<?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[CTO Logic]]></title><description><![CDATA[Pragmatic, hard-earned advice for CTOs who deliver tangible business outcomes.]]></description><link>https://www.ctologic.pro</link><image><url>https://substackcdn.com/image/fetch/$s_!GkjY!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c94072-f730-4fdd-8ca8-361009a91b78_512x512.png</url><title>CTO Logic</title><link>https://www.ctologic.pro</link></image><generator>Substack</generator><lastBuildDate>Sun, 10 May 2026 11:36:39 GMT</lastBuildDate><atom:link href="https://www.ctologic.pro/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Itzy Sabo]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[itzy@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[itzy@substack.com]]></itunes:email><itunes:name><![CDATA[Itzy Sabo]]></itunes:name></itunes:owner><itunes:author><![CDATA[Itzy Sabo]]></itunes:author><googleplay:owner><![CDATA[itzy@substack.com]]></googleplay:owner><googleplay:email><![CDATA[itzy@substack.com]]></googleplay:email><googleplay:author><![CDATA[Itzy Sabo]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The Hitchhiker’s Guide to Measuring Engineering ROI]]></title><description><![CDATA[How to Measure Engineering ROI: A Practical Guide for SaaS CTOs. Engineering ROI is elusive &#8212; but measurable. This guide breaks down attribution philosophies and provides practical formulas to help CTOs quantify and communicate engineering&#8217;s impact.]]></description><link>https://www.ctologic.pro/p/how-to-measure-engineering-roi</link><guid isPermaLink="false">https://www.ctologic.pro/p/how-to-measure-engineering-roi</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Wed, 26 Nov 2025 18:46:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vomK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9818daaf-3dc6-48d4-a3ae-d4d78cd96115_1390x1336.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>The Challenge of Attributing ROI</h2><p>Your marketing VP may tell you that for every dollar she spends, the company gets back $3 in revenue.</p><p>Sales people are measured by the amount of revenue they book. It&#8217;s probably the primary determining factor of how much they take home.</p><p>In contrast with our VPs of Marketing and Sales above, many CTOs can tell you only this: &#8220;Without my department, we wouldn&#8217;t have anything to sell.&#8221; Correct, but not useful.</p><p>The connection between engineering and revenue is not clearly visible, and in most cases is actually quite elusive. This is for two inter-related reasons: the lack of a clear cause-and-effect relationship, and the tendency of results to lag significantly behind the corresponding  efforts.</p><p>The engineering department&#8217;s job is to build and maintain the company&#8217;s core revenue engine. Engineering, therefore, obviously plays a central role in the company&#8217;s success.</p><p>Attempts to attribute a fair portion of the company&#8217;s business outcomes to the engineering department are seriously challenged by the tension between engineering&#8217;s key role, on one side, and the opaqueness of the chain of causation between engineering work and business outcomes, on the other.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OS9X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33ecb9-e794-4e06-9bfc-500f36034840_1328x1328.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OS9X!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33ecb9-e794-4e06-9bfc-500f36034840_1328x1328.png 424w, https://substackcdn.com/image/fetch/$s_!OS9X!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33ecb9-e794-4e06-9bfc-500f36034840_1328x1328.png 848w, https://substackcdn.com/image/fetch/$s_!OS9X!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33ecb9-e794-4e06-9bfc-500f36034840_1328x1328.png 1272w, https://substackcdn.com/image/fetch/$s_!OS9X!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33ecb9-e794-4e06-9bfc-500f36034840_1328x1328.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OS9X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33ecb9-e794-4e06-9bfc-500f36034840_1328x1328.png" width="1328" height="1328" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b33ecb9-e794-4e06-9bfc-500f36034840_1328x1328.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1328,&quot;width&quot;:1328,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:269277,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.ctologic.pro/i/180043552?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33ecb9-e794-4e06-9bfc-500f36034840_1328x1328.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!OS9X!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33ecb9-e794-4e06-9bfc-500f36034840_1328x1328.png 424w, https://substackcdn.com/image/fetch/$s_!OS9X!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33ecb9-e794-4e06-9bfc-500f36034840_1328x1328.png 848w, https://substackcdn.com/image/fetch/$s_!OS9X!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33ecb9-e794-4e06-9bfc-500f36034840_1328x1328.png 1272w, https://substackcdn.com/image/fetch/$s_!OS9X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33ecb9-e794-4e06-9bfc-500f36034840_1328x1328.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">What is Engineering&#8217;s ROI?</figcaption></figure></div><h2>Why Quantify Engineering ROI?</h2><p>Before we attempt to solve the challenge, let&#8217;s examine <em>why</em> we need to do it in the first place.</p><p>It&#8217;s natural to want to know how well engineering &#8212; one of a startup&#8217;s most expensive departments &#8212; is running. The marketing and sales departments can provide simple numbers, directly tied to revenue, that give a good snapshot of how well they are functioning. It&#8217;s only natural to try to get a similarly succinct number from engineering.</p><p>When asked, &#8220;What is Engineering&#8217;s ROI?&#8221; the CTO feels pressured to answer it, but often doesn&#8217;t have the tools. So the CTO counters with DORA metrics, uptime percentages, bug rates, and developer experience (DX) evaluations. None of these translate into a bottom line revenue number. In extreme cases, CTOs have even been known to claim that engineering creativity and innovation cannot be quantified, and should not be measured.</p><p>Even though everyone appreciates the difficulty, the CTO&#8217;s inability to account for the high costs of their engineering department is nevertheless perceived as the CTO&#8217;s <em>own personal shortcoming</em>.</p><p>Even if the CTO manages to present the above metrics impressively, the fundamental lack of ROI data remains, because (for example):</p><ul><li><p>Efficiency <strong>does not</strong> imply effectiveness.</p></li><li><p>Shipping features <strong>does not</strong> necessarily bring in revenue.</p></li><li><p>Velocity <strong>does not</strong> indicate value.</p></li></ul><p>A seemingly excellent engineering department can generate a quite low ROI, if it does not pull in the direction of some very specific business outcomes. One infamous archetype that exhibits this behaviour is known as the &#8220;feature factory.&#8221;</p><p>The pressure to understand the engineering department&#8217;s ROI is typically an attempt to validate whether the high costs are worthwhile. However, if you do it right, you can turn this process into a tool that will actually <em>generate a higher ROI</em>.</p><h2>The ROI Mindset</h2><p>The main difficulty with measuring ROI is that it requires mindset changes from the CTO himself, the CEO, and the other executives.</p><h3>Outcomes versus Outputs</h3><p>ROI revolves around business outcomes, yet in many companies the engineering department merely delivers requested outputs, in the form of features. In such cases, the head of engineering can be held accountable only for outputs, and they will be unable to optimise for ROI &#8212; even if the CFO actually calculates it using some arbitrary formula. In many such output-driven feature-centric companies, no executive will be explicitly responsible to ensure that the requested outputs plausibly align with the company&#8217;s business goals, let alone be truly <em>accountable</em> for the eventual outcomes.</p><p>If we want true accountability for outcomes, we need to assign the corresponding responsibility <em>and authority</em>. Of course, we need a CTO who is worthy of these, and can properly fill &#8220;a seat at the table.&#8221;</p><h3>Leading Indicators</h3><p>In order to be able to get any inkling of ROI, we need to make a habit of circling back to measure usage of new features, and how they contribute to acquisition, retention, or whatever their stated aim was.</p><p>Business outcomes tend to surface in lagging metrics &#8212; calculated well after deployment of the changes that we hoped would drive the results we need.</p><p>Therefore, CTOs must ensure that relevant <em>leading indicators</em> are identified, that can be used as early litmus tests. This also highlights the imperative to invest in observability and analytics &#8212; something which many output-oriented engineering departments feel they have little time for. They see it as a separate effort, distinct from the main deliverable, and which will just slow them down. A mindset that is more conducive to ROI would be, &#8220;a feature isn&#8217;t complete without observability.&#8221;</p><p>Advantages of measuring and monitoring leading indicators:</p><ol><li><p><strong>Prediction</strong> &#8212; Leading indicators allow us to track, predict and report success early.</p></li><li><p><strong>Attribution</strong> &#8212; Suitable leading indicators make it easier to attribute results to specific efforts and features, compared with lagging metrics, which are aggregate effects of multiple phenomena.</p></li><li><p><strong>Savings of time and resources</strong> &#8212; By monitoring leading indicators, we can make early course corrections, thus saving time and reducing waste of engineering resources on avenues that we discover to be doomed to fail.</p></li><li><p><strong>Increased likelihood of success</strong> &#8212; We can increase our focus on the intended results, and therefore our likelihood of attaining them, by clarifying from the outset which observations will indicate how successful a feature is considered, and by selecting appropriate leading indicators. (I teach techniques to identify intended outcomes and relevant leading indicators, such as <em>The 5 Whats</em> and <em>Definition of Success</em>.)</p></li></ol><h2>How to Demonstrate ROI</h2><p>Here are a number of methods that can be used, individually or in combination, to form an impression of the ROI of your engineering department, and determine whether it is &#8220;enough.&#8221;</p><h3>A. Compare Reality With Expectations</h3><p>The most natural method, in use almost everywhere, is to compare reality with your original expectations. Are you getting what you expected from engineering? This amounts to a gut feeling, and it is especially prone to conflation of the following factors:</p><ol><li><p>Are you satisfied with engineering&#8217;s <em>performance</em>? Did they deliver what was requested, on time, and with good quality? Any such satisfaction has nothing to do with ROI.</p></li><li><p>Are you satisfied with the <em>business outcomes</em> that were enabled by engineering&#8217;s efforts? If not, should this low ROI reflect back on engineering&#8217;s standing in your eyes? After all, engineering itself may have nevertheless performed outstandingly, even though your bets didn&#8217;t win.</p></li></ol><h3>B. Compare Yourself Against Benchmarks</h3><p>Current financial benchmarks will tell you whether your engineering costs as a percentage of revenue are consistent with other companies. Your <em>assumption</em> may be that if your investment follows the benchmark, <em>and</em> you&#8217;re satisfied with engineering, all is good. But <em>how good</em> is it exactly?</p><p>Such benchmarks have a lot of play in them, depending on your industry, and also the growth stage you&#8217;re at. For example, a company that has pulled its acceleration lever to scale rapidly after finding product-market-fit (PMF) might increase engineering spending past 60% of revenue, whereas larger, more stable companies will tend to spend a lower percentage.</p><p>It is worth explaining that if you invest 60% of your revenue on engineering, that does not mean that engineering ROI is 100&#247;60 = 167%. The revenue arriving now is most probably not a result of your <em>current</em> spending.</p><p>True ROI is a measure of how well your <em>past</em> engineering investments are influencing <em>current</em> revenue, or how well <em>today&#8217;s</em> bets will convert into <em>future</em> payoffs. Startups are notorious for their high failure rate at this game.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EYOx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eb4dd7d-c60a-4898-aef2-cffdcaabeeaa_821x388.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EYOx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eb4dd7d-c60a-4898-aef2-cffdcaabeeaa_821x388.png 424w, https://substackcdn.com/image/fetch/$s_!EYOx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eb4dd7d-c60a-4898-aef2-cffdcaabeeaa_821x388.png 848w, https://substackcdn.com/image/fetch/$s_!EYOx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eb4dd7d-c60a-4898-aef2-cffdcaabeeaa_821x388.png 1272w, https://substackcdn.com/image/fetch/$s_!EYOx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eb4dd7d-c60a-4898-aef2-cffdcaabeeaa_821x388.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EYOx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eb4dd7d-c60a-4898-aef2-cffdcaabeeaa_821x388.png" width="821" height="388" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9eb4dd7d-c60a-4898-aef2-cffdcaabeeaa_821x388.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:388,&quot;width&quot;:821,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:51576,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.ctologic.pro/i/180043552?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eb4dd7d-c60a-4898-aef2-cffdcaabeeaa_821x388.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!EYOx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eb4dd7d-c60a-4898-aef2-cffdcaabeeaa_821x388.png 424w, https://substackcdn.com/image/fetch/$s_!EYOx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eb4dd7d-c60a-4898-aef2-cffdcaabeeaa_821x388.png 848w, https://substackcdn.com/image/fetch/$s_!EYOx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eb4dd7d-c60a-4898-aef2-cffdcaabeeaa_821x388.png 1272w, https://substackcdn.com/image/fetch/$s_!EYOx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eb4dd7d-c60a-4898-aef2-cffdcaabeeaa_821x388.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>Source: <a href="https://www.benchmarkit.ai/2025benchmarks">Benchmarkit&#8217;s 2025 B2B SaaS Performance Metrics Benchmarks</a></p><h3>C. Demonstrate ROI via Initiatives that <em>Drive</em> ROI</h3><p>I have successfully used this model at multiple companies, and it forms the core of the method I teach CTOs that work with me. It&#8217;s a 3-stage process that&#8217;s simple to grasp, but which requires more than technology skills alone to carry it out.</p><ol><li><p><strong>Identify</strong><br>Identify business outcomes that the company needs. Ideally, you will derive these directly from your company&#8217;s business goals, and agreed upon business strategies that form approaches for achieving the goals. If such goals or strategies don&#8217;t exist in coherent form, you will need to play an important part in clarifying and crystallising them, because without a clear business direction, you&#8217;ll get nowhere useful.</p></li><li><p><strong>Commit</strong><br>Design technology initiatives that will result in the outcomes you identified. You cannot do this in a vacuum &#8212; you must align and collaborate with your fellow executive leaders. This collaboration has the potential to position you as a capable and trusted partner who leverages technology, and the centrality of the engineering department, in pursuit of the company&#8217;s business goals.</p></li><li><p><strong>Deliver &amp; Report</strong><br>Execute the initiatives and ensure you deliver the results. An integral part of this requires proper tracking and reporting of results.</p></li></ol><p>By <em>committing</em> to solve specific business problems and to achieve specific business outcomes, and then <em>honouring</em> those commitments, you are demonstrating your value as a leader, and attributing to your engineering department the credit for those specific outcomes.</p><p>Here&#8217;s an example to demonstrate:</p><p>Business goal:</p><blockquote><p> Increase Annual Recurring Revenue (ARR) by 60%</p></blockquote><p>There are many ways to achieve this goal. Multiple business strategies that are agreed upon, including:</p><blockquote><p>Reduce monthly churn down to 11%, to boost MRR in powerfully compounding way</p></blockquote><p>The CTO defines the following initiative:</p><blockquote><p>Identify and fix our top 3 churn triggers (in order to boost MRR independently of traffic or conversion rates)</p></blockquote><p>Later, even before the full effect has been felt, the CTO is happy to report:</p><blockquote><p>We cut churn from 20% &#8594; 10%, by fixing our top 5 churn triggers.</p><p>It&#8217;s a +$10M (+34%) boost to our projected 12-month revenue.</p></blockquote><p>A CTO who can intentionally deliver highly relevant business outcomes, and who can also demonstrate progress using relevant indicators and metrics, is achieving a &#8220;high ROI,&#8221; even though such a statement may be based on an unquantified intuition.</p><p>In this example, based on a development cost of a few hundred thousand dollars, the company got amazing value for money.</p><div><hr></div><p><em><strong>Engineer your pathway to ROI</strong></em></p><p><em>My next free online workshop for SaaS <strong>CTO</strong>s and <strong>Engineering VP</strong>s will get you started <strong>immediately</strong> with <strong>practical</strong> steps to deliver, demonstrate and <strong>boost</strong> engineering <strong>ROI</strong>.</em></p><p><em>In 60 minutes, I&#8217;ll teach you the framework that has helped 120+ engineering leaders get started on optimising their departments and operations for maximum ROI.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://engineer-your-roi.carrd.co/?utm_medium=email&amp;utm_source=newsletter&amp;utm_campaign=roi&amp;utm_content=roi-article&quot;,&quot;text&quot;:&quot;Register Now (Free)&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://engineer-your-roi.carrd.co/?utm_medium=email&amp;utm_source=newsletter&amp;utm_campaign=roi&amp;utm_content=roi-article"><span>Register Now (Free)</span></a></p><div><hr></div><h3>D. Calculate ROI using a Formula</h3><p>The initiatives approach gives results that are undeniably powerful. However, these results are expressed anecdotally, and cannot necessarily be mathematically aggregated across initiatives to produce a standardised measurement.</p><p>If we want to gauge how much leverage the company is getting from its engineering department, we need a method of attributing financial results to all the relevant departments.</p><p>Companies tend to come up with their own formulae, or at least their own way of applying them. Anyone doing so should consider the following factors:</p><h4>Attribution Philosophies</h4><p>There are three philosophies regarding ROI attribution (excuse my borrowing of marketing terminology here):</p><ol><li><p><strong>Full Attribution (a.k.a. &#8220;Single-Touch&#8221;)</strong><br>Attribute 100% of the impact to the department or initiative that is most closely associated to the final conversion.</p></li><li><p><strong>Fractional Attribution (a.k.a &#8220;Multi-Touch&#8221;)</strong><br>Split the attribution across contributing departments, according to their proportional contributions. Some companies will attribute arbitrary percentages of revenue e.g. 30% for marketing, 40% for sales, etc.</p></li><li><p><strong>Causal Attribution (a.k.a. Incremental Attribution)</strong><br>When there is an incremental lift (&#8220;delta&#8221;) in a metric, attribute the resulting effect to the initiative or department that caused it.</p></li></ol><p>There are many drawbacks with these philosophies, for example:</p><ol><li><p>The full attribution philosophy ignores the inter-departmental teamwork that underpins any product, crediting only the last department in the chain. This will naturally concentrate most of the perceived value in the marketing or sales departments. Additionally, for each type of revenue-generating conversion, including new ones that arise, you&#8217;ll need to discuss and define which department exclusively gets the credit.</p></li><li><p>Fractional attribution seems significantly more fair, yet using arbitrary weightings encourages never-ending negotiations about adjusting the weightings.</p></li><li><p>Causal Attribution can be problematic to implement properly, for a number of reasons.</p><ol><li><p>Revenue will need to be broken down and attributed to many different efforts. It quickly gets impractically nitpicky.</p></li><li><p>If an increase in the percentage of landing page visitors who registered free accounts eventually turned into more paying customers, was this because engineering streamlined the registration form or because marketing figured out how to bring better quality traffic? Or both? Or neither?</p></li><li><p>Attributing an intentional improvement in a leading indicator can be practical, but isolating its eventual effect on the lagging revenue metric is often not feasable among the noise generated by many concurrent efforts.</p></li></ol></li><li><p>There are potentially some damaging second-order effects of full attribution, and to some degree fractional attribution, depending on the split. For example, engineering may have no incentive to prioritise work that sales will get credit for, over work that directly helps engineering&#8217;s own ROI score.</p></li></ol><h4>Attribution by Activity or Revenue Type</h4><p>The above attribution philosophies are concerned mainly with <em>who</em> to attribute revenue to.</p><p>In many cases, it may make sense to overlay this with an orthogonal dimension that denotes the <em>what</em> &#8212; activities that led or contributed to revenue-generating events. Dave McClure&#8217;s famous <a href="https://web.archive.org/web/20070628222051/http://500hats.typepad.com/500blogs/2007/06/internet-market.html">AARRR Pirate Metrics framework</a> provides a convenient list (I&#8217;ve tweaked it for my own purposes):</p><ol><li><p><strong>Acquisition</strong> of new users.</p></li><li><p><strong>Activation</strong> of the new users &#8212; i.e. getting them to their Aha moments.</p></li><li><p><strong>Revenue</strong> &#8212; converting free users into paying customers.</p></li><li><p><strong>Retention</strong> of paying customers for as long as possible, to maximise their lifetime value (LTV). This will also include upgrading them to higher cost packages, known as &#8220;expansions&#8221; in accounting language.</p></li><li><p><strong>Referral</strong> &#8212; getting customers to refer others who become customers.</p></li></ol><p>A simplification of this that might be preferred by some companies could distinguish just between new and pre-existing revenue. For example:</p><ol><li><p><strong>New revenue</strong> &#8212; revenue received from customers who converted during the reporting period. This could be attrbuted to the marketing department, or to sales, or split across both, because these departments&#8217; efforts were the key contributions here.</p></li><li><p><strong>Pre-existing revenue</strong> &#8212; recurring revenue from customers who converted prior to the beginning of the reporting period. A company might decide to attribute retained revenue to the engineering department, because a high quality user experience that delivers value consistently is much more conducive to retention.</p></li></ol><p>This approach essentially boils down to a breakdown of &#8220;Single-Touch&#8221; attribution by revenue type.</p><p>Another perspective is not to differentiate by revenue type, but by the intended purpose of investment. Most basically, this can be expressed as follows:</p><ol><li><p><strong>Keep the lights on (KTLO)</strong> &#8212; Efforts and expenses that are required to keep the product functioning smoothly with its current feature set and customer base. This maps (roughly) to what the CFO calls operating expenses, or &#8220;OpEx&#8221; for short.</p></li><li><p><strong>New features and capabilities</strong> &#8212; Investment in new features and capabilities such as scaling up the infrastructure to support a larger customer base. This is what the finance people call capital expenditure (&#8220;CapEx&#8221;).</p></li></ol><p>CFOs care about the distinction between OpEx and CapEx because these expenditures are treated differently in financial reports (CapEx are reported as assets, while OpEx are expenses), and have differing effects on taxes owed and even influence the company&#8217;s valuation differently.</p><p>Distinguishing between OpEx and CapEx is logically understandable, but attempting to attribute incoming revenue to the corresponding type of investment is impractical in many cases.</p><h4>Additional Factors to Consider</h4><ol><li><p><strong>Risk Mitigation</strong></p><p>A significant portion of engineering work mitigates risks, to prevent potential losses and other adverse events. Production downtime can have a high direct cost through loss of revenue (e.g. in ecommerce), and also can be accompanied by an indirect cost in the form of reputational damage. The attribution problem here is not the <em>who</em>, but the <em>amount</em>. We can know exactly how much we invested, but any figure we put on the potential damage we prevented (multiplied by a probability percentage we pick) is purely imaginary &#8212; because if our effort is successful, the events do not happen.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> Will we factor this type of activity into our ROI formula, and if so, how?</p></li><li><p><strong>Actual vs. Predicted Revenue</strong></p><p>Do we care only about <em>actual</em> revenue accrued during the reporting period, or will we attempt to estimate the <a href="https://www.investopedia.com/terms/n/npv.asp">net present value (NPV)</a> of all improvements?</p></li><li><p><strong>Time-lag</strong></p><p>Do we care that investment and payback periods could be offset from each other, e.g. investment over a sustained period that starts paying off only once it is complete? The residual effect will persist &#8212; for how long should we attribute this to the original investment?</p></li><li><p><strong>Intent</strong></p><p>Do we care whether an effect is due to <em>deliberate</em> effort? For example, if we increased revenue by raising prices, does anyone get credit for that (apart from the decision-maker)? What about if we got more business because a competitor had a serious outage? Do we care to differentiate between internal and external causes?</p></li><li><p><strong>Stability</strong></p><p>How stable is our formula? How prone is it to constant renegotiation attempts? How sensitive is it to changing industry or market realities?</p></li><li><p><strong>Incentive</strong></p><p>Is one of the aims of our ROI formula to serve as an incentive for departments to improve? Might our formula cause territorial disputes and dis-incentivise the departments from collaborating? How can we avoid dis-incentivising investments that do not obviously generate revenue (see risk mitigation above), and therefore lower a department&#8217;s ROI score (mathematically)?</p></li><li><p><strong>Fairness</strong></p><p>Are we trying to be fair? If so, why exactly? Is it just to prevent squabbling? How does fairness affect each department&#8217;s incentive to improve? Will a fair formula encourage collaboration between departments?</p></li><li><p><strong>Availability, Clarity, Estimatability and Mechanical Simplicity</strong></p><p>How readily available are the up-to-date numbers for calculating the formula? How easy is it for a department head to calculate or estimate their current situation? To what degree are the attributions and amounts subject to a determination by the CFO before they can be relied upon? Can a department head understand clearly how to adjust their activities in order to improve their ROI over time?</p></li></ol><h2>What Makes an ROI Formula Useful?</h2><p>I&#8217;m not looking for an academic formula that produces a number that has little practical value in real time. My formula needs to be <em>useful</em>. To me, that means it must do as many of these as possible:</p><ol><li><p>Track something meaningful over time.</p></li><li><p>Create a timely feedback loop for departments to improve the score.</p></li><li><p>Help engineering compete for budgets and resources with the other departments.</p></li><li><p>Align the departments&#8217; incentives so they all pull in the same direction.</p></li><li><p>Be comparable between companies, e.g. in a private equity portfolio. Optional.</p></li></ol><p>For my formula to help departments improve, it must be:</p><ol><li><p><strong>Actionable</strong> &#8212; department heads must be able to determine which factors influence their scores, and be able to control or influence the values of as many as possible of these factors.</p></li><li><p><strong>Estimatable</strong> &#8212; department heads must be able to [at least] estimate their current situation to confirm that they are improving. Therefore, It must also be straightforward to calculate or update, i.e., not too intricately pedantic.</p></li><li><p><strong>Mechanical</strong> &#8212; application of the formula must be mechanical, i.e. not subject to discussion, nor pending the CEO or CFO&#8217;s as yet unknown, or even unpredictable, interpretation of recent happenings.</p></li><li><p><strong>Timely</strong> &#8212; the raw data to calculate the scores must be available regularly, in a timely manner that allows department heads to iterate and improve.</p></li></ol><p>In order to ensure incentives are aligned, the formula must appear to be fair. Fairness also promotes stability (less squabbling &#8594; fewer changes), which is a prerequisite for tracking values over time.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vomK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9818daaf-3dc6-48d4-a3ae-d4d78cd96115_1390x1336.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vomK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9818daaf-3dc6-48d4-a3ae-d4d78cd96115_1390x1336.png 424w, https://substackcdn.com/image/fetch/$s_!vomK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9818daaf-3dc6-48d4-a3ae-d4d78cd96115_1390x1336.png 848w, https://substackcdn.com/image/fetch/$s_!vomK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9818daaf-3dc6-48d4-a3ae-d4d78cd96115_1390x1336.png 1272w, https://substackcdn.com/image/fetch/$s_!vomK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9818daaf-3dc6-48d4-a3ae-d4d78cd96115_1390x1336.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vomK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9818daaf-3dc6-48d4-a3ae-d4d78cd96115_1390x1336.png" width="1390" height="1336" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9818daaf-3dc6-48d4-a3ae-d4d78cd96115_1390x1336.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1336,&quot;width&quot;:1390,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:234812,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.ctologic.pro/i/180043552?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9818daaf-3dc6-48d4-a3ae-d4d78cd96115_1390x1336.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vomK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9818daaf-3dc6-48d4-a3ae-d4d78cd96115_1390x1336.png 424w, https://substackcdn.com/image/fetch/$s_!vomK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9818daaf-3dc6-48d4-a3ae-d4d78cd96115_1390x1336.png 848w, https://substackcdn.com/image/fetch/$s_!vomK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9818daaf-3dc6-48d4-a3ae-d4d78cd96115_1390x1336.png 1272w, https://substackcdn.com/image/fetch/$s_!vomK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9818daaf-3dc6-48d4-a3ae-d4d78cd96115_1390x1336.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>ROI Formulae &amp; Application</h2><p>In The Hitchhiker&#8217;s Guide to the Galaxy by Douglas Adams, the Deep Thought supercomputer calculates the &#8220;Answer to the Ultimate Question of Life, the Universe, and Everything&#8221; to be the number 42. Unfortunately, after 7.5 million years, no one knew what the actual question was, thus rendering the answer somewhat meaningless.</p><p>Similarly, when attempting to calculate the ROI of an engineering department, we must clarify to ourselves the specific questions we want answered. In doing so, it is also helpful to anticipate how these answers might influence our subsequent actions.</p><p>It turns out that the accounting world already has a formula for ROI, and in the case of SaaS companies, the answer might as well be 42.</p><h3>ROI Formula - Formal Accounting Version</h3><p>This is a simple ROI formula for a company. It quite simply means that your company&#8217;s ROI is your gross profit divided by your costs of generating it. Ideally it&#8217;s a positive multiple, or you can represent it as a percentage.</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;ROI = \\frac{Revenue - Cost\\ of\\ Revenue}{Cost\\ of\\ Revenue}&quot;,&quot;id&quot;:&quot;EUBYBTRTVE&quot;}" data-component-name="LatexBlockToDOM"></div><p>The question this formula answers is, <em>&#8220;For every dollar we spend on delivering our product or service, how much <strong>extra</strong> money do we get back?&#8221;</em></p><p>Cost of Revenue is a term that has quite a narrow definition. It will typically include only the <em>direct</em> costs associated with keeping your service operational for customers. Not salaries of engineers who are building new features, and not (for example) your cloud CI/CD service. This definition is designed to eliminate noise when comparing the financial performance of different companies.</p><p>In a manufacturing scenario, the above question could be stronger: <em>&#8220;For every <strong>additional</strong> dollar we spend on delivering our product or service, how much extra money <strong>can we expect</strong> to get back?&#8221;</em> In the SaaS scenario, where costs do not vary much with the number of customers, the above formula will not answer this question. However, it&#8217;s not needed; the answer is zero.</p><p>This means that formulae based on Cost of Revenue will fail to capture much of what a software engineering department does.</p><h3>Marketing Efficiency Ratio</h3><p>Marketing is another department whose activities are not captured by Cost of Revenue. The Marketing Efficiency Ratio (MER) provides a holistic impression of departmental ROI.</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;Marketing\\ Efficiency\\ Ratio = \\frac{Total\\ Revenue}{Total\\ Advertising\\ Spend}&quot;,&quot;id&quot;:&quot;SNURYTLHCB&quot;}" data-component-name="LatexBlockToDOM"></div><p>A nuance to note here is that they don&#8217;t deduct their direct costs &#8212; they are just looking for a simple multiple to track. Also, they don&#8217;t include salary costs of operating the marketing department. This could be fine for marketing &#8212; their raw materials costs are for advertising &#8212; but engineering&#8217;s main raw material is human brainpower, and the chief costs are in the form of salaries.</p><h3>Engineering ROI Questions</h3><p>A SaaS company&#8217;s engineering department does two main things:</p><ol><li><p>Operate and maintain the company&#8217;s product or service.</p></li><li><p>Improve the product or service and develop new capabilities.</p></li></ol><p>That&#8217;s how the engineers may see things. From a more outcomes-based perspective, these are the purposes of the engineering department:</p><ol><li><p>Retain existing customers, or at least don&#8217;t give them a reason to leave.</p></li><li><p>Attract new customers, or enable efforts to do this.</p></li></ol><p>These two sets don&#8217;t map onto each other exactly<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>, but holistically speaking, they are reasonably close.</p><p>Somewhat paradoxically, many SaaS companies spend the bulk of their engineering budget on building new features, while the majority of their revenue comes from serving their existing customers.</p><p>This situation encourages two distinct ROI questions:</p><ol><li><p><em>&#8220;How much revenue is supported by each dollar we spend on operating and maintaining the service?&#8221;</em></p></li><li><p><em>&#8220;How much <strong>new</strong> revenue is enabled by each dollar we spend on improving the service and developing new capabilities?&#8221;</em></p></li></ol><h3>Engineering Operating Efficiency Ratio</h3><p>Question: <em>&#8220;How much revenue is supported by each dollar we spend on operating and maintaining our product or service <strong>at the current level</strong>?&#8221;</em></p><p>This question produces a simple ratio: the revenue attributed to existing customers, divided by the cost of keeping the system running smoothly.</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;Engineering\\ Operating\\ Efficiency = \\frac{Revenue\\ from\\ existing\\ customers}{KTLO\\ Costs}&quot;,&quot;id&quot;:&quot;IWAKEQYORJ&quot;}" data-component-name="LatexBlockToDOM"></div><p>In order to apply this formula, we need to define the terms, and obtain or calculate their component values.</p><h4>Revenue from Existing Customers</h4><p>We are calculating values pertaining to a specific time period &#8212; the &#8220;reporting period&#8221;. Revenue from existing customers consists of total payments received from customers that were already paying customers &#8212; not free users &#8212; prior to the start of the reporting period. Do not confuse this with the amount of monthly recurring revenue (MRR) at the start of the reporting period.</p><p>Revenue from existing customers will naturally be affected by these phenomena:</p><ol><li><p>Account upgrades (&#8220;expansions&#8221;) that existing customers made, from one paid tier to another, e.g. from Pro to Enterprise.</p></li></ol><ol start="2"><li><p>Price increases that your company instituted.</p></li></ol><ol start="3"><li><p>Churn.</p></li></ol><h4>KTLO Costs</h4><p>If all you had to do was to keep your service operating at current levels, how much would it cost you? What percentage of your current engineering and DevOps capacity does it require?</p><p>You&#8217;d still probably need cloud environments for development and staging, as well as a CI/CD system, and of course Jira (or equivalent).</p><p>Here&#8217;s a list of typical expenses:</p><ul><li><p>Direct expenses of production:</p><ul><li><p>Troubleshooting customer issues and fixing production bugs</p></li><li><p>On-call employee compensation</p></li><li><p>Servers or cloud compute instances</p></li><li><p>Databases and object storage</p></li><li><p>Networking services (CDN, API gateways, load balancers, etc.)</p></li><li><p>Security and regulatory compliance tools, services and work</p></li><li><p>Backups and snapshots</p></li><li><p>Logging, alerting and observability</p></li><li><p>Data warehouse</p></li><li><p>Replicated resources for resilience and disaster recovery</p></li><li><p>Any other 3rd party API or service fees (production only)</p></li></ul></li><li><p>Appropriate fractions of indirect expenses, that I nevertheless include (see &#8220;Classify Engineering Costs as OpEx or CapEx&#8221; below):</p><ul><li><p>Development and staging environments</p></li><li><p>Software subscription costs, e.g. GitHub, Cursor, Jira.</p></li><li><p>Any other 3rd party API or service fees (development)</p></li><li><p>Departmental expenses, such as:</p><ul><li><p>Salary costs (these are higher than gross salaries, due to employment taxes, health insurance, investment schemes, etc.)</p></li><li><p>Travel, team-building, training expenses, etc.</p></li><li><p>Rent and utilities</p></li><li><p>Shared burden of internal services such as HR, legal, etc.</p></li><li><p>Laptops and other equipment</p></li></ul></li></ul></li></ul><p>Examples of &#8220;appropriate fractions&#8221; (above):</p><ul><li><p>If KTLO only requires 10 people, attribute the cost of 10 Jira licences to KTLO.</p></li><li><p>If 20% of days worked were spent on KTLO, attribute 20% of your salary costs to KTLO.</p></li><li><p>If something has a fixed cost (or a minimum cost), and is necessary for KTLO, then attribute 100% of the cost (or the cost of the minimal package) to KTLO.</p></li></ul><h3>Engineering Growth Efficiency Ratio</h3><p>Question: <em>&#8220;How much new revenue is enabled by each dollar we spend on improving the service and developing new capabilities?&#8221;</em></p><p>This question produces a simple ratio: the amount of revenue attributed to new customers divided by the cost of improving the service and developing new capabilities.</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;Engineering\\ Growth\\ Efficiency = \\frac{Revenue\\ from\\ new\\ customers}{Cost\\ of\\ new\\ capabilities\\ (amortised)}&quot;,&quot;id&quot;:&quot;BCXAQWZKRI&quot;}" data-component-name="LatexBlockToDOM"></div><h4>Revenue from New Customers</h4><p>Revenue from new customers consists of total payments received from entities that became paying customers during the reporting period. Note that this is not the same as the amount of MRR at the end of the period.</p><h4>Amortisation</h4><p>Amortisation is a way of spreading the recognition of costs over an expected payback period. See &#8220;Classifying Engineering Costs as OpEx or CapEx&#8221; below.</p><h3>Classify Engineering Costs as OpEx or CapEx</h3><p>To begin to answer these questions, you need to classify all your engineering costs as either operating expenses (OpEx) or capital expenditure (CapEx). Your CFO probably already does this, possibly using rough estimates, or according to &#8220;financial engineering&#8221; principles that may not reflect your CTO&#8217;s version of reality.</p><p>The way engineering departments operate, including the tools and systems they use for development and testing, is a critical part of a company&#8217;s secret sauce of &#8220;manufacturing&#8221; its product or delivering its service. It&#8217;s akin to a purpose-built manufacturing facility. As such, I want to consider all of engineering&#8217;s operating expenses, rather than be limited strictly to what accountants include in Cost of Revenue. This also has the advantage of simplifying things somewhat.</p><h4>Operating Expenses</h4><p>In this context, operating expenses (OpEx) include anything you spend on keeping your product or service operating smoothly, in its current state and level of service<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a>.</p><h4>Capital Expenditures</h4><p>Capital expenditures (CapEx) include the costs of improvements you make to your product or service, and anything you invest in new capabilities &#8212; basically any investments that are intended to increase the value of your product. In this specific context, CapEx will generally be anything that is not OpEx.</p><h4>CapEx Amortisation</h4><p>It often takes quite a while for a new feature to start delivering results, and its productive lifetime can last for years. The simple fact is that most of a feature&#8217;s payback will not arrive during the reporting period in which the feature was delivered.</p><p>Were we to recognise the costs immediately, it would inflate our costs in the current reporting period. These costs are chiefly unrelated to the revenue that arrived during this period. When this feature&#8217;s revenue arrives later, it will be as if by magic, because it will not have any corresponding development costs. This would render our ratio misleading.</p><p>Therefore, treat all capital investments as though they were spread over 3 years (for example). If our reporting period is a quarter (3 months), include (&#8220;recognise&#8221;) 3/36 = 8.33% of the total cost in each period. Your CFO calls this &#8220;amortisation.&#8221;</p><h4>Restated Formula</h4><p>Based on the above, we can restate our engineering ROI formulae:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;Engineering\\ Operating\\ Efficiency = \\frac{Revenue\\ from\\ existing\\ customers}{OpEx}&quot;,&quot;id&quot;:&quot;UVFSMHOAYE&quot;}" data-component-name="LatexBlockToDOM"></div><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;Engineering\\ Growth\\ Efficiency = \\frac{Revenue\\ from\\ new\\ customers}{CapEx\\ (amortised)}&quot;,&quot;id&quot;:&quot;MZUEJKBEOI&quot;}" data-component-name="LatexBlockToDOM"></div><h4>Track Capital Expenditures in Aggregate</h4><p>Don&#8217;t attempt to track launch dates and amortisation periods for individual projects or tasks &#8212; it snowballs too quickly into a thankless task.</p><p>A little-known, but sad fact is that most capital investments will fail to recoup any business value. When you realise one has failed, you could decide to write it off as an immediate loss. Don&#8217;t do this, for the same reason as above. Unless you want to handle an exceptional case, it&#8217;s just too nitpicky.</p><p>It is sufficient to track your <em>aggregate</em> capital investment for each period, and have a spreadsheet distribute it over the following 3 years.</p><h4>Classifying and Tracking Costs</h4><p>You need to track two main things:</p><ol><li><p><strong>Direct monetary costs</strong> &#8212; These are things you forked out money for, and are naturally tracked on a spreadsheet in units of money. Attribute each expense to OpEx or CapEx based on its purpose. Where appropriate, split the attribution to reflect the relative amounts consumed by each category.</p></li><li><p><strong>Effort</strong> &#8212; Track effort invested in OpEx and CapEx. Translate this into money by expressing effort expended (for example, in terms of man-days worked, or number of people assigned) as a percentage of your total capacity, and then multiplying by your total salary costs. Use Jira&#8217;s (or whatever work queue system you&#8217;re using) tagging or custom fields to classify epics/stories into appropriate categories for this.</p></li></ol><h2>Conclusion</h2><p>Is calculating engineering ROI the <em>right</em> thing to do? And is it fair to collapse all of engineering&#8217;s activities into a pair of numbers? Two short answers:</p><ol><li><p>Someone will do this anyway. When done na&#239;vely, the results can be unintentionally destructive. I&#8217;d rather you had a framework for doing it constructively.</p></li><li><p>Fairness isn&#8217;t the point &#8212; usefulness is. Used appropriately &#8212; and not as a scorecard to punish offenders &#8212; an ROI model can be very useful.</p></li></ol><p>However, engineering ROI is more about the journey than the destination. Figuring out the right <em>questions</em> is of critical importance. The moment you start being explicit about ROI &#8212; and have deliberate conversations about it with your CEO, CFO and peers &#8212; you will naturally start aligning and optimising for ROI.</p><p>I have proposed two complementary formulae for measuring engineering ROI. But beware: the ability to <em>measure</em> ROI does not magically give you the ability to <em>generate</em> ROI &#8212; which is arguably far more important. The simplicity of the formulae hides the wealth of strategies, techniques and judgement calls that the CTO or VP of Engineering needs to employ in order to consistently deliver, demonstrate and boost ROI. That&#8217;s what I do with clients over a period of months.</p><p>Acting on the above ideas will stop &#8220;What is engineering&#8217;s ROI?&#8221; being a trap question that freezes you like a deer in headlights, and convert it into an opportunity for you to align incentives, focus your company&#8217;s roadmap, and defend the budgets you genuinely need. It&#8217;s how you&#8217;ll ensure that the value of your engineering organisation &#8212; with you at its head &#8212; becomes obvious to everyone in the room.</p><p>CTOs and Engineering VPs:</p><ul><li><p><a href="https://engineer-your-roi.carrd.co/?utm_medium=email&amp;utm_source=newsletter&amp;utm_campaign=roi&amp;utm_content=roi-article">Come to my next free online workshop</a> that gets you started immediately with practical steps for engineering your pathway to ROI.</p></li><li><p>Forward this article to your CEO and/or CFO to start aligning your joint ROI vision.</p></li></ul><p>CEOs and CFOs:</p><ul><li><p>Bring your CTO and work with me together, to design and implement your pathway to maximise your company&#8217;s engineering ROI. <a href="https://calendar.app.google/NBVAT1iVKwXpFif8A">Book a meeting</a>, or send me a message containing the phrase &#8220;ROI article&#8221; via <a href="https://www.linkedin.com/in/itzysabo/">my LinkedIn profile</a>.</p></li></ul><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>I discovered an unfortunate way to get obvious credit for such improvements. They need to happen routinely, and then a new CTO (me) comes in and undertakes successful efforts to reduce or prevent the damage.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Operating and maintaining the service supports existing customers, and is also obviously a prerequisite for onboarding new customers. New features could be needed in order to open up new market segments, or to appeal to a wider set of potential customers, but they might also help retain existing customers by keeping the service competitive.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>This is explicitly the <em>current</em> level of service your company has chosen to deliver, not the theoretical <em>minimum</em> sustainable level.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[How CTOs Leverage Strategy to Drive Business Outcomes]]></title><description><![CDATA[Strategy &#8212; it's the key to focusing on the right things, and it's simpler than people make out.]]></description><link>https://www.ctologic.pro/p/how-ctos-leverage-strategy-business-outcomes</link><guid isPermaLink="false">https://www.ctologic.pro/p/how-ctos-leverage-strategy-business-outcomes</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Wed, 19 Feb 2025 09:54:07 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/6c9c655a-88d8-4e87-8a73-5990bf58eb16_640x1138.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>The Core Problem You Solve</h2><p>At the highest level, your company has a goal, which can be to solve a problem, or a class of problems:</p><ul><li><p>People need to travel from A to B but don't have a car.</p></li><li><p>People want to invest but don't know how to start.</p></li><li><p>People want more books to read, but affordably.</p></li><li><p>People want/need a life partner.</p></li></ul><h2>Your Approach</h2><p>How will your company achieve this goal?</p><p>What is your <em>approach</em>?</p><p>As a single phrase.</p><p>&#8594; That's your Strategy.</p><p>Let's give it a capital S because it's the company's highest level strategy.</p><p>Effectively, this Strategy is who you want <em>to be</em> as a company.</p><ul><li><p>The easiest investment platform.</p></li><li><p>The taxi app that gets you there fastest.</p></li><li><p>The cheapest bookshop on the internet.</p></li><li><p>The only dating app that finds you normal people.</p></li></ul><p>That's not the level of strategy my CTO coachees need help with. We focus on one level below this:</p><h2>Business Goals &amp; Strategies</h2><p>Ideally, a company has business goals for the next quarter or year.</p><ul><li><p>Capture a 10% market share.</p></li><li><p>Break-even on unit economics.</p></li><li><p>Reach $1M annually recurring revenue (ARR).</p></li><li><p>Raise a financing round, based on $150 million valuation.</p></li></ul><p>There are many ways to achieve such goals, and each will have its own trade-offs. So the company's departments need to align on some agreed-upon strategies to achieve them. </p><p>In this context, a strategy is the chosen approach to achieving a common goal.</p><p>Example business strategies:</p><ul><li><p>Lower the subscription price (to capture more market share).</p></li><li><p>Increase advertising budgets (to increase paying customers).</p></li><li><p>Increase conversion and customer lifetime value (to break even).</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.ctologic.pro/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 CTO Logic! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Technology Initiatives</h2><p>Once we have a set of business strategies, the CTO's job is to figure out how to leverage the engineering department to support these strategies.</p><p>For each business strategy, the CTO may be able to identify and propose strategic technology initiatives that could support it, for example:</p><ul><li><p>Handle a higher volume of users.</p></li><li><p>Measure and improve time-to-activation. </p></li><li><p>Increase Google Page Speed Insights score of all landing pages.</p></li></ul><p>These initiatives involve identifying, controlling, and moving <em>technological levers</em> that control business outcomes.</p><p>Yes, CTOs can, and should, take responsibility for driving business outcomes! </p><h2>Free Workshop</h2><p>I'm hosting a free online workshop on 3 + 4 March to show SaaS CTOs/Engineering VPs how to drive strategic business outcomes, and how to get the C-Suite&#8217;s cooperation, too.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://ctograndmasters.carrd.co/?utm_campaign=Newsletter&amp;utm_source=Substack&amp;utm_medium=web&amp;utm_content=strategy-guide&quot;,&quot;text&quot;:&quot;Register for Workshop&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://ctograndmasters.carrd.co/?utm_campaign=Newsletter&amp;utm_source=Substack&amp;utm_medium=web&amp;utm_content=strategy-guide"><span>Register for Workshop</span></a></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[The True Cost of Custom Features: 3 Painful Taxes]]></title><description><![CDATA[That feature you built to help close a lucrative deal? &#8212; You lost money on it.]]></description><link>https://www.ctologic.pro/p/the-true-cost-of-custom-features</link><guid isPermaLink="false">https://www.ctologic.pro/p/the-true-cost-of-custom-features</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Thu, 05 Dec 2024 11:04:34 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/152607918/17c04e251a735a6c44b87c0ee6523522.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>That feature you built to help close a lucrative deal?</p><p>You lost money on it.</p><p>You didn't charge anywhere near enough.</p><p>Oh, you didn't even charge for it?!!</p><p>Did they they ever even use it?</p><p>Are they even still a customer?</p><h1>Here's why you lost</h1><p>Three major reasons: </p><h2>Future maintenance tax</h2><p>You factored in only the cost of <em>building</em> the feature.</p><p>But it's still costing you <em>every sprint</em> &#8212; because you have to make sure it didn't break.</p><p>You also need to keep it well maintained in line with the rest of your product.</p><h2>Complexity tax</h2><p>Complexity increases with each additional feature, so:</p><p><em><strong>Each new feature increases the cost of every future feature.</strong></em></p><p>For your product's <em>lifetime</em>, you've just made it slightly more time consuming and expensive to develop anything new.</p><h2>Opportunity costs</h2><p>Saying yes to these extra efforts meant saying no to adding features that will possibly drive high impact outcomes for your business. </p><h1>Recommendations</h1><ol><li><p>Charge a LOT more for doing "Customer Specials," or agree only to bring forward features that are already planned &#8212; but still charge extra for this. </p></li><li><p>Keep track of the percentage of your effort capacity you spend on "Customer Specials." Agree on a budget that you won't be pressured to exceed.</p></li><li><p>Instrument your product to measure feature usage, and get rid of unused features. (Sorry, I meant "retire" them.)</p></li></ol><p></p><p>P.S.<br>Are you a CTO, VP or Dir. of Engineering? &#8212; Can you imagine being able to focus every sprint on delivering high impact business outcomes?<br><br>&#128073; Reply to this email with the word "OUTCOMES".<br></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.ctologic.pro/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 CTO Logic! 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[The New CTO's Survival Guide: Rescuing a System at its Breaking Point]]></title><description><![CDATA[You've just stepped into your role as CTO, only to inherit a revenue-generating system that's gasping for air. With 3,000 daily active users pushing the infrastructure to its &#8212; or the team's &#8212; limits, what's your next move?]]></description><link>https://www.ctologic.pro/p/cto-survival-guide-rescuing-system-breaking-point</link><guid isPermaLink="false">https://www.ctologic.pro/p/cto-survival-guide-rescuing-system-breaking-point</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Tue, 19 Nov 2024 10:00:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!sU4v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17980c1-4a40-44bf-99d6-2659f3ce7d07_1600x1600.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As a newly hired CTO, you've inherited a system that is functioning well enough to generate meaningful monthly revenue, based on up to 3,000 daily active users.</p><p>With recent growth, many functions have been slowing down, and there are even occasional outages of various features. It looks like the system is functioning at maximum capacity, and all the engineering team can recommend is to "increase resources" or "increase the DB instance size" etc.</p><p>Basically, the development team cannot squeeze any more capacity from the system. This effectively means that the business cannot grow.</p><p><em>You got hired to rescue the company from this situation. The CEO and the other execs expect you to have all the answers. The clock is ticking ...</em></p><p>How would you approach this problem?</p><h2>A. Rewrite the system from scratch</h2><p>The current implementation is clearly and severely flawed from a scalability, reliability and resilience perspective. Despite this, rewriting the system from scratch is the wrong answer &#8212; in most situations.&nbsp;</p><p>During the rewrite, business growth, and product growth, will be frozen &#8212; making it an expensive option. Functioning businesses do not typically have the patience for such things.</p><p>The current solution has been trouble-shooted (trouble-shot?) enough to iron out the most egregious bugs and is functioning well enough to garner revenue. Rewriting it will create a whole new set of bugs and quirks that will have to be ironed out.</p><p>Thirdly, you'll need to migrate data from the old platform to the new one &#8212; which could be fraught with pain.&nbsp;</p><p>In summary: business growth will be frozen during the rewrite, after which there will be a turbulent period during the shakedown of the replacement platform.</p><h2>B. Buy time and show some quick wins by easing bottlenecks</h2><p>Analyse known problems, re-examine prior assumptions, and use your&nbsp; knowledge and experience to guide the team to implement quick (and sometimes dirty) fixes or "plasters". This way, you will very likely squeeze more capacity out of the system while getting more intimately familiar with it.&nbsp;</p><p>Showing some quick wins will also generate build confidence with the executive team, which you may need to rely on later.</p><p>These are examples of quick wins I have used successfully for significant results:</p><ul><li><p>Database Optimisation:</p><ul><li><p>Ensure suitable indexes are used for retrieval. (But not too many, which slows down inserts/updates.)</p></li><li><p>Identify and optimise slow queries.</p></li><li><p>Consider using read replicas for reporting / OLAP.</p></li><li><p>Where suitable, cache expensive query results using an in-memory cache such as Redis.</p></li></ul></li><li><p>Traffic Management:</p><ul><li><p>Use a content delivery network (CDN) such as Cloudflare to cache static files e.g. images and scripts.</p></li><li><p>Use a web application firewall (WAF) such as Cloudflare to filter out distributed denial of service (DDoS) bots.</p></li></ul></li><li><p>Networking Optimisation:</p><ul><li><p>Ensure that requests from one service to another are not routed through your cloud's public network interface.</p></li><li><p>Ensure that your service-to-service communications use connection pools with keep-alive.</p></li></ul></li></ul><p>You may also need to stoop to these "dirty" (but apparently effective) solutions:</p><ul><li><p>The dreaded "Increase resources" (RAM in DB machines, ...)</p></li><li><p>Scheduled rebooting of various resources that "get stuck," either prior to crashing, or which then go into "zombie mode."</p></li></ul><blockquote><p><em>What other quick win ideas have you used? &#8212; please comment below.</em></p></blockquote><p>Remember to <strong>measure the effect of the improvements</strong>, and their <strong>impact on core business metrics</strong>!</p><p>This option not a solution on its own. It supports incremental growth and buys you time to make a more informed choice about your next move.</p><p>By the way, there is also a non-technical bottleneck you may decide to solve at this stage: the team's skill level. They built the current system, and were failing at scaling it. You will likely want to upgrade the team's abilities by bringing in some more capable and experienced people.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.ctologic.pro/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 CTO Logic! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>C. Refactor or rewrite pieces of it gradually in stages</h2><p>The system is functioning and bringing in revenue. You'll have the luxury of being able to get immediate feedback on any modification you make.</p><p>You'll need to identify components that can be replaced without affecting the rest of the system. Even parts of existing components can be re-routed and replaced using an approach along the lines of Martin Fowler's <a href="https://martinfowler.com/bliki/StranglerFigApplication.html">strangler fig pattern</a>.</p><p>This approach seems slower than a complete rewrite, but it's far less risky, and has the added advantage of delivering improvements continually. It's definitely more "messy" than a rebuild, but in a true engineer's mind, there should be nothing more beautiful than a system that actually delivers &#8212; and it will continue delivering at every step of the way.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sU4v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17980c1-4a40-44bf-99d6-2659f3ce7d07_1600x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sU4v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17980c1-4a40-44bf-99d6-2659f3ce7d07_1600x1600.png 424w, https://substackcdn.com/image/fetch/$s_!sU4v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17980c1-4a40-44bf-99d6-2659f3ce7d07_1600x1600.png 848w, https://substackcdn.com/image/fetch/$s_!sU4v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17980c1-4a40-44bf-99d6-2659f3ce7d07_1600x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!sU4v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17980c1-4a40-44bf-99d6-2659f3ce7d07_1600x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sU4v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17980c1-4a40-44bf-99d6-2659f3ce7d07_1600x1600.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e17980c1-4a40-44bf-99d6-2659f3ce7d07_1600x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1103786,&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_!sU4v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17980c1-4a40-44bf-99d6-2659f3ce7d07_1600x1600.png 424w, https://substackcdn.com/image/fetch/$s_!sU4v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17980c1-4a40-44bf-99d6-2659f3ce7d07_1600x1600.png 848w, https://substackcdn.com/image/fetch/$s_!sU4v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17980c1-4a40-44bf-99d6-2659f3ce7d07_1600x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!sU4v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17980c1-4a40-44bf-99d6-2659f3ce7d07_1600x1600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://www.monkeyuser.com/2022/small-delights/?ref=comic">Small Delights</a>, Copyright Monkeyuser 2024, used with permission.</figcaption></figure></div><h2>Conclusion</h2><p>Freezing growth in favour of a complete rewrite is almost always the wrong answer  from a technical viewpoint, and is a complete non-option from a business perspective.</p><p>As you've probably guessed by now, my default approach, in situations akin to the idealised dilemma I presented, has been as follows:</p><ol><li><p>First: Buy time, and show some quick wins by easing bottlenecks.</p></li><li><p>Next: Refactor or rewrite pieces of it gradually in stages.</p></li></ol><blockquote><p><em>Have you been in a similar situation? How did you handle it? Please comment below.</em></p></blockquote>]]></content:encoded></item><item><title><![CDATA[The Dangers of Being Indispensable: A CTO’s Rescue Mission]]></title><description><![CDATA[When an irreplaceable leader left behind potential chaos, I stepped in and discovered two ways to be indispensable.]]></description><link>https://www.ctologic.pro/p/the-dangers-of-being-indispensable</link><guid isPermaLink="false">https://www.ctologic.pro/p/the-dangers-of-being-indispensable</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Tue, 12 Nov 2024 10:01:52 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/972e17be-22cc-449a-8f3c-cf0b07d62ba5_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This guy was indispensable. He kept resigning, but they couldn't let him leave.</p><p>Periodically, "Tom" would have a raging row with the CEO. And in a fit of anger and emotion, Tom would resign.</p><p>After calming down, the CEO would concede to one of his demands. Tom would back down, and continue for a little longer.</p><p>Eventually the CEO decided this couldn't continue. The next time Tom resigned in anger, it would be final.</p><p>Tom headed the company's core engineering group. 40 people. He was a talented technologist, but not such a gifted manager.</p><p>Tom was extremely dedicated to his job and his people. They loved him. He was intimately familiar with the minutest of details in every project. Nothing moved without his approval &#8212; he was involved in all decisions.&nbsp;</p><p>Extremely hands-on, he often did a lot of the challenging work himself. As you can imagine, he worked around the clock and hardly slept.</p><p>Anyhow, as you can guess, he had another row with the CEO. This time, the CEO was ready. He accepted Tom's resignation on the spot. There would be a price to pay, but the bill was due.</p><p>The CEO asked me to step in at short notice. My job would be to keep the department running smoothly ... without the only person who had seen the cover of the jigsaw box.</p><p>Challenge accepted!</p><p>CEO: "Oh, by the way, you need to fire 10 people by the end of the week &#8212; the department is too bloated. It costs too much and delivers too little."</p><p>Me, to myself: "As if I didn't already have a tough enough problem ..."</p><p>I said: "&#8217;Too bloated&#8217; <em>might</em> well be true. However, I'll know where any potential bloat is <em>only</em> once I've figured out these 5 things:</p><ol><li><p><strong>What business outcomes is the group expected to support?</strong></p></li><li><p>What is the group doing, and why?</p></li><li><p>In order to bring about the desired outcomes, what <em>should</em> the group be working on?</p></li><li><p>What is the appropriate size and structure needed in order to deliver the desired outcomes?</p></li><li><p>Who are the appropriate people with skills and domain knowledge that match the above size and structure?</p></li></ol><p>The CEO turned out to be right! But he needed me to pinpoint the reason, and then to fix it. I even ended up letting a few more than 10 people go.</p><p>During the first week I discovered things that blew my mind, such as:</p><ul><li><p>A 5-person team dedicated to projects that had no commercial benefit.</p></li><li><p>Excessively complicated solutions, requiring rare skills to develop and maintain.</p></li><li><p>No cross-team communication, coordination or collaboration &#8212; it had all gone through Tom.</p></li></ul><p>It took quite a few months to restructure and rebuild the department on a new set of values and behaviours.</p><p><em>Together,</em> we had to:</p><ul><li><p>Process the change in leadership, as well as understand and learn to accept the reason 13 people were fired.</p></li><li><p>Spark an environment of collaboration and teamwork, and boost employee morale. Changing an organisation's culture can be difficult, but in this instance they embraced it.</p></li><li><p>Discover and piece together operational knowledge that until then had been only in Tom's head.</p></li><li><p>Stabilise the high-maintenance operational environment &#8212; we worked systematically to reduce what was a constant stream of incidents, first to a slow trickle, and then down to to rare exceptions. This bought back time for uninterrupted and creative development, and this, too, boosted morale.</p></li></ul><p>Within 6 months, the organisation was unrecognisable. Mainly the same people, but with smiles on their faces &#8212; more capable, and shouldering more responsibility. And most importantly, driving outcomes with clear business value.</p><p>The group could now function smoothly without me; I had even trained my replacement. Yet I was considered indispensable, but in a <em>positive</em> way &#8212; my replacement moved into my spot, and I was promoted to become CTO.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.ctologic.pro/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 CTO Logic! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Conclusion</h2><p>Don't be indispensable. At least, not in the way Tom was. If they simply cannot manage without you, you become a single point of failure.</p><p>That can be an exhausting situation, which has further disadvantages:</p><ul><li><p>If you're indispensable, you can't be promoted.</p></li><li><p>You also can't be fired, but you'll be resented for it.</p></li><li><p>Nobody is indispensable forever &#8212; it's temporary. Single points of failure must be eliminated.</p></li></ul><p>The right way to be indispensable? &#8212; Be a catalyst for providing significant business value.</p><p>Be a CTO who thinks strategically; leverage your technical knowledge, product mindset and business acumen to collaborate with the other executives, and run engineering as a profit centre instead of a cost centre.</p><p>P.S. <br>Which of Tom's mistakes can you spot?</p><p>P.P.S. <br>As a manager, which of Tom's mistakes have you NOT made?</p><p>BTW:<br>Are you in Tom's predicament? &#8212; <a href="https://itzysabo.com/#cto-skills-sharpening">I'll help you fix it</a>.</p>]]></content:encoded></item><item><title><![CDATA[How a CTO's Strategic Questions Saved a Startup from Hell]]></title><description><![CDATA[Asking the right business questions prevented a fintech startup from getting trapped in a badly structured partnership deal.]]></description><link>https://www.ctologic.pro/p/cto-strategic-business-questions-saved-fintech-startup</link><guid isPermaLink="false">https://www.ctologic.pro/p/cto-strategic-business-questions-saved-fintech-startup</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Tue, 29 Oct 2024 07:44:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!zSTU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F738740c0-1004-4b6b-8113-15f1954de792_1600x866.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Me and my big mouth. My cheeky, but incisive, questions evaporated a lucrative opportunity for me.</p><p>I saved a company from <em>a ton</em> of trouble, though.</p><p>My potential client, a fintech platform startup, wanted help producing a heavily customised "white label" version of their app for a strategic partner.&nbsp;Two separate partners, actually. Both are prestigious brand names.&nbsp;</p><p>I take my hat off to them &#8212; amazing! But the client was blundering into a potentially problematic situation, and it couldn't end well unless I helped them change the parameters.&nbsp;</p><p>They approached me as a CTO, so they were surprised by my non-technical questions:</p><p>Me: <em>Are you charging these partners for the customised apps?</em></p><p>Client: <em>Yes, one of them agreed to pay 500K up front.</em></p><p>(So far, so good.)</p><p>Me: <em>How much will you be charging for routine maintenance?</em>&nbsp;</p><p>Client: <em>No need. We'll be making money from standard usage fees.</em></p><p>(Hmmm &#129300;)</p><h2>Analysis of the Situation</h2><p>Me: Let's think this through. You're essentially going to be <em>maintaining a portfolio of customised apps</em>, in addition to your core product.</p><ul><li><p><strong>Multiple front-end apps to maintain</strong> &#8212; Each app will need constant maintenance for the lifetime of the contract. You will need to keep the apps in sync with your back-end platform, as well as keep up with phone operating system versions, security standards and other environmental concerns. In addition, you'll need to implement and test all your standard new features on each customised app too.</p></li><li><p><strong>Slower evolution and iteration</strong> &#8212; Oh, but wait! Your product is new! It should naturally evolve fast, and radically. Your partners may insist on approving each change, which could slow you down.&nbsp;</p></li><li><p><strong>Multiple concurrent API versions</strong> &#8212; Having multiple front end apps could also mean that you'll have to support multiple API versions concurrently, which can add costly complexity.</p></li><li><p><strong>Core development costs increase</strong> &#8212; The cost, in manpower and time, of your <em>core</em> development will increase with each custom app and custom feature. This is because the quirks of each customised version have to be constantly taken into account, so that the core technology does not break them.</p></li></ul><h2>My Recommendations</h2><p>Your partners are marquee customers; they are powerful and influential brands, and will lend you significant sales-boosting credibility.&nbsp;</p><blockquote><p>The challenge here is to prevent your focus and attention being stolen away from your core product.</p></blockquote><p>Having handled such situations myself, I advise the following:<br><br>&#8594; Try and find a way to get your partners to use your standard app &#8212; maybe with some extremely light cross-branding.&nbsp;</p><p>But <em>if</em> you <em>must</em> white-label your app:</p><ol><li><p>Charge (or earn) enough money to fund <em>dedicated</em> product management, engineering, and support resources for the custom apps. I will estimate the costs for you and help you set it up.</p></li><li><p>Ensure that your contracts allow you plenty of leeway to keep the custom apps in sync with your core platform without approval delays. I'll be happy to work with your lawyers on this.</p></li></ol><p>Client: <em>Hmmm. I'll take this up internally and get back to you.</em></p><p>(A week passes.)</p><p>Client: <em>Our partners have agreed to use our standard app.</em><br><br>(&#128079;)</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.ctologic.pro/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 CTO Logic! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Parting Thoughts</h2><p>I gave free advice that made a potential client think, and it gave them the confidence to push back against strong partners.</p><p>I also saved them from hiring someone who would faithfully carry out their exact wishes. &#129318;&#8205;&#9794;&#65039;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zSTU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F738740c0-1004-4b6b-8113-15f1954de792_1600x866.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zSTU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F738740c0-1004-4b6b-8113-15f1954de792_1600x866.png 424w, https://substackcdn.com/image/fetch/$s_!zSTU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F738740c0-1004-4b6b-8113-15f1954de792_1600x866.png 848w, https://substackcdn.com/image/fetch/$s_!zSTU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F738740c0-1004-4b6b-8113-15f1954de792_1600x866.png 1272w, https://substackcdn.com/image/fetch/$s_!zSTU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F738740c0-1004-4b6b-8113-15f1954de792_1600x866.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zSTU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F738740c0-1004-4b6b-8113-15f1954de792_1600x866.png" width="1456" height="788" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/738740c0-1004-4b6b-8113-15f1954de792_1600x866.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:788,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Joy&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Joy" title="Joy" srcset="https://substackcdn.com/image/fetch/$s_!zSTU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F738740c0-1004-4b6b-8113-15f1954de792_1600x866.png 424w, https://substackcdn.com/image/fetch/$s_!zSTU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F738740c0-1004-4b6b-8113-15f1954de792_1600x866.png 848w, https://substackcdn.com/image/fetch/$s_!zSTU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F738740c0-1004-4b6b-8113-15f1954de792_1600x866.png 1272w, https://substackcdn.com/image/fetch/$s_!zSTU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F738740c0-1004-4b6b-8113-15f1954de792_1600x866.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://www.monkeyuser.com/2022/complexity/?ref=comic">Complexity</a>, Copyright Monkeyuser 2024, used with permission.</figcaption></figure></div><p>Am I foolish for evaporating this lucrative opportunity? Maybe &#8212; though in my mind it would have been unethical not to alert the client.</p><p>It is said that the best line of code is one that you don&#8217;t need to write. I am proud to have used my <em>technical</em> experience to recommend a <em>non</em>-technical way to solve a <em>business</em> problem. Examples such as this one capture much of the essence of being a CTO, which is first and foremost a <em>business-oriented</em> position.</p>]]></content:encoded></item><item><title><![CDATA[Agile + Scrum — a convenient fiction]]></title><description><![CDATA[Enabling agile software development in command-and-control style companies.]]></description><link>https://www.ctologic.pro/p/agile-scrum-a-convenient-fiction</link><guid isPermaLink="false">https://www.ctologic.pro/p/agile-scrum-a-convenient-fiction</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Wed, 09 Oct 2024 10:56:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c94072-f730-4fdd-8ca8-361009a91b78_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Agile + Scrum is a convenient fiction.</p><p>Software development is creative and non-deterministic, and is full of: </p><ul><li><p>known unknowns</p></li><li><p>unknown unknowns.</p></li></ul><p>Command-and-control-style ("C2") companies cannot handle that:</p><ul><li><p>Internal and external deadlines that must be met!</p></li><li><p>They must be in control of "What?" and "When?"</p></li><li><p>Plans are communicated down the hierarchy.</p></li><li><p>Progress is reported back up the ladder.</p></li></ul><h2>Agile software development</h2><p>Agile development follows a set of principles that guide software development to successful outcomes:</p><ul><li><p>Scope is not fixed.</p></li><li><p>Progress is incremental.</p></li><li><p>Teams are highly autonomous.</p></li><li><p>Experimentation is encouraged &#8212; </p></li><li><p>Even though most experiments fail.</p></li><li><p>Work is iterative; there is no "Do it right first time!"</p></li><li><p>Continuous feedback and adjustment eventually wins.</p></li></ul><p>There are at least 2 problems with this approach in C2 companies:</p><ol><li><p>Many CTOs fear appearing incapable without predictable control over the development process, which is inherently non-deterministic.</p></li><li><p>C2 companies cannot swallow Agile without choking.</p></li></ol><h2>Scrum as a wrapper</h2><p>Scrum is a framework that can be used as a wrapper for agile processes to make them palatable for C2 companies.</p><ul><li><p>Crisp, military cadence of sprints.</p></li><li><p>Metrics can be generated, tracked &amp; gamed.</p></li><li><p>Efficiency can be measured and misinterpreted.</p></li></ul><p>Scrum can make everything <em>appear</em> orderly and under control.</p><h2>The CTO as a buffer</h2><p>However, it does not have to be a complete illusion &#8212; Scrum is quite a fine method, if you have to use it.</p><p>There is an art to managing Scrum successfully to achieve good outcomes in a command-and-control company. </p><p>As a CTO or Engineering VP, you need to buffer the dissonance between the top-down diktats of executive management and the creative engineering process. </p><p>This means that the way you represent the process outwards is not the way it's experienced from the inside:</p><ul><li><p><strong>Outwardly</strong>, you deliver the outcomes the company needs, representing Engineering as a well-oiled and reliable input-output machine. </p></li><li><p><strong>Inwardly</strong>, your engineering organisation is an island of agility that is insulated from the command-and-control culture.</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.ctologic.pro/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 CTO Logic! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>How can a CTO or VP of Engineering do this?</h2><ul><li><p><strong>Interop API</strong> &#8212; Insulate the Engineering department from the command-and-control culture, allowing it to function in a truly agile way. Translate the top-down instructions into Scrum or Agile constructs, and vice-versa (see Bets).</p></li><li><p><strong>Alignment</strong> &#8212; use your leadership and communication skills to ensure that everyone is aligned, both within the Engineering department, and with other departments. Knowing what matters to other departments helps make better decisions at all levels.</p></li><li><p><strong>Bets</strong> &#8212; Call upon your experience to make reasonable bets about 1. the best direction to advance, and 2. what is likely to be delivered and by when. </p></li><li><p><strong>Risk Mitigation</strong> &#8212; Foresee, identify and monitor risks, and act early when things start going wrong.</p></li></ul><h3>Practical Advice</h3><p>For practical ideas about reducing the dissonance and risks in order to succeed with Scrum + Agile in a C2 organisation, see these 3 articles:</p><p></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;983e7acf-9fcc-45e3-af77-222cc075c6c0&quot;,&quot;caption&quot;:&quot;What company management need to know so that Agile can thrive.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Agile software development &#8212; 5 essential facts for startup CEOs&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:18876758,&quot;name&quot;:&quot;Itzy Sabo&quot;,&quot;bio&quot;:&quot;Fractional CTO &#8226; Engineering Management Expert &#8226; Coach &#8226; CTO x3 &#8226; Indie maker x2 &#8226; Built a fintech from 0 - &#8364;500M ADTV &#8226; Scaled a marketing platform to 9M MAU&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c4a445b-2253-45be-82f1-5e7365ac5869_612x612.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-11-01T11:12:23.000Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ac2f7b-7235-4747-90d7-96011554f3b3_1280x720.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://www.ctologic.pro/p/agile-software-development-5-essential-facts-for-startup-ceos-598563a3&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:142294299,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:3,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;CTO Logic&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c94072-f730-4fdd-8ca8-361009a91b78_512x512.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;a82da147-fabf-4244-89b5-c42237c82867&quot;,&quot;caption&quot;:&quot;How I have managed to keep sprint planning balanced.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Escape the Feature Factory trap using Business Impact Categories &amp; Budgets&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:18876758,&quot;name&quot;:&quot;Itzy Sabo&quot;,&quot;bio&quot;:&quot;Fractional CTO &#8226; Engineering Management Expert &#8226; Coach &#8226; CTO x3 &#8226; Indie maker x2 &#8226; Built a fintech from 0 - &#8364;500M ADTV &#8226; Scaled a marketing platform to 9M MAU&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c4a445b-2253-45be-82f1-5e7365ac5869_612x612.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-09-12T07:58:47.000Z&quot;,&quot;cover_image&quot;:null,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://www.ctologic.pro/p/escape-the-feature-factory-trap-to-unleash-exponential-value-f7f6a71b&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:142294290,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:3,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;CTO Logic&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c94072-f730-4fdd-8ca8-361009a91b78_512x512.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;4943f548-2920-4a97-9d64-84b886e7d27e&quot;,&quot;caption&quot;:&quot;If you have to use story points, this is how I've made them work for me.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;A Story about Points, with a Happy Ending&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:18876758,&quot;name&quot;:&quot;Itzy Sabo&quot;,&quot;bio&quot;:&quot;Fractional CTO &#8226; Engineering Management Expert &#8226; Coach &#8226; CTO x3 &#8226; Indie maker x2 &#8226; Built a fintech from 0 - &#8364;500M ADTV &#8226; Scaled a marketing platform to 9M MAU&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c4a445b-2253-45be-82f1-5e7365ac5869_612x612.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-05-10T08:15:38.000Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7921775-34d8-43bd-aba8-18e3fb4b5ea2_1280x720.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://www.ctologic.pro/p/a-story-about-points-with-a-happy-ending-ddec3fc5&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:142294301,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;CTO Logic&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c94072-f730-4fdd-8ca8-361009a91b78_512x512.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.ctologic.pro/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 CTO Logic! 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[How I align tech initiatives to business goals]]></title><description><![CDATA[A CTO's job is to align tech strategy with the company's business strategy. The most valuable part of my job is helping clients achieve this. This is how I do it.]]></description><link>https://www.ctologic.pro/p/how-i-align-tech-initiatives-to-business</link><guid isPermaLink="false">https://www.ctologic.pro/p/how-i-align-tech-initiatives-to-business</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Wed, 10 Jul 2024 06:01:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!h4t3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893e439e-41d8-4d45-87a0-396196de335d_1120x800.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There are 2 keys to aligning tech initiatives to business goals:</p><p>&#9989; 1st key: actually start with a <em>business</em> goal.</p><p>Let&#8217;s consider this business goal example:</p><div class="pullquote"><p>"Break even on our unit economics"</p></div><p>i.e. reach a situation where Customer Acquisition Cost (CAC) becomes lower than Customer Lifetime Value (LTV), i.e.</p><p>CAC &lt;= LTV</p><p>Strategies that could support this goal:</p><ol><li><p>Reduce CAC by 20%.</p></li><li><p>Increase LTV by 20%.</p></li></ol><blockquote><p>(Why 20% &#8212; no reason, but always define what to aim for.)&nbsp;</p></blockquote><p>2nd key: don't dive immediately into tech stuff; stay on the business side for a while &#8230;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!h4t3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893e439e-41d8-4d45-87a0-396196de335d_1120x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h4t3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893e439e-41d8-4d45-87a0-396196de335d_1120x800.png 424w, https://substackcdn.com/image/fetch/$s_!h4t3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893e439e-41d8-4d45-87a0-396196de335d_1120x800.png 848w, https://substackcdn.com/image/fetch/$s_!h4t3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893e439e-41d8-4d45-87a0-396196de335d_1120x800.png 1272w, https://substackcdn.com/image/fetch/$s_!h4t3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893e439e-41d8-4d45-87a0-396196de335d_1120x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!h4t3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893e439e-41d8-4d45-87a0-396196de335d_1120x800.png" width="1120" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/893e439e-41d8-4d45-87a0-396196de335d_1120x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1120,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:143228,&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_!h4t3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893e439e-41d8-4d45-87a0-396196de335d_1120x800.png 424w, https://substackcdn.com/image/fetch/$s_!h4t3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893e439e-41d8-4d45-87a0-396196de335d_1120x800.png 848w, https://substackcdn.com/image/fetch/$s_!h4t3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893e439e-41d8-4d45-87a0-396196de335d_1120x800.png 1272w, https://substackcdn.com/image/fetch/$s_!h4t3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893e439e-41d8-4d45-87a0-396196de335d_1120x800.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><h1>Product Metrics</h1><p>Before we jot down some relevant tech initiatives, let's consider some <em>leading</em> indicators that influence the above-mentioned <em>lagging</em> metrics, and are usually within the CTO's sphere of influence &#8212; at least partially. </p><p>We can usually influence leading indicators more directly, and they give us faster feedback.</p><ul><li><p><strong>Bounce Rate</strong> &#8212; % of visitors who ditch upon arrival.<br>Decreasing the bounce rate widens the top of the funnel, which should increase all of the numbers further down, i.e. potentially reduce the CAC.<br><br>Of course, the landing page content must speak for itself, and that is usually not a CTO thing. But technical factors can bounce visitors even before they've been exposed to your captivating copy.<br></p></li><li><p><strong>Registration Rate</strong> &#8212; % of visitors who sign up (trial or free version).</p><p>Increasing this value widens the middle of the funnel, and thus gives more people a chance to activate later on, i.e. potentially reduce the CAC.<br></p></li><li><p><strong>Activation Rate </strong>&amp;<strong> Time to Activation</strong> &#8212; % of registered users who perform a specific meaningful action that indicates they are benefiting from the product, and the average time it takes until they do it. The more people who succeed in using the product and who do so in less time, the lower the CAC (potentially).<br></p></li><li><p><strong>Subscription Rate</strong> &#8212; % of registered users who become paying customers.</p><p>Increasing the subscription rate reduces the CAC, because you're increasing the number of paying customers for the same ad spend.<br></p></li><li><p><strong>Sessions per Week/Month</strong> &#8212; The average number of times a registered user access the product. The subscription rate should rise with "stickiness", and so should lifetime value.<br></p></li><li><p><strong>Actions per Session</strong> &#8212; The average number of actions a registered user performs per session. The more useful the product, the higher the subscription rate, the lower the CAC and the higher the lifetime value.<br></p></li><li><p><strong>Referral Rate</strong> &#8212; % of registered users who refer the product to others. Each referred visitor is one we don't have to pay to bring, i.e. potentially reduces CAC.</p></li></ul><h1>Initiatives</h1><p>With the above metrics in mind, we can now propose some very focused tech initiatives that will move the relevant dials in the right directions.</p><h2>Initiatives that support "Reduce CAC by 20%"</h2><ol><li><p>Deploy an analytics tool and configure it to measure bounce rate, registration rate, etc.</p></li><li><p>Rework entry pages to achieve a Google Page Speed score above 90, in order to reduce the bounce rate.</p></li><li><p>Add social sign-up methods to increase registration rate.</p></li><li><p>Analyse, streamline and shorten user journeys that lead to activation.</p></li><li><p>Know who is an activated user and prompt activated users to subscribe.</p></li><li><p>Add a refer-a-friend feature; prompt and incentivise users to bring us more traffic.</p></li><li><p>Deploy a tool/service that automatically collects client-side error logs and reports, and act on them to increase the perception of quality and thus conversion and retention rates.</p></li></ol><h2>Initiatives that support "Increase LTV by 20%"</h2><p>Initiatives 1 and 7 (above) are relevant, as well as these:</p><ol><li><p>Email inactive subscribers and give them a compelling reason to log on.</p></li><li><p>Shorten user journeys, simplify actions and generally reduce friction, to increase the number of actions performed per session (and also the number of sessions).</p><p></p></li></ol><blockquote><p><em><strong>Did you notice?</strong></em></p><ul><li><p>Many of the above initiatives overlap with Product. </p></li><li><p>A good CTO understands product too.</p></li></ul></blockquote><h1>Wrapping Up</h1><ol><li><p>We took a business goal, </p></li><li><p>broke it down into strategies, </p></li><li><p>considered appropriate leading indicators (for early feedback), </p></li><li><p>and only then did we derive a list of supporting tech initiative candidates for selection.</p></li></ol><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.ctologic.pro/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 CTO Logic! 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[5 revealing questions for startup CEOs to assess their CTOs]]></title><description><![CDATA[These 5 litmus-test questions are designed to be highly indicative of problems, or to justify and even increase your confidence in your CTO.]]></description><link>https://www.ctologic.pro/p/5-revealing-questions-for-startup-ceo-cto</link><guid isPermaLink="false">https://www.ctologic.pro/p/5-revealing-questions-for-startup-ceo-cto</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Wed, 26 Jun 2024 06:06:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9mEd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eb92318-3c30-41df-afb8-c67c4e4c0ce1_1279x854.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The CTO may tell you it's difficult to measure engineering performance. "Trust me, I know what I'm doing," says the CTO.  And you feel you have no choice but to do just that.</p><p>These 5 non-technical questions are a litmus test.</p><p>They are not exhaustive, but they are designed either to be highly indicative of problems, or to justify, and even increase, your confidence in your CTO.</p><p>Note for CEOs: these questions are primarily for you to <em>ask yourself</em>, not the CTO. If you don't know, or cannot get the answer easily &#8212; that's a strong signal. These questions may naturally spark discussions with your CTO afterwards.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9mEd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eb92318-3c30-41df-afb8-c67c4e4c0ce1_1279x854.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9mEd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eb92318-3c30-41df-afb8-c67c4e4c0ce1_1279x854.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9mEd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eb92318-3c30-41df-afb8-c67c4e4c0ce1_1279x854.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9mEd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eb92318-3c30-41df-afb8-c67c4e4c0ce1_1279x854.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9mEd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eb92318-3c30-41df-afb8-c67c4e4c0ce1_1279x854.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9mEd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eb92318-3c30-41df-afb8-c67c4e4c0ce1_1279x854.jpeg" width="1279" height="854" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8eb92318-3c30-41df-afb8-c67c4e4c0ce1_1279x854.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:854,&quot;width&quot;:1279,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:124701,&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_!9mEd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eb92318-3c30-41df-afb8-c67c4e4c0ce1_1279x854.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9mEd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eb92318-3c30-41df-afb8-c67c4e4c0ce1_1279x854.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9mEd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eb92318-3c30-41df-afb8-c67c4e4c0ce1_1279x854.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9mEd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eb92318-3c30-41df-afb8-c67c4e4c0ce1_1279x854.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="pullquote"><p>1. How aligned is the CTO with your business goals?</p></div><ul><li><p>Can the CTO articulate their technology strategy?</p></li><li><p>Does it align with, and support, your business goals and long term vision?</p></li><li><p>Is the CTO aware of your North Star business metrics?</p></li><li><p>Can they tell you how engineering contributes to these?</p></li></ul><div class="pullquote"><p>2. Can your CTO bridge the gap between technical and non-technical teams?</p></div><ul><li><p>Can the CTO understand business concerns, and address them from a technical perspective?</p></li><li><p>Can they communicate complex technical concepts to non-technical stakeholders?</p></li></ul><div class="pullquote"><p>3. What technology stack is your business built on, and why?</p></div><ul><li><p>The selection of a technology stack can have a <a href="https://www.ctologic.pro/p/tech-decisions-can-bury-companies-3-examples-6af5a3af">significant impact on the business</a>.</p><ul><li><p>How was the decision made?</p></li><li><p>Were you consulted?</p></li></ul></li><li><p>What do you know about its architecture? Is it <a href="https://www.ctologic.pro/p/mircroservices-it-s-not-about-size-df87d686">microservices</a>? Why?</p></li><li><p>Which cloud services does your platform depend on?</p></li><li><p>What languages is it written in?</p></li><li><p>Your company's innovation is probably not the tech stack itself, so ensure that it is comprised of widely adopted components.</p></li><li><p>How easy is it to hire engineers with suitable expertise?</p><ul><li><p>How easy will it be in 3-5 years?</p></li></ul></li></ul><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.ctologic.pro/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 CTO Logic! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="pullquote"><p>4. What is engineering working on right now?</p></div><ul><li><p>Do you always know the answer to this question?</p></li><li><p>Can you look it up by yourself and get a coherent answer?</p></li><li><p>By the way, how does engineering know that these are the <em>right</em> things to work on?</p></li></ul><div class="pullquote"><p>5. How do you measure the engineering department&#8217;s performance?</p></div><p>"I have no clue how Engineering is performing." &#8212; many CEOs.</p><ul><li><p>There are lots of metrics, many of them useless or even counterproductive. Does your CTO know how to do it properly?</p></li><li><p>Do your CTO report the statistics to you, like Sales and Marketing do?</p></li><li><p>How long does it take to get a new feature into production?</p></li><li><p>What percentage of deployments break things, requiring immediate remediation?</p></li><li><p>What fraction of engineering resources are devoted to creating business value and moving the needle on your core metrics?</p><ul><li><p>Do they routinely move the needle as much as expected?</p></li></ul></li></ul>]]></content:encoded></item><item><title><![CDATA[Web Apps are Native Apps]]></title><description><![CDATA[Why native apps aren't necessarily your best option.]]></description><link>https://www.ctologic.pro/p/web-apps-are-native-apps</link><guid isPermaLink="false">https://www.ctologic.pro/p/web-apps-are-native-apps</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Wed, 03 Apr 2024 07:02:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!R_Gm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea794e1-9fbc-4ddf-8c28-42a0e188f96b_1328x1728.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The CEO said: </p><div class="pullquote"><p>"We need a native mobile app."</p></div><p>The software engineer heard:</p><p>&#8220;Build me:</p><ol><li><p>An iOS app, written in Swift;</p></li><li><p>An Android app, written in Kotlin;</p></li><li><p>And keep maintaining the web-based version of our app that is hosted on our website.&#8221;</p></li></ol><p>This probable miscommunication is underpinned by a fundamental misconception.</p><h1>What is a &#8220;Native&#8221; App?</h1><p>The CEO&#8217;s goal is most likely to have a downloadable, self-contained app that can be launched directly from the phone's home screen, in contrast with functionality that has to be accessed via a web browser. This app could be expected to make the user log-in using a face-print or fingerprint, and receive push notifications (for example). Such apps are typically downloadable from Apple's App Store and Google's Play Store &#8212; but this can be more of a hindrance than an advantage.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!R_Gm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea794e1-9fbc-4ddf-8c28-42a0e188f96b_1328x1728.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!R_Gm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea794e1-9fbc-4ddf-8c28-42a0e188f96b_1328x1728.png 424w, https://substackcdn.com/image/fetch/$s_!R_Gm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea794e1-9fbc-4ddf-8c28-42a0e188f96b_1328x1728.png 848w, https://substackcdn.com/image/fetch/$s_!R_Gm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea794e1-9fbc-4ddf-8c28-42a0e188f96b_1328x1728.png 1272w, https://substackcdn.com/image/fetch/$s_!R_Gm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea794e1-9fbc-4ddf-8c28-42a0e188f96b_1328x1728.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!R_Gm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea794e1-9fbc-4ddf-8c28-42a0e188f96b_1328x1728.png" width="1328" height="1728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4ea794e1-9fbc-4ddf-8c28-42a0e188f96b_1328x1728.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1728,&quot;width&quot;:1328,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:384047,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!R_Gm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea794e1-9fbc-4ddf-8c28-42a0e188f96b_1328x1728.png 424w, https://substackcdn.com/image/fetch/$s_!R_Gm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea794e1-9fbc-4ddf-8c28-42a0e188f96b_1328x1728.png 848w, https://substackcdn.com/image/fetch/$s_!R_Gm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea794e1-9fbc-4ddf-8c28-42a0e188f96b_1328x1728.png 1272w, https://substackcdn.com/image/fetch/$s_!R_Gm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea794e1-9fbc-4ddf-8c28-42a0e188f96b_1328x1728.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You don't actually need a native app for this &#8212; at least not in the strict technical meaning of &#8220;native&#8221;. To a software engineer, &#8220;native&#8221; means &#8220;integrates tightly and exclusively with a specific operating system and/or specific hardware.&#8221; Our CEO almost definitely did not intend this.</p><p>There is an additional option, that practically speaking, is just as native. <em>Native to the web.</em> Web-native apps leverage web technologies and can run smoothly and securely on any modern general purpose operating system and device. Such apps can be completely indistinguishable from classic native apps.</p><p>I have worked with numerous companies that automatically assume that apps made with web technologies cannot be as good as classic native apps, and they make the costly mistake of fragmenting their front-end technology stack.</p><p>In 80% of cases, web technologies are a perfect match for what a business needs. When used correctly, browser engines provide a fast user interface layer, and they have APIs that provide much of the hardware integration functionality that was once reserved exclusively for classic native apps. &nbsp;</p><p><em>Web technologies have graduated to become a set of standardised APIs provided by general purpose operating systems, that provide streamlined access to lower-level resources and hardware.</em></p><h1>Multiple Apps or One App &#8212; Which is Better?&nbsp;</h1><p>If you take the classically native approach, you&#8217;ll likely build and maintain multiple apps &#8212; one for each target platform. These apps all do exactly the same thing, but are re-written in different languages, using different tools. You will have multiple codebases to manage, and probably a separate engineer, or team, for each one. Good luck when you try to roll out new features in a synchronised manner. Each one will have its own peculiar customer support issues, too.</p><p>Using web technologies, you can <em>use a single family of technologies to build and maintain a single codebase</em> that requires fewer engineers. Not only is it cheaper to build apps using this approach, but it&#8217;s also more suited for subsequent maintenance because of the more limited competencies required.</p><p>The same web app can be deployed to all these target platforms:</p><ol><li><p>Web site</p></li><li><p>Progressive Web App (PWA) &#8212; a standalone web app, see below</p></li><li><p>iOS app, available in the App Store</p></li><li><p>Android app, available via the Play Store, or as a downloadable APK file</p></li><li><p>Windows desktop app</p></li><li><p>MacOS desktop app</p></li></ol><h1>What is a Progressive Web App?</h1><p>A Progressive<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> Web App (PWA) is a website that can put its launching icon on your phone&#8217;s home screen or your desktop&#8217;s dock or start menu, like any other app. When launched, it uses your browser&#8217;s underlying technology, but you don't necessarily see any of the browser&#8217;s &#8220;chrome&#8221;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> &#8212; user interface elements such as the address bar.&nbsp;</p><p>You may not even be able to distinguish between a PWA you installed from a website and an app you installed from the App Store. My desktop Gmail and Google Calendar apps happen to be PWAs. They launch from MacOS&#8217;s dock or Windows&#8217; taskbar into their own windows, which have no browser toolbar. Unlike individual browser tabs, they are each distinct entries in the series of apps I can cycle through using Command-Tab (MacOS) or Alt-Tab (Windows).</p><p>PWAs are far smaller in download size than corresponding&nbsp;classic native apps, and their updates can be instantaneous, too.</p><h2>Steve Jobs Makes the Case for Web Apps</h2><p>When the iPhone was launched in 2007, web apps were the <em>official</em> way to develop apps for the iPhone. Steve Jobs gave the best sales pitch for PWAs you&#8217;ll ever hear:</p><div id="youtube2-QvQ9JNm_qWc" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;QvQ9JNm_qWc&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/QvQ9JNm_qWc?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><blockquote><p>&#8220;You can write amazing Web 2.0 and AJAX<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a> apps that look exactly, and behave exactly like apps on the iPhone.&nbsp;</p><p>And these apps can integrate perfectly with iPhone services; they can make a call; they can send an email; they can look up a location on Google Maps.&nbsp;</p><p>After you write them, you have instant distribution. You don&#8217;t have to worry about distribution &#8212; just put them on your internet server. And they&#8217;re really easy to update &#8212; just change the code on your own server, rather than having to go through this really complex update process.&nbsp;</p><p>And they&#8217;re secure, with the same kind of security you&#8217;d use for transactions with Amazon or a bank. And they run securely on the iPhone, so that they don't compromise its reliability or security.&nbsp;</p><p>And guess what? &#8212; There&#8217;s no SDK<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a> that you need! You&#8217;ve got everything you need &#8212; if you know how to write apps &#8212; using the most modern web standards, to write amazing apps for the iPhone today.</p></blockquote><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.ctologic.pro/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.ctologic.pro/subscribe?"><span>Subscribe now</span></a></p><h2>What Can PWAs Do Today?</h2><p>PWAs can do most of the same things you expect from classic apps, for example:</p><ul><li><p>Install to the operating system's Home screen.</p></li><li><p>Authenticate users using the device&#8217;s biometric capabilities.</p></li><li><p>Use the device's camera and microphone.</p></li><li><p>Detect the device&#8217;s location using GPS.</p></li><li><p>Sense the device&#8217;s motion and orientation.</p></li><li><p>Receive push notifications, even when the app is not active.</p></li><li><p>Detect when the network is offline, and continue to function anyway.</p></li><li><p>Create and access data files that persist between usage sessions.</p></li><li><p>Make payments using pre-installed payment apps (Apple Pay / Google Pay).</p></li><li><p>Share data with other apps, using the operating system&#8217;s Share Sheet.</p></li><li><p>Establish real-time peer-to-peer communications (WebRTC).</p></li></ul><p>These important features and enhancements are supported on Android but not (yet) on iOS:</p><ul><li><p>Enable a first class PWA installation experience from your website, including detecting whether your PWA is already installed and the ability to provide custom prompts to help the user install it.</p></li><li><p>Register as a Share Target, i.e., appear on the Share Sheet as an app that can receive content that the user shares from other apps.</p></li><li><p>Perform various operations in the background when the app is not even running.</p></li><li><p>Register as a protocol handler &#8212; an app that can open specific types of links and file types.</p></li><li><p>Home screen icon context menus.</p></li><li><p>Interact with other devices via Bluetooth.</p></li><li><p>Read and write to NFC tags.</p></li><li><p>Prevent the screen from locking.</p></li><li><p>Speech recognition.</p></li></ul><p>You can find more details here:</p><ul><li><p><a href="https://whatpwacando.today/">What PWA Can Do Today</a> &#8212; install this web app on your device to discover and demonstrate your device&#8217;s supported capabilities.</p></li><li><p><a href="https://web.dev/learn/pwa/capabilities">PWA Capabilities</a> &#8212; a Google site for developers that thoroughly describes PWA capabilities.</p></li></ul><p>The good news is that if you need one of the missing capabilities, there is a generally accepted workaround:</p><h2>Deploying a PWA as a Hybrid App</h2><p>If your mobile app needs a capability that is not yet implemented, you can easily create what is known as a hybrid app using a &#8220;wrapper&#8221; such as <a href="https://capacitorjs.com/">Capacitor</a>. This creates a classic native app that encapsulates your web app, and also provides the missing functionality via available plugins. This approach will necessitate making your app available via Apple's app Store, and possibly Google's Play store, too.</p><p>On the desktop you have a variety of options such as <a href="https://www.electronjs.org/">Electron</a> and <a href="https://tauri.app/">Tauri</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.ctologic.pro/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 CTO Logic! 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><h1>App Stores are Cash Cows</h1><p>Since launching the iPhone in 2007, Apple has strayed far from Steve Jobs's vision for standards-based apps. Apple could apparently not resist the lucrative temptation of creating a walled garden in iOS for which Apple itself serves as the gatekeeper. Android follows a similar model, ostensibly because Google would otherwise be leaving money on the table.</p><p>Thankfully, the web as a free and standards-based platform predates smartphones. Imagine a world in which Apple and Google decided which websites were &#8220;safe&#8221; to view on your mobile phone. The site owners would pay registration fees, and the content would be reviewed for compliance with the gatekeepers&#8217; arbitrary policies. Any money changing hands would be automatically taxed by Apple or Google at 30%. You're almost there; Apple does exactly this with mobile apps. Google does this to a slightly lesser extent &#8212; Android allows you to permit installation of apps that don&#8217;t originate in Google&#8217;s Play Store, a method pejoratively termed &#8220;side-loading&#8221;.</p><p>Instead of expanding and deepening support for standards-based APIs, Apple and Google created platform-specific Software Development Kits (SDK) that allowed tight integration with each operating system. There are many benefits to this approach, but one of the trade-offs is reduced security and control. This conveniently necessitated that Apple and Google step in as gatekeepers in order to be able to evict bad actors &#8212; something they are <a href="https://9to5mac.com/2021/03/24/fleeceware-apps-have-earned-over-400-million-in-the-app-store-and-play-store-new-research-says/">notoriously bad at doing</a>. The revenues they command are in return for their efforts to &#8220;create a safe environment&#8221;.&nbsp;</p><h2>Revenue Model</h2><p>The <a href="https://developer.apple.com/programs/">Apple Developer Program</a> generates hundreds of millions of dollars in annual membership fees of $99 or $299, paid by companies and individuals who host apps in the App Store (&gt;2M apps). Google charges a one-time initial registration fee of $25.</p><p>In addition to this, Apple and Google charge up to 30% commission on sales of digital products and services. On iOS, apps <em>must</em> use Apple&#8217;s payment mechanism and are not allowed to link to an external website for processing payments. Google&#8217;s demands are not as strict, but they are in the same vein.</p><p>Out of <a href="https://techcrunch.com/2023/05/31/apple-touts-1-1-trillion-in-app-store-commerce-in-2022-with-104b-in-digital-sales/">$1.1 trillion billed by Apple App Store developers in 2022</a>, $109 billion was from in-app advertising and $104 billion from digital goods and services. Apple therefore reaps tens of billions of dollars in annual income from the App Store. Google&#8217;s figures are smaller, but are still in the same order of magnitude.</p><h1>Your Risks as a Vendor</h1><p>When you use an app store as vendor, you assume significant additional risks to your app distribution operation. You are giving a third-party gatekeeper the power and authority to:</p><ul><li><p>Decide whether and when you can publish your app.</p></li><li><p>Decide whether and when you can update your app.</p></li><li><p>Remove your app from the store.</p></li><li><p>Impose new rules or policies on your company and/or app.</p></li></ul><p>In order to publish an app, you need to create a vendor account first. This involves submitting personal identification documents and company registration details<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a>, as well as paying a fee.</p><p>After your account is approved, you need to request approval for your app. This can take a few weeks, even if there are no problems.</p><p>Subsequently, each update also needs to go through the approval process. Many hearts flutter during the waiting period because the different examiners don&#8217;t seem to interpret and apply the criteria in a consistent and predictable way, and there is no deadline.</p><p><em>Your app&#8217;s approval can also be summarily revoked at any time!</em> The most sensitive time for this is when you request approval for an update, because this triggers a fresh examination of your app.</p><p>Additionally, at any time, the gatekeeper can introduce an arbitrary rule that you then have to race to comply with, with little recourse to challenge or appeal it.</p><p>In short, you do not control the timeline of releases or updates, and your app&#8217;s distribution is constantly at risk. Admittedly, the probability of experiencing a business disruption may be low, but its impact will be very high if disaster strikes.</p><h1>Legal Challenges and Antitrust Regulation</h1><p>By keeping PWA support alive after their 180 degree turn towards the App Store business model, Apple was able to say that their App Store is not a monopoly because there is an alternative way to install apps. This is probably why Apple has continued to maintain a passable level of support for PWA features, even if there are some glaringly obvious and plausibly deliberate gaps.</p><p>However, the success of this approach seems to be waning in the face of increased legal challenges from corporations and government regulators, who assert that Apple and Google use their app stores to exert illegal monopolistic control over the app market.&nbsp;</p><p>Epic Games, makers of Fortnite, recently sued Apple and Google for operating illegal monopolies, in separate cases in the United States. <a href="https://www.theverge.com/24003500/epic-v-google-loss-apple-win-fortnite-trial-monopoly">Epic lost against Apple, but beat Google</a>. In the mid-market, smaller companies such as 37signals, makers of Basecamp and the HEY Email and Calendar products, are periodically <a href="https://world.hey.com/dhh/apple-rejects-the-hey-calendar-from-their-app-store-4316dc03">embroiled in David vs. Goliath skirmishes</a> against Apple&#8217;s monopolistic gatekeeping, but only massive companies such as Epic can afford the legal fees to take this fight to the courts. At the lower end of the market are small companies that feel they have no option other than simply to submit to the gatekeepers&#8217; heavy-handed directives.</p><p>Similar to Microsoft in the 1990s, Apple is increasingly falling afoul of antitrust regulators in the USA and Europe. Their strategy seems to be to drag things out for as long as possible, all the while raking in the revenue.</p><p>As if Steve Jobs&#8217;s sales pitch wasn&#8217;t enough, Apple recently signalled that it considers Progressive Web Apps a credible threat to their App Store revenue. In what appears to be malicious compliance with the European Union&#8217;s Digital Markets Act that forces gatekeepers to allow alternative app stores as well as alternative browser engines, <a href="https://developer.apple.com/support/dma-and-apps-in-the-eu#8">Apple announced the removal, in the EU, of PWA support</a> from the upcoming iOS 17.4 update. In response to <a href="https://open-web-advocacy.org/blog/its-official-apple-kills-web-apps-in-the-eu/">uproar from the app development community</a>, the EU&#8217;s <a href="https://www.theverge.com/2024/2/26/24083511/apple-eu-investigation-web-app-support">European Commission requested clarifications from Apple</a> prior to opening an investigation. This resulted in <a href="https://open-web-advocacy.org/blog/apple-backs-off-killing-web-apps/">Apple promptly backing down</a> from these plans.</p><p>In another saga, the US Department of Justice, along with 16 individual US states, has <a href="https://www.justice.gov/opa/pr/justice-department-sues-apple-monopolizing-smartphone-markets">sued Apple for illegal monopolisation of smartphone markets</a>, listing a whole slew of anticompetitive behaviours that &#8220;impose extraordinary costs on developers, businesses and consumers.&#8221;</p><p>This battle will take a few years to play out until the parties settle it or let the court decide. But the writing is on the wall: eventually, the anticompetitive behaviours will be stopped, either using current laws, or by enacting new ones, as is the case in Europe.</p><h1>Conclusion</h1><p>Whether to build a classic native app or a web-native app is not a purely technical decision &#8212; there are also significant business aspects to consider. Web-native apps are eminently viable, both functionally and technologically, as well as being a wise choice economically.&nbsp;</p><p>The app store model imposes numerous risks on app companies&#8217; distribution and revenues. App vendors should not follow the herd that accepts these risks as a given, but should instead apply rational judgement.</p><p>Apple&#8217;s and Google&#8217;s monopolistic behaviours confirm that Progressive Web Apps pose a credible threat to the app store ecosystem. The tide that is turning against gatekeeping monopolies ensures that Progressive Web Apps will be an increasingly viable alternative to classic native apps.</p><p>Progressive Web Apps deserve a bright future. They are based on a natural progression of the device- and vendor-independent protocols and standards that power the free web, such as HTTP, SSL, HTML, CSS, and Javascript. The level of support for Progressive Web Apps on the various platforms is allowing these platform-independent apps to become increasingly ubiquitous, if not the norm.</p><p>The best app store is the web!</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>The word &#8220;progressive&#8221; refers to <em>progressive enhancement</em>, which is an approach whereby web apps (and websites) automatically adjust their functionality to match differences in levels of support for various features and technologies across the different browser engines and devices.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>&nbsp;&#8220;Chrome&#8221; is a term that originates in automotive slang, and refers to showy features that don't contribute to performance. This generic usage of "chrome" pre-dates the Chrome browser by many years. See <a href="https://retrocomputing.stackexchange.com/questions/15615/where-did-the-the-term-chrome-referring-to-onscreen-decorations-originate">this discussion</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p><a href="https://en.wikipedia.org/wiki/Web_2.0">Web 2.0</a> and <a href="https://en.wikipedia.org/wiki/Ajax_(programming)">AJAX</a> refer collectively to what today are standard web technologies and approaches that no longer need special buzzwords.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>SDK = Software Development Kit</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p>From experience, it can be excessively challenging to set up and validate an Apple Developer Program account in a multi-national situation where the company is registered in a different country from where its director resides and/or the person setting up the account.&nbsp;</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[CTO Logic is booting up ...]]></title><description><![CDATA[A newsletter that opens a window into the mind of a software CTO.]]></description><link>https://www.ctologic.pro/p/cto-logic-is-booting-up</link><guid isPermaLink="false">https://www.ctologic.pro/p/cto-logic-is-booting-up</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Thu, 07 Mar 2024 06:44:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c94072-f730-4fdd-8ca8-361009a91b78_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Welcome to CTO Logic &#8212; a newsletter that opens a window into the mind of a software CTO.</p><div class="pullquote"><p>I write about <strong>how to operate professionally</strong> at the intersection of <strong>software engineering</strong>, <strong>tech management</strong>, <strong>leadership</strong> and <strong>business</strong>.</p></div><p>You'll get (FREE):</p><ul><li><p>Tips that are pragmatic, jargon-free and hard-earned.</p></li><li><p>Additional perspectives to those you see from your current position &#8212; if you&#8217;re technical, I&#8217;ll show you how the business side thinks, and vice-versa.</p></li><li><p>Explanations and decision rationales I wish I could have used to convince my bosses and stakeholders in the past.&nbsp;</p></li></ul><p></p><p>I'm not starting from scratch, though. For the past year, <a href="https://www.linkedin.com/comm/mynetwork/discovery-see-all?usecase=PEOPLE_FOLLOWS&amp;followMember=itzysabo">I've been writing daily on LinkedIn</a> and in addition, I have published quite a few stand-alone articles elsewhere.<br><br>These are the most popular articles (I&#8217;ve migrated them to this newsletter):</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;d629874f-5e71-4219-aea5-82342097f35e&quot;,&quot;caption&quot;:&quot;Software engineers love working on nice juicy problems, especially ones that are rich in CV-worthy buzzwords. It is a rare engineer that will admit: &#128161; Engineering for 99.5% uptime is more cost-effective than 99.99% for most startups! \&quot;But why shouldn&#8217;t my engineers strive for excellence?\&quot;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;How much uptime can I afford?&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:18876758,&quot;name&quot;:&quot;Itzy Sabo&quot;,&quot;bio&quot;:&quot;Fractional CTO &#8226; Engineering Management Expert &#8226; Coach &#8226; CTO x3 &#8226; Indie maker x2 &#8226; Built a fintech from 0 - &#8364;500M ADTV &#8226; Scaled a marketing platform to 9M MAU&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c4a445b-2253-45be-82f1-5e7365ac5869_612x612.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-01-10T08:09:39.000Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facfe2745-791e-42cb-baf3-f9dc385d47b4_1280x720.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://www.ctologic.pro/p/how-much-uptime-can-i-afford-3130e605&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:142294298,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;CTO Logic&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c94072-f730-4fdd-8ca8-361009a91b78_512x512.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;40e13796-027e-43c1-88f2-b8d68be1fa5e&quot;,&quot;caption&quot;:&quot;Problem Imagine that your product planning and software development priorities are tactical and feature-driven, rather than strategic. You have clever, capable and diligent product managers and software developers. They are sweating away with picks and shovels, steadily chipping away at your mountainous product backlog. Your department works like a well-o&#8230;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Escape the Feature Factory trap using Business Impact Categories &amp; Budgets&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:18876758,&quot;name&quot;:&quot;Itzy Sabo&quot;,&quot;bio&quot;:&quot;Fractional CTO &#8226; Engineering Management Expert &#8226; Coach &#8226; CTO x3 &#8226; Indie maker x2 &#8226; Built a fintech from 0 - &#8364;500M ADTV &#8226; Scaled a marketing platform to 9M MAU&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c4a445b-2253-45be-82f1-5e7365ac5869_612x612.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-09-12T07:58:47.000Z&quot;,&quot;cover_image&quot;:null,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://www.ctologic.pro/p/escape-the-feature-factory-trap-to-unleash-exponential-value-f7f6a71b&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:142294290,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;CTO Logic&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c94072-f730-4fdd-8ca8-361009a91b78_512x512.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;3c9d4d30-5d49-4146-a36d-f64d14fc5d5b&quot;,&quot;caption&quot;:&quot;Two things I bet you didn't know about Technical Debt: It can make you bankrupt. At least one type of technical debt is good. Technical Debt is a software engineering concept, and is defined as follows: Technical debt is is a measure of the amount of duct tape holding your system together, plus the amount of rust&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Technical Debt = Duct Tape + Rust&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:18876758,&quot;name&quot;:&quot;Itzy Sabo&quot;,&quot;bio&quot;:&quot;Fractional CTO &#8226; Engineering Management Expert &#8226; Coach &#8226; CTO x3 &#8226; Indie maker x2 &#8226; Built a fintech from 0 - &#8364;500M ADTV &#8226; Scaled a marketing platform to 9M MAU&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c4a445b-2253-45be-82f1-5e7365ac5869_612x612.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-07-25T09:16:16.000Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a93c99-29db-4636-82dc-023e94715ddd_1280x720.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://www.ctologic.pro/p/technical-debt-duct-tape-rust-27bf7096&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:142294304,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;CTO Logic&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c94072-f730-4fdd-8ca8-361009a91b78_512x512.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p></p><h2>Upcoming Articles</h2><p>Coming soon will be informative articles for people on both sides of the tech / business divide, on topics such as:</p><ul><li><p>My "<strong>&#8230;</strong> <strong>for CxOs</strong>" series, in which I show non-engineering executives exactly what they should know, and why they should care, about: GitHub, JIRA, Agile, technical debt etc.</p></li><li><p>Practical tips and advice for CTOs and engineering heads.</p></li><li><p>Advice for CEOs about how to get the best from their engineering organisations. (OK, it's mainly about what <em>not</em> to do.)</p></li><li><p>How to scale organisations &#8212; it's harder than scaling technology.</p></li></ul><div class="poll-embed" data-attrs="{&quot;id&quot;:153559}" data-component-name="PollToDOM"></div><h2>Thanks!</h2><p>I should have started this ages ago, and I want to thank <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Anton Zaides&quot;,&quot;id&quot;:121956618,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fa87af7-7089-4977-ab32-dbcae410c190_3847x3564.jpeg&quot;,&quot;uuid&quot;:&quot;4972c478-afd5-459b-95af-b21f6c1852f4&quot;}" data-component-name="MentionToDOM"></span>, author of <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Leading Developers&quot;,&quot;id&quot;:1804629,&quot;type&quot;:&quot;pub&quot;,&quot;url&quot;:&quot;https://open.substack.com/pub/zaidesanton&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a3706aa6-89dc-44a2-9dfc-9de6bb33c494_500x500.png&quot;,&quot;uuid&quot;:&quot;6a94965d-89c9-4be9-a54b-761d4abf007a&quot;}" data-component-name="MentionToDOM"></span>, for giving me the final push to accept Substack's invitation to get this newsletter up and running. Anton&#8217;s newsletter for engineering managers is packed with practical and thought-provoking tips and advice, and is peppered with personal anecdotes.<br><br>In addition, I&#8217;d like to recognise the following people for their inspiration, encouragement, and for setting an example I can only try to follow:</p><ul><li><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Nicola Ballotta&quot;,&quot;id&quot;:110306672,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a3ba97cd-df6a-4f7a-bdc1-ba537e467eaf_800x800.png&quot;,&quot;uuid&quot;:&quot;26b3e062-52eb-40c7-b91c-dcc28a4f1356&quot;}" data-component-name="MentionToDOM"></span> author of <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;The Hybrid Hacker&quot;,&quot;id&quot;:1319561,&quot;type&quot;:&quot;pub&quot;,&quot;url&quot;:&quot;https://open.substack.com/pub/hybridhacker&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/75097fc7-4f8b-422c-bf8b-786ce8fca550_500x500.png&quot;,&quot;uuid&quot;:&quot;f8654d19-e832-4d88-afc7-70344c0d2f0e&quot;}" data-component-name="MentionToDOM"></span> </p></li><li><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Adrian Stanek&quot;,&quot;id&quot;:169525424,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4214aa51-cec6-405d-8df9-5cfeff123168_2048x2048.jpeg&quot;,&quot;uuid&quot;:&quot;e938b760-5f9b-4a7a-b06b-1acefbb1e903&quot;}" data-component-name="MentionToDOM"></span>author of <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;snackableCTO&quot;,&quot;id&quot;:1957989,&quot;type&quot;:&quot;pub&quot;,&quot;url&quot;:&quot;https://open.substack.com/pub/snackablecto&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8cd57e61-56b1-4892-9a26-6081500dbbda_400x400.png&quot;,&quot;uuid&quot;:&quot;d1f41a50-c8b1-41ac-b697-607f0ead00fb&quot;}" data-component-name="MentionToDOM"></span> </p></li><li><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Denis &#268;ahuk&quot;,&quot;id&quot;:142079316,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F477a4af2-ffde-4a54-864b-3a844c997e6b_2976x2976.png&quot;,&quot;uuid&quot;:&quot;cf620324-75e2-4c7e-b6b8-b9d78ddf48fe&quot;}" data-component-name="MentionToDOM"></span>author of <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;&#128302; Crafting Tech Teams&quot;,&quot;id&quot;:1610520,&quot;type&quot;:&quot;pub&quot;,&quot;url&quot;:&quot;https://open.substack.com/pub/craftingtechteams&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8a4f8a7-af0b-4883-a185-9faf66579f77_500x500.png&quot;,&quot;uuid&quot;:&quot;ce510031-9e57-4123-abd7-beb66c4e6921&quot;}" data-component-name="MentionToDOM"></span> </p></li><li><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Gregor Ojstersek&quot;,&quot;id&quot;:106098672,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdbe0558-3b80-4d09-9925-34ff44ed066e_400x400.jpeg&quot;,&quot;uuid&quot;:&quot;5f720bea-6e40-4fb1-b590-218f39326775&quot;}" data-component-name="MentionToDOM"></span> author of <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Engineering Leadership&quot;,&quot;id&quot;:1115815,&quot;type&quot;:&quot;pub&quot;,&quot;url&quot;:&quot;https://open.substack.com/pub/gregorojstersek&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0845c094-23e3-40d0-86f3-d1ff19631211_317x317.png&quot;,&quot;uuid&quot;:&quot;4841667a-25d4-4031-9f2d-a1c6a3d16922&quot;}" data-component-name="MentionToDOM"></span> </p></li></ul><h2>And finally &#8230;</h2><p>Thank <strong>you</strong> for subscribing &#128071;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.ctologic.pro/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 CTO Logic! 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></p>]]></content:encoded></item><item><title><![CDATA[5 best practices to survive going viral]]></title><description><![CDATA[... and for resisting DDoS attacks.]]></description><link>https://www.ctologic.pro/p/5-best-practices-to-survive-going-viral-and-ddos-attacks-3106f508</link><guid isPermaLink="false">https://www.ctologic.pro/p/5-best-practices-to-survive-going-viral-and-ddos-attacks-3106f508</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Thu, 15 Feb 2024 08:20:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/498abfb0-0a37-4209-b319-b0757a718e4f_1276x1276.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>People are more concerned with scalability than resilience, yet distributed denial of service (DDoS) attacks are more common than going viral.</p><p>Either way, if you're unprepared, going viral is almost equivalent to suffering a DDoS attack. It will totally paralyse your infrastructure, costing you a lot of money and missed opportunities.</p><p>You wanted scalability? RESILIENCE is one of the prerequisites.</p><p>DDoS attacks are like the weather. You can't prevent them, but you can prepare. Make sure the roof doesn't leak. Wear multiple layers. And especially don't leave the front door open! Or the windows.</p><p>I have seen a pattern of clients who are "sophisticated" enough to use Kubernetes, but who still haven't implemented these simple best practices:</p><h2>1. Cache static content and serve it from a CDN.</h2><p>It's a waste to serve images and scripts from your back-end servers. Serve these using your cloud provider's content delivery network (CDN), e.g. Amazon CloudFront, or an external one such as Cloudflare.</p><p>Additional benefit: much snappier load-time for the end-users!</p><p>Additional details:&nbsp;</p><ol><li><p>You'll need to carefully tweak your HTTP headers to fine-tune the caching behaviour. You can get additional benefits from controlling the client-side browser cache too.</p></li><li><p>If your main HTML pages have to be generated dynamically per request, it's usually possible to rework things to make them static, with the dynamic component being generated on the client side.&nbsp;</p></li><li><p>Been there, done that: talk to me if you're having trouble with this.</p></li></ol><h2>2. Use domain names, not fixed IP addresses.</h2><ul><li><p>You won't be able to change your system's fixed IP addresses under fire.&nbsp;</p></li><li><p>Domain names and subdomains give you much more flexibility.</p></li><li><p>Assign different subdomains to customer-facing systems and back-office systems &#8212; see next. &nbsp;</p></li></ul><h2>3. Don't route internal requests through your public interface!</h2><p>When one back-end service makes a call to another, don't route the request through the public interface! Use <em>internal</em> addresses. Apart from being a necessary security practice, it prevents your internal requests from having to compete with incoming traffic.</p><h2>4. Use distinct infrastructure for handling customer-facing requests vs. back office systems.</h2><p>If all requests reach your system via a common route that isn't resilient, you won't have access to your back-office systems when your customer-facing systems are overloaded. Ensure that you don't have a single point of failure.</p><p>It's not just your access to your back-office: what about things like payment confirmations that arrive in the form of callbacks by 3rd party providers to your webhooks? You need to ensure that these will be totally unaffected by heavy loads on your customer-facing systems.</p><p>Also:</p><ul><li><p>Maintain and enforce a whitelist that controls which parties can trip your webhooks.&nbsp;</p></li></ul><h2>5. Use Cloudflare as your first line of defence.</h2><p>Pay attention to these features:</p><ul><li><p>I'm Under Attack Mode</p></li><li><p>Caching (see point 1 above)</p></li><li><p>Rate limiting (part of Web Application Firewall)</p></li></ul><h2>Conclusion</h2><p>Each of the above measures has a significant and independent impact, and they are almost free if you design them in from the beginning.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L8RT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fec211a-be10-4f43-9734-94644b1e4419_1276x1276.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L8RT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fec211a-be10-4f43-9734-94644b1e4419_1276x1276.png 424w, https://substackcdn.com/image/fetch/$s_!L8RT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fec211a-be10-4f43-9734-94644b1e4419_1276x1276.png 848w, https://substackcdn.com/image/fetch/$s_!L8RT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fec211a-be10-4f43-9734-94644b1e4419_1276x1276.png 1272w, https://substackcdn.com/image/fetch/$s_!L8RT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fec211a-be10-4f43-9734-94644b1e4419_1276x1276.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L8RT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fec211a-be10-4f43-9734-94644b1e4419_1276x1276.png" width="1276" height="1276" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3fec211a-be10-4f43-9734-94644b1e4419_1276x1276.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1276,&quot;width&quot;:1276,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:280269,&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_!L8RT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fec211a-be10-4f43-9734-94644b1e4419_1276x1276.png 424w, https://substackcdn.com/image/fetch/$s_!L8RT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fec211a-be10-4f43-9734-94644b1e4419_1276x1276.png 848w, https://substackcdn.com/image/fetch/$s_!L8RT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fec211a-be10-4f43-9734-94644b1e4419_1276x1276.png 1272w, https://substackcdn.com/image/fetch/$s_!L8RT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fec211a-be10-4f43-9734-94644b1e4419_1276x1276.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p>]]></content:encoded></item><item><title><![CDATA[How much uptime can I afford?]]></title><description><![CDATA[99.5% uptime is more cost-effective than 99.99% for most startups!]]></description><link>https://www.ctologic.pro/p/how-much-uptime-can-i-afford-3130e605</link><guid isPermaLink="false">https://www.ctologic.pro/p/how-much-uptime-can-i-afford-3130e605</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Wed, 10 Jan 2024 08:09:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facfe2745-791e-42cb-baf3-f9dc385d47b4_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Software engineers love working on nice juicy problems, especially ones that are rich in CV-worthy buzzwords. It is a rare engineer that will admit:</p><p>&#128161; Engineering for 99.5% uptime is <em>more cost-effective</em> than 99.99% for most startups!</p><h3><em><strong>"But why shouldn&#8217;t my engineers strive for excellence?"</strong></em></h3><p>Of course they should, but 99.99% guaranteed uptime cannot be achieved merely by doing things perfectly.&nbsp; For that level of reliability, your engineers need to do things <em>differently</em>. You'll need specialised architecture, redundant infrastructure, and streamlined operational and organisational procedures.</p><p>It's unlikely to be cost-effective, unless you do the calculations and prove to yourself that your case warrants it. Most businesses do not need 99.999% ("five-nines") uptime, or even 99.99% ("four-nines"). 99.5% ("two-and-a-half nines") uptime is very decent.<em>&nbsp;</em></p><h3><strong>What's the big deal?</strong></h3><p>&#128161; A system with 99.99% guaranteed uptime must be 50 times(!) as reliable as one with "only" 99.5%.</p><p>This is easier to see when you compare the amount of downtime allowed: 0.01% vs. 0.50%.</p><h3>How much does this cost?</h3><p>The cost of building and <em>operating</em> a system in a way that <em>guarantees</em> 99.99% uptime is several times as expensive as 99.5%. This is in terms of system complexity, the number of engineers required, their specialisations, experience levels, and corresponding salaries, as well as significantly increased operational costs and arrangements.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5nPm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facfe2745-791e-42cb-baf3-f9dc385d47b4_1280x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5nPm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facfe2745-791e-42cb-baf3-f9dc385d47b4_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!5nPm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facfe2745-791e-42cb-baf3-f9dc385d47b4_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!5nPm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facfe2745-791e-42cb-baf3-f9dc385d47b4_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!5nPm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facfe2745-791e-42cb-baf3-f9dc385d47b4_1280x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5nPm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facfe2745-791e-42cb-baf3-f9dc385d47b4_1280x720.png" width="728" height="409.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/acfe2745-791e-42cb-baf3-f9dc385d47b4_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:143164,&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_!5nPm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facfe2745-791e-42cb-baf3-f9dc385d47b4_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!5nPm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facfe2745-791e-42cb-baf3-f9dc385d47b4_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!5nPm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facfe2745-791e-42cb-baf3-f9dc385d47b4_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!5nPm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facfe2745-791e-42cb-baf3-f9dc385d47b4_1280x720.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>What level of reliability should I aim for?</h2><p>It's a <em>business</em> decision, not a technical one. Evaluate the effect of downtime on the <em>business</em> before even starting to discuss the technical implications.</p><h3>How much does an hour of downtime cost you?</h3><p>Ask yourself these questions:</p><ul><li><p>If you have an e-commerce platform, how much revenue (or dare I say it, profit) does it make per hour?</p></li><li><p>How much downtime can your customers tolerate?</p></li><li><p>How much damage will an hour of downtime do? This can be both due to direct loss of revenue and also&nbsp; due to eventual customer churn due to loss of trust.</p></li><li><p>Bonus question: are all hours of downtime equal, or are some hours less costly, such as weekends or after midnight?</p></li></ul><h3>How much downtime can you tolerate?</h3><p>These are the total downtimes you can expect for corresponding uptime guarantees:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yH9e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58559382-6b1c-4637-8ca6-760d356b9b8d_1408x410.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yH9e!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58559382-6b1c-4637-8ca6-760d356b9b8d_1408x410.png 424w, https://substackcdn.com/image/fetch/$s_!yH9e!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58559382-6b1c-4637-8ca6-760d356b9b8d_1408x410.png 848w, https://substackcdn.com/image/fetch/$s_!yH9e!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58559382-6b1c-4637-8ca6-760d356b9b8d_1408x410.png 1272w, https://substackcdn.com/image/fetch/$s_!yH9e!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58559382-6b1c-4637-8ca6-760d356b9b8d_1408x410.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yH9e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58559382-6b1c-4637-8ca6-760d356b9b8d_1408x410.png" width="1408" height="410" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/58559382-6b1c-4637-8ca6-760d356b9b8d_1408x410.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:410,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:125366,&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_!yH9e!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58559382-6b1c-4637-8ca6-760d356b9b8d_1408x410.png 424w, https://substackcdn.com/image/fetch/$s_!yH9e!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58559382-6b1c-4637-8ca6-760d356b9b8d_1408x410.png 848w, https://substackcdn.com/image/fetch/$s_!yH9e!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58559382-6b1c-4637-8ca6-760d356b9b8d_1408x410.png 1272w, https://substackcdn.com/image/fetch/$s_!yH9e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58559382-6b1c-4637-8ca6-760d356b9b8d_1408x410.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Operational &amp; Organisational Aspects</h2><p>The limitations on your uptime are most likely operational, not technical. You typically have a higher risk of downtime due to operational issues than due to technical problems. There may be fewer things that can go wrong, but when they do, it takes many hours to fix them.</p><p>Let's assume that a system &#8212; engineered for 99.99% guaranteed uptime &#8212; dropped from the sky into your lap. On a technological level, such a system will have redundancies to ensure that there are no single points of failure. However, single points of failure do not have to be technical; they can also be administrative.</p><p>&#128161; A credit card can be a single point of failure.</p><p>I have seen operational accounts frozen because a credit card went over its spending limit. How many hours will it take for you to first notice that there's a serious problem, identify that the cause is not technical, and then actually rectify it? A single such event will destroy your 99.99% uptime record.</p><ul><li><p>Are you organised to prevent such "unplanned administrative downtime"? It's not trivial, because you need to have <a href="https://drp.li/ItA8L">cross-departmental plans and procedures both to prevent, and to handle such events</a>.</p></li><li><p>Do you have a 24x7 rota of engineers?&nbsp;</p></li><li><p>Do you have monitoring and alerting that will activate your 24x7 support when an error rate threshold is crossed?&nbsp;</p></li></ul><p>Scheduled downtime for maintenance is an additional operational point to consider. Do you allow this at all? If you do, should it fit within the downtime parameters you allow yourself? What are the risks of it lasting longer than planned? The solution may be technical, but the decision is a business one.</p><h2>Infrastructure &amp; SaaS Provider Guarantees</h2><p><em>"The infrastructure I use guarantees 99.xx% uptime."</em></p><p>Let's unpack this sentence. Consider Amazon Web Services (AWS), for example.</p><ul><li><p><strong>Redundancy</strong> &#8212; <a href="https://aws.amazon.com/compute/sla/">Amazon's Service Level Agreement ("SLA") for EC2</a> specifies 99.5% uptime for a single machine instance. By running multiple redundant machines you can increase this, but what if the EC2 failure affects multiple machines?</p></li><li><p><strong>Availability zones = better redundancy</strong> &#8212; The answer is to have a redundant system running in at least one other "availability zone". Each zone is geographically separated, has an independent power supply, independent internet connection etc. Running two machines, one in each of two such independent availability zones, allows you to multiply the probabilities and get 99.75% uptime. In reality, Amazon's SLA actually specifies 99.99% for this combination.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p></li><li><p><strong>Downtime is </strong><em><strong>cumulative</strong></em><strong> across services</strong> &#8212; You'll use multiple different AWS services (e.g. EC2, ELB, S3, CloudFront). Each service's SLA specifies its own uptime. The downtime is cumulative from a probability standpoint. This means that even if you use four services, each having a 99.99% uptime SLA, you'll have a common uptime expectation of 99.96%.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> This is not "almost 99.99%" &#8212; it gives 4 times as much downtime! Therefore, if you are using multiple services, your cloud provider's uptime SLA for any one service should be considered to be an <em>upper limit</em> for your whole system.</p></li></ul><p>What "guarantee" means to you vs. cloud providers</p><p>In addition to the back-of-the-envelope maths above, we need to consider what is meant by the term "guarantee". You probably will <em>not</em> find this word in any service level agreement. Cloud providers promise to make "commercially reasonable efforts" to make their services available with a specified uptime percentage. If they don't meet this in a specific month, they agree (typically upon your <em>explicit request</em>) to deduct a pro-rated amount from your bill, corresponding to the duration of the outage or <a href="https://aws.amazon.com/legal/service-level-agreements/?aws-sla-cards.sort-by=item.additionalFields.serviceNameLower&amp;aws-sla-cards.sort-order=asc&amp;awsf.tech-category-filter=tech-category%23containers%7Ctech-category%23databases%7Ctech-category%23storage%7Ctech-category%23networking-content-dev%7Ctech-category%23compute">a fixed percentage based on the actual range of uptime they delivered</a>. The cloud providers do not reimburse you for your actual losses.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a> So based on your monthly spend, how much is a cloud provider's 99.99% SLA worth to you?</p><h3>Other providers in your SaaS supply chain</h3><p>Do you have other providers in your supply chain, such as GitHub, npm, and CircleCI? They might not be critical for production, but any problems there can delay deployment of a fix to production.</p><h3>Your own code must meet your uptime requirements too!</h3><p>Your own code runs on top of the infrastructure we discussed above. If you are aiming for 99.99%, your own code has to be part of this. Is your own QA and load testing thorough enough to guarantee 99.99% uptime of your own code, even without considering the reliability of the infrastructure layer?</p><h2>Wrapping Up</h2><ul><li><p>99.5% uptime is reasonably achievable without excessive costs and distractions. Anything more costs a lot more.</p></li><li><p>The good news is that if your own system is constructed well, your actual uptime will likely be significantly better than this, because the providers try to do better than what they promise. It's the guarantee that's expensive, not the typical result.</p></li><li><p>Each layer of your system needs to have a higher reliability, in isolation, than the final uptime you're aiming for, because error rates are cumulative.</p></li><li><p>Before spending a lot of money, time, and resources on development, <a href="https://drp.li/ItA8L">upgrade your operational capabilities and administrative procedures</a>.</p></li><li><p>If any individual measures (e.g. 24x7x365 on-call support) are not achievable, that doesn't mean you should give up. Do the best with what you can afford.</p></li><li><p>Hopefully you have gained a fresh perspective that will help you decide what you really need, and be conscious of where your real risks are.</p></li></ul><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>This would seem to indicate that internally they aim for higher reliability than they promise in their SLA.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>It's actually less than that for one availability zone, because the services are not independent.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>There's insurance for that; "downtime insurance" is a thing, apparently.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[Agile software development — 5 essential facts for startup CEOs]]></title><description><![CDATA[The 5 essentials that startup CEOs should know about Agile software development:]]></description><link>https://www.ctologic.pro/p/agile-software-development-5-essential-facts-for-startup-ceos-598563a3</link><guid isPermaLink="false">https://www.ctologic.pro/p/agile-software-development-5-essential-facts-for-startup-ceos-598563a3</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Wed, 01 Nov 2023 11:12:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ac2f7b-7235-4747-90d7-96011554f3b3_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The 5 essentials that startup CEOs should know about Agile software development:</p><p>(Test your CTO &#128521;)</p><h1>1. Real users are unpredictable and full of surprises.&nbsp;</h1><p>This is the <em>why</em> of Agile &#8212; the reason it exists.</p><p>You (CEO) are an expert in your industry.</p><p>You have used your unique insights to build a product.</p><p>But something unexpected happens when people see or use it.</p><ul><li><p>They can't work out how to use it.</p></li><li><p>It solves a problem they don't have.</p></li><li><p>It doesn't solve a problem they do have.</p></li><li><p>It solves their problem, but causes another.</p></li><li><p>It solves a problem that you didn't know about.</p></li><li><p>They don't want to use it the way you intended.</p></li><li><p>They love the idea of it, but never actually use it.</p></li><li><p>It does its job, but they hate it and can't explain why.</p></li></ul><p>OK, not all of these, but at least one.</p><p>Get over it &#8212; nobody has solved this yet.</p><p>But Agile is an effective workaround.</p><h1>2. You get more things right, faster, by taking small risks.&nbsp;</h1><p>Getting your product right first time is possible, but unlikely.</p><p>It's a large investment riding on single spin of a roulette wheel.</p><p>Instead, the Agile approach is to develop small slices of functionality, collect feedback, adjust and repeat. You make consistent incremental progress, using tight trial-and-error feedback cycles.</p><p>Smaller stakes, but multiple spins.</p><p>But unlike roulette, your knowledge of previous spins gives you an edge. &#128526;</p><h1>3. Prioritise face-to-face collaboration with stakeholders, and especially, real users.&nbsp;</h1><p>It is unlikely that you (CEO) know exactly what to build and how, because of point zero: "Real users are weird and unpredictable".</p><p>But you do have a vision. Share it with your product managers and engineers. They will collaborate (not just talk) with stakeholders, including Real Users&#8482;, and will figure out the best path to realising your vision &#8212; one small step at a time.</p><h1>4. Changes are expected and welcome at any time!</h1><p>Agile expects requirements to change constantly. However, I'm not referring to your (CEO) whims &#8212; I'm talking about changes that are based on real world feedback.</p><h1>5. Agile is challenging for many CEOs.</h1><p><strong>a. Autonomy &amp; Trust</strong></p><p>You'll need to entrust product managers and engineers with a high degree of decision-making autonomy (see point 3).</p><p><strong>b. Minimalism</strong></p><p>Agile has a minimalist perspective.</p><p>It can be tough to decide what NOT to do.</p><p>Or at least, what not to do YET.</p><p>If you just tested your CTO on the above, don't be too hard on them.</p><p>They might not have summed it up as casually as this, picking out only the bits that CEOs should know. (If they mentioned roulette, give them full marks, because they must have read this post.)</p><p>However, this is what I hope they told you:</p><h1>6. What problem does Agile solve?</h1><p>I once worked for a consulting firm that catered to large organizations. We spent weeks analysing a client's needs, then wrote a formal specification &#8212; a thick book. They signed it, and we spent months building the system. When development was complete, it slammed into its first real users. They would complain that it was out of date, or even useless. It took many further months to process and deliver formal change requests until the system became somewhat acceptable.</p><p>This process was too rigid and was highly resistant to changes in the specification.</p><p>Problems were discovered late, making them expensive to fix.</p><p>Such a processes have been dubbed "waterfall" &#8212; a linear sequence of steps that must be followed in order, to completion. Each step has a beginning and an end, and the output of one step is the input of the next.</p><p>In this case (simplifying): analysis &#8594; design &#8594; development &#8594; testing &#8594; deployment.</p><p>Waterfall works well for construction and manufacturing, but not for software development.</p><p>It is too expensive and inefficient in terms of effort, time and money, because we cannot get most software features "right" first time.</p><p>We need something that is less formal, more flexible, makes our inevitable mistakes cheaper, and suceeds faster.</p><p>In one word: "Agile".</p><h1>7. What is the essence of Agile?</h1><p>Agile is an iterative, cyclical process.</p><p>We reduce up-front investment to a minimum.</p><p>We also progress in small increments, which compound fast.</p><p>Agile's feedback loop is tight, measured in days / weeks, not months.</p><p>When we get something wrong, we find out early, and it's cheaper to fix.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BNyW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ac2f7b-7235-4747-90d7-96011554f3b3_1280x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BNyW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ac2f7b-7235-4747-90d7-96011554f3b3_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!BNyW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ac2f7b-7235-4747-90d7-96011554f3b3_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!BNyW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ac2f7b-7235-4747-90d7-96011554f3b3_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!BNyW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ac2f7b-7235-4747-90d7-96011554f3b3_1280x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BNyW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ac2f7b-7235-4747-90d7-96011554f3b3_1280x720.png" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/06ac2f7b-7235-4747-90d7-96011554f3b3_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:113405,&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_!BNyW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ac2f7b-7235-4747-90d7-96011554f3b3_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!BNyW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ac2f7b-7235-4747-90d7-96011554f3b3_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!BNyW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ac2f7b-7235-4747-90d7-96011554f3b3_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!BNyW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ac2f7b-7235-4747-90d7-96011554f3b3_1280x720.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">caption...</figcaption></figure></div><p>Agile prefers:</p><ul><li><p>Individuals and interactions over processes and tools</p></li><li><p>Working software over comprehensive documentation</p></li><li><p>Customer collaboration over contract negotiation</p></li><li><p>Responding to change over following a plan</p></li></ul><p>Key principles in Agile:</p><ul><li><p><strong>Cadence<br></strong>Deliver working software early, frequently, and at a constant, sustainable pace.<br></p></li><li><p><strong>Collaboration</strong></p><p>Software developers must collaborate face to face with business people.<br></p></li><li><p><strong>Autonomy</strong></p><p>Trust motivated people to get the job done, acting in highly autonomous teams.<br></p></li><li><p><strong>Reflection<br></strong>To increase the effectiveness of the process, reflect and adjust your behaviour at regular intervals.<br></p></li><li><p><strong>Progress<br></strong>The primary measure of progress is working software.<br></p></li><li><p><strong>Change<br></strong>Requirements will change &#8212; embrace this.</p><p></p></li><li><p><strong>Simplicity<br></strong>Maximise the work you decide <strong>not</strong> to do.</p><p></p></li><li><p><strong>Excellence</strong></p><p>Technical excellence and good design enhance agility.<br></p></li></ul><p>Some of these principles can be hard for management; others are challenging for engineers. But it's worthwhile to overcome the difficulties.</p><h1>8. Agile Vocabulary that you'll hear</h1><p>You'll hear these words &#8212; let me dispel any mystery that surrounds them:</p><p><strong>Scrum, Kanban</strong> &#8212; agile ways of organising software development work. (If your engineers are too insistent on dogmatic adherence to these mystical ideologies, send them to me.)</p><p><strong>Sprint</strong> &#8212; another name for an iteration or cycle. It's essentially a team-level unit of planning and execution.</p><p><strong>Story</strong> &#8212; describes a *tangible*, incremental unit of functionality that can be implemented and delivered independently.</p><p><strong>CI/CD</strong> &#8212; continuous integration and continuous deployment allow features to be deployed to production as soon as they are completed. (FYI Continuous Deployment is like teenage sex: everyone talks about it, but only a few know what they are doing.)</p><p><strong>Feature Flags</strong> &#8212; allow deployed features to be released in a controlled way to subsets of users, in order to gather feedback. With feature flags, <em>deployed</em> does not necessarily mean <em>released</em> -- that's a good thing!</p>]]></content:encoded></item><item><title><![CDATA[Escape the Feature Factory trap using Business Impact Categories & Budgets]]></title><description><![CDATA[Problem]]></description><link>https://www.ctologic.pro/p/escape-the-feature-factory-trap-to-unleash-exponential-value-f7f6a71b</link><guid isPermaLink="false">https://www.ctologic.pro/p/escape-the-feature-factory-trap-to-unleash-exponential-value-f7f6a71b</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Tue, 12 Sep 2023 07:58:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GkjY!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c94072-f730-4fdd-8ca8-361009a91b78_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Problem</h2><p>Imagine that your product planning and software development priorities are tactical and feature-driven, rather than strategic.</p><p>You have clever, capable and diligent product managers and software developers. They are sweating away with picks and shovels, steadily chipping away at your mountainous product backlog. Your department works like a well-oiled machine, processing tickets and delivering new features by the dozen, on time and to specification, consistently.</p><p>&#128161; You're running a <em>feature factory;</em> optimising for <em>output</em>, not <em>outcome</em>.</p><p>Factory assembly lines crank out identical units, each of which has an identical business value, which is also well-defined. It's a mistake to think of your software development operation in the same way, because:</p><ul><li><p>An assembly line optimises for <em>process efficiency</em>, not <em>product effectiveness</em>.</p></li><li><p>Different features can contribute wildly differing amounts of business value.</p></li><li><p>Features are not identical, so you invent arbitrary prioritisation criteria.</p></li><li><p>Most of your features will not improve any business metric.</p></li><li><p>Effort and profit are not directly related.</p></li></ul><p>The problem with a feature factory is that the focus is on fulfilling requests, rather than improving core business metrics. The constant stream of requests encourages you to optimise for <em>efficiency</em> rather than <em>effectiveness</em>. Insufficient consideration is given to the business value of the features being churned out.</p><h2>Solution</h2><p>The solution is to optimise the process to maximise business value. Business value needs to become a thread that runs throughout the whole process.&nbsp;</p><p>The essence of the solution is to clarify what the company wants to achieve, and then to allocate the bulk of the development budget towards that, and little else.</p><p>Make <em>business impact</em> the driving force behind everything you do, by adopting these principles:</p><ul><li><p><strong>Core metrics</strong>: tie as much work as possible to the company's core business metrics.</p></li><li><p><strong>Roadmaps</strong>: instead of detailed lists of features, express business outcomes that will be achieved and/or initiatives that the company will focus on.</p></li><li><p><strong>Prioritise</strong> work based on expected business impact, using the roadmap or core metrics.</p></li><li><p><strong>Budgets</strong>: keep different types of work within pre-determined <em>budgets</em>.</p></li><li><p><strong>Productivity</strong>: base your productivity metrics on business impact.</p></li></ul><p>These principles are simple to grasp. However, implementing them requires organisational finesse, patience and perseverance.</p><p>I'll provide a mechanical solution to get you started, but the major breakthrough will happen when you notice that your company's <em>mindset</em> has changed.</p><h2>How I Introduced Budgeting &#8212; the Trojan Horse Method</h2><p>An evolutionary approach usually beats a revolutionary one. However, when you look back after multiple steps, there's no question that a revolution has taken place. This is the story of how I quietly and gradually introduced a new way of thinking, without declaring a revolution.</p><p>We were a sales-led company. Some of our large customers routinely leveraged their size to convince us to implement special features for them. Such behaviour is a fact of life at many software companies.</p><p>I started tracking the development costs of these <em>Customer Specials</em> in each development cycle, and I made sure to keep management aware of both the direct costs and the opportunity costs.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><p>The amount of attention we were devoting to <em>Customer Specials</em>, and diverting away from the general customer base, seemed excessive. After a few cycles, it wasn&#8217;t a big leap to get management to agree to limit the effort we could expend on <em>Customer Specials</em> by allocating a specific effort budget.</p><p>&#128161; Yes, I slipped the word <em>budget</em> in quite deliberately. Executives are accustomed to budgets, although this use stretches the concept a little.</p><p>OK, I admit it &#8212; I've understated the problem somewhat. It wasn't just <em>Customer Specials &#8212;&nbsp; </em>my department had become a <em>feature factory</em> and our way of working needed a serious shake-up.</p><p>Once I had wedged open the door using <em>Customer Specials</em>, I widened the gap by sneaking in another 6 categories. Everything we did&nbsp; from that point onwards was assigned a <em>business impact category</em>.</p><p>Later, I took it yet another step further, and with the cooperation and active participation of the rest of the executive team, organised quarterly planning meetings &#8212; more on this below.</p><h2>The 7 Business Impact Categories&nbsp;</h2><p>I recommend adding a field to your issue tracking system, and/or tagging your issues using the following <em>business impact categories</em>:</p><ol><li><p><strong>Basics</strong><br>Features that are so basic that the product is not viable without them. New products will have these features; mature products won't.<br></p></li><li><p><strong>Incrementals</strong><br>Continuous improvements to existing features. You need these in order to retain your customers.<br></p></li><li><p><strong>Differentiators</strong><br>Unique features which distinguish your product from the competition. Alternatively, improvements which are game-changing by an order of magnitude. These are what the business needs to win!<br></p></li><li><p><strong>Speculative Bets</strong><br>Potential differentiators, but without any reliable evidence.<br></p></li><li><p><strong>Technological Foundation</strong><br>Infrastructure improvements for scalability, performance, reliability, maintainability, etc. This includes paying down <em>historical</em><a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> <a href="https://www.ctologic.pro/p/technical-debt-duct-tape-rust-27bf7096">technical debt</a>.<br></p></li><li><p><strong>Embarrassments</strong><br>Fixes for embarrassing mishaps that make the product or company look unprofessional (&#8220;broken windows&#8221;).<br></p></li><li><p><strong>Customer Specials</strong><br>Work done for a specific customer which you would not otherwise do, or at least not now.</p></li></ol><h2>How to Use the Business Impact Categories</h2><p>You can use the <em>business impact categories</em> in two independently useful ways: retrospectively and proactively.</p><ol><li><p>Analyse all the work that you've delivered recently.</p><p><br>How was effort distributed across your <em>business impact categories</em>?</p><p>How much effort did you waste on things that don't "move the needle"?</p><p><br>These results show how well your recent output reflects your company's business goals. If the results are not satisfactory, you can use them to get management buy-in to change the planning process so that it aligns with the company's goals &#8212; see next.<br></p></li><li><p>Use the <em>business impact categories</em> to align your plan with company business goals.</p><p><br>When planning, allocate an <em>effort budget </em>per<em> business impact category</em>, based on what it will take to achieve or support the company's business goals for that period. This can be done at multiple levels such as quarterly planning down to planning individual sprints.</p></li></ol><blockquote><p>In <a href="https://www.ctologic.pro/p/how-to-deliver-business-value-predictably-5fff0957">How to Deliver Business Value Predictably</a>, I referred to e<em>ffort budgets</em> as an advanced planning technique. To stretch the aviation metaphor I have been using, the <em>business impact categories</em> would be different "fuel tanks", designated for specific uses.</p></blockquote><h2>Initiatives</h2><p>In addition to the improved focus brought by <em>business impact categories</em>, you can define <em>initiatives</em> as a high level way to drive your planning.</p><p>Back to my story. After several months of working with <em>business impact categories,</em> we were ready for the next step: quarterly planning.</p><p>Rather than a typically useless presentation-fest, the company's executive management team and other key figures met with the product and engineering organisation for an intensive series of interactive discussions over a short two-day period.</p><p>During this time we aligned our departmental plans fully, and produced a list of <em>initiatives</em> that we would work on. Each <em>initiative</em> was allocated an <em>effort budget</em>, based on our teams' capacities, growth plans and hiring forecasts.</p><p>&#128526; For the first time, and from this point onwards, each engineer would be able to know exactly how s/he would be contributing to the company's goals.</p><p>Whether or not you do quarterly planning, and regardless of the method you use, you should decide on a periodic basis:</p><ul><li><p>What <em>business</em> problems does the company want to solve?</p></li><li><p>Which <em>business</em> metrics does the company want to improve?</p></li><li><p>What is it <em>worth</em> to the company to achieve each of these these goals?&nbsp;</p></li><li><p>How many people and how much time can the company afford to <em>dedicate</em> to each?</p></li></ul><p>Think in terms of <em>initiatives</em> rather than features. Decide how much attention you would like to give to each <em>initiative</em> &#8212; this will be its <em>effort budget</em>.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a></p><p>Features should be invented to serve specific <em>initiatives</em> and their goals. They should then be sliced and worked on within the <em>effort budgets</em>. Later, you'll be able to measure their success against those goals, too.</p><h2>Initiatives vs. Impact Categories</h2><p>We started with <em>business impact categories</em>, and then graduated to <em>initiatives</em>. Does this mean we no longer need those <em>business impact categories</em>?</p><p><em>Initiatives</em> and <em>business impact categories</em> can be used independently of each other. They can also both be used at the same time, because they are orthogonal to each other.</p><p>If you have graduated to <em>initiatives</em>, I still recommend using <em>business impact categories</em> to ensure that you are balancing the different types of work, and are not starving some types of activity.</p><h2>Recommendations</h2><ol><li><p>Allocate as much effort as possible to Differentiators.</p></li><li><p>Next come Incrementals.</p></li><li><p>Labelling your Speculative Bets will help you ensure that you make enough of them to succeed, but also keep them within sane levels. Don't expect more than a 15% success rate for these.</p></li><li><p>Customer Specials and Embarrassments should ideally need zero attention. Good luck with that.</p></li><li><p>Allocate a fixed budget for Tech Foundation. It depends on the maturity of your platform, but I would suggest anchoring your opening bid at 25%.</p></li></ol><p></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>There is also a third type of cost to adding features: the larger and more complex your product, the more expensive it is to make further changes.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Historical technical debt is the "bad" kind of technical debt that <a href="https://www.ctologic.pro/p/technical-debt-duct-tape-rust-27bf7096">accumulates like rust</a>. The "good" kind of technical debt is temporarily incurred when you implement an experimental feature. If it works, you pay back the debt in the next cycle. If the experiment fails, you remove the feature, and its debt.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>You'll need to know what your total capacity is for this; step 1 above will give you the answer. <a href="https://www.ctologic.pro/p/how-to-deliver-business-value-predictably-5fff0957">How to deliver business value predictably</a> discusses how to do this in more detail.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[Does your Company have a Think-first Culture?]]></title><description><![CDATA[7 reasons to prioritise writing in your company culture:]]></description><link>https://www.ctologic.pro/p/does-your-company-have-a-think-first-culture-733a6b77</link><guid isPermaLink="false">https://www.ctologic.pro/p/does-your-company-have-a-think-first-culture-733a6b77</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Thu, 17 Aug 2023 07:56:36 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2467fb80-4212-457c-ba26-c543b804a444_1328x788.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>7 reasons to prioritise writing in your company culture:</p><ul><li><p>Deeper work</p></li><li><p>Fewer meetings</p></li><li><p>Fewer interruptions</p></li><li><p>Increased productivity</p></li><li><p>Self-sufficient employees</p></li><li><p>High quality decision-making</p></li></ul><p>These are achieved through:&nbsp;</p><ul><li><p>Clear, written communications.</p></li></ul><p>Is your time valuable? So is everyone else's.</p><p>&#128161; Writing-centric organisations cultivate a consciousness that everyone's time is valuable.</p><p>By prioritising writing, you <strong>prioritise thinking</strong>.</p><p>Clarity &#8212; Requires you to think and organise your thoughts.</p><p>Consistency &#8212; Writing tells everyone *exactly* the same thing.</p><p>Thoroughness &#8212; Helps communicate while raising fewer questions.</p><p>Being a "writing-first" organisation does not mean writing-<em>only</em>.</p><p>But it does mean investing in the written word, wherever possible.</p><p>And I don't mean monosyllabic one-liners in Slack!</p><p>Writing-first organisations tend to look like this:</p><p><strong>&#128198; Fewer meetings</strong></p><ul><li><p>Meetings are focused and productive.&nbsp;</p></li><li><p>Meetings have written agendas and clear goals.</p></li><li><p>No meetings just for &#8220;status updates&#8221; that should be emails or group posts instead.&nbsp;</p></li></ul><p><strong>&#128165; Fewer interruptions</strong>&nbsp;</p><ul><li><p>Read messages and documents at *your* convenience.</p></li><li><p>Give people documents instead of private lessons.</p></li><li><p>You don&#8217;t have to answer questions continually.</p></li><li><p>You don't have to wait constantly for answers.</p></li><li><p>Get all the pertinent information in one shot.</p></li></ul><p><strong>&#128105;&#8205;&#9878;&#65039; Quality decisions</strong></p><ul><li><p>Decisions are based on thoughtful analyses and written arguments, rather than heat-of-the-moment emotions, or shoot-from-the-hip ideas.</p></li><li><p>Decisions are written down, along with the rationale behind them. This makes them easier to communicate clearly. (Some might not view that as a good thing, but this also enables decisions to be revisited later. Many times I have wracked my brains why a decision sounded good at the time.)</p></li></ul><p><strong>&#129300; Deep Work</strong></p><ul><li><p>Fewer meetings + fewer interruptions &#8594; Deep Work</p></li><li><p>Deep work in a state of flow is where breakthroughs happen. Every interruption or switch of context requires another 20+ minutes of concentration just to get back in "the zone".</p></li></ul><p><strong>&#128196; Documented procedures</strong>&nbsp;</p><ul><li><p>Procedures are documented, and don't just exist in some people's heads.</p></li><li><p>Everything is searchable and discoverable.</p></li></ul><p><strong>&#128378; Independent, self-sufficient employees</strong></p><ul><li><p>Well written and comprehensive documentation allows present and future employees to become more self-sufficient, quicker.</p></li><li><p>Knowledge is democratised across the organisation. This is a double-win, because anyone can contribute too.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://world.hey.com/itzy/733a6b77/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2Z6L3hwSSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--4a900981d2058dbc7e75c5841eb001cae181bb50/image.png?disposition=attachment" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!umg4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8da1bb2c-b2f9-4fce-8b2f-49bb0ec81412_1328x788.png 424w, https://substackcdn.com/image/fetch/$s_!umg4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8da1bb2c-b2f9-4fce-8b2f-49bb0ec81412_1328x788.png 848w, https://substackcdn.com/image/fetch/$s_!umg4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8da1bb2c-b2f9-4fce-8b2f-49bb0ec81412_1328x788.png 1272w, https://substackcdn.com/image/fetch/$s_!umg4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8da1bb2c-b2f9-4fce-8b2f-49bb0ec81412_1328x788.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!umg4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8da1bb2c-b2f9-4fce-8b2f-49bb0ec81412_1328x788.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8da1bb2c-b2f9-4fce-8b2f-49bb0ec81412_1328x788.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;image.png&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://world.hey.com/itzy/733a6b77/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2Z6L3hwSSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--4a900981d2058dbc7e75c5841eb001cae181bb50/image.png?disposition=attachment&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="image.png" title="image.png" srcset="https://substackcdn.com/image/fetch/$s_!umg4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8da1bb2c-b2f9-4fce-8b2f-49bb0ec81412_1328x788.png 424w, https://substackcdn.com/image/fetch/$s_!umg4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8da1bb2c-b2f9-4fce-8b2f-49bb0ec81412_1328x788.png 848w, https://substackcdn.com/image/fetch/$s_!umg4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8da1bb2c-b2f9-4fce-8b2f-49bb0ec81412_1328x788.png 1272w, https://substackcdn.com/image/fetch/$s_!umg4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8da1bb2c-b2f9-4fce-8b2f-49bb0ec81412_1328x788.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Q: Why is this graph exponential and not linear?</p><p>A: Because of Aha! moments and breakthroughs that become more common as <em>more people think more deeply, more often</em>.</p><h1>Things you can do today:</h1><p>&#128073; When writing an email or document, consider:</p><ul><li><p>How will this piece of writing be used?&nbsp;</p></li><li><p>What questions might people ask?</p></li><li><p>What are the main takeaways?&nbsp;</p></li><li><p>Who is the target audience?</p></li><li><p>What is the main goal?&nbsp;</p></li></ul><p>&#128073; If appropriate, share an online document in preference to writing everything in an email.&nbsp;</p><ul><li><p>Shared documents are easier to comment on.&nbsp;</p></li><li><p>Additional participants can be added without having to forward them long email chains.&nbsp;</p></li><li><p>New employees will automatically gain access.</p></li></ul><p>&#128073; When scheduling a meeting, share its purpose and agenda.</p><p>&#128073; Reject meeting invitations that don't make these clear.</p><p>If you have influence over the systems you use:</p><p>&#128073; Use a shared knowledge management system, e.g. Notion, Nuclino, Confluence, ...</p><p>If you have influence over the hiring process:</p><p>&#128073; Test candidates' written communication skills during the recruiting process.</p>]]></content:encoded></item><item><title><![CDATA[85% of New Features FAIL & Feature Cost Inflation]]></title><description><![CDATA[85% of new features fail &#8212; in the best companies.]]></description><link>https://www.ctologic.pro/p/85-of-new-features-fail-feature-cost-inflation-287ca167</link><guid isPermaLink="false">https://www.ctologic.pro/p/85-of-new-features-fail-feature-cost-inflation-287ca167</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Tue, 25 Jul 2023 09:55:03 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/9ef99f09-3481-439b-abc0-ecb43aed6443_1328x788.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>85% of new features <strong>fail</strong> &#8212; in the <strong>best</strong> companies.</p><p>Most of us are wrong, most of the time.</p><p>It's just the nature of the beast.</p><p>This makes what I have to say next much worse.</p><p>Another rule, which I discovered when managing a feature factory:</p><p>&#128161; <em>Each feature you add to a product increases the cost of every subsequent feature.</em></p><p>Yes, each newer feature will take <em>more</em> people, <em>longer</em> to build. &#128561;</p><p>That feature you added just to close a deal? &#8212; It made all future features more expensive, so I doubt you charged enough for it!</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://world.hey.com/itzy/287ca167/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2NzUVlkTiIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--5b1249e4a6c59ee11ac285df88357401402ba388/incremental-feature-cost.png?disposition=attachment" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_YxF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c2d52e-a26e-43d0-9215-acd4fce83bac_1328x788.png 424w, https://substackcdn.com/image/fetch/$s_!_YxF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c2d52e-a26e-43d0-9215-acd4fce83bac_1328x788.png 848w, https://substackcdn.com/image/fetch/$s_!_YxF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c2d52e-a26e-43d0-9215-acd4fce83bac_1328x788.png 1272w, https://substackcdn.com/image/fetch/$s_!_YxF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c2d52e-a26e-43d0-9215-acd4fce83bac_1328x788.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_YxF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c2d52e-a26e-43d0-9215-acd4fce83bac_1328x788.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/94c2d52e-a26e-43d0-9215-acd4fce83bac_1328x788.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;incremental-feature-cost.png&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://world.hey.com/itzy/287ca167/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2NzUVlkTiIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--5b1249e4a6c59ee11ac285df88357401402ba388/incremental-feature-cost.png?disposition=attachment&quot;,&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="incremental-feature-cost.png" title="incremental-feature-cost.png" srcset="https://substackcdn.com/image/fetch/$s_!_YxF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c2d52e-a26e-43d0-9215-acd4fce83bac_1328x788.png 424w, https://substackcdn.com/image/fetch/$s_!_YxF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c2d52e-a26e-43d0-9215-acd4fce83bac_1328x788.png 848w, https://substackcdn.com/image/fetch/$s_!_YxF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c2d52e-a26e-43d0-9215-acd4fce83bac_1328x788.png 1272w, https://substackcdn.com/image/fetch/$s_!_YxF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c2d52e-a26e-43d0-9215-acd4fce83bac_1328x788.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>You've heard of these 2 types of software development costs:</p><p>1. Direct costs (people x time x salaries)</p><p>2. Opportunity costs &#8212; saying yes to one thing means saying no to other possibilities.</p><p>Above, we just met a third cost, and it's hidden:</p><p>3. Complexity cost</p><p>Complexity cost is NOT another name for technical debt! That's the fourth type of cost, also hidden.</p><p>This article goes into detail on tech debt:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;24f1f82d-14b4-4fe6-9dfb-736197a90512&quot;,&quot;caption&quot;:&quot;Two things I bet you didn't know about Technical Debt: It can make you bankrupt. At least one type of technical debt is good. Technical Debt is a software engineering concept, and is defined as follows: Technical debt is is a measure of the amount of duct tape holding your system together, plus the amount of rust&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Technical Debt = Duct Tape + Rust&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:18876758,&quot;name&quot;:&quot;Itzy Sabo&quot;,&quot;bio&quot;:&quot;Fractional CTO &#8226; Engineering Management Expert &#8226; Coach &#8226; Troubleshooter &#8226; CTO x3 &#8226; Indie maker x2 &#8226; Built a fintech from 0 - &#8364;500M ADTV &#8226; Scaled a marketing platform to 9M MAU&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c4a445b-2253-45be-82f1-5e7365ac5869_612x612.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-07-25T09:16:16.000Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a93c99-29db-4636-82dc-023e94715ddd_1280x720.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://www.ctologic.pro/p/technical-debt-duct-tape-rust-27bf7096&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:142294304,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;CTO Logic&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c94072-f730-4fdd-8ca8-361009a91b78_512x512.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>As you increase the scope of a product, and the number of features that interact with each other, it becomes more expensive to make any further change. Any change affects more parts of an increasingly large and more complex system. There are more considerations that need to be taken into account when designing, implementing, testing, troubleshooting and deploying the feature.</p><p>Operating and supporting a larger, more complex product costs more, too.</p><p>Therefore:</p><ol><li><p>Be sure about the business value each new feature is supposed to bring.</p></li><li><p>When an experimental feature doesn't deliver results, remove it.</p></li><li><p>In fact, remove all features that don't contribute value.</p></li></ol><p>This is much easier to say than it is to do.</p><p>Because of the 85% rule, we don't know anything in advance.</p><p>Therefore, we need to create a culture in which we routinely experiment, measure and cut.</p><p>To do it right, each experiment should have these two phases:</p><p><strong>Phase 1: Experiment</strong></p><ol><li><p>Define or select a problem to solve.</p></li><li><p>Design a feature that you <em>hope</em> will solve it.</p></li><li><p>Define how you will measure it, and the success criteria.</p></li><li><p>Implement in a quick-and-dirty way if necessary.</p></li></ol><p><strong>Phase 2: Clean Up</strong></p><ul><li><p>Failure: remove the feature or tweak it.</p></li><li><p>Success: pay back the tech debt incurred in phase 1. If you don't pay down your tech debt, your costs will spiral out of control.</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Technical Debt = Duct Tape + Rust]]></title><description><![CDATA[Two things I bet you didn't know about Technical Debt:]]></description><link>https://www.ctologic.pro/p/technical-debt-duct-tape-rust-27bf7096</link><guid isPermaLink="false">https://www.ctologic.pro/p/technical-debt-duct-tape-rust-27bf7096</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Tue, 25 Jul 2023 09:16:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a93c99-29db-4636-82dc-023e94715ddd_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Two things I bet you didn't know about Technical Debt:</p><ul><li><p>It can make you bankrupt.</p></li><li><p>At least one type of technical debt is <em>good</em>.</p></li></ul><p>Technical Debt is a software engineering concept, and is defined as follows:</p><p><em>Technical debt is is a measure of the amount of duct tape holding your system together, plus the amount of rust<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> that it has accumulated.</em></p><p><strong>Duct tape</strong> represents improvisations, which are present in every software system, as a result of:</p><ul><li><p>Pressure to produce too fast, and not doing things properly.</p></li><li><p>Quick fixes that were needed to "plug leaks".</p></li><li><p>Experimenting with various features before deciding whether to pursue them.</p></li></ul><p><strong>Rust: </strong>Even a well designed and implemented software system will not continue working forever.</p><p>It will slowly degrade, as if it is rusting. This is because it doesn't exist in a vacuum.</p><ul><li><p><strong>Business processes change and assumptions break. </strong>The world is constantly changing, and businesses must adapt to survive. Software is designed and written based on various assumptions. These assumptions gradually become invalid. The gap between the current situation and the ideal situation will tend to widen steadily.</p></li><li><p><strong>Integrations with third parties change over time. </strong>Changes are required to keep up with evolving third party APIs, cloud infrastructure and security patches.</p></li><li><p><strong>Scaling issues.</strong> As the business grows, the system may need to handle significantly more traffic, and perform an order of magnitude more operations. As a result, its performance may drop below acceptable levels.</p></li></ul><p>What does <em>not</em> count as technical debt?</p><p>&#8212; Bugs.</p><p>Any functioning software system starts accumulating technical debt from the moment it is born.</p><p>Whether or not you decide to pay back the principal, the interest is deducted automatically on a regular basis, in terms of the following:</p><ul><li><p><strong>Lost productivity</strong> &#8212; it takes longer to deliver new features.</p></li><li><p><strong>Lost business </strong>&#8212; due to breakdowns, missing features, bad performance, security issues.</p></li></ul><p>If you let technical debt get out of control, there can be additional consequences:</p><ul><li><p><strong>Employee churn</strong> &#8212; It is frustrating to work on an ageing system that is not well maintained, has frequent breakdowns and emergencies, and is generally perceived as being disrespected by the business. In addition, opportunities to learn and grow professionally in such an environment may be perceived as being limited.</p></li></ul><ul><li><p><strong>Default or bankruptcy</strong> &#8212; I was recently asked to help a company that had let their technical debt get so out of control that they were seriously considering rewriting their whole system. In a different language. In the business world, this would be equivalent to defaulting on a loan, or even going bankrupt.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mda3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a93c99-29db-4636-82dc-023e94715ddd_1280x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mda3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a93c99-29db-4636-82dc-023e94715ddd_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!mda3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a93c99-29db-4636-82dc-023e94715ddd_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!mda3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a93c99-29db-4636-82dc-023e94715ddd_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!mda3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a93c99-29db-4636-82dc-023e94715ddd_1280x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mda3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a93c99-29db-4636-82dc-023e94715ddd_1280x720.png" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76a93c99-29db-4636-82dc-023e94715ddd_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:162267,&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_!mda3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a93c99-29db-4636-82dc-023e94715ddd_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!mda3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a93c99-29db-4636-82dc-023e94715ddd_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!mda3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a93c99-29db-4636-82dc-023e94715ddd_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!mda3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a93c99-29db-4636-82dc-023e94715ddd_1280x720.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Strategies for controlling technical debt</h2><ul><li><p><strong>Clean up after experiments</strong> &#8212; It's fine to go into tech debt when experimenting with new features. Not just fine &#8212; I actually recommend<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> it. However, after the experimental phase you <em>must</em> replace the duct tape with properly engineered solutions, or remove it altogether.</p></li><li><p><strong>Budget for it</strong> &#8212; Allocate a constant, fixed percentage of engineering capacity in each sprint, or planning period, for the express purpose of paying down technical debt. I usually frame it at 25% and negotiate from there.</p></li><li><p><strong>Track technical debt</strong> &#8212; Use your issue tracking system (Jira, Linear, etc.) to tag and track technical debt.&nbsp;</p></li><li><p><strong>Identify technical debt hotspots</strong> &#8212; Use your source code control system (GitHub, GitLab, etc.) to identify technical debt hotspots. These are modules where there are a lot of frequent fixes that may indicate instability or too much improvisation.</p></li></ul><p>When you address technical debt as a matter of routine, the curve looks 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_!2Iz9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ff014e6-bf76-4461-b996-09867078a88e_1280x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2Iz9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ff014e6-bf76-4461-b996-09867078a88e_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!2Iz9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ff014e6-bf76-4461-b996-09867078a88e_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!2Iz9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ff014e6-bf76-4461-b996-09867078a88e_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!2Iz9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ff014e6-bf76-4461-b996-09867078a88e_1280x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2Iz9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ff014e6-bf76-4461-b996-09867078a88e_1280x720.png" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1ff014e6-bf76-4461-b996-09867078a88e_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:133318,&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_!2Iz9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ff014e6-bf76-4461-b996-09867078a88e_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!2Iz9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ff014e6-bf76-4461-b996-09867078a88e_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!2Iz9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ff014e6-bf76-4461-b996-09867078a88e_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!2Iz9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ff014e6-bf76-4461-b996-09867078a88e_1280x720.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>I first saw technical debt called "rust" in an article by Jim Highsmith, one of the authors of the Agile Manifesto: <a href="https://jimhighsmith.com/technical-debt-is-rust-you-cant-see/">Technical Debt is Rust You Can't See</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>As a child, I had always been taught that being in debt is bad. I have since learned that this is simply not true: there can also be "good" debt. A good debt can be when you borrow money and leverage it to create a cashflow-positive situation. For example, it's possible to borrow money to buy a house, and then rent it out for more than your monthly mortgage payment. Of course, there are risks. Similarly, technical debt can be advantageous in some situations.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Just Throw it Over the Wall]]></title><description><![CDATA["Just throw it over the wall"]]></description><link>https://www.ctologic.pro/p/just-throw-it-over-the-wall-e0e5fc92</link><guid isPermaLink="false">https://www.ctologic.pro/p/just-throw-it-over-the-wall-e0e5fc92</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Wed, 12 Jul 2023 10:55:59 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d50a1492-cf6f-45e5-bd50-ea4f41605a4e_1920x1280.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://world.hey.com/itzy/e0e5fc92/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2UyeTZ4TSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--86192d8f43453ed37bdbf595de9e395f7cd34497/rocks-falling.jpg?disposition=attachment" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5y9H!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973c5eed-cebf-414e-a6f2-9378ba00cc9f_1920x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5y9H!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973c5eed-cebf-414e-a6f2-9378ba00cc9f_1920x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5y9H!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973c5eed-cebf-414e-a6f2-9378ba00cc9f_1920x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5y9H!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973c5eed-cebf-414e-a6f2-9378ba00cc9f_1920x1280.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5y9H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973c5eed-cebf-414e-a6f2-9378ba00cc9f_1920x1280.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/973c5eed-cebf-414e-a6f2-9378ba00cc9f_1920x1280.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;rocks-falling.jpg&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://world.hey.com/itzy/e0e5fc92/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2UyeTZ4TSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--86192d8f43453ed37bdbf595de9e395f7cd34497/rocks-falling.jpg?disposition=attachment&quot;,&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="rocks-falling.jpg" title="rocks-falling.jpg" srcset="https://substackcdn.com/image/fetch/$s_!5y9H!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973c5eed-cebf-414e-a6f2-9378ba00cc9f_1920x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5y9H!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973c5eed-cebf-414e-a6f2-9378ba00cc9f_1920x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5y9H!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973c5eed-cebf-414e-a6f2-9378ba00cc9f_1920x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5y9H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973c5eed-cebf-414e-a6f2-9378ba00cc9f_1920x1280.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p><em>"Just throw it over the wall"</em></p><p>Is that how hand-offs happen in your company?</p><p>When your engineers start work, do they find:</p><p>&#128545; Product questions that need to be resolved?</p><p>&#128548; Requirements that are not fully cooked?</p><p>The good news is:</p><p>&#128526; Once you've batted the issue back over to the other side, you'll get a few days' quiet until it comes back.</p><p>Playing ping-pong with requirements is common in many organisations. It delays delivery, and lengthens the lifespan of issues (lead time or cycle time).</p><p>Don't attempt to fix this by instituting formal definitions and templates. This bureaucracy will help in the worst cases, where the problem is a lack of diligence. However, if your product managers are reasonably competent, this will make things worse.</p><p>The fundamental problem is usually a <strong>lack of collaboration</strong>. Requirements should not be prepared in a vacuum and then handed off to the engineering team, waterfall-style. Instead, they should be formulated in close collaboration with engineering. With good collaboration, there is no "other side of the wall" &#8212; you're all batting for the same team.</p><p>Handing something off between one team and the next should be <strong>an overlapping process</strong>. Just as the product manager is involved, informed and aware of issues during the implementation process, relevant engineers should be involved during appropriate phases of the requirements process.</p><p><strong>Product Managers:</strong>&nbsp;</p><ul><li><p>Start cooking requirements well in advance.</p></li><li><p>Give requirements a longer incubation period.</p></li><li><p>No handed-off requirement should surprise engineering.</p></li><li><p>Share with engineering well before you write formal requirements.</p></li></ul><p><strong>Engineers:</strong></p><ul><li><p>Ensure that nothing handed off from product should surprise you.</p></li><li><p>Don't expect perfect requirements to fall into your lap, waterfall-style.</p></li><li><p>Help product understand the challenges and trade-offs you might face.</p></li><li><p>Help product formulate requirements that you can realistically implement.</p></li></ul><p>The way you choose to implement this will depend very much on your existing processes and company culture.</p><p>For the more strategic features or complex implementations, I start off with a <em>Brief</em>. That's my fancy name for a brain-dump, and it is therefore a rather informal document.</p><p><strong>The 3 Goals of Briefs:</strong></p><ol><li><p>Inform people about what will soon be coming down the pipeline.</p></li><li><p>&nbsp;Serve as a focal point for getting input and especially questions.</p></li><li><p>Attempt to uncover hidden problems before development starts.</p></li></ol><p><strong>Brief Structure:</strong></p><p>I use a minimal structure, and modify it based on common sense.</p><ol><li><p>Background</p></li><li><p>Problem</p></li><li><p>Proposed Solution</p></li></ol><p>Anyone can comment on a brief, though I typically also designate specific people to reserve time to review it.</p><p>Remember, it's an iterative process. You'll need to keep the discussion alive through the iterations.</p><p>After a few volleys of comments, revisions, and occasionally synchronous discussions, you may find that the process achieves one of the following results:&nbsp;</p><ul><li><p>Great solution! This is how we'll need to implement it.</p></li><li><p>Great problem! Not so great a solution. Here's a better one.</p></li><li><p>The problem is not the problem. We need to solve a different problem.</p></li></ul><p></p><div><hr></div><p>Photo by <a href="https://unsplash.com/@yer_a_wizard?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Fleur</a> on <a href="https://unsplash.com/photos/Ahs_MHU8y1s?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>]]></content:encoded></item><item><title><![CDATA[Why do features take so long to ship?]]></title><description><![CDATA[&#8220;Features are taking far too long to ship &#8212; how can I fix it?&#8220; This is one of the most common problems I have encountered.]]></description><link>https://www.ctologic.pro/p/why-do-features-take-so-long-to-ship-94b7284f</link><guid isPermaLink="false">https://www.ctologic.pro/p/why-do-features-take-so-long-to-ship-94b7284f</guid><dc:creator><![CDATA[Itzy Sabo]]></dc:creator><pubDate>Wed, 12 Jul 2023 07:55:34 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/831c22d0-b64f-4b66-889c-ae5d1b46d5a2_1920x1280.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://world.hey.com/itzy/94b7284f/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2RIeHNaSyIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--30db7d154bc760481b908624f3e971bf603765d9/delay.jpg?disposition=attachment" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XEt8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3f9dea-e9f2-4e08-8d73-4968d3dbd916_1920x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XEt8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3f9dea-e9f2-4e08-8d73-4968d3dbd916_1920x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XEt8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3f9dea-e9f2-4e08-8d73-4968d3dbd916_1920x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XEt8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3f9dea-e9f2-4e08-8d73-4968d3dbd916_1920x1280.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XEt8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3f9dea-e9f2-4e08-8d73-4968d3dbd916_1920x1280.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4e3f9dea-e9f2-4e08-8d73-4968d3dbd916_1920x1280.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;delay.jpg&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://world.hey.com/itzy/94b7284f/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2RIeHNaSyIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--30db7d154bc760481b908624f3e971bf603765d9/delay.jpg?disposition=attachment&quot;,&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="delay.jpg" title="delay.jpg" srcset="https://substackcdn.com/image/fetch/$s_!XEt8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3f9dea-e9f2-4e08-8d73-4968d3dbd916_1920x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XEt8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3f9dea-e9f2-4e08-8d73-4968d3dbd916_1920x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XEt8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3f9dea-e9f2-4e08-8d73-4968d3dbd916_1920x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XEt8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3f9dea-e9f2-4e08-8d73-4968d3dbd916_1920x1280.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>&#8220;<strong>Features are taking far too long to ship</strong> &#8212; how can I fix it?&#8220; This is one of the most common problems I have encountered.&nbsp;</p><p>It is actually one of my favourites, because there is typically plenty that can be done. Although it can take months to solve, the first results can show up within a few short weeks.</p><p>It is rare that the problem is due to a single cause. It is usually a combination of factors.</p><p>However, we opened with a subjective feeling, so the first step is to understand whether it is justified.</p><h2>Behavioural Patterns &amp; Indicators</h2><p>The ticketing system (e.g., Jira) is a goldmine of behavioural data that shows how the organisation operates.</p><p>We are primarily looking for <em>repeating patterns</em> of behaviour, not isolated incidents. These patterns are <em>indicators</em> of possible problems, and are not necessarily the problems themselves.</p><p>Here is a breakdown of common indicators that are not difficult to discover. At this stage, I'm trying to be non-judgemental, but as you'll see, some judgement inevitably leaks through.</p><ul><li><p><strong>Bumped Stories</strong> &#8212; These are stories that got bumped to the next sprint, sometimes repeatedly. I sort these into three main categories:<br></p><ul><li><p><em><strong>Cliff Hangers</strong></em> &#8212; These are stories that were completed, but not deployed, and got bumped to the next sprint. This type of thing borders on the criminal, and almost always comes with an interesting (but sad) story.<br></p></li><li><p><em><strong>Unfinished Masterpieces</strong></em> &#8212; These are stories that were started, but got bumped to the next sprint for seemingly trivial reasons, sometimes repeatedly. This is where most of the meat usually is.</p><ul><li><p>Waiting for someone on another team, or in another department, to do something (e.g. design, translate, approve, register, pay, &#8230;)</p></li><li><p>Waiting for someone on the same team to do something (e.g., review and approve the code, implement code review feedback, &#8230;)</p></li><li><p>Waiting for QA validation &#8212; depending on how the engineering department is structured, this could belong under 1 or 2, but it really deserves its own entry.</p></li><li><p>Failed QA validation, but not repaired and/or resubmitted for validation.</p></li><li><p>Stuck because of a dependency on another story.<br></p></li></ul></li><li><p><em><strong>Writer&#8217;s Block</strong></em> &#8212; <em><strong>&nbsp;</strong></em>These are stories that were not even started, and got bumped to the next sprint, sometimes repeatedly.<br></p></li></ul></li><li><p><strong>Stowaways</strong> &#8212; These are stories that somehow sneaked into the sprint after it started. There are 3 common types:</p><ol><li><p>Production or support issues.</p></li></ol><ol start="2"><li><p>&#8220;The Boss wants it done immediately!&#8221;</p></li><li><p>No apparent reason.<br></p></li></ol></li></ul><ul><li><p><strong>Overweight Baggage</strong> &#8212; These are stories that are just taking far longer than the original estimates, and were not finished in time.</p><ol><li><p>Unanticipated complexities were uncovered during implementation.</p></li><li><p>Stories that should have been epics, i.e. too large in scope.</p></li><li><p>Effort is consistently underestimated.</p></li><li><p>Small stories have unexpectedly high estimates.</p></li></ol></li></ul><h2>Actionable Causes</h2><p>The causes of each of the above issues are typically a combination of the following common actionable causes. This is where I'm being very judgemental!</p><ul><li><p><strong><a href="https://www.ctologic.pro/p/how-to-deliver-business-value-predictably-5fff0957">Overbooking</a></strong> &#8212; Too many stories are scheduled for the sprint. This can be because:</p><ul><li><p>Engineering throughput is uncalculated, or does not reflect reality.&nbsp;</p></li><li><p>QA capacity does not match planned engineering throughput, violating the Theory of Constraints.</p></li><li><p>Too much negotiation and pressure on engineering regarding story size estimates.</p></li><li><p>"To make sure the engineers always have plenty of work to do."<br></p></li></ul></li><li><p><strong><a href="https://www.ctologic.pro/p/how-to-deliver-business-value-predictably-5fff0957">Stowaways</a></strong> &#8212; High priority support incidents and/or other "urgent" work enters the sprint late and displaces scheduled tasks, because sprint planning did not allow for an average quantity of incidents.<br></p></li><li><p><strong>Process not respected by management</strong> &#8212; The engineering organisation's method of planning and executing has not been communicated to, and fully embraced by, upper management. Upper management is not aware of the importance of respecting the process, and routinely introduce noise in the form of Stowaways. Product management and engineering have not developed the ability to push back on such requests.<br></p></li><li><p><strong><a href="https://www.ctologic.pro/p/just-throw-it-over-the-wall-e0e5fc92">Requirements are not ready</a></strong> &#8212; Product requirements are prepared in a vacuum, i.e. "thrown over the wall" without collaborating with engineering. This inevitably causes ping-pong while the engineers try to digest the requirements and ask questions that the product manager didn't think of.<br></p></li><li><p><strong>Technical debt</strong> &#8212; There is no deliberate plan to track and <a href="https://www.ctologic.pro/p/technical-debt-duct-tape-rust-27bf7096">manage technical debt</a>, and it keeps accumulating. The effort needed for every engineering task increases with the level of technical debt.<br></p></li><li><p><strong>Features are prioritised inconsistently</strong> &#8212; Work is prioritised based on who shouts the loudest rather than by business impact.<br></p></li><li><p><strong>Features or support issues are prioritised ineffectively</strong> &#8212; Too much work is classified as highest priority. I have seen one case where there were 3 levels of "Highest" priority: Highest-Highest, Highest-High, and Highest-Medium (even they thought that Highest-Low would have been too much of a joke).<br></p></li><li><p><strong>Stories are not small</strong> enough and/or are sliced incorrectly.<br></p></li><li><p><strong>Effort is underestimated</strong> &#8212; Analysis by engineers is not thorough enough when estimating the effort required, or (far worse) there is undue pressure to reduce the estimates.<br></p></li><li><p><strong>Suboptimal ordering of work</strong> &#8212; The order of execution does not attempt to reduce risk and maximise impact early, and to take advantage of QA throughput.<br></p></li><li><p><strong>Code reviews cause delays</strong> &#8212; Code waits too long for review by tech leads or senior engineers. In some cases it cannot be fixed up and tested in time for release.<br></p></li><li><p><strong>QA is a bottleneck</strong> &#8212; QA can cause delays for a number of reasons, especially:&nbsp;</p><ul><li><p>QA are not part of the product/engineering collaboration that generates the stories.</p></li><li><p>Lack of automation that makes it take a long time to set up complex testing environments.</p></li><li><p>Understaffing.<br></p></li></ul></li><li><p><strong>Cross-team dependencies </strong>&#8212; Too many cross team dependencies, or even a few dependencies that are not aligned, are problematic. Different teams naturally have a different plan, priorities and cadence. Waiting for someone on another team can cause delays, or at least unpredictable timing.<br></p></li><li><p><strong>External bureaucratic processes</strong> &#8212; Depending on a clumsy bureaucratic process that is managed outside the team and has a mind of its own can drive you crazy, unless you either get it changed or allow for it in your plans.<br></p></li><li><p><strong>Faulty implementations</strong> &#8212; Implementaions can be imperfect for many reasons, especially ineffective definition of requirements by a product manager and lack of engineering professionalism.<br></p></li><li><p><strong>No distinction between deployment and release</strong> &#8212; Deployment of some stories is artificially delayed because deploying a feature necessarily releases it; feature flags are not used.<br></p></li><li><p><strong>Migrations cause downtime</strong> &#8212; Deployment of some stories is delayed for operational reasons, because downtime is required to migrate the database structure.</p></li></ul><h2>Root Causes</h2><p>The above "actionable causes" are easy targets when focusing on fixing the process. However, the real root causes are much more systemic. Some organisations have the culture, maturity, self-awareness and desire to recognise and treat these systemic issues. It is not trivial, but is quite doable with willing partners.</p><ul><li><p>Lack of alignment between departments, especially:</p><ul><li><p>Ineffective communication.</p></li><li><p>Processes not aligned.</p></li><li><p>Insufficient collaboration at relevant stages.</p></li></ul></li><li><p>Management deficiencies, especially:</p><ul><li><p>Ineffective planning &amp; delivery management on macro and/or micro levels.</p></li><li><p>Unsuitable organisational structure.</p></li><li><p>Weak management, lacking backbone.</p></li><li><p>Following the bureaucratic steps of the process without understanding its essence.</p></li></ul></li><li><p>Execution deficiencies, e.g.:</p><ul><li><p>Professional abilities are lacking, e.g. defining requirements, slicing stories.</p></li><li><p>Professionalism is lacking, i.e. lack of diligence and attention to detail.</p></li><li><p>Lack of appropriate tools, e.g. automated tests (or the time/resources to build them &#8212; see ineffective planning).</p></li></ul></li></ul><h2>Solutions</h2><p>Some of the solutions for the above actionable problems are obvious, and others are far less so. This is the first in a series of upcoming posts in which I will drill down each set of problems and discuss the solutions in detail.&nbsp;</p><p></p><div><hr></div><p>Photo by <a href="https://unsplash.com/ko/@odiin?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Erik Odiin</a> on <a href="https://unsplash.com/photos/jbQvJx2EWnU?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>]]></content:encoded></item></channel></rss>