<?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[The Principal Engineer]]></title><description><![CDATA[The Principal Engineer is focused on the intersection between business, tech, software, and how to work to create impact.
Sometimes, we may go a little off-topic, but never too far.]]></description><link>https://www.principalengineer.com</link><image><url>https://substackcdn.com/image/fetch/$s_!ipKa!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9ea5ae1-9d6f-421c-97ee-fd87bc6a769b_608x608.png</url><title>The Principal Engineer</title><link>https://www.principalengineer.com</link></image><generator>Substack</generator><lastBuildDate>Mon, 06 Apr 2026 19:35:48 GMT</lastBuildDate><atom:link href="https://www.principalengineer.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Wille Faler]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[principalengineer@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[principalengineer@substack.com]]></itunes:email><itunes:name><![CDATA[Wille Faler]]></itunes:name></itunes:owner><itunes:author><![CDATA[Wille Faler]]></itunes:author><googleplay:owner><![CDATA[principalengineer@substack.com]]></googleplay:owner><googleplay:email><![CDATA[principalengineer@substack.com]]></googleplay:email><googleplay:author><![CDATA[Wille Faler]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The Industrial Revolution of Software Engineering]]></title><description><![CDATA[The untold truth about Software Engineering: it was never engineering, it was always an artisan craft. Until now. Current developments are finally forcing it to become a true engineering discipline.]]></description><link>https://www.principalengineer.com/p/the-industrial-revolution-of-software</link><guid isPermaLink="false">https://www.principalengineer.com/p/the-industrial-revolution-of-software</guid><dc:creator><![CDATA[Wille Faler]]></dc:creator><pubDate>Tue, 10 Mar 2026 17:13:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!j3VS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bdc8762-b914-442d-8028-d0dcdbb5203e_1408x768.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j3VS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bdc8762-b914-442d-8028-d0dcdbb5203e_1408x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j3VS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bdc8762-b914-442d-8028-d0dcdbb5203e_1408x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!j3VS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bdc8762-b914-442d-8028-d0dcdbb5203e_1408x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!j3VS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bdc8762-b914-442d-8028-d0dcdbb5203e_1408x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!j3VS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bdc8762-b914-442d-8028-d0dcdbb5203e_1408x768.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j3VS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bdc8762-b914-442d-8028-d0dcdbb5203e_1408x768.jpeg" width="1408" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8bdc8762-b914-442d-8028-d0dcdbb5203e_1408x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:323387,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.principalengineer.com/i/190227181?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bdc8762-b914-442d-8028-d0dcdbb5203e_1408x768.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!j3VS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bdc8762-b914-442d-8028-d0dcdbb5203e_1408x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!j3VS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bdc8762-b914-442d-8028-d0dcdbb5203e_1408x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!j3VS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bdc8762-b914-442d-8028-d0dcdbb5203e_1408x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!j3VS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bdc8762-b914-442d-8028-d0dcdbb5203e_1408x768.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The definition of an artisan in <a href="https://en.wikipedia.org/wiki/Artisan">Wikipedia</a>:</p><blockquote><p>An artisan (from French: artisan, Italian: artigiano) is a skilled craft worker who makes or creates material objects partly or entirely by hand.</p></blockquote><p>Apart from <em>&#8220;material objects&#8221;</em>, the definition sounds exactly like the definition of a Software Engineer before ca 2024. Especially when you consider that each item was effectively a unique creation, and historically, the tolerances (defects, reliability, proximity of functionality to desired outcome) had an extremely high variability.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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>AI changes this. We are no longer hand-crafting every line of code. Writing code was never the only skill required of a good Software Engineer, but it was a central one. We are now moving towards one where the emphasis is wholly moving towards figuring out the <strong>why</strong> <strong>and what</strong> to build, defining inputs (specification), and verifying this against output within some tolerance. We are also dealing with a much higher volume of output than before.</p><p>This move from artisanally hand-crafted code being informally verified (hopefully with some unit-, integration- and acceptance tests + some manual testing, usually varying from team to team), to verifying high volume AI manufactured code is shifting the demands of the profession fundamentally. Writing a few tests, and clicking around a bit isn&#8217;t going to cut it anymore, when we are looking at a veritable fire hose of code.</p><h2>The death of the Software Engineer is greatly exaggerated </h2><p>Why do we even need Software Engineers if AI is writing all the code? All we have to do is tell the AI what sort of thing we want to build, right?</p><p>Right. This works fine for vibe-coding a small app or website. It is true that AI is democratizing software creation. Except.. </p><p>For anything of non-trivial size and/or complexity, you need to make sure you specify precisely and unambiguously, in such a way that there is no room for the AI to confidently fill the gaps with bad assumptions. You must be explicit about:</p><ul><li><p><strong>Edge cases and failure scenarios.</strong></p></li><li><p><strong>Scalability constraints.</strong></p></li><li><p><strong>Interactions</strong> between the new spec and prior specifications.</p></li></ul><p>Sounds a lot like engineering, huh? Add to that the fact that English, and every other language spoken by humans, are inherently lossy and ambiguous. The shift from artisanally hand-crafted code, to a fire hose of specification generated code will actually require more discipline, more structure than we have ever applied in our field before. The scale of what we now can do demands it.</p><h2>Drinking from the fire hose: the verification crisis</h2><p>The burden of verification is growing exponentially. Line-by-line code review will wither and die in all but the most sensitive fields (and perhaps even there). Hand-crafted test-code will go the way of hand-crafted production code, we simply won&#8217;t be able to keep it up. We can try to instruct AI to do TDD, to write tests as it goes along, but even here the AI will be incentivized to write tests that pass, rather than rigorously test its own output.</p><p>The consequence of this is, that we will be forced to come up with new, novel approaches to automating our verification, how close to our intent our output is.</p><p>What these approaches are, I can only speculate on, and we&#8217;ll likely discover things along the way as things evolve, just as we have these past few years. But I would make an early guess that some of the approaches will be a combination of:</p><ol><li><p><strong>AI-on-AI auditing:</strong> Using &#8220;Critic&#8221; models to find hallucinations in &#8220;Generator&#8221; outputs.</p></li><li><p><strong>Property-based testing:</strong> Moving from testing specific examples (e.g., 2+2=4) to testing invariants (e.g., <em>A+B must always equal B+A across all possible inputs</em>).</p></li><li><p><strong>Formal &amp; Probability-based verification:</strong> Mathematical proofs of correctness to ensure systems stay within non-functional requirement tolerances.</p></li></ol><h2>Conclusion: the Expertise paradox</h2><p>The great irony of Software Engineering in the age of AI, is that we will need to become even more of an expert than before. Relying on vibe-coding, or doing things &#8220;the way we used to&#8221; will only result in drowning in a mountain of garbage and technical debt. A new level of discipline, skill, and ability to create reliable feedback-  and verification loops will be required.</p><p>This shift has an interesting characteristic: it will increase demand for these skills (expect more demand for software engineers), while at the same time creating a brutal shake-out of those in the industry incapable of adapting. Increased demand for higher level of skills, but reduced supply likely means those who can make the jump will be paid a handsome premium compared to today&#8217;s software engineers.</p><p>The age of the Software Artisan is coming to an end. Industrial scale production of software means we are finally crossing over into a proper rigorous discipline called <strong>Software Engineering</strong>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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 end of labor arbitrage: why AI economics is killing Offshoring]]></title><description><![CDATA[Conventional wisdom is you save on software engineering by offshoring to low-cost locations. But token-economics is about to kill geographic labor arbitrage.]]></description><link>https://www.principalengineer.com/p/the-end-of-labor-arbitrage-why-ai</link><guid isPermaLink="false">https://www.principalengineer.com/p/the-end-of-labor-arbitrage-why-ai</guid><dc:creator><![CDATA[Wille Faler]]></dc:creator><pubDate>Sat, 07 Mar 2026 18:50:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1UOd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5b22fa-e7b0-476c-8586-b8673e69ff36_1408x768.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1UOd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5b22fa-e7b0-476c-8586-b8673e69ff36_1408x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1UOd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5b22fa-e7b0-476c-8586-b8673e69ff36_1408x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1UOd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5b22fa-e7b0-476c-8586-b8673e69ff36_1408x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1UOd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5b22fa-e7b0-476c-8586-b8673e69ff36_1408x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1UOd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5b22fa-e7b0-476c-8586-b8673e69ff36_1408x768.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1UOd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5b22fa-e7b0-476c-8586-b8673e69ff36_1408x768.jpeg" width="1408" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9c5b22fa-e7b0-476c-8586-b8673e69ff36_1408x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:336418,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.principalengineer.com/i/190215576?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5b22fa-e7b0-476c-8586-b8673e69ff36_1408x768.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1UOd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5b22fa-e7b0-476c-8586-b8673e69ff36_1408x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1UOd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5b22fa-e7b0-476c-8586-b8673e69ff36_1408x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1UOd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5b22fa-e7b0-476c-8586-b8673e69ff36_1408x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1UOd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5b22fa-e7b0-476c-8586-b8673e69ff36_1408x768.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For thirty years, the standard playbook of lowering cost of software production was to move high cost software development from places like San Francisco, New York, London or Zurich, to low-cost locations like Pune, Bangalore or Manila.</p><p>We are now moving to a world where this will be akin to a corporate suicide note. The arithmetic is simple: the cost of producing software is falling close to zero. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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>In a world where the actual effort to write code is 10% of what it was a few years ago, how much are you really saving by having an engineer at half the salary on the other side of the planet, compared to how much you are losing in cycle-time due to timezones, and context by using a less skilled worker who doesn&#8217;t know your business?</p><h2>The latency tax: the killer of time-to-market</h2><p>AI allows us to build and move faster than ever before. This means we can reduce our cycle time for change and new features from days and weeks, to mere hours. An idea can be built, refined and demoed, multiple times in a single day. </p><p>In a vicious competitive landscape, who wins, the actor who can iterate and refine a value proposition 5-8x in a single day, or the actor who can do exactly one cycle every 24 hours, because timezone incompatibilities means they have a brief window of overlap once a day?</p><p>That cost-per-seat with your offshore provider will seem costlier than ever, when the competition is moving 5x faster. Even at half the salary, you are effectively paying 5x more for the same result per unit of time, all things being equal.</p><p>And all things are rarely equal, as we&#8217;ll soon discuss.</p><h2>The context tax: the killer of quality</h2><p>The second thing is, people working closely together, iterating on a problem, will always outperform disengaged people turning JIRA tickets they fully do not grasp the purpose of.</p><p>With increased speed of iteration, clarity of purpose becomes more important than ever - having a shared understanding of <strong>what</strong> you are trying to achieve, and more importantly <strong>why</strong>, will be competitive advantages. </p><p>Feeding people with ill-defined JIRA tickets, who then feed them onwards to AI assistants are going to combine the absolute worst aspects of offshore development with the worst aspects of generative AI: a drift between desired- and actual outcomes, and plenty of inferred bad assumptions and AI hallucinations to fill the gap.</p><p>Context + purpose eats cost savings and Taylorism for breakfast in the old world. AI grows it from a gap, to an ocean.</p><h2>The Token Arbitrage</h2><p>Historically, the unit of cost in software was the hour of human work. In the future, the unit of cost is the cost of tokens.</p><p>When a local/onshore engineer who truly understands the business they are working in, and the problem they are working on, is given a high token budget to use leading edge AI Assistants (such as Claude Code currently), combined with frontier models, working at a <a href="https://www.principalengineer.com/p/the-7-levels-of-software-engineering">Level 7 of AI Assisted Software Engineering</a>, they effectively become an industrial factory of automation and software creation.</p><p>The typical offshore firm&#8217;s model built on billable hours: they are incentivized to keep headcount high and processes manual. Conversely, a high-skill onshore lead aligned with the organization they are working in is incentivized to automate themselves out of everything mundane and repetitive.</p><p>The outcome is a $200,000/year engineer with a monthly $5,000 compute- and token budget can now outperform and run rings around a $1000,000/year managed offshore team. The premium paid for an &#8220;Architect-Orchestrator&#8221; isn&#8217;t an expense, it&#8217;s the most efficient CAPEX investment you can make.</p><h2>Conclusion</h2><p>The era of geographic labor arbitrage was built on a simple assumption: human labor was the scarcest resource in software. AI has completely up-ended this assumption - human labor is no longer the key input for ROI per unit of time.</p><p>The new math of software production looks like this:</p><p><strong>Velocity + Context + Compute &gt; Cheap Labor</strong></p><p>If you continue to optimize for the lowest hourly rate, you are effectively choosing to pay a 400-500% tax, while reducing your chances of survival. You are choosing to be slower in a world that is moving faster. You are choosing to be <em>&#8220;lost in translation&#8221;</em> in a world where context is the only moat left.</p><p>The winners of the next decade won&#8217;t be companies that best optimize their blended cost of labor. The winners will be lean, high-context teams located in the same timezone, fueled by sufficient token budgets, turning ideas into reality and testing them on real customers before their offshore-reliant competitors have even finished their morning stand-up.</p><p>The map of the software world is being redrawn. The future belongs to the <a href="https://leerob.com/product-engineers">Product Engineer</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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 7 Levels of Software Engineering with AI]]></title><description><![CDATA[I believe there are currently 7 levels of progression when it comes to Software Engineering with AI. In this post, we will explore what they are, and find out where you are!]]></description><link>https://www.principalengineer.com/p/the-7-levels-of-software-engineering</link><guid isPermaLink="false">https://www.principalengineer.com/p/the-7-levels-of-software-engineering</guid><dc:creator><![CDATA[Wille Faler]]></dc:creator><pubDate>Sat, 21 Feb 2026 15:34:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JJGe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07e8bcdc-a71e-49b0-963d-a2a3840c036e_2816x1536.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JJGe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07e8bcdc-a71e-49b0-963d-a2a3840c036e_2816x1536.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JJGe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07e8bcdc-a71e-49b0-963d-a2a3840c036e_2816x1536.heic 424w, https://substackcdn.com/image/fetch/$s_!JJGe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07e8bcdc-a71e-49b0-963d-a2a3840c036e_2816x1536.heic 848w, https://substackcdn.com/image/fetch/$s_!JJGe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07e8bcdc-a71e-49b0-963d-a2a3840c036e_2816x1536.heic 1272w, https://substackcdn.com/image/fetch/$s_!JJGe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07e8bcdc-a71e-49b0-963d-a2a3840c036e_2816x1536.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JJGe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07e8bcdc-a71e-49b0-963d-a2a3840c036e_2816x1536.heic" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/07e8bcdc-a71e-49b0-963d-a2a3840c036e_2816x1536.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:461297,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.principalengineer.com/i/188676231?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07e8bcdc-a71e-49b0-963d-a2a3840c036e_2816x1536.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JJGe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07e8bcdc-a71e-49b0-963d-a2a3840c036e_2816x1536.heic 424w, https://substackcdn.com/image/fetch/$s_!JJGe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07e8bcdc-a71e-49b0-963d-a2a3840c036e_2816x1536.heic 848w, https://substackcdn.com/image/fetch/$s_!JJGe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07e8bcdc-a71e-49b0-963d-a2a3840c036e_2816x1536.heic 1272w, https://substackcdn.com/image/fetch/$s_!JJGe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07e8bcdc-a71e-49b0-963d-a2a3840c036e_2816x1536.heic 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></p><p>Software engineering isn&#8217;t being replaced, it is both becoming a purer form of what it always was, and something entirely different to what it has been.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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>As of early 2026, I have observed a natural progression in how we work with AI. It is an evolution of maturity: moving from AI as a better &#8220;search engine&#8221; to AI as a self-correcting industrial system. But there is a cliff edge ahead. <strong>If you are clinging to Level 0-2 by 2028, you will be professionally irrelevant.</strong> Stubbornly clinging to hand-crafted syntax today is as futile as the Luddites destroying knitting frames in 1811. You may be a skilled artisan, but your hobby has no place in a professional production line that requires a scale, speed, and quality you simply cannot match manually.</p><p>Why? Because the technical friction and cost of construction, bringing an idea to code, has evaporated and is fast approaching zero.</p><h2>Level 0: Classic software engineering</h2><p>Self-explanatory: you are not using AI. You are using your IDE like it&#8217;s January 2021, relying on dumb-autocompletion, refactoring tools and symbol navigation. </p><p>In 2026, this is the equivalent of trying to solve the western housing crisis by building log cabins equipped with only a saw and the power of your muscles: you&#8217;ll probably produce something small and beautiful, but by comparison, you&#8217;re not making a dent into the underlying problem.</p><p>Doing this is fine, if you enjoy the tactile experience of typing out code as a hobby, but it&#8217;s best to acknowledge what it is.</p><h2>Level 1: Assisted software engineering</h2><p>This is where we all started sometime in the second half of 2021 or early 2022: when Github Copilot first came out, it was an auto-complete on steroids. Copy-pasting from asking ChatGPT questions was also a revelation in terms of having a better, compressed, but sometimes hallucinating search over StackOverflow. Where you could get blocked for days working a problem before 2021, all of a sudden, you had the power at your disposal to, mostly, get unstuck after a few rounds of asking.</p><h2>Level 2: Integrated assisted software engineering</h2><p>Eventually, Copilot and other tools evolved to the point where you got a chat-bar in your IDE. You could give the chat a set of files as context, ask questions or request solutions, that you had the option of merging into your selected files.</p><p>It seems a long time ago when this was the state-of-the-art, if you think second half of 2024 was a long time ago! It just goes to show how quickly things evolve, when the approaches we used 18 months ago already feel ancient.</p><h2>Level 3: Agentic vibe coding</h2><p>Vibe coding in agent-mode is probably where most of the industry sits today in terms of Software Engineering AI maturity: you have either &#8220;agent-mode&#8221; turned on in Github Copilot in your IDE, or you&#8217;ve started using Claude Code, or some other CLI based tool.</p><p>At this level, it&#8217;s possible to ask your tool harder questions, or complete harder problems, often with context, but even with incomplete context (in terms of files), the agent will find a way to make at least a competent attempt at solving the problem you have asked it to solve.</p><p>The issue at level 3 is, that quite often the guardrails and specifications for what you want to achieve are insufficient for your AI assistant to fully complete, or complete without issues. Another problem is that you often have to re-explain yourself to your assistant when you start a new session, causing unnecessary waste of time in repeating yourself.</p><p>This often leads to the realization that we need level 4&#8230;</p><h2>Level 4: Structured vibe coding</h2><p>The first step to moving beyond vibe coding is the realization you need a bit more structure to the process than simply &#8220;talking&#8221; to the agent and incrementally correct it, reduce ambiguity.</p><p>This is usually when you:</p><ul><li><p>Start writing instructions to your agent in things like the CLAUDE.md file.</p></li><li><p>Start writing down tasks and requirements for your assistant, perhaps even using the agent as an assistant to drive out ambiguity and refine the requirements.</p></li><li><p>Ask the assistant to write a markdown file keeping track of learnings, what we want to do, what we have done etc. A &#8220;Save game&#8221; of sorts, to borrow video game terminology.</p></li><li><p>Perhaps have the assistant generate some architectural documentation as well, speeding up &#8220;relearning&#8221; between sessions.</p></li></ul><p>Somewhere at level 3 or 4, you might also find yourself, depending on the task at hand, reviewing code more than actively participating in writing.</p><h2>Level 5: The Manager of Agents</h2><p>Some of the structure we are starting to adopt at level 4 quickly leads to the realization that many of the tasks are predictable- and/or repetitive. </p><p>This naturally leads into starting to define tasks and agents for the work that you can foresee.</p><p>All that documentation needs to be kept up-to-date. It makes sense to have a documentation expert agent, and perhaps a skill to invoke with a default template.</p><p>Requirements refinement? A domain expert BA sub-agent persona, who thoroughly analyzes and audits requirements, as well as their consistency with prior requirements, calling out any conflicts.</p><p>Security experts, DevOps engineer, depending on the project, use your imagination. Just a word of caution: perhaps don&#8217;t replicate full Taylorism, have agents and skills that make sense. But if you valued TDD prior to 2025, probably having a &#8220;Test agent&#8221; doesn&#8217;t make sense, make your agent write its own unit tests.</p><h2>Level 6: Cognitive Engineering</h2><p>The increased structure of starting to define tasks and agent roles often leads to the next &#8220;aha&#8221;-moment:</p><p>Our job as software engineers, as far as producing the actual software, has evolved from writing code and tests, to defining a harness for our agents, consisting of:</p><ul><li><p>The big picture &#8220;North Star&#8221; problem and domain we are solving for.</p></li><li><p>The architectural vision and how it links to the North Star.</p></li><li><p>Principles of engineering, patterns and architecture we want to follow.</p></li><li><p>Constraints, non-functional requirements and &#8220;Do not&#8221;-rules.</p></li><li><p>Unambiguous, internally consistent requirements, which can be directly translated to code.</p></li></ul><p>However, the big structural challenge when reaching this level is, how do we organize this harness of constraints and knowledge in such a way, that loss of context between sessions and context-compactions is minimal, even when working on large tasks?</p><p>Answering this question requires us to become structured, such that we can store all this information in-repository in a way that makes it amenable for recall. The best analogy I currently use for this is mimicking human long-term memory, which is divided into three key parts:</p><ul><li><p><strong>Episodic memory:</strong> how we remember what happened, when, and in which order things happened.</p></li><li><p><strong>Semantic memory:</strong> General knowledge, concepts and facts we&#8217;ve learned through the work.</p></li><li><p><strong>Procedural memory:</strong> how we know how to perform tasks and processes almost unconsciously.</p></li></ul><p>Thinking of the problem in this way, means we have to get structured about how we store, interlink and shape all the different types of documents in our repository. We are no longer writing code or even directly working on the software we are producing, we are meta-engineering the long-term memory and brain of a team of agents.</p><p>As your confidence grows at this level, and you have found a system that works for the domain, you might find yourself spending less and less time reviewing the code that is being produced, because you trust it.</p><h2>Level 7: Blackbox Intent Engineering</h2><p>At this point, we have built skills, teams of sub-agents, we have engineered long-term memory and context for our agents, and if we&#8217;ve done it well, we are starting to note that the code mostly &#8220;just works&#8221;, even for large sets of features.</p><p>We have firmly shifted the bottleneck of software production from creation to review &amp; verification. We might have some level of trust in the code, as well as the unit- and integration-tests that our agents are producing, but how can we be absolutely sure it works as intended under all circumstances without human inspection and testing?</p><p>Turns out we can borrow inspiration from existing disciplines, on how ML- and AI systems are traditionally trained, and formal verification:</p><p>We split the agentic system, into two parts: The Producer and The Verifier. The Verifier is intentionally &#8220;blind&#8221; to the source code. It only sees your high-level intent. Your job as the engineer is to define the Formal Specification that the Verifier uses to hunt for failures:</p><ul><li><p><strong>Scenarios</strong>: The &#8220;Happy Path&#8221; and edge-case journeys the system must survive.</p></li><li><p><strong>Properties</strong>: Behavioural contracts, which should hold under all circumstances, for instance <em>&#8220;each processed payment should produce an &#8216;Invoice Generated&#8217; event&#8221;</em>.</p></li><li><p><strong>Invariants</strong>: Systemic truths that can never be violated, for instance <em>&#8221;The sum of all allocated stock must never exceed the physical warehouse capacity&#8221;</em>.</p></li></ul><p>Equipped with these, you can then setup your second agentic system (without access to code, but access to system and tools to exercise the system), to create agentic loops which obviously verify that the happy path system works, but also create <em>&#8220;Red Team&#8221;</em> adversarial loops which try to break the system, both from a specification, as well as performance and security perspective.</p><p>By splitting the production from verification, you have also done away with one of the biggest weaknesses of AI aided development over recent years: the propensity of coding agents to write tests that pass, either by undermining functionality or testing.</p><p>When the Producer writes code that passes the Verifier swarms adversarial stress tests, you no longer need to read the code. You have empirical proof of correctness. </p><h2>The New reality of Software Engineering</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XjQ0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F924a43c2-513b-4b79-b678-3bb3f6653a4b_786x202.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XjQ0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F924a43c2-513b-4b79-b678-3bb3f6653a4b_786x202.png 424w, https://substackcdn.com/image/fetch/$s_!XjQ0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F924a43c2-513b-4b79-b678-3bb3f6653a4b_786x202.png 848w, https://substackcdn.com/image/fetch/$s_!XjQ0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F924a43c2-513b-4b79-b678-3bb3f6653a4b_786x202.png 1272w, https://substackcdn.com/image/fetch/$s_!XjQ0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F924a43c2-513b-4b79-b678-3bb3f6653a4b_786x202.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XjQ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F924a43c2-513b-4b79-b678-3bb3f6653a4b_786x202.png" width="786" height="202" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/924a43c2-513b-4b79-b678-3bb3f6653a4b_786x202.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:202,&quot;width&quot;:786,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:57924,&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.principalengineer.com/i/188676231?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F924a43c2-513b-4b79-b678-3bb3f6653a4b_786x202.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_!XjQ0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F924a43c2-513b-4b79-b678-3bb3f6653a4b_786x202.png 424w, https://substackcdn.com/image/fetch/$s_!XjQ0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F924a43c2-513b-4b79-b678-3bb3f6653a4b_786x202.png 848w, https://substackcdn.com/image/fetch/$s_!XjQ0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F924a43c2-513b-4b79-b678-3bb3f6653a4b_786x202.png 1272w, https://substackcdn.com/image/fetch/$s_!XjQ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F924a43c2-513b-4b79-b678-3bb3f6653a4b_786x202.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Many teams have hit a ceiling at Level 3, this is the current mainstream &#8220;state-of-the-art&#8221; of the industry. But it is far below what is practically possible, as of now.</p><p>Software production has been democratized, made possible, much like photography was democratized by digital cameras. This didn&#8217;t mean that photographers went extinct though. The same is true of Software Engineering, we are evolving from multi-functional artisans of code, to meta-enginers of systems of agents, memory and intent. The work we used to do at Level 0, will now shift to being done mostly at mutually inclusive and complementary Levels 5 to 7.</p><p>In a sense, our job has now finally become what we were always meant to do: <strong>Solve problems at the intersection of business, humans, and technology, not just writing syntax.</strong></p><p>I will come back later with posts and guides specifically on Levels 6 and 7, if you want to read these, please subscribe!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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[Software Engineering with AI: Beyond Vibe-Coding ]]></title><description><![CDATA[Since I last wrote about how I use AI for software engineering in 2024, almost everything has changed. Again. Software engineering is forever changed, but, fundamentally still software engineering.]]></description><link>https://www.principalengineer.com/p/software-engineering-with-ai-beyond</link><guid isPermaLink="false">https://www.principalengineer.com/p/software-engineering-with-ai-beyond</guid><dc:creator><![CDATA[Wille Faler]]></dc:creator><pubDate>Sun, 08 Feb 2026 13:49:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!enKM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F668031c0-d56d-48ba-9fb4-cd0a1a919d28_5055x3555.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!enKM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F668031c0-d56d-48ba-9fb4-cd0a1a919d28_5055x3555.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!enKM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F668031c0-d56d-48ba-9fb4-cd0a1a919d28_5055x3555.heic 424w, https://substackcdn.com/image/fetch/$s_!enKM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F668031c0-d56d-48ba-9fb4-cd0a1a919d28_5055x3555.heic 848w, https://substackcdn.com/image/fetch/$s_!enKM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F668031c0-d56d-48ba-9fb4-cd0a1a919d28_5055x3555.heic 1272w, https://substackcdn.com/image/fetch/$s_!enKM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F668031c0-d56d-48ba-9fb4-cd0a1a919d28_5055x3555.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!enKM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F668031c0-d56d-48ba-9fb4-cd0a1a919d28_5055x3555.heic" width="1456" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/668031c0-d56d-48ba-9fb4-cd0a1a919d28_5055x3555.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:217599,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.principalengineer.com/i/186403374?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F668031c0-d56d-48ba-9fb4-cd0a1a919d28_5055x3555.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!enKM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F668031c0-d56d-48ba-9fb4-cd0a1a919d28_5055x3555.heic 424w, https://substackcdn.com/image/fetch/$s_!enKM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F668031c0-d56d-48ba-9fb4-cd0a1a919d28_5055x3555.heic 848w, https://substackcdn.com/image/fetch/$s_!enKM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F668031c0-d56d-48ba-9fb4-cd0a1a919d28_5055x3555.heic 1272w, https://substackcdn.com/image/fetch/$s_!enKM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F668031c0-d56d-48ba-9fb4-cd0a1a919d28_5055x3555.heic 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></p><p>I wrote in late <a href="https://www.principalengineer.com/p/how-i-use-ai-to-boost-my-software">2024 about how I use AI for Software Engineering</a>. 12-14 months is a lifetime in this tech cycle, and as a consequence, my entire workflow has completely changed. I expect it to change as much in the next 12 months, so this is an ever evolving topic. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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>If you read this after July 2026 and think <em>&#8220;this is stupid!&#8221;</em>, it&#8217;s quite likely you are right, because things might have changed again. What is clear, is we have come a long way from vibe-coding and autocomplete on steroids.</p><h2>The Seven Pillars</h2><p>There are seven pillars to my current workflow. We will go into the detail of each below, and I will start from what is likely familiar to people, and move our way towards perhaps less mainstream, but hyper-effective approaches.</p><h3>The Tooling: Claude Code</h3><p>My weapon of Choice since spring of 2025 is Claude Code. At first, I was skeptical of the CLI based approach over the IDE-integrated approach, but as I got used to it, I quickly realized it is superior to the alternatives:</p><ul><li><p>We can use whatever editor we want to view code.</p></li><li><p>The CLI can go off and use whatever tools it needs to do its work.</p></li><li><p>We can integrate the CLI tool into CI pipelines and other automated workflows.</p></li></ul><p>Freeing our AI assistant from the confines of a desktop application really opens up possibilities.</p><p>What is my take on other tools? Github Copilot has come a long way. It&#8217;s probably 3-6 months behind Claude, and if your organization is on Copilot, there is no pressing need to switch, but do know you are somewhat behind of being able to do the most powerful use-cases.</p><h3>Agents &amp; Skills</h3><p>Let&#8217;s first set the scene, with what each means in layman terms: an agent can be seen as an independent process, with its own context (thus not using the size of the main context), that communicates with the main context, but executes tasks and responsibilities that it is assigned as appropriate.</p><p><em>&#8220;Skills&#8221;</em> I view effectively as reusable prompts for repetitive and/or frequently used tasks. If you view skills in this light, you&#8217;ll quickly figure out exactly what skills you need for your specific project: things you need to do frequently and consistently.</p><h4>What Agents should I have?</h4><p>Some people go nuts with agents: they&#8217;ll have a frontend agent, backend agent, architect agent, unit-test agent and so on. I actually do not buy into this approach: if you consider how humans build cohesive systems, it is not by splitting responsibility across every technical silo possible - this is in fact a means of creating disjointed, poorly architected systems. I find it better to put these responsibilities into the overall Claude instructions: such as <em>&#8220;all code should have adequate unit-test coverage, covering both happy- and negative path cases&#8221;</em>.</p><p>Where I do find agents come in handy, is as domain-experts and executors of ancillary tasks. Some examples:</p><ul><li><p><strong>Documentation Agent:</strong> responsible for continuously updating documentation, if relevant, as code changes.</p></li><li><p><strong>Business Domain Expert Agent:</strong> reviews requirements and code, such that they actually make sense in the context of the system and domain you are building. </p></li><li><p><strong>Code Review &amp; Rule Expert Agent:</strong> Solely passive agent that calls out when we duplicate code, write tests that are written to pass, rather than test functionality, violate architectural rules etc.</p></li><li><p><strong>Requirements Reconciliation Agent:</strong> An agent that keeps track of your new work and compares it to past requirements, such that any logical conflicts between new and old requirements can be called out and reconciled.</p></li><li><p><strong>Security Agent:</strong> reviews code for security vulnerabilities.</p></li></ul><h3>Requirements Engineering</h3><p>One fallacy of the AI era is that software engineering is going away. It is not. The level of abstraction is just being raised, same as when we went from punch cards to in-computer code, from manual memory management to garbage collection, and from procedural code to object-oriented and/or functional programming.</p><p>In the age of AI, the bulk of engineering will happen at the level of refining requirements to a size and specificity that is appropriate for AI. AI works exceedingly well for solving well-defined, unambiguous problems. It still falls apart if a problem is ambiguous, or there are edges which are ambiguous. If you look at most of what is put into JIRA and similar tools, or into product description documents  by non-technical product managers, business analysts and users, you&#8217;ll find that the level of ambiguity and lack of specificity will make AI generated solutions mostly fall apart at any scale beyond a single requirement.</p><p>So in early 2026, what is the ideal loop for requirements?</p><p>This is how I go about it:</p><ol><li><p>Write out a requirement in Markdown, as specific as possible.</p></li><li><p>Ask Claude to call out ambiguity in the requirement and ask any questions required to make it unambiguous.</p></li><li><p>Refine collaboratively until Claude is happy.</p></li><li><p>Reset the context window, go back to 2). Repeat until such time Claude, with a clean context, considers the requirement entirely unambiguous and clear to implement.</p></li><li><p>If the requirement is larger than what would be a simple task for a human, ask Claude to break it down into sub-tasks.</p></li><li><p>Again, repeat until you are confident of the specificity and clarity of each step.</p></li><li><p>Start implementation.</p></li></ol><p>The intent of this loop is to effectively have a plain-language, unambiguous and very clear idea of what is being built, what the edge-cases are and how they will be dealt with, how it fits into the greater context of the system, and how it can be broken down into smaller tasks, if necessary.</p><p>It is also useful to keep requirements and tasks broken down, in a structured folder and Markdown format, such that a historical record of requirements and decisions can be accessible both for you as the engineer, and for the AI, to later find and explain why certain things work the way they do, and call out potential conflicting requirements, and how to resolve them, in the future.</p><p>But this alone is not enough, this is why we must continuously do the following steps as well:</p><h3>Non-functional Requirements &amp; Rules</h3><p>We should create unambiguous documentation for our AI assistant of all non-functional rules and requirements that we should adhere to. This should include things such as:</p><ul><li><p>Our tech-stack.</p></li><li><p>Rules around testing.</p></li><li><p>Preferred patterns and code style: do&#8217;s and don&#8217;t&#8217;s.</p></li><li><p>Levels of linting.</p></li><li><p>Verification steps before considering a task done (run tests, lints etc).</p></li><li><p>..anything else that is not technically a requirement, but considered a non-negotiable rule.</p></li></ul><p>If you are only setting up a new project, I&#8217;d suggest you again, use your AI assistant to collaboratively build out this requirements- and rule-set, as you discuss potential architectural choices and tech stacks.</p><h3>Automated Documentation</h3><p>For your AI assistant to easily understand the system that is built when starting a new session, and also for humans who come onboard, automated documentation is essential.</p><p>In the old world, documentation was frequently stale as soon as you&#8217;d done the first commit of a <em>README.md</em>, however, as I mentioned in the <em>Agents &amp; Skills</em>-section, with a dedicated documentation agent, documentation does never need to be outdated.</p><p>If you start automating documentation from the start, this would be the ideal case, but you can also bootstrap documentation after the fact on existing systems through a process of Socratic questioning, and focusing on infrastructural files as entry points for your AI to start exploring (think Dockerfiles, K8S manifests, build files etc).</p><p>What you would hope to produce is:</p><ul><li><p>An entry point README.md for your documentation.</p></li><li><p>Comprehensive documentation, both in the form of Markdown, and Mermaid diagrams embedded in the markdown, this should contain:</p><ul><li><p>Architectural documentation.</p></li><li><p>Overall purpose of the system.</p></li><li><p>Technical principles and rules (your non-functional requirements and rules from before).</p></li><li><p>Architectural Design Records that explain technical decisions that have been made thus far, when they are of architectural significance.</p></li><li><p>Your requirements log.</p></li></ul></li></ul><p>Doing this, and automating it has several key benefits:</p><ul><li><p>Your AI will never get lost in what the system is about, and neither will you.</p></li><li><p>You will have a comprehensive audit-trail of how the system has evolved, and why.</p></li><li><p>New conflicting requirements can be reconciled against old requirements, to find a way forward, without breaking the intent of old requirements.</p></li></ul><p>One point of note though, to not drown in documentation, it is worth also instructing the documentation agent in its definition, to not be shy about removing documentation that is out of date.</p><h3>&#8220;Save Game files&#8221;: the Secret for Continuity</h3><p>One pattern I frequently follow when doing larger changes that may span several days (yes, this still happens even in the age of AI), is that I request my assistant to keep a running log of what it has done so far, what is left to do, and what it has learned around solving non-trivial problems in the process. This is so that when I continue in a new session the next day, I won&#8217;t have to remember the details myself, nor reteach or retrace past steps with my assistant.</p><p>If you&#8217;re just vibe-coding a simple webapp with two features, this may seem superfluous, but on any system of sufficient size and complexity, eventually you will come in contact with changes that are non-trivial to complete in a single day.</p><h3>AI in CI</h3><p>Reading everything we&#8217;ve gone through so far might leave you thinking <em>&#8220;couldn&#8217;t we further automate some of these steps?&#8221;</em>.</p><p>And you&#8217;d be absolutely right! When it comes to how far we can go in embedding AI in our CI pipelines, only our imagination is the limit, if we use CLI-based tooling.</p><p>The obvious steps are:</p><ul><li><p>PR reviews, based on our rules and documentation.</p></li><li><p>Automated documentation updates.</p></li><li><p>Security reviews.</p></li><li><p>..and much, much more.</p></li></ul><h2>Key Takeaways for the 2026 Software Engineer</h2><ul><li><p><strong>Precision is the new Syntax:</strong> Your ability to eliminate ambiguity in requirements is now more important than your ability to remember library APIs.</p></li><li><p><strong>Context is King:</strong> The difference between a &#8220;vibe-coded&#8221; mess and a production-grade system is the quality of the non-functional rules and documentation you provide your agents.</p></li><li><p><strong>The CLI is the Workflow Engine:</strong> Moving away from the IDE-integrated &#8220;chat box&#8221; toward CLI-based tools like Claude Code allows for the automation and pipeline integration that professional systems require.</p></li><li><p><strong>Continuity over Speed:</strong> Using &#8220;Save Game&#8221; files and automated ADRs (Architectural Design Records) ensures that the speed of AI doesn&#8217;t lead to a technical debt trap.</p></li></ul><h3>Conclusion: The Rise of the Logic Architect</h3><p>We are witnessing a fundamental shift in the &#8220;unit of work&#8221; for a software engineer. We used to measure ourselves by the code we wrote - today, we measure it in the <strong>clarity of our mental models</strong> and the <strong>robustness of our agentic workflows.</strong></p><p>If you feel like you&#8217;re spending more time writing Markdown than JavaScript, don&#8217;t worry, you&#8217;re doing it right. You are no longer just a coder; you are a <strong>Logic Architect</strong>. Your job is to build the constraints, the rules, and the context that allow AI to execute with 100% precision.</p><p>The &#8220;seven pillars&#8221; I&#8217;ve outlined here aren&#8217;t just about being faster - they are about being more intentional. In a world where AI can generate a thousand lines of code in seconds, the human engineer&#8217;s most valuable contribution is ensuring that every single one of those lines actually belong there.</p><p>See you in 12 months for the next update, unless the agents haven&#8217;t rewritten this blog for me by then.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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 limits and possibilities of AI Assistants]]></title><description><![CDATA[The discourse on AI-generated code is stuck in a false dichotomy peddled by both proponents and detractors.]]></description><link>https://www.principalengineer.com/p/the-limits-and-possibilities-of-ai</link><guid isPermaLink="false">https://www.principalengineer.com/p/the-limits-and-possibilities-of-ai</guid><dc:creator><![CDATA[Wille Faler]]></dc:creator><pubDate>Fri, 02 May 2025 09:43:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!eqo3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51671acd-112d-404a-934f-8efe07500b5b_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eqo3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51671acd-112d-404a-934f-8efe07500b5b_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eqo3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51671acd-112d-404a-934f-8efe07500b5b_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!eqo3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51671acd-112d-404a-934f-8efe07500b5b_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!eqo3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51671acd-112d-404a-934f-8efe07500b5b_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!eqo3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51671acd-112d-404a-934f-8efe07500b5b_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eqo3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51671acd-112d-404a-934f-8efe07500b5b_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51671acd-112d-404a-934f-8efe07500b5b_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1706154,&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.principalengineer.com/i/162333603?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51671acd-112d-404a-934f-8efe07500b5b_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!eqo3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51671acd-112d-404a-934f-8efe07500b5b_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!eqo3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51671acd-112d-404a-934f-8efe07500b5b_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!eqo3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51671acd-112d-404a-934f-8efe07500b5b_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!eqo3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51671acd-112d-404a-934f-8efe07500b5b_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The discussion about AI-generated code, whether coming from hype-merchants, or skeptics, frequently makes it sound as if you should stop thinking about the code and architecture and just accept it as is, once it compiles and seemingly works.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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>Nothing could be further from the truth: AI-generated code does not absolve the developer from thinking about code, architecture, tests, refactoring, edge-cases etc. All it absolves us from doing is some of the typing!</p><p>I generate a lot of my code these days. I rarely accept it at face value. I almost always spend significant time refactoring what I&#8217;ve received, thinking about edge-cases and tests I&#8217;ll need. And I have an active discussion with my AI assistant about these things. What generated code has allowed me to do is focus my on what matters, and save energy on typing out boilerplate.</p><h2>What is an LLM capable of, really?</h2><p>LLM&#8217;s, somewhat simplified, are not real intelligence, but a combination of three things:</p><ul><li><p>Autocomplete on steroids.</p></li><li><p>A compressed, lossy search across the LLM&#8217;s training corpus (compressed, lossy = hallucinations).</p></li><li><p>Conversational search across the above, predicting the most likely/wanted response to a query.</p></li></ul><p>The last point is key. We should not anthropomorphize AI, but if we are to do it, I think we can translate the <em>&#8220;most likely/wanted response&#8221;</em>, into thinking about an LLM as a sycophant - it will tell you what you want to hear.</p><p>The second order consequence of an LLM as a sycophant, is that if you ask it to write your unit-tests, there is a high risk/chance it will generate tests that pass if possible, even if the code tested contains obvious bugs. This means a few things:</p><ul><li><p>You can never fully trust tests written by an LLM without thorough human inspection.</p></li><li><p>You can increase trust by prompting with a high degree of specificity of the criteria to pass.</p></li><li><p>You need to question edge-cases that are likely not covered.</p></li></ul><p>Now, if you do the last two things, the lines are blurring between code and natural language, don&#8217;t you think? This doesn&#8217;t mean we can&#8217;t work this way, or that it isn&#8217;t useful. However, it does mean that we still need to have in-depth awareness of the problem we are solving, and how it interacts with the code we are using, writing and generating.</p><p>I discussed tests here, but obviously all of the above here also applies to implementation code! Just because you didn&#8217;t test it, or see a failing test, doesn&#8217;t mean there aren&#8217;t bugs lurking.</p><h2>AI only helps with autocomplete?</h2><p>In a word: No.</p><p>As <a href="https://www.principalengineer.com/p/how-i-use-ai-to-boost-my-software">I previously wrote</a>, I think we are only starting to scratch the surface of what AI assistants are capable of, but we also need to learn to work with them, and understand their limitations.</p><p>Some ways I have found AI Assistants to help:</p><ul><li><p>Code generation</p></li><li><p>Inspection/review: did we catch all edge-cases? Are there any issues?</p></li><li><p>Interactive documentation: How does this code or API work? If I do A, are my assumptions correct?</p></li><li><p>Getting unstuck: <em>&#8220;better, contextual StackOverflow&#8221;</em></p></li><li><p>Architecture feedback: describe my architectural ideas, get feedback on trade-offs.</p></li></ul><p>But, remember what I said earlier: your Assistant is a sycophant! You need to take all feedback and code generated in consideration with a critical mind. The model might just be telling you what it thinks you want to hear, not what is most useful.</p><h2>So how much time and cognitive load do I save?</h2><p>This is the billion-dollar question.</p><p>My feeling is that, like many other technological improvements over the last 50 years, we yet again reduce time used, and cognitive load of low-value work. </p><p>Calculators did not replace mathematicians or undermine the value of mathematical knowledge. </p><p>What AI Assistants save software engineers is in typing, remembering API&#8217;s &amp; documentation, and having interactive feedback on work, without always requiring a physical human as your pair programming partner.</p><p>The result is, we will spend less time typing out code, and more time thinking about the problem to be solved. This will certainly reduce the time and cost of producing software. But as any seasoned professional will know, conceptualizing a solution, and in particular, writing the code, is only a small portion of the problem software engineers solve. </p><h2>Conclusion</h2><p>If AI Assistants only touch a small surface area of what software engineers do, are they useful?</p><p>The answer to that is a resounding <em>&#8220;Yes!&#8221;</em>. They are useful in the same way calculators and spreadsheets are useful to mathematicians and statisticians.</p><p>They won&#8217;t do the high-level thinking and problem-solving for us, but they will certainly aid us in doing it, by providing feedback and reducing the cognitive load of low-level details.</p><p>Personally, more often than not, I have an idea of the direction I want to go in to solve a problem, but in the past, going from idea to solution was broken up by a LOT of typing code, looking at documentation, getting stuck on small, but non-obvious bugs.</p><p>If I can do less of that grunt work, and more of the more fulfilling thinking, I will not only be more productive, but also a lot happier in what I do. I think this goes for almost anyone.</p><p>We should embrace our brave new world, but keep our expectations grounded in what the tools can- and cannot do at any point of progress. This is how we ensure we stay at the leading edge of progress, without wasting time going down blind alleys of false promise.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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[Generative AI will displace fewer jobs than you think]]></title><description><![CDATA[The current generation of AI is productivity boosting, but will ultimately fall short of expectations without significant, unknown scientific discoveries.]]></description><link>https://www.principalengineer.com/p/generative-ai-will-displace-fewer</link><guid isPermaLink="false">https://www.principalengineer.com/p/generative-ai-will-displace-fewer</guid><dc:creator><![CDATA[Wille Faler]]></dc:creator><pubDate>Mon, 13 Jan 2025 09:01:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!DhNz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd974832-1be2-4c95-9404-e8cd3fa74e2f_1024x1024.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DhNz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd974832-1be2-4c95-9404-e8cd3fa74e2f_1024x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DhNz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd974832-1be2-4c95-9404-e8cd3fa74e2f_1024x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!DhNz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd974832-1be2-4c95-9404-e8cd3fa74e2f_1024x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!DhNz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd974832-1be2-4c95-9404-e8cd3fa74e2f_1024x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!DhNz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd974832-1be2-4c95-9404-e8cd3fa74e2f_1024x1024.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DhNz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd974832-1be2-4c95-9404-e8cd3fa74e2f_1024x1024.heic" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bd974832-1be2-4c95-9404-e8cd3fa74e2f_1024x1024.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:159814,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&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_!DhNz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd974832-1be2-4c95-9404-e8cd3fa74e2f_1024x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!DhNz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd974832-1be2-4c95-9404-e8cd3fa74e2f_1024x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!DhNz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd974832-1be2-4c95-9404-e8cd3fa74e2f_1024x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!DhNz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd974832-1be2-4c95-9404-e8cd3fa74e2f_1024x1024.heic 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></p><p>I have been on the Generative AI train since before day one. My first brushes with Natural Language Processing (NLP) go as far back as 2008. I founded a startup that focused on NLP applications for financial markets trading systems in 2011.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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>Even with a deep background, I was blown away when first GPT 3 and later GPT 4 came out, and I started integrating them into my workflows immediately, to the point where today, Generative AI are an integral part of my daily workflows.</p><p>They are immensely useful, productivity boosting. I&#8217;ve previously written at length about how I use them for some of my work. </p><p>But with deep familiarity also comes awareness of the limits and shortcomings of current, and likely immediately coming generations of software: hallucinations are not getting better. Reasoning is lacking. They get stuck in local maxima and loops, and much more. These issues don&#8217;t look to go away, as we have practically exhausted all sources of training data, and improvements are now primarily focused on the inference side.</p><p>To make a long story short: to make significant progress from where we are today, we will need to make several, as of now, unknown scientific discoveries. Sure, we can polish what we have and make it smoother, less error-prone, but it ain&#8217;t AGI.</p><h2>Unreasonable business risks of replacement</h2><p>So we have an AI that hallucinates, gets things wrong 10-20% of the time (conservatively estimated), and lacks reasoning.</p><p>Where does that leave us in terms of unsupervised operation? What human tasks in business are acceptable with these sorts of problems? </p><p>Call-centers and customer support have been mooted as one area, and Klarna claims to have made massive inroads here (nothing to do with an overfunded company struggling to live up to past funding rounds valuations, wanting to boost it by being an &#8220;AI company&#8221;, but I digress).</p><p>I&#8217;m not sure if I buy it: sure, call-centers and customer support may be candidates, IF you are happy with basically an interactive FAQ style level of customer support. But for how many businesses will this be acceptable? Also, if the LLM Agent hallucinates discounts, rewards or refund policies, businesses have to fulfill them, is this going to be ok?</p><p>Let&#8217;s move up the stack to more intellectually demanding jobs: programmers seem to be on the shopping block quite a lot. But if LLM produced code is wrong 10-20% of the time, and it is uncritically deployed to production, it is probably going to be a business ending issue a relatively high percentage of the time.</p><p>Fire all the programmers, who are equipped to evaluate the output, while letting managers and business analysts dictate to an LLM? Good luck.</p><h2>Who is getting replaced anyway?</h2><p>It&#8217;s undeniable that AI will allow us to do more with less, I already <a href="https://www.principalengineer.com/p/ai-and-the-coming-boom-in-demand">wrote about the paradoxical increase in demand for human intelligence</a> that will result from this.</p><p>But let&#8217;s assume for a second we simply keep doing the same things as today, with fewer resources, and let&#8217;s focus on technology.</p><p>Who is best equipped to &#8220;manage&#8221; AI, evaluate and correct its output? Undeniably, it will be software engineers. So in practice, it is simply an evolution of the profession: writing even less code (coding is only a fraction of what software engineers do), spending more time reading code. </p><p>In practice, we&#8217;ll see increased demand for software engineers with a flair for product management, prioritization and evaluating trade-offs. The profession will become more demanding, and the bottom 10-20% of &#8220;code monkeys&#8221; will be cut loose, as their value add in this new reality is negligible.</p><p>What are the secondary effects of engineers taking on more responsibilities? We&#8217;ll see reduced demand for the ancillary skill sets and roles. Non-technical Business Analysts are on thin ice. Product Managers will continue to exist, but there will be fewer of them. Manual testers have long been disappearing and will continue to do so.</p><p>So if the above comes to pass, there will be significantly fewer people to manage. What, then, happens to the managerial classes, when there are fewer, more self-organizing people to manage? I&#8217;ll let you finish my next sentence on your own.</p><h2>The fallacy of replacing &#8220;the doing&#8221;</h2><p>The fundamental fallacy of theories of job displacement through technology is that those with the expertise in doing the work will get replaced, while those without it (managers, analysts) will assume their responsibilities.</p><p>This is an assumption based on hierarchy, not fact. Feeding the foot soldiers to the grinder, while those &#8220;above&#8221; are safe.</p><p>If you instead turn to assumptions and questions based on unit-economics, the outcomes become quite different. Whose economic output is likely to be increased the most by new technology? Whose skill set is likely to be increased the least? If fewer people will indeed be required, what roles and overheads will disappear?</p><h2>Conclusion</h2><p>My thesis is, given the error rates of Generative AI, fewer jobs than we think will be entirely displaced, even low-end ones. </p><p>The current zeitgeist around displacement is also wrong: applying a lens of whose output is most likely to benefit from new technology, and who is most adept at managing it, means these assumptions will be turned on their heads.</p><p>Finally, being able to do more with less, is primarily detrimental to roles that are overheads in relation to the doing: the roles that are necessary evils when managing at scale, but which may be surplus to requirements as team-sizes to achieve the same thing shrinks.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[AI and the coming boom in demand for Human Intelligence]]></title><description><![CDATA[History teaches us that AI will increase, not decrease, the demand for human intelligence. Mostly so in skilled professions that are the most impacted by AI.]]></description><link>https://www.principalengineer.com/p/ai-and-the-coming-boom-in-demand</link><guid isPermaLink="false">https://www.principalengineer.com/p/ai-and-the-coming-boom-in-demand</guid><dc:creator><![CDATA[Wille Faler]]></dc:creator><pubDate>Mon, 30 Dec 2024 12:25:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!gq8N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c99ebca-d9c6-4bdb-8665-b262e22a6837_1793x2397.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gq8N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c99ebca-d9c6-4bdb-8665-b262e22a6837_1793x2397.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gq8N!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c99ebca-d9c6-4bdb-8665-b262e22a6837_1793x2397.jpeg 424w, https://substackcdn.com/image/fetch/$s_!gq8N!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c99ebca-d9c6-4bdb-8665-b262e22a6837_1793x2397.jpeg 848w, https://substackcdn.com/image/fetch/$s_!gq8N!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c99ebca-d9c6-4bdb-8665-b262e22a6837_1793x2397.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!gq8N!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c99ebca-d9c6-4bdb-8665-b262e22a6837_1793x2397.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gq8N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c99ebca-d9c6-4bdb-8665-b262e22a6837_1793x2397.jpeg" width="268" height="358.1923076923077" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5c99ebca-d9c6-4bdb-8665-b262e22a6837_1793x2397.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1946,&quot;width&quot;:1456,&quot;resizeWidth&quot;:268,&quot;bytes&quot;:759438,&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_!gq8N!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c99ebca-d9c6-4bdb-8665-b262e22a6837_1793x2397.jpeg 424w, https://substackcdn.com/image/fetch/$s_!gq8N!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c99ebca-d9c6-4bdb-8665-b262e22a6837_1793x2397.jpeg 848w, https://substackcdn.com/image/fetch/$s_!gq8N!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c99ebca-d9c6-4bdb-8665-b262e22a6837_1793x2397.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!gq8N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c99ebca-d9c6-4bdb-8665-b262e22a6837_1793x2397.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">William Stanley Jevons, father of Jevons Paradox</figcaption></figure></div><p>When intelligence becomes abundant, demand for it will explode. This is something we can easily see from history, and what is called <a href="https://en.wikipedia.org/wiki/Jevons_paradox">Jevons Paradox</a>: When a resource becomes more effective to use, and radically cheaper, demand paradoxically increases.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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>When electricity became cheap, we didn&#8217;t stick with replacing our means of lighting. We replaced heating, eventually food preparation. We invented radio, refrigeration and more new technologies than earlier thought possible, because we got abundant, cheap energy. When calculators became mainstream, mathematical knowledge didn&#8217;t lose its value, the value of it rose through its leveraged application.</p><p>The same thing will happen as intelligence becomes abundant with the entry of generative AI.</p><h2>Doing things that were too small &amp; costly before</h2><p>The obvious case of what will happen: We&#8217;ll do the same things with fewer people and less resources. This is the focus of the current Zeitgeist, and what people with a static, unimaginative mindset believe will lead to mass unemployment by people displaced by AI.</p><p>Some displacement will inevitably happen, but the opportunities that arise in adjacent areas will be bigger than the displacement. The most obvious case, for software, is doing all the things that were previously inefficiencies, but far too expensive to do anything about. Consider any workflow today that is puzzled together by email, Excel-spreadsheets, or people doing repetitive tasks with small variability, but for which the payoff of automation has been lower than the cost of automation.</p><p>If the cost of producing software is reduced by just 20%, an immense number of new use-cases suddenly becomes economically viable. If you reduce the cost by 50% or even 90% (unlikely in the foreseeable future), the number of use-cases that can be dealt with has a veritable Cambrian explosion.</p><p>Consider previous technological shifts, the things that became economically viable, but this time, add the human intellectual bandwidth which is freed by AI, and we might see a boom the like of which we&#8217;ve never seen before.</p><h2>Doing things that were too big or speculative before</h2><p>On the opposite end of the status quo, endeavors that were previously too big, too resource intensive, or simply too speculative, become less so. This is the realm of the unknown unknows: new technologies that may seem like science fiction by our current standards.</p><p>If the timeline, resources, and cost of a moonshot-type project is reduced significantly, it becomes less of a moonshot, and, more feasible to start in the first place. The impact on this for technology, medicine, biotechnology and other deep-tech industries should not be underestimated. Be prepared for our impending sci-fi future.</p><h2>Conclusion: humans will be more in demand, not less</h2><p>Steve Jobs is attributed with the saying that <em>&#8220;Personal computers are like bicycles for the mind&#8221;</em>.</p><p>If that is the case, AI is like a personal rocketship for your brain: It shortens the path from idea to proven or disproven hypothesis. It reduces the drudgery in f&#8217;in around and finding out, so that we may find out sooner. Our intellect gets an amazing leverage in thinking about the big picture, while not having to memorize trivia to achieve the same outcome, when trivia with instant recall is at our fingertips.</p><p>This in turn, unlocks economic opportunities, small and massive, which are far greater than the opportunities we have today. The consequence is, the world will have a never ending demand for intelligence, both artificial and biological.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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 use AI to boost my Software Engineering productivity]]></title><description><![CDATA[AI still hallucinates, generates slop, and can't reason about the big picture. But it's still an incredible productivity tool for software engineers. This post is about how I use it.]]></description><link>https://www.principalengineer.com/p/how-i-use-ai-to-boost-my-software</link><guid isPermaLink="false">https://www.principalengineer.com/p/how-i-use-ai-to-boost-my-software</guid><dc:creator><![CDATA[Wille Faler]]></dc:creator><pubDate>Tue, 17 Dec 2024 17:40:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!CWwc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe57e6d8-9b27-41e5-a0cf-9c4371659b7f_1024x1024.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CWwc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe57e6d8-9b27-41e5-a0cf-9c4371659b7f_1024x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CWwc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe57e6d8-9b27-41e5-a0cf-9c4371659b7f_1024x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!CWwc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe57e6d8-9b27-41e5-a0cf-9c4371659b7f_1024x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!CWwc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe57e6d8-9b27-41e5-a0cf-9c4371659b7f_1024x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!CWwc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe57e6d8-9b27-41e5-a0cf-9c4371659b7f_1024x1024.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CWwc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe57e6d8-9b27-41e5-a0cf-9c4371659b7f_1024x1024.heic" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/be57e6d8-9b27-41e5-a0cf-9c4371659b7f_1024x1024.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:151028,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&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_!CWwc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe57e6d8-9b27-41e5-a0cf-9c4371659b7f_1024x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!CWwc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe57e6d8-9b27-41e5-a0cf-9c4371659b7f_1024x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!CWwc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe57e6d8-9b27-41e5-a0cf-9c4371659b7f_1024x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!CWwc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe57e6d8-9b27-41e5-a0cf-9c4371659b7f_1024x1024.heic 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>Fever dreams of having AI write all our complex software for us are still largely that, fever dreams.</p><p>But used correctly, it&#8217;s still a powerful tool to get more done, with fewer defects. My use has evolved with time, and my first steps were much the same as everyone else:</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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>First steps: Copilot completion &amp; &#8220;fix this!&#8221;</h2><p>Like most others, my first steps were paying for Github Copilot, and asking ChatGPT, and later Claude general questions about code sticking points and algorithms.</p><p>The first gains were, for a former RSI sufferer, welcome: it simply made me type less. Github Copilots early in-editor support is autocompletion on steroids, nothing more, nothing less.</p><p>Also, having an interactive search like ChatGPT to quickly get personalised responses to what in the past would have been a Google search for a StackOverflow result, is great. We have StackOverflow on steroids!</p><p>The big win with the first iteration of tools was less typing, less spending time completely stuck on things of trivia.</p><h2>Second steps: Contextual help</h2><p>The next generation has been tools like Cursor, <a href="https://github.com/yetone/avante.nvim">Avante</a>, Cody, and further iterations of Github Copilot - these live in your IDE or editor of choice, and can take a snippet of code, whole file, set of files or whole project as context, and give you help in writing code, writing tests or solving issues like finding the unbalanced brace or other syntactical issues.</p><p>I too went through this phase. It&#8217;s like having an over-eager junior developer you&#8217;re pairing with, who knows algorithms and API&#8217;s better than you, but couldn&#8217;t see the forest for the trees, if their virtual life depended on it.</p><p>At this point, we are writing even less code, but we need a firm hand to drive our virtual junior colleague. They easily miss context, get stuck in loops, or simply cannot solve problems that require more than a few pieces of context in your head at the same time.</p><p>We&#8217;re not getting replaced anytime soon, the only thing that is happening is that the nature of how we do our job is changing: we are becoming supervisors, while the minutae of typing is becoming less important.</p><h2>Where I am today: my virtual pairing partner</h2><p>I am still using AI in all of the aforementioned ways, but I&#8217;ve found a few additional use-cases, that really unlocked additional productivity..</p><p>I provide the AI assistant with context (usually a few files at a time), constraints, and requirements, and ask it to:</p><ul><li><p>Find issues with my code: ask if it achieves the given aim, and if there are any issues, smells or edge-cases I can&#8217;t see.</p></li><li><p>Suggest improvements: Are there ways in which the code can be improved? If there are, I will usually provide additional context, and ask for specific improvement suggestions in the areas highlighted.</p></li><li><p>Explain to me what this code does: In the case of code, I am not familiar with, but can explain what it is part of.</p></li><li><p>Explain third-party API behaviors: especially useful with systems that are stateful. Most APIs are pretty sucky. But widely used APIs are at least well enough documented and discussed for AI to have been trained on its foibles.</p></li><li><p>Ask outright whether specific edge-cases I can envision are covered by a piece of code.</p></li><li><p>Look at my tests and my code, analyze whether the tests are comprehensive, or if there are further edge-cases I have missed.</p></li><li><p>Verify my SQL is syntactically correct for the dialect I am using, and ensure it is efficient.</p></li><li><p>..and yes, for relatively trivial, but typing intensive tasks, I frequently let the AI generate the code for me. But beware, it&#8217;s fraught with issues for anything that goes beyond trivial, which barely makes it worthwhile.</p></li></ul><p>Basically, I have started using AI (I use <a href="https://sourcegraph.com/cody">Cody</a> with Claude as my primary assistant these days) like a pair programming partner, whom I ask the questions I would ask a human pair. With the exception that Claude/Cody never gets tired, never switches off, has amazing recall of API specifics, but can&#8217;t see the big picture very well.</p><p>The main takeaway for me is, Pair Programming has always been an effective way to review and improve code. While AI assistants are not yet anywhere near human level, they nonetheless provide a valuable second pair of &#8220;eyes&#8221; to review ongoing work, if prompted correctly.</p><h2>Conclusions</h2><p>Software engineering as a profession isn&#8217;t going away anytime soon. But it is evolving at a rapid pace, and we need to keep adapting. Adopt, adapt, or become irrelevant. </p><p>So far, I wouldn&#8217;t say AI is making me hyper-productive compared to my 2022 self, but it is certainly adding 10-20% at least. At the same time, used correctly, I think, rather than generating &#8220;AI slop&#8221;, we can leverage AI to make our co-created software more reliable, by asking the right questions, and critically taking in the input.</p><p>And I&#8217;m sure if you ask me again in 18 months, my use will have further evolved.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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[When is a CTO not a CTO?]]></title><description><![CDATA[Title inflation is real. Many of the individuals in industry with the title "CTO", really are no such thing. Let's dig deeper!]]></description><link>https://www.principalengineer.com/p/when-is-a-cto-not-a-cto</link><guid isPermaLink="false">https://www.principalengineer.com/p/when-is-a-cto-not-a-cto</guid><dc:creator><![CDATA[Wille Faler]]></dc:creator><pubDate>Tue, 03 Dec 2024 20:14:42 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FJLN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd419a042-1055-4d8f-a0d8-d7d1364c9317_1024x1024.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FJLN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd419a042-1055-4d8f-a0d8-d7d1364c9317_1024x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FJLN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd419a042-1055-4d8f-a0d8-d7d1364c9317_1024x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!FJLN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd419a042-1055-4d8f-a0d8-d7d1364c9317_1024x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!FJLN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd419a042-1055-4d8f-a0d8-d7d1364c9317_1024x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!FJLN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd419a042-1055-4d8f-a0d8-d7d1364c9317_1024x1024.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FJLN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd419a042-1055-4d8f-a0d8-d7d1364c9317_1024x1024.heic" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d419a042-1055-4d8f-a0d8-d7d1364c9317_1024x1024.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:189622,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&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_!FJLN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd419a042-1055-4d8f-a0d8-d7d1364c9317_1024x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!FJLN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd419a042-1055-4d8f-a0d8-d7d1364c9317_1024x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!FJLN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd419a042-1055-4d8f-a0d8-d7d1364c9317_1024x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!FJLN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd419a042-1055-4d8f-a0d8-d7d1364c9317_1024x1024.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I&#8217;ve seen many discussions on LinkedIn and social media lately on whether a CTO should be hands-on. Opinions differ, but mine is pretty clear:</p><p>I&#8217;m going to set out my stall early: most early-stage startup CTO&#8217;s aren&#8217;t CTO&#8217;s. Most early-stage startups patently do not need a CTO.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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>If your CTO writes production code, he probably isn&#8217;t a CTO. If your CTO directly manages developers, he most likely isn&#8217;t a CTO.</p><p>What companies at this sort of scale need, and frequently have, are strong Individual Contributors (&#8220;IC&#8217;s&#8221;), with a good feel for product, who can help teams self-organize and select the correct trade-offs to get to market/iterate after market entry.</p><p>But giving these individuals premature titles of CTO, Director/VP/Head of Engineering or similar is doing them a great disservice - if their comfort zone and zone of excellence is the intersection of IC, team &amp; product, asking them to do the work of an actual CTO/Director/VP/Head later will at best make them miserable, at worst have them be awful at their job, when they used to be an outstanding IC &amp; team multiplier.</p><h2>A star IC &amp; CTO are not the same</h2><p>A real CTO&#8217;s job mostly includes responsibilities far away from writing code: it&#8217;s turning the CEO&#8217;s business strategy into technological strategy. It&#8217;s selecting and negotiating with vendors. Budgeting. Figuring out how to structure the engineering organization, and what that means in terms of the lieutenants they need in place to delegate to. It&#8217;s a million things miles away from writing code.</p><p>It is also about learning to let go and trust people to do what they were hired to do. Many a star IC over-promoted has a hard time letting go of being an IC, being in control and knowing every minute detail of what is going on in their tech stack. It easily spills over into micromanagement, second guessing and directing people instead of giving them a goal to aim for.</p><p>This sort of behavior in a CTO role is absolutely toxic: it makes people second guess what the CTO wants, it sucks the air out of the room, and subsequently robs people of both initiative, agency and growth opportunities.</p><h2>Seniority means guarding your opinions</h2><p>It&#8217;s lonely at the top. Or at least, it sadly should be:</p><p>The more senior the formal title and authority, the more weight even throwaway comments carry among staff. Even without intent, subordinates easily fall into guessing games about what the CTO wants, if they seemed to express an opinion on something. It&#8217;s easy for people to fall into seeking approval of a the CTO rather than doing what&#8217;s right for their business area.</p><p>In practice, this means someone with a senior management title often needs to be well-guarded in expressing opinions publicly in areas which are not their direct purview. It&#8217;s better to say nothing, than to send a team into tail-chasing mode because you expressed a preference for one architectural style, technology or vendor over another.</p><p>Let&#8217;s be honest: being this level of guarded does not come naturally to many people at all. Especially not those who have been on a career-path to seniority. But some excel at it naturally, others learn it the hard way. Yet others never learn, and as a consequence, unwittingly struggle with the issues that it produces.</p><h2>Early-stage startups and small businesses don&#8217;t need a CTO!</h2><p>I implied early on that most CTO&#8217;s of early-stage startups and small companies aren&#8217;t CTO&#8217;s.</p><p>If we take a step back, it&#8217;s really no criticism of the individuals who still hold the title. It&#8217;s just that what early-stage and small businesses need aren&#8217;t a CTO. Arguably, they don&#8217;t need Directors, VPs etc. either, they barely need Engineering Managers.</p><p>But because CxO titles are cool, and most feel someone needs it, they are handed out like candies anyway, when what is needed is actually something entirely different.</p><p>An early-stage startup CTO probably more does the equivalent job of what in a bigger company a Principal- or Staff Engineer does, with explicit final say in technical decisions. </p><p>All the inflated title achieves is future prestige &amp; political issues, as demoting someone unsuited to the role is both more frequent, and more infected, than simply not having the title to begin with and hiring for it later as growth requires it.</p><p>Occasionally, a company might get lucky, and their designated CTO is actually an appropriate pick and grows with the role. But I&#8217;d venture a guess that it is far more common that star Individual Contributors get over-promoted based on showing excellence in areas entirely unrelated to what is required of a CTO. In a way, it&#8217;s a tragedy in its own right: you are robbing an individual of the thing they excel at (and often fulfils them), and hanging them out to dry, doing work they are potentially not suited to. They may even cling on to the work of their old role, holding a senior title, but actually doing none of the work it entails.</p><h2>Take-away: resist title-inflation</h2><p>Let&#8217;s be honest: a 3-5 man company does not need to have 3-5 CxO&#8217;s. One is plenty, often to a considerably larger size.</p><p>Call roles what they are, and hire for what they are. If the role entails primarily engineering work, the person is an engineer, end of story. </p><p>Excessive title inflation will only cause problems of hurt egos as a company grows and people are painted into corners because of the titles they were given prematurely.</p><p>Avoiding title inflation is in everyone&#8217;s best interest: the company, and the individuals who would be saddled with inflated titles.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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[Old school architectures making a return, part 3: escaping the Hyperscalers]]></title><description><![CDATA[Nobody ever got fired for buying AWS. But maybe they should be?]]></description><link>https://www.principalengineer.com/p/old-school-architectures-making-a-5c0</link><guid isPermaLink="false">https://www.principalengineer.com/p/old-school-architectures-making-a-5c0</guid><dc:creator><![CDATA[Wille Faler]]></dc:creator><pubDate>Tue, 26 Nov 2024 18:11:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!O2Vq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20950638-75d7-4514-aec6-6be9b7b482bd_534x467.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For the last 15 years, the default move for startups and enterprises alike has been to move their compute needs to the three big Hyperscalers (AWS, Google Cloud, Azure). In particular, AWS has benefitted, being the first modern cloud provider.</p><p>This has been further solidified by skills for the three specific clouds being in-demand: a combination of Resum&#233; Driven Development, and certifications have reinforced the loop of moving to the Hyperscalers.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>However, lately this default is coming under attack: Amazon Web Services margins, as of April 2024, were 37.6%, quite rich for a supposed commodity business. GCP and Azure margins aren&#8217;t far behind. People have started questioning the default, Basecamp have loudly moved from the cloud back to on-premises due to costs.</p><p>And even by what can be observed externally, it seems the Hyperscalers are milking their customers. As an example, <a href="https://holori.com/egress-costs-comparison/">in a recent price comparison</a>, 50TB of data costs:</p><ul><li><p>$56 on Hetzner</p></li><li><p>$4250 on Google Cloud</p></li><li><p>$4350 on Azure</p></li><li><p>$4500 on AWS</p></li></ul><p>There are two observations I can make from this:</p><p>The Hyperscalers price bandwidth almost 80x higher than some of their smaller competitors.</p><p>Secondly, the Hyperscalers usurious egress pricing is curiously closely clustered together to make me think&#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_!O2Vq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20950638-75d7-4514-aec6-6be9b7b482bd_534x467.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!O2Vq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20950638-75d7-4514-aec6-6be9b7b482bd_534x467.jpeg 424w, https://substackcdn.com/image/fetch/$s_!O2Vq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20950638-75d7-4514-aec6-6be9b7b482bd_534x467.jpeg 848w, https://substackcdn.com/image/fetch/$s_!O2Vq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20950638-75d7-4514-aec6-6be9b7b482bd_534x467.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!O2Vq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20950638-75d7-4514-aec6-6be9b7b482bd_534x467.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!O2Vq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20950638-75d7-4514-aec6-6be9b7b482bd_534x467.jpeg" width="534" height="467" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/20950638-75d7-4514-aec6-6be9b7b482bd_534x467.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:467,&quot;width&quot;:534,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48552,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!O2Vq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20950638-75d7-4514-aec6-6be9b7b482bd_534x467.jpeg 424w, https://substackcdn.com/image/fetch/$s_!O2Vq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20950638-75d7-4514-aec6-6be9b7b482bd_534x467.jpeg 848w, https://substackcdn.com/image/fetch/$s_!O2Vq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20950638-75d7-4514-aec6-6be9b7b482bd_534x467.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!O2Vq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20950638-75d7-4514-aec6-6be9b7b482bd_534x467.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>But surely there are benefits to the Hyperscalers?</h2><p>Yes, the Hyperscalers have certain benefits (note: i distinguish between the cloud and hyperscalers, they are not the same).<br>Not least:</p><ul><li><p>Close to limitless elastic scaling.</p></li><li><p>Global reach - the ability to put compute close to users almost anywhere on the planet. This significantly reduces latency in many cases.</p></li><li><p>Global resilience - the ability to create systems where losing an entire datacenter is only a blip.</p></li><li><p>A plethora of managed services that reduce the need for dedicated DevOps/systems administrator headcount.</p></li></ul><p>There are surely more benefits that slip my mind at this point, but nonetheless, for organizations that need one or more of the above, Hyperscalers are close to the only game in town.</p><h2>Do you need it, though?</h2><p>However, ask yourself, apart from the cool-points you score from saying your system is globally resilient and distributed, can scale infinitely, etc, do you <em>really</em> need those things?</p><p>Is your load-profile mostly stable, or perhaps not stable, but predictable, to the point where growth and even best/worst-case scenarios of load are easily achieved with.. Some servers?</p><p>Maybe, it&#8217;s a case of YAGNI (<em>&#8220;You Aren&#8217;t Gonna Need It&#8221;</em>)? Maybe one of the smaller, budget cloud providers will serve you just as well, for a fraction of the price?</p><p>Or if you are a bigger company, perhaps on-premise/dedicated hardware in someone&#8217;s datacenter(s) will do the job?</p><h2>For the third time: consider your defaults!</h2><p>For the third time in this series of posts, I&#8217;m going to make the point I have been making throughout: </p><p><em>Stop defaulting your choices. Start considering the trade-offs of different choices. Pick the best one.</em></p><p>I&#8217;m not quite advocating a return to on-premise (though it might be appropriate for some), just consider whether the benefits of the Hyperscalers really apply to your use of compute, and whether they warrant the steep premium paid.</p><p>By simply asking the questions and considering the answers, it&#8217;s possible you may cut your operational costs down to a fraction. If you compound the choice of not always building microservices, and not always defaulting to the big, expensive cloud providers, the savings could be immense. Simpler architecture leads to less compute being used, and less DevOps work needed. Less compute, from less expensive providers, will improve the bottom-line even further.</p><p>As we close the books on the excesses of the ZIRP (&#8220;Zero Interest Rate Policy&#8221;)-era, it&#8217;s worth reflecting on the excesses our industry got caught up in. Expensive default choices are definitely some of them.</p><h3>Previous entries in this series:</h3><ul><li><p><a href="https://www.principalengineer.com/p/old-school-architectures-making-a">Old school architectures making a return, part 1: Monoliths</a></p></li><li><p><a href="https://www.principalengineer.com/p/old-school-architectures-making-a-3f9">Old school architectures making a return, part 2: Backend rendered webapps</a></p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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[Old school architectures making a return, part 2: Backend rendered webapps]]></title><description><![CDATA[Separating backend and frontend is an evolutionary dead-end, or at least frequently, a complication.]]></description><link>https://www.principalengineer.com/p/old-school-architectures-making-a-3f9</link><guid isPermaLink="false">https://www.principalengineer.com/p/old-school-architectures-making-a-3f9</guid><dc:creator><![CDATA[Wille Faler]]></dc:creator><pubDate>Mon, 18 Nov 2024 21:08:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!jz8k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ed724cb-d268-4646-a6f2-5bf3dbeab4d0_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jz8k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ed724cb-d268-4646-a6f2-5bf3dbeab4d0_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jz8k!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ed724cb-d268-4646-a6f2-5bf3dbeab4d0_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!jz8k!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ed724cb-d268-4646-a6f2-5bf3dbeab4d0_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!jz8k!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ed724cb-d268-4646-a6f2-5bf3dbeab4d0_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!jz8k!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ed724cb-d268-4646-a6f2-5bf3dbeab4d0_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jz8k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ed724cb-d268-4646-a6f2-5bf3dbeab4d0_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8ed724cb-d268-4646-a6f2-5bf3dbeab4d0_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:848098,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jz8k!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ed724cb-d268-4646-a6f2-5bf3dbeab4d0_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!jz8k!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ed724cb-d268-4646-a6f2-5bf3dbeab4d0_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!jz8k!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ed724cb-d268-4646-a6f2-5bf3dbeab4d0_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!jz8k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ed724cb-d268-4646-a6f2-5bf3dbeab4d0_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Steam-punk browser</figcaption></figure></div><p>The last 15 years has seen us move from backend-rendered webapps to Single-Page-Applications (&#8220;SPA&#8221;), to hybrid approaches like Next.js and Remix. </p><p>In the 2000&#8217;s, most webapps were simple backend-rendered things, usually following a Model-View-Controller pattern. When Gmail arrived on the scene, everyone got excited about how Google had managed to make a webapp so dynamic and desktop-app like. What followed was the evolution that led us to modern SPA web-frameworks like Vue and React, where eventually, frontends are in effect their own applications, talking to a server, usually via a JSON-over-REST API.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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>As a one-size-fits-all approach has been found wanting, we have also had novel new approaches, like the hybrid frontend frameworks like Next.js, Remix &amp; Nuxt, where pages are sometimes rendered on the backend, sometimes on the frontend.</p><h2>The benefits of SPA and hybrid SPA/SSR apps</h2><p>Pushing logic to the client&#8217;s browser is not without merit. In a pure SPA approach, an app can be distributed via CDN, and a lot of logic can be executed locally in the client&#8217;s browser. This frequently gives the perception of a faster app to end-users.</p><p>A hybrid SPA/SSR (&#8220;Server-Side Rendered&#8221;) app achieves similar goals, while allowing certain necessary aspects to be done on the server-side, and also improving the ability to Search Engine Optimize content.</p><p>Yet another benefit is that you frequently get an API for your backend &#8220;for free&#8221;, that other clients, internal or third-party, can also use. However, as we&#8217;ll soon discuss, &#8220;free&#8221; things are rarely actually free, they come at a cost.</p><p>A final benefit of modern web frameworks in particular, is that they have adopted a component-based approach: this frequently means it's easy to re-use frontend components across the application, or even across applications.</p><h2>The drawbacks of SPA &amp; SPA/SSR hybrids</h2><p>The SPA &amp; hybrid approaches come with quite a few issues, let&#8217;s have a look at some of them:</p><h3>The &#8220;free&#8221; API duplicates work</h3><p>With a separate frontend and backend, communicating via an API comes a cost: duplication. Frequently user logic, flows and validation are duplicated across both. In bad cases, the responsibilities get muddled, perhaps too much logic gets pushed to the frontend, exposing security weaknesses in the backend.</p><p>I&#8217;d estimate (completely made up, but plausible based on anecdotal experience), a strict frontend/backend split results in between 40-80% more work compared to just a simple backend rendered app.</p><h3>The API is frequently unsuited for other clients</h3><p>The &#8220;<a href="https://learn.microsoft.com/en-us/azure/architecture/patterns/backends-for-frontends">Backend-for-frontend</a>&#8221; pattern is a tacit admission that different clients require slightly different API&#8217;s. This means that the API designed for a webapp, will rarely be well-suited for a mobile app, or some headless automation. In practice, you&#8217;ll either end up with suboptimal interaction patterns to your API, or multiple API&#8217;s tailored for different clients.</p><p>The &#8220;free&#8221; API you got with your webapp gave you nothing but extra effort. Even where the API fits, clients are likely to only need some small subset of the API.</p><h3>Testing becomes challenging</h3><p>Testing is hard as it is. With effectively separate apps, testing just got even harder. Instead of just writing unit/integration tests with something like <a href="https://testcontainers.com">test-containers</a> and an embedded web-server, testing the entire app end-to-end, you need to either fake the backend, risking drift in your fakes from the real behavior, or deploy the entire stack, and write flaky end-to-end tests, that take long to run, are difficult to write, easily fall apart, and eventually no one pays attention to.</p><h3>Lost productivity</h3><p>So if we duplicate work, make testing harder for ourselves, we&#8217;ve already damaged our productivity quite significantly, haven&#8217;t we?</p><p>To add insult to injury, we also have to spend time and energy either finding ways of sharing representations of types, or worse, duplicating them on server and frontend respectively. Even where this is trivial, and assuming we have fullstack developers who do both sides, they still have to jump between codebases potentially, doing mental context switches as they transition between frontend and backend.</p><h3>SPA/SSR hybrids are difficult to reason about</h3><p>Why don&#8217;t we just use Next.js/Remix/Nuxt/insert-hybrid-framework-here as a full-stack framework? We can use SSR with those?</p><p>Well, yes you can. But in my experience, it can be difficult to reason about when exactly something is client-rendered, vs server-rendered. And in the wild, I have seen instances where this has led to passwords and other secrets leaking to clients.</p><p>The Next.js approach in particular of having &#8220;use client&#8221; and &#8220;use server&#8221; directives are in my opinion, an absolutely horrible approach just waiting to go wrong.</p><h2>The Solution: an old-school alternative that isn&#8217;t entirely old-school</h2><p>You might have read between the lines that I am about to suggest we go back to writing server-side rendered webapps in your backend language of choice, and you wouldn&#8217;t be entirely wrong.</p><p>But, there&#8217;s a twist:</p><p>I don&#8217;t think we should throw out the baby with the bathwater. We can still update portions of a page, but instead use tools like <a href="https://htmx.org">HTMX</a>, to build <a href="https://hypermedia.systems/book/contents/">hypermedia driven applications</a>. This allows us to get the best of both worlds: dynamic webapps, swapping out elements of a page, but where the code is cohesively contained in one codebase, for which the execution is easy to reason about and easy to test.</p><p>Another part that would get painful in a backend-driven webapp is writing reusable components and design systems. However, for this too, there is a solution: the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_components">Web Components</a> standard, that can be implemented with libraries such as <a href="https://lit.dev">Lit</a>.</p><p>In other words, with Web Components, there is still a bit of room for <em>&#8220;frontend web development&#8221;</em> as we know from the last decade, but with a massively cut down scope. And with hypermedia and HTMX, we cut out the unecessary step of constantly turning JSON into HTML.</p><h2>Not every problem is suited to going back to basics</h2><p>Of course, the world is full of nuance, problems of varying complexity. There are surely problems that require a very frontend heavy approach to solve. So, as always, consider the trade-offs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hssp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f850fc4-a4ed-4ecf-b631-c3f6cbe4efd7_500x500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hssp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f850fc4-a4ed-4ecf-b631-c3f6cbe4efd7_500x500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Hssp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f850fc4-a4ed-4ecf-b631-c3f6cbe4efd7_500x500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Hssp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f850fc4-a4ed-4ecf-b631-c3f6cbe4efd7_500x500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Hssp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f850fc4-a4ed-4ecf-b631-c3f6cbe4efd7_500x500.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hssp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f850fc4-a4ed-4ecf-b631-c3f6cbe4efd7_500x500.jpeg" width="500" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f850fc4-a4ed-4ecf-b631-c3f6cbe4efd7_500x500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:55116,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Hssp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f850fc4-a4ed-4ecf-b631-c3f6cbe4efd7_500x500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Hssp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f850fc4-a4ed-4ecf-b631-c3f6cbe4efd7_500x500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Hssp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f850fc4-a4ed-4ecf-b631-c3f6cbe4efd7_500x500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Hssp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f850fc4-a4ed-4ecf-b631-c3f6cbe4efd7_500x500.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>My preference towards backend-rendered webapps leaning on a hypermedia-approach with web components is for the 80% of webapps that are below the complexity threshold where something else is necessary.</p><p>There are no blanket solutions, merely trade-offs to be weighed. <a href="https://www.principalengineer.com/p/old-school-architectures-making-a">As in the first part of this series of posts</a>, my main recommendation is to stop defaulting and start thinking.</p><p>For the majority of apps, there are simpler ways. For some, the dominant approaches of the last decade might be perfect.</p><h4>Also consider reading:</h4><ul><li><p><a href="https://www.principalengineer.com/p/old-school-architectures-making-a">Old school architectures making a return, part 1: Monoliths</a></p></li></ul><p></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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[Old school architectures making a return, part 1: Monoliths]]></title><description><![CDATA[Over the last decade, microservices have dominated the software landscape, but could we see a retracement of their use? I think this is almost a certainty.]]></description><link>https://www.principalengineer.com/p/old-school-architectures-making-a</link><guid isPermaLink="false">https://www.principalengineer.com/p/old-school-architectures-making-a</guid><dc:creator><![CDATA[Wille Faler]]></dc:creator><pubDate>Tue, 12 Nov 2024 17:40:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wIaB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5005b41-8b6c-41cd-ba46-fa70868652eb_1024x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wIaB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5005b41-8b6c-41cd-ba46-fa70868652eb_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wIaB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5005b41-8b6c-41cd-ba46-fa70868652eb_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!wIaB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5005b41-8b6c-41cd-ba46-fa70868652eb_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!wIaB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5005b41-8b6c-41cd-ba46-fa70868652eb_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!wIaB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5005b41-8b6c-41cd-ba46-fa70868652eb_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wIaB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5005b41-8b6c-41cd-ba46-fa70868652eb_1024x1024.webp" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c5005b41-8b6c-41cd-ba46-fa70868652eb_1024x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:245284,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wIaB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5005b41-8b6c-41cd-ba46-fa70868652eb_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!wIaB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5005b41-8b6c-41cd-ba46-fa70868652eb_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!wIaB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5005b41-8b6c-41cd-ba46-fa70868652eb_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!wIaB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5005b41-8b6c-41cd-ba46-fa70868652eb_1024x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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>Cloud native architectures brought about the technical viability of microservices. But what technical problems do they actually solve, and are monolithic architectures more viable under some circumstances?</p><p>Let&#8217;s answer the first question first: </p><p>There are very few technical reasons to use microservices. They are almost always a solution to a people problem: a means to scale an engineering organization without unfeasibly large and unproductive teams. They allow us to split an organization into multiple teams, all owning their own domain or slice of the company&#8217;s concerns.</p><p>It is no coincidence that microservices rose to prominence during the ZIRP (&#8220;Zero Interest Rate Policy&#8221;)-era: when Venture Capital was abundant, the capital needed to be used, usually to grow engineering. Growing engineering meant multiple teams needed to be created (we all know how detrimental massive teams are to productivity).</p><p>Microservices allows us to solve the problem of organizational growth, it answers the question of how do you split work across multiple teams, when multiple teams become necessary due to workload and headcount growth?</p><h2>Surely, there are technical merits to microservices?</h2><p>Yes, I can think of a few technical reasons for splitting into services, apart from organizational growth:</p><ul><li><p><em>Independent scaling</em> - you may split services based on read and write boundaries, if one is more performance intensive than the other. This allows us to scale services independently.</p></li><li><p><em>Observability</em> - if you are at the top of your observability game (very few are!), the smaller functional surface of microservices allows us to more easily diagnose issues as they arise.</p></li><li><p><em>Distinct domains </em>- perhaps the most obvious case, some things are simply completely distinct domains, and should be separate. However, experience tells us, that microservices frequently slice adjacent or related domains slightly wrong.</p></li></ul><h2>What are the issues with microservices?</h2><p>Microservices come with several drawbacks:</p><ul><li><p><em>Observability is challenging</em> - I mentioned this as a benefit, but it is also a drawback. Very few organizations have the observability and ops maturity to pull off microservices.</p></li><li><p><em>Cascading reliability &amp; coupling </em>- many organizations set reliability goals, such as &#8220;99.9% uptime. But what happens if services are coupled, and multiple services with the same reliability goal need each other? Simple arithmetic dictates that the reliability goal becomes impossible to achieve: 0.999*0.999*.999 is less than 99.9%.</p></li><li><p><em>Poor industry understanding of asynchronous interaction patterns </em>- leading on from the previous point: ideally, microservices should prefer asynchronous communication as much as possible, so they survive downtime of adjacent services. In practice though, people frequently implement synchronous RPC or REST interfaces, thus increasing coupling and overall system fragility. This is often done in the name of &#8220;simplicity&#8221;, simply because there is insufficient understanding and appreciation of asynchronous communication.</p></li><li><p><em>API impedance mismatches, performance issues &amp; fragility </em>- What one service provides to another does frequently not line up with what the user requires. This might lead to <em>n+1</em> interaction patterns or worse (I&#8217;ve seen bulk downloads hammer services!). Not only that, but services must also consider API versioning and how changes may be breaking. It&#8217;s not uncommon to see breakages because some API or protocol was changed unilaterally, without thought to communicate changes and plan a migration path.</p></li><li><p><em>Lowered productivity</em> - should come as no surprise that all of the above contribute to lower productivity, compared to working in a monolithic codebase. Even if under the control of a single team or empowered to make changes in adjacent services, working on multiple codebases across network boundaries is slower.</p></li></ul><h2>Are monoliths the answer?</h2><p>Maybe, sometimes, it depends. Monoliths certainly address most of the issues effectively, and reduce the need for excellence in ops and observability. </p><p>One issue of the last decade is that too many organizations have defaulted to microservices without considering why they are doing so. Simply considering <em>why</em> you are choosing microservices, whether it is appropriate given the technical- and productivity costs in the light of your company&#8217;s engineering org growth plans. If headcount is likely to remain relatively static, or only grow slowly at times, maybe a monolithic architecture makes more sense.</p><p>In conclusion, I think we&#8217;ll see a return to more organizations defaulting to monoliths instead of microservices. There is no one-size-fits-all answer to the question of monoliths vs microservices, but moving from an unthinking default, to a considered decision given a set of trade-offs will naturally see monoliths becoming more popular again.</p><h2>Stay tuned!</h2><p>This post is part 1 of a four part series on old architectures becoming new again. I will post the next part next week, so if you want to read it first, please do sign up to the newsletter!</p><p></p>]]></content:encoded></item><item><title><![CDATA[State of the Linux Desktop]]></title><description><![CDATA[As a long-time Mac user, I've asked myself the eternal question: is this the year of Linux on the desktop? Here is what I found out after a year of incremental buy-in..]]></description><link>https://www.principalengineer.com/p/state-of-the-linux-desktop</link><guid isPermaLink="false">https://www.principalengineer.com/p/state-of-the-linux-desktop</guid><dc:creator><![CDATA[Wille Faler]]></dc:creator><pubDate>Sun, 10 Nov 2024 10:52:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qmi5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf6bc1-a6ca-4a1e-acd5-001a4f163510_3840x1600.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qmi5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf6bc1-a6ca-4a1e-acd5-001a4f163510_3840x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qmi5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf6bc1-a6ca-4a1e-acd5-001a4f163510_3840x1600.png 424w, https://substackcdn.com/image/fetch/$s_!qmi5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf6bc1-a6ca-4a1e-acd5-001a4f163510_3840x1600.png 848w, https://substackcdn.com/image/fetch/$s_!qmi5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf6bc1-a6ca-4a1e-acd5-001a4f163510_3840x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!qmi5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf6bc1-a6ca-4a1e-acd5-001a4f163510_3840x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qmi5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf6bc1-a6ca-4a1e-acd5-001a4f163510_3840x1600.png" width="1456" height="607" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b2cf6bc1-a6ca-4a1e-acd5-001a4f163510_3840x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:607,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9713097,&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_!qmi5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf6bc1-a6ca-4a1e-acd5-001a4f163510_3840x1600.png 424w, https://substackcdn.com/image/fetch/$s_!qmi5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf6bc1-a6ca-4a1e-acd5-001a4f163510_3840x1600.png 848w, https://substackcdn.com/image/fetch/$s_!qmi5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf6bc1-a6ca-4a1e-acd5-001a4f163510_3840x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!qmi5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf6bc1-a6ca-4a1e-acd5-001a4f163510_3840x1600.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I have used almost exclusively Macs since about 2007, but had my first Linux desktop in the late 1990&#8217;ies while at university.</p><p>I have owned a Linux desktop since 2018, which mostly acted as a server, and last year I bought a monster desktop with an AMD 7950X3D processor, 64gb RAM and Nvidia 4090.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! 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>Today, I only pick up my M1 Max Macbook Pro when circumstances dictate I need a laptop, otherwise, I mostly use my desktop. But for a long time after my desktop purchase, I was still using the Mac as my primary computer. The switch-over really only happened fully in the last 3 months or so.</p><h2>Dipping my toes in</h2><p>The desktop came with Windows 11 installed. It lasted about 4 hours before I could not stand it. Back at the end of last year, I installed Pop!OS on it, simply because it was the one distro I could make work with the Nvidia card.</p><p>A year later, the picture has changed a lot: I&#8217;ve since tried Ubuntu (24.04 and 24.10), Kubuntu, Pop!OS and <a href="https://endeavouros.com/">EndeavourOS</a> (an Arch based distro with simple GUI installer). All of them install easily, without much pain.</p><p>However, for the first 9 months, I didn&#8217;t fully go Linux, I used the desktop for some work, and some games, but tended to prefer my Mac still, purely out of habit. Slowly, that picture changed, and about 3 months ago, I went on Linux-Distro safari, tried all of the aforementioned Linux distributions.</p><p>Now, I think I&#8217;ll probably stick Linux, and I&#8217;m pretty sure my next laptop will be a <a href="https://frame.work/">Framework</a> 13, assuming Framework start shipping to Switzerland. I wouldn&#8217;t expect a non-Mac to have the build-quality or battery life of a Mac, but then again, a new top-end mac would set me back about $5000, whereas a fully-kitted out Framework 13 would be &lt; $2000. The Mac will certainly not be 2.5x better than a Framework.</p><h2>The reality of Linux vs Mac OS</h2><p>After a year of going back and forth, my take on Linux vs Mac OS is: there&#8217;s really not much between them. I don&#8217;t think one of them is particularly better than the other. If you know how to use a computer, the transition will be mostly smooth, and almost all the same apps are available in one shape or another, or at least analogues are.</p><p>What brings me to Linux is a few things:</p><ul><li><p>I like to develop software on the same platform I deploy to. Least risk of weird bugs.</p></li><li><p>There really isn&#8217;t much difference. Apart from Command vs Control key usage for copy-paste, I can move seamlessly between the platforms. Maybe a testament to how far Linux has come, is that I can&#8217;t say it&#8217;s worse than Mac anymore. Things mostly just work.</p></li><li><p>I like to foster vendor-independence in my workflows. Being bound to a single eco-system sits wrong with me. So being able to move between platforms just feels good. Call it compute-autonomy.</p></li><li><p>I really can&#8217;t bring myself to pay 2-4x for the same hardware, when the experience isn&#8217;t even 10% better. As an example: a 1 to 4tb SSD upgrade with Apple is about $1100. You can buy some of the top-of-the-line 4tb SSDs for PC&#8217;s for under $300. I promise, the soldered, unrepairable stuff is not 3.5x better.</p></li></ul><h2>Where Linux is better: Gaming</h2><p>The work that Valve has put into Proton and the Linux platform is nothing short of amazing. Gaming is perhaps more of an aspirational hobby for me, than a real one, but it seems to me that practically every single-player game ever made for PC plays well on Linux now, with few exceptions. </p><p>The area where gamers might encounter issues is multi-player games, where anticheat systems rely on Windows rootkits, but this is not an issue for me, as I don&#8217;t really play multiplayer games.</p><h2>What about window managers?</h2><p>I have tried Gnome, KDE, i3wm and Hyperland.</p><p>If you want to keep it simple, not tinker, and have things just work out of the box, just stick to Gnome or KDE. Anything else is asking for initial pain.</p><p>I&#8217;d say Gnome feels familiar for a Mac user, KDE feels familiar to Windows users. KDE though has higher ability of customize the look-and-feel, and the default apps of the KDE eco-system have slightly better polish.</p><p>If you care about polish and customizability, go KDE. If you want to keep things simple, go Gnome.</p><p>Personally, I did not keep it simple: I prefer using <a href="https://hyprland.org/">Hyprland</a>, a tiling window manager as my default, which I&#8217;ve heavily customized for my needs (see screenshot). I did this, because I simply like the workflow where I can keep my hands on the keyboard most of the time, and very rarely have to use the mouse. But It wouldn&#8217;t recommend it if you are not prepared to put in the time. I use KDE as my backup, and I also use the KDE apps as my default apps for file-management, PDF viewing etc.</p><h2>Which distro should I pick?</h2><p>Again, if you want a simple life, where everything just works: use a Ubuntu LTS for Gnome, (currently 24.04), or the Kubuntu LTS for KDE. I suspect vanilla Ubuntu might be the best tested one. Everything should just work, including sleep etc, unless you have new, unsupported hardware.</p><p>If you feel adventurous, go with a non-LTS Ubuntu/Kubuntu. It&#8217;s worth noting, a lot of &#8220;big software vendor&#8221; software is frequently built and tested for Ubuntus LTS releases, so if you rely on some specific software, Ubuntu LTS will be the path of least resistance.</p><p>Obviously, I don&#8217;t heed my own advice, and instead went with Endeavour OS, which is an Arch Linux based distribution. This means occassionally some things break, sleep doesn&#8217;t work etc. But this is pain I&#8217;ve imposed upon myself in exchange to have the latest and greatest software for everything. Can&#8217;t be a beta-tester without experiencing some bugs, huh?</p><h2>Should I switch from Mac to Linux too?</h2><p>My advice here is: really depends. Like I&#8217;ve said, there isn&#8217;t much between Mac and Linux for a software engineer these days, the experience is very similar, UX, hardware support, software, all within 10% of each other.</p><p>For me, the question comes primarily down to autonomy/independence, using open source, and ultimately, not seeing the point in paying usurious Apple prices anymore, when I can get similar quality for a third of the price. Sure, I won&#8217;t expect exact equality in quality, but it&#8217;s good enough to not warrant a 3x markup.</p><p>Also, given how resource-light Linux is, I&#8217;d expect hardware to last much longer. As an example: I recently gave my mother an old 2014 Macbook Pro. It is out of support for MacOS updates, but Ubuntu 24.04 ran merrily on it when I installed it. Lifespan extended by yet another few years (Apple typically support computer hardware for up to 7 years).</p><p>If you are looking to switch, Linux likely won&#8217;t rock your world, but neither will it diminish your quality of life and work. In 2024, Linux mostly just works, is as usable as Mac or Windows (probably more so than Windows!), and has sufficient software to get almost anything done.</p><p>If you&#8217;re a gamer, whether casual or hardcore, chances are also that Linux will be the best possible platform for you.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.principalengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Principal Engineer! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>