<?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[Packt Deep Engineering]]></title><description><![CDATA[Deep Engineering is a weekly newsletter for developers and software architects featuring expert-led insights, deep dives into modern systems, and clear thinking on real-world software design.]]></description><link>https://deepengineering.net</link><image><url>https://substackcdn.com/image/fetch/$s_!H5BJ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F736bc1ee-d689-497e-83a8-7d9bf9022eb9_600x600.png</url><title>Packt Deep Engineering</title><link>https://deepengineering.net</link></image><generator>Substack</generator><lastBuildDate>Sat, 27 Jun 2026 11:14:12 GMT</lastBuildDate><atom:link href="https://deepengineering.net/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Packt]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[deepengineering@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[deepengineering@substack.com]]></itunes:email><itunes:name><![CDATA[Packt]]></itunes:name></itunes:owner><itunes:author><![CDATA[Packt]]></itunes:author><googleplay:owner><![CDATA[deepengineering@substack.com]]></googleplay:owner><googleplay:email><![CDATA[deepengineering@substack.com]]></googleplay:email><googleplay:author><![CDATA[Packt]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Deep Engineering #53: Rick Spencer on Matching the Right AI to the Right Engineering Work]]></title><description><![CDATA[Rick Spencer, GM of Product and Engineering at SUSE, on the three-tier framework his teams use to match AI tools to work, why frontier models are reserved for the hardest problems, and how to keep cost and control in the engineer's hands.]]></description><link>https://deepengineering.net/p/issue-53-rick-spencer-matching-ai-to-engineering-work</link><guid isPermaLink="false">https://deepengineering.net/p/issue-53-rick-spencer-matching-ai-to-engineering-work</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Thu, 25 Jun 2026 15:41:01 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5a84c1b1-7455-466d-93ef-b2d48d938c6a_2760x1240.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong><a href="https://www.eventbrite.co.uk/e/10-essential-ai-agents-every-engineer-must-build-tickets-1992470369511?aff=deepeng">A Hands-On Workshop for the Next Generation of Engineers</a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.eventbrite.co.uk/e/10-essential-ai-agents-every-engineer-must-build-tickets-1992470369511?aff=deepeng" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P5L3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a2b450-b55f-43a3-bf49-e7cfd2fe301d_2160x1080.png 424w, https://substackcdn.com/image/fetch/$s_!P5L3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a2b450-b55f-43a3-bf49-e7cfd2fe301d_2160x1080.png 848w, https://substackcdn.com/image/fetch/$s_!P5L3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a2b450-b55f-43a3-bf49-e7cfd2fe301d_2160x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!P5L3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a2b450-b55f-43a3-bf49-e7cfd2fe301d_2160x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P5L3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a2b450-b55f-43a3-bf49-e7cfd2fe301d_2160x1080.png" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c5a2b450-b55f-43a3-bf49-e7cfd2fe301d_2160x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.eventbrite.co.uk/e/10-essential-ai-agents-every-engineer-must-build-tickets-1992470369511?aff=deepeng&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!P5L3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a2b450-b55f-43a3-bf49-e7cfd2fe301d_2160x1080.png 424w, https://substackcdn.com/image/fetch/$s_!P5L3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a2b450-b55f-43a3-bf49-e7cfd2fe301d_2160x1080.png 848w, https://substackcdn.com/image/fetch/$s_!P5L3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a2b450-b55f-43a3-bf49-e7cfd2fe301d_2160x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!P5L3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5a2b450-b55f-43a3-bf49-e7cfd2fe301d_2160x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Includes a free copy of the <strong>ebook</strong> 30 Agents Every AI Engineer Must Build and a certificate of completion.</em></figcaption></figure></div><p>A hands-on, build-along workshop where you build and run 10 production-inspired AI agents across finance, healthcare, and education. Walk away with a complete GitHub repo and implementations for OpenAI, Claude, Gemini, and local models.</p><p>&#128467;&#65039; September <strong>12th</strong> &#183; <strong>11:00</strong> AM EDT onwards</p><p>Use code <strong>DEEPENG50</strong> for 50% off the early bird price. First 10 sign-ups only.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.eventbrite.co.uk/e/10-essential-ai-agents-every-engineer-must-build-tickets-1992470369511?aff=deepeng&quot;,&quot;text&quot;:&quot;Register here&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.eventbrite.co.uk/e/10-essential-ai-agents-every-engineer-must-build-tickets-1992470369511?aff=deepeng"><span>Register here</span></a></p><div><hr></div><p><span>&#9997;&#65039; </span><strong><span>From the editor&#8217;s desk,</span></strong></p><p><span>Welcome to the </span><strong><span>53rd</span></strong><span> issue of </span><strong><span>Deep Engineering</span></strong><span>!</span></p><p>At London Tech Week this month, <a href="https://blogs.nvidia.com/blog/uk-sovereign-ai-advancements/">NVIDIA</a> made it exceedingly clear, showcasing a wave of UK companies building AI for environments where sovereignty is not optional. Building capable AI models is no longer the hardest problem. The real challenge is running them in environments where security, compliance, and cost aren&#8217;t negotiable. Organizations want AI they can trust, control, and operate on their own terms.</p><p><span>That&#8217;s exactly the challenge </span><a href="https://www.linkedin.com/in/rickspencer3"><span>Rick Spencer</span></a><span> has been solving at </span><a href="https://www.suse.com/"><span>SUSE</span></a><span>. As General Manager for Technology and Product at SUSE, he works with the teams behind its enterprise Linux and cloud native platforms for regulated organizations. His perspective is simple: engineers will use AI wherever it helps them move faster. But the real question isn&#8217;t whether teams should adopt AI; in fact, it is how to match the right model to the right kind of work.</span></p><p><span>In today&#8217;s issue, Spencer shares the framework his teams use to make those decisions. We discuss where agentic AI is delivering real value, why frontier models should be reserved for high-impact problems, and how SUSE keeps AI adoption practical without letting costs spiral.</span></p><blockquote><p><span>You can read or watch the full Q&amp;A interview </span><a href="https://deepengineering.substack.com/p/sovereign-ai-agentic-infrastructure-rick-spencer-suse"><span>here</span></a><span>.</span></p></blockquote><p><span>Let&#8217;s get started.</span></p><div><hr></div><p style="text-align: center;"><strong><span>Featured Newsletter: </span><a href="https://aiagentssimplified.substack.com/">AI Agents Simplified</a></strong> </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://aiagentssimplified.substack.com/" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g3qt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e4e65-e79c-4dab-b3a6-93b3e23343b2_256x256.png 424w, https://substackcdn.com/image/fetch/$s_!g3qt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e4e65-e79c-4dab-b3a6-93b3e23343b2_256x256.png 848w, https://substackcdn.com/image/fetch/$s_!g3qt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e4e65-e79c-4dab-b3a6-93b3e23343b2_256x256.png 1272w, https://substackcdn.com/image/fetch/$s_!g3qt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e4e65-e79c-4dab-b3a6-93b3e23343b2_256x256.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g3qt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e4e65-e79c-4dab-b3a6-93b3e23343b2_256x256.png" width="256" height="256" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5c1e4e65-e79c-4dab-b3a6-93b3e23343b2_256x256.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:256,&quot;width&quot;:256,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://aiagentssimplified.substack.com/&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!g3qt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e4e65-e79c-4dab-b3a6-93b3e23343b2_256x256.png 424w, https://substackcdn.com/image/fetch/$s_!g3qt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e4e65-e79c-4dab-b3a6-93b3e23343b2_256x256.png 848w, https://substackcdn.com/image/fetch/$s_!g3qt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e4e65-e79c-4dab-b3a6-93b3e23343b2_256x256.png 1272w, https://substackcdn.com/image/fetch/$s_!g3qt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e4e65-e79c-4dab-b3a6-93b3e23343b2_256x256.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://aiagentssimplified.substack.com/">AI Agents Simplified</a></strong> cuts through the noise with clear, actionable breakdowns of agents, automation, and what's actually worth your attention. Trusted by 58,000+ subscribers, with new issues every week and no hype.</p><p><strong>&#8594; <a href="https://aiagentssimplified.substack.com/">Subscribe to AI Agents Simplified</a></strong></p><div><hr></div><p><strong><span>Expert Insights</span></strong></p><h2><span>Not whether engineers use AI, but which AI for which work</span></h2><p><em><span>by </span><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Srishty Goyal&quot;,&quot;id&quot;:523194698,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/17b92734-dbd6-43f6-ac70-f6d999200f28_144x144.png&quot;,&quot;uuid&quot;:&quot;57632cd3-565f-42c9-8a03-aba16c1a438d&quot;}" data-component-name="MentionToDOM"></span> <span>with </span><a href="https://www.linkedin.com/in/rickspencer3"><span>Rick Spencer</span></a></em></p><p>Most engineering organizations start their AI adoption conversation with limits. Should engineers use it, and how much should they be allowed to? <a href="https://www.linkedin.com/in/rickspencer3">Rick Spencer</a> sees that as the wrong question. As General Manager for Technology and Product at <a href="https://www.suse.com/">SUSE</a>, he works with the teams building enterprise Linux and cloud native infrastructure for companies operating under strict compliance requirements. His starting point is practical: engineers will use AI wherever it helps them move faster.</p><p>&#8220;It&#8217;s not like, oh, don&#8217;t use AI,&#8221; he says. &#8220;That would just not be workable.&#8221;</p><p>For Spencer, the real question is not whether engineers should use AI. It is which AI belongs to which kind of work. Getting that decision right is what separates useful AI adoption from adoption that quietly burns money, trust, and control.</p><h3><span>Three kinds of AI work, and why the distinction matters</span></h3><p><span>SUSE breaks engineering use of AI into three categories, each calling for different tools, cost profiles, and levels of oversight. Spencer describes the first as </span><strong><span>daily work</span></strong><span>: statement completion and debugging that engineers rely on throughout the day. The second is </span><strong><span>agentics</span></strong><span>, where agents take care of repetitive work and interruptions that would otherwise consume engineering time. The third is what he calls </span><strong><span>curve jumping</span></strong><span>, and it is the most consequential of the three.</span></p><p><span>&#8220;That&#8217;s like when you&#8217;re just going from zero to infinity,&#8221; he explains. &#8220;You can do things with AI that you wouldn&#8217;t have tried before, like solve really deep problems in one big step.&#8221;</span></p><p><span>The value of this distinction is that it helps teams make more deliberate tooling and cost decisions instead of relying on guesswork. As Spencer puts it, the framework helps engineering managers pattern-match the right AI to the right kind of work. If a task only needs statement completion and debugging, that points to one set of tools. If it involves data sovereignty requirements, that points to another. Frontier models, the most capable and most expensive, are reserved for curve jumping, where their cost is justified by the scale and complexity of the problem.</span></p><p><span>&#8220;It sounds very organized now, but there was a lot of experimentation, a lot of really rapid innovation from the engineers,&#8221; Spencer says of how the framework came together.</span></p><p><span>The framework emerged from engineers first. Management then built structure around what those early adopters had learned so the approach could be shared across the organization. It&#8217;s a practical reminder that successful AI frameworks often evolve from experimentation before they become formal processes.</span></p><h3><span>Frontier models are for curve jumping, not code completion</span></h3><p><span>One of Spencer&#8217;s most practical observations is about matching model capability to the task at hand. Routing every request through the most capable model is both expensive and unnecessary, and he is clear about where the line sits.</span></p><p><span>&#8220;You do not need a frontier model to understand your Python module and give you code completion,&#8221; he says. &#8220;You just don&#8217;t need it for that.&#8221;</span></p><p><span>Frontier models earn their cost in the </span><strong><span>curve</span></strong><span>-</span><strong><span>jumping</span></strong><span> category, where the problems are strategic and complex.</span></p><p><span>&#8220;We have projects where we spend tens of thousands of dollars on frontier models, but they generated, who knows, a million or two million dollars in value,&#8221; he notes.</span></p><p><span>When the value is that high, the investment makes sense. The discipline is in not using frontier models for work that a much cheaper model can handle just as well. Spencer&#8217;s teams apply the same thinking in another way. They use frontier models to build agents that later run on much cheaper models.</span></p><p><span>&#8220;We use the frontier model to create an agent that can then be run on a much lower-cost model,&#8221; he explains.</span></p><p><span>The frontier model writes the Python scripts and prepares the context the agent needs. After that, a lower-cost model handles the repeated execution. The expensive model does the design work once, while the cheaper model runs the workflow repeatedly. For teams looking to bring frontier-level capabilities into production without paying frontier-level costs every time, it&#8217;s a practical approach that balances capability with efficiency.</span></p><h3><span>Agentics is where the toil goes to die</span></h3><p><span>The agentics category is where Spencer&#8217;s examples become most concrete. More importantly, they show what relieving engineering toil looks like in a production environment rather than a demo. His favorite example isn&#8217;t about writing code at all. After a series of software supply chain attacks, SUSE&#8217;s security team built an agent that scans for newly reported compromised packages every hour.</span></p><p><span>&#8220;It finds those, and then it scans all of our open source code to see if we&#8217;re using it anywhere,&#8221; he says. &#8220;If we are, it writes a report and notifies us on Slack.&#8221;</span></p><p><span>The benefit is immediate.</span></p><p><span>&#8220;If you see a report of a tool chain attack, our agent was on it before we even knew about it,&#8221; Spencer says.</span></p><p><span>Work that once required engineers to manually search through repositories now happens automatically, often before anyone has even seen the news.</span></p><p><span>His second example focuses on CVE triage, another task that has become increasingly difficult to manage manually at enterprise scale. CVEs arrive faster than teams can assess them, and many turn out not to be relevant.</span></p><p><span>&#8220;A lot of times the CVE comes in and the package is in the repo, but it is not being exposed in any way that it would matter,&#8221; Spencer says.</span></p><p><span>An agent reviews each CVE for applicability and helps generate the VEX file that documents whether the vulnerability actually affects the product. The result is that engineers spend less time sorting through reports and more time addressing the vulnerabilities that matter.</span></p><p><span>&#8220;We&#8217;re focusing our attention not on keeping up with the crush of CVE reports, but on the actual vulnerabilities,&#8221; he explains. &#8220;Our attention is reserved for actually keeping our customers safe.&#8221;</span></p><p><span>That&#8217;s the hallmark of a good agentic use case. It removes repetitive work without taking engineers away from the decisions that require human judgment.</span></p><h3><span>The context that does not survive the session</span></h3><p><span>As engineers move from AI-assisted coding to autonomous agents, Spencer points to a challenge his senior engineers have had to learn to manage. Context that isn&#8217;t made explicit often ends up buried in conversation history. When that history disappears, the agent&#8217;s behavior changes.</span></p><p><span>&#8220;Those history sessions can embed context which you have not made explicit in your markdown,&#8221; he says. &#8220;The next time you go and you don&#8217;t have all that history, you get different behavior than you were expecting.&#8221;</span></p><p><span>The lesson, Spencer says, is to make recurring context explicit instead of letting it live inside a session that will eventually disappear.</span></p><p><span>The challenge becomes even more significant once agents begin operating autonomously. Unlike traditional infrastructure tools, agents are not deterministic.</span></p><p><span>&#8220;This is a big change in infrastructure management,&#8221; he notes. &#8220;If I give this input, I know exactly what&#8217;s going to happen.&#8221;</span></p><p><span>With conventional tools, unexpected inputs usually produce predictable failures. Agents behave differently. When they encounter something unexpected, they try to solve the problem, and that often requires additional context, including organizational policies or guidance on how a situation should be handled.</span></p><p><span>This is where MCP servers become important. They give agents a way to retrieve the right context when they need it. At that point, context management is no longer just about writing better prompts; it becomes part of the infrastructure itself.</span></p><h3><span>Cost control is a design decision, not an afterthought</span></h3><p><span>Running AI at scale makes cost something teams have to design for, not react to later. Spencer sees this as part of the architecture.</span></p><p><span>At SUSE, part of the answer is structural. Self-hosted AI gives the organization a clearer cost ceiling. The question becomes how well the team can observe and use that fixed capacity, rather than whether a usage-based bill might suddenly run away.</span></p><p><span>Spencer connects this directly to sovereignty.</span></p><p><span>&#8220;Sometimes they call it cost sovereignty,&#8221; he says, &#8220;because no one can come back later and say, oh, by the way, we&#8217;re changing our model.&#8221;</span></p><p><span>He has seen suppliers move from seat-based pricing to usage-based pricing, leaving engineering teams with a cost model they did not control. Hosting your own AI infrastructure changes that equation. It gives teams more control over where AI runs, how it is governed, and what it can cost.</span></p><p><span>The governance side of that argument, including how SUSE keeps agents and their costs inside a boundary it can stand behind, is covered in the companion piece,</span><a href="https://deepengineering.substack.com/p/how-suse-runs-ai-without-losing-control"><span> How SUSE Runs AI Without Losing Control</span></a><span>.</span></p><p><span>The more tactical layer is circuit breakers, which cap runaway agent spend in real time.</span></p><p><span>&#8220;We just noticed our Claude usage in the last minute was way too high,&#8221; he says, describing the trigger.</span></p><p><span>Spencer acknowledges the trade-off. Aggressive rate limiting can frustrate engineers who are trying to get work done, but it is a necessary safeguard when autonomous agents can generate costs without a human in the loop.</span></p><p><span>Like the three-tier framework, the goal is simple: match the cost of the tool to the value of the work and put clear limits around the situations where agents can spend without delivering value.</span></p><p><span>Ultimately, Spencer&#8217;s goal isn&#8217;t to slow engineers down. It&#8217;s to give them the confidence to use AI effectively without sacrificing governance or cost control.</span></p><p><span>&#8220;The penny drops for them that they&#8217;re in a new paradigm,&#8221; he says, describing the moment developers realize they can be ten or even a hundred times more productive.</span></p><p><span>The framework, the tooling, and the guardrails exist to support that shift, not to get in its way.</span></p><p><span>&#8220;You don&#8217;t want to stop them from getting that 100X improvement,&#8221; he says. &#8220;You need to give them the right tools for the job.&#8221;</span></p><p><span>For Spencer, that&#8217;s what successful AI adoption looks like: giving engineers the freedom to move faster while making sure the right tool is used for the right work.</span></p><div class="callout-block" data-callout="true"><p><strong>The Packt Summer Sale is live through June 30.</strong> Get 8,000+ eBooks and videos across AI, programming, data, DevOps, and cloud for $9.99 each, including <a href="https://www.packtpub.com/en-us/product/clean-architecture-with-net-9781805128021">Clean Architecture with .NET</a>, <a href="https://www.packtpub.com/en-us/product/python-illustrated-9781836646327">Python Illustrated</a>, and the <a href="https://www.packtpub.com/en-us/product/c-stl-cookbook-9781836204244">C++ STL Cookbook</a>.</p><p>&#8594; <strong><a href="https://www.packtpub.com/">Browse the sale</a></strong></p></div><div><hr></div><h2><strong>In case you missed</strong></h2><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;7a557be2-2077-42a3-8d18-22563eddcfa2&quot;,&quot;caption&quot;:&quot;Rick Spencer, GM of Product and Engineering at SUSE, on how an open source enterprise runs AI at scale while keeping control of its data, its tooling, and its costs, treating sovereignty, MCP governance, and cost predictability as one connected problem.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;How SUSE Runs AI Without Losing Control&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:427210082,&quot;name&quot;:&quot;Saqib Jan&quot;,&quot;bio&quot;:&quot;/localhost&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997a788a-cd78-4f84-9b3b-c72ab6dc0153_1008x1008.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-06-24T20:20:29.941Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c14a30e1-69ef-4264-9338-6a7b82cc9e59_2760x1240.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://deepengineering.substack.com/p/how-suse-runs-ai-without-losing-control&quot;,&quot;section_name&quot;:&quot;Engineering Leadership&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:203458741,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1729053,&quot;publication_name&quot;:&quot;Packt Deep Engineering&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!H5BJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F736bc1ee-d689-497e-83a8-7d9bf9022eb9_600x600.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;7a4d7ba0-6a0e-49ee-928f-cb9891bb90c6&quot;,&quot;caption&quot;:&quot;Interview with Rick Spencer on running AI disconnected from the internet, the three-tier framework SUSE uses to match tools to work, why output metrics are vanity metrics, and MCP as a control layer for enterprise infrastructure<br />&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Sovereign AI and Agentic Infrastructure with Rick Spencer&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:427210082,&quot;name&quot;:&quot;Saqib Jan&quot;,&quot;bio&quot;:&quot;/localhost&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997a788a-cd78-4f84-9b3b-c72ab6dc0153_1008x1008.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-06-24T18:06:00.000Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/youtube/w_728,c_limit/8PdtwqLL6YI&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://deepengineering.substack.com/p/sovereign-ai-agentic-infrastructure-rick-spencer-suse&quot;,&quot;section_name&quot;:&quot;Interviews&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:203441001,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1729053,&quot;publication_name&quot;:&quot;Packt Deep Engineering&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!H5BJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F736bc1ee-d689-497e-83a8-7d9bf9022eb9_600x600.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><h2><span>&#128736;&#65039; </span><strong><span>Tool of the Week</span></strong></h2><p><strong><a href="https://github.com/stacklok/toolhive"><span>ToolHive</span></a></strong><span> is an open source platform from Stacklok for running and governing Model Context Protocol (MCP) servers in production.</span></p><p><strong><span>Highlights</span></strong></p><ul><li><p><strong><span>Secure isolation:</span></strong><span> Runs each MCP server in its own isolated container with minimal permissions.</span></p></li></ul><ul><li><p><strong><span>Enterprise access control:</span></strong><span> Enforces per-request identity and access policies with OIDC integration.</span></p></li></ul><ul><li><p><strong><span>Self-hosted deployment:</span></strong><span> Keeps the MCP registry, gateway, and servers on your own infrastructure.</span></p></li></ul><ul><li><p><strong><span>Lower token usage:</span></strong><span> Uses semantic tool discovery to reduce token usage by up to 85%.</span></p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/stacklok/toolhive&quot;,&quot;text&quot;:&quot;ToolHive&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/stacklok/toolhive"><span>ToolHive</span></a></p><div><hr></div><h1><strong>&#128206; Tech Briefs</strong></h1><ul><li><p><a href="https://x.ai/news/grok-plugin-marketplace">Grok Build opens a plugin marketplace</a> - New plugin marketplace featuring tools from MongoDB, Vercel, Sentry, and Cloudflare.</p></li><li><p><a href="https://www.gartner.com/en/newsroom/press-releases/2026-05-19-gartner-forecasts-worldwide-ai-spending-to-grow-47-percent-in-2026">Gartner Forecasts Worldwide AI Spending </a>- Enterprise spending is expected to grow 47% year-over-year to reach $2.59 trillion in 2026.</p></li><li><p><a href="https://www.anthropic.com/research/claude-code-expertise">Anthropic study links AI coding success to domain understanding</a> - Domain expertise proved a stronger predictor of success than coding ability.</p></li><li><p><a href="https://orca.security/resources/blog/mastra-npm-supply-chain-attack/"><span>Mastra npm supply chain attack disclosed</span></a><span> - Over 144 packages were compromised through the </span><em><span>easy-day-js</span></em><span> typosquat dependency.</span></p></li><li><p><a href="https://developers.openai.com/codex/changelog"><span>OpenAI Codex adds granular internet access controls</span></a><span> - Users can now restrict internet access by domain and HTTP method.</span></p></li></ul><div><hr></div><p><span>That&#8217;s all for today. Thank you for reading this issue of Deep Engineering.</span></p><p><span>We&#8217;ll be back next week with more expert-led content.</span></p><p><span>Keep building,</span></p><p><span>Saqib Jan</span></p><p><span>Editor-in-Chief, Deep Engineering</span></p><div><hr></div><p><em><span>If your company wants to reach senior developers, software engineers, and technical decision-makers, </span><a href="https://packt.omeclk.com/portal/wts/uc%5EcnN2dfNaqmD-kB-mo66%7C7g%5Ef%7Cb"><span>speak to us about partnering</span></a><span> with Deep Engineering.</span></em></p>]]></content:encoded></item><item><title><![CDATA[How SUSE Runs AI Without Losing Control]]></title><description><![CDATA[Open source enterprises treat data sovereignty, MCP governance, and cost predictability as one connected problem]]></description><link>https://deepengineering.net/p/how-suse-runs-ai-without-losing-control</link><guid isPermaLink="false">https://deepengineering.net/p/how-suse-runs-ai-without-losing-control</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Wed, 24 Jun 2026 20:20:29 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c14a30e1-69ef-4264-9338-6a7b82cc9e59_2760x1240.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most companies adopting AI are making a quiet trade in exchange for speed. They accept that their data passes through systems they do not control, priced on terms they did not set, governed by rules someone else can change. For a consumer app that trade is often fine. But for an enterprise running infrastructure under compliance regimes, it is not. <a href="https://www.linkedin.com/in/rickspencer3">Rick Spencer</a>, General Manager for Technology and Product at <a href="https://www.suse.com/">SUSE</a>, has for the last two years been working out how an open source enterprise adopts AI at scale without making that trade, and his approach is a useful template for any organization that takes data sovereignty, auditability, and cost predictability seriously.</p><p>SUSE&#8217;s position is unusual in a way that sharpens the problem. &#8220;All the software that we write is open source,&#8221; Spencer explains. &#8220;We&#8217;re not worried about, oh, we leaked the code, we publish the code.&#8221; The concern is the data that belongs to others. When an engineer debugs a customer environment, the logs are not SUSE&#8217;s to hand to a third-party model. &#8220;They trust us to not do those kinds of things,&#8221; he says, and that trust is the thing the entire approach is built to protect.</p><div><hr></div><p><em>You can watch our full interview or read the <a href="https://deepengineering.substack.com/p/sovereign-ai-agentic-infrastructure-rick-spencer-suse">Q&amp;A article here</a>.</em></p><div id="youtube2-8PdtwqLL6YI" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;8PdtwqLL6YI&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/8PdtwqLL6YI?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2><strong>Sovereignty means how, not whether</strong></h2><p>The first instinct when AI collides with compliance is to draw a boundary around where AI is allowed to go. Spencer rejects that framing, saying &#8220;I don&#8217;t think it&#8217;s can or cannot. It&#8217;s more so how.&#8221; The distinction matters because a can-or-cannot policy ends with engineers either blocked from useful tools or quietly routing around the rules. A question of how keeps the capability available while controlling the conditions under which it runs.</p><p>The clearest illustration is SUSE&#8217;s build process. A lot of what the company ships is built in an internal instance of Open Build Service, and the defining property of those builds is that they happen offline. &#8220;All the builds are offline. They literally are not connected to the internet,&#8221; he points out. &#8220;This is super important because you need to be able to prove that nothing happened during the build process.&#8221; Proving a negative is far easier when there was no connection through which anything could have happened. It means doing things the hard way, making sure every source is present ahead of time because nothing can be pulled live during the build, but the payoff is provable integrity.</p><p>Applying AI inside that environment is where the how becomes concrete. The example Spencer gives is backporting a patch to previous stable releases, the kind of repetitive, knowledge-intensive work AI is well suited to. The question is whether it can be done in a sovereign way, and his answer is yes, on conditions. &#8220;As long as we are running AI in a way that it&#8217;s able to run disconnected from the internet, and we can have complete visibility into everything it&#8217;s doing.&#8221; SUSE goes further than running existing models in isolation. &#8220;In some cases we even train our own models to accomplish these things,&#8221; he shares, &#8220;and that way we know the model doesn&#8217;t have some naughty time bombs built into it.&#8221; Because owning the model end to end removes the last category of thing the enterprise would otherwise have to take on trust.</p><p>The foundation under all of this is SUSE AI, the company&#8217;s own stack for running AI workloads on private infrastructure, which it uses heavily internally and runs Llama on. &#8220;It&#8217;s all within our private infrastructure, so we make sure there&#8217;s no chance that any data can escape,&#8221; Spencer says. &#8220;We only use models which can be vetted effectively.&#8221; The principle is consistent. Keep the data inside the boundary, and only run models you can actually inspect.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://deepengineering.net/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 Packt Deep Engineering! Subscribe for free to receive new posts and support our 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><strong>MCP as the control layer, not just the connector</strong></h2><p>Most of the conversation about Model Context Protocol treats it as plumbing that turns a chatbot into an agent by giving it tools to act with. Spencer agrees that is what it does, but his more interesting argument is that MCP is where an enterprise regains the control that autonomous agents would otherwise erode. &#8220;MCP servers do another really important thing,&#8221; he explains, &#8220;which is provide a place where you can, as an enterprise, bring some sanity and control to the usage.&#8221;</p><p>The mechanism is straightforward once you see the server as infrastructure rather than glue. &#8220;If you have MCP servers running, they&#8217;re just servers,&#8221; Spencer says. &#8220;That means you can provide access ACLs to them.&#8221; A server can be told that a given user&#8217;s agent may use these tools and not those. The usage can be logged. Gateways can sit in front, and the company runs its own alongside a partnership with StackLok. The architectural rule that holds it together is that the language model never touches tools directly. &#8220;You don&#8217;t give the LLMs access directly to tools, only the MCP servers,&#8221; he reasons, &#8220;and then you can have that oversight, meet your compliance needs.&#8221;</p><p>He takes the containment idea down to the operating system. &#8220;You can put the MCP server, I call it, in jail,&#8221; Spencer says, describing a systemd process scoped to present only the compute resources the server actually needs. The reasoning is a security posture rather than a convenience. &#8220;For every MCP server you&#8217;re running, there&#8217;s an LLM out there that&#8217;s trying to use it, and who knows what kind of prompt injections people are running.&#8221; The same boundary defends against the model&#8217;s own failures, not only malicious input. An agent cannot delete a production server with a tool it was never given. &#8220;They guard against things like the AI hallucinating something and deleting your production server, because you simply don&#8217;t provide that tool to it,&#8221; he warns. Control here is not a policy document. It is the set of tools the agent is and is not handed.</p><p>There is a quality dimension to MCP that reinforces the control argument, because a well-built server encodes expert knowledge rather than leaving the model to guess. SUSE ships MCP servers with its products, crafted by the people who know those products best. &#8220;It would be like, instead of you sitting down in front of a chatbot saying I need to figure out how to use Rancher, you&#8217;re sitting down with the whole Rancher development team telling you how to prompt the chatbot,&#8221; Spencer says. An agent working against an expert-built server is not interpreting raw APIs and making guesses a human cannot easily validate. The encoded knowledge makes the agent both more capable and more predictable, which is control of a subtler kind.</p><h2>Cost sovereignty belongs in the same conversation</h2><p>The control story is incomplete if it stops at data and governance, because an enterprise that cannot predict its AI spend has lost a different kind of control. Spencer folds cost into the sovereignty argument directly. &#8220;Sometimes they call it cost sovereignty,&#8221; he says, &#8220;because no one can come back later and say, oh, by the way, we&#8217;re changing our model.&#8221; He has watched a supplier move developers from seat-based to usage-based pricing, a shift his teams did not control and could not prevent. Hosting your own infrastructure changes the nature of the exposure. &#8220;There&#8217;s a maximum cost there,&#8221; he notes of self-hosted AI, and the question shifts from whether you will overrun a variable bill to whether you have the observability to use a fixed capacity fully.</p><p>For the cases where variable cost is unavoidable, SUSE uses circuit breakers that cut off runaway spend in real time when usage spikes past a threshold in a given minute. Spencer is honest that this frustrates engineers who get rate limited mid-task, but the alternative is an autonomous agent running up cost with no human in the loop. The same discipline runs through the company&#8217;s use of frontier models, reserved for high-value strategic work rather than routine completion, and through the practice of using a frontier model once to build an agent that then runs on a cheaper model or a private one. Each of these is the same instinct expressed at the level of money, keeping the expensive capability available for the work that justifies it and putting hard limits around everything else.</p><p>What makes the SUSE approach instructive beyond its own walls is that none of it depends on slowing engineers down. The sovereignty, the MCP governance, and the cost controls exist so that engineers can move fast inside a boundary the enterprise can actually stand behind. &#8220;You don&#8217;t want to stop them from getting that 100X improvement,&#8221; Spencer says. &#8220;You need to give them the right tools for the job.&#8221; Control, in his telling, is not the opposite of speed. It is the thing that makes speed safe to allow.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Sovereign AI and Agentic Infrastructure with Rick Spencer]]></title><description><![CDATA[On running AI disconnected from the internet, the three-tier framework SUSE uses to match tools to work, why output metrics are vanity metrics, and MCP as a control layer for enterprise infrastructure]]></description><link>https://deepengineering.net/p/sovereign-ai-agentic-infrastructure-rick-spencer-suse</link><guid isPermaLink="false">https://deepengineering.net/p/sovereign-ai-agentic-infrastructure-rick-spencer-suse</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Wed, 24 Jun 2026 18:06:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/8PdtwqLL6YI" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most engineering organizations adopting AI do it without compliance regimes scrutinizing every decision. SUSE works under exactly that scrutiny, and the way it solved for AI adoption under strict data sovereignty requirements is instructive for any team that cares about where its data goes and what its AI actually costs.</p><p><a href="https://www.linkedin.com/in/rickspencer3">Rick Spencer</a> is the General Manager for Technology and Product at <a href="https://www.suse.com/">SUSE</a>, where he leads the engineering teams behind the company&#8217;s full product portfolio, from SUSE Linux Enterprise and Multi-Linux Manager to the cloud native stack of Rancher, RKE2, K3S, and SUSE AI. </p><p>SUSE has one of the longest and deepest open source infrastructure histories in the industry, and its enterprise customers are operating under strict compliance regimes. Rick joined Deep Engineering Live to talk about how SUSE adopted AI agents without breaking its promises on data sovereignty, the framework his teams use to decide which AI tools fit which work, why he rejects output-based developer metrics, and the role MCP now plays in managing enterprise infrastructure.</p><p>Watch the full conversation below or read the full interview.</p><div id="youtube2-8PdtwqLL6YI" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;8PdtwqLL6YI&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/8PdtwqLL6YI?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><em>This session was recorded offline as part of the Deep Engineering Interview Series. The transcript below has been lightly edited for clarity and readability.</em></p><div><hr></div><p><em><strong>Q. Tell us a little about yourself and what you do at SUSE, and the kinds of engineering challenges your teams are working through right now.</strong></em></p><p><strong>Rick Spencer:</strong> I&#8217;m the General Manager for Technology and Product at SUSE. That means I lead the engineering teams for all the products that we offer to customers. That includes Linux, like SUSE Linux Enterprise, SUSE Linux Enterprise Server for SAP, and Multi-Linux Manager. We also have a suite of cloud native products like RKE2, K3S, and Rancher of course. We have a lot of things built on top of both of those, like the application collection, which are certified Kubernetes applications that you can run. We have other products composed of those building blocks like SUSE AI that you can use to run your own sovereign AI stack. There is SUSE Edge, and SUSE Edge&#8217;s cousins like SUSE Telco and SUSE Industrial Solutions.</p><p>Our customers tend to be enterprises with pretty serious enterprise requirements. They work under compliance regimes, they typically face a lot of scrutiny, they need important things like L3 support, reliable lifecycle models, a lot of predictability, high quality, and low CVE counts. So we take the open source software in the world and we create packages of it that are usable by enterprise companies.</p><div><hr></div><p><em><strong>Q. SUSE has a longer and deeper open source infrastructure history than most companies in the space. When AI agents started becoming the real workflow tool for engineers, how did that land internally, and what did adoption actually look like on the ground?</strong></em></p><p><strong>Rick Spencer:</strong> There is a lot to unpack here, so let me try to go at least somewhat systematically. All the software that we write is open source, so we are not worried about leaking the code. We publish the code. That was not the concern. But there are things like, let&#8217;s say you are debugging a customer environment. You do not want to let your engineers just take those logs and send them to random AI bots. We promise that we won&#8217;t do that. They trust us to not do those kinds of things. So there was a phase that we went through trying to figure out how to use AI in an effective way that maintained our promises to the customers.</p><p>Part of that solution was really realizing that engineers are going to use AI to go faster wherever they can. It is not like, oh, don&#8217;t use AI. That would just not be workable. So it was really about setting up our engineering management team to coach those engineers effectively. Besides keeping promises of data sovereignty, costs can also really run out of control. We see a lot of people run into that. For us, we never really had the problem of engineers deleting things in production. Our engineers tend to be very cautious. But it is easy to rack up pretty big bills on Anthropic and Copilot and so on.</p><p>A big part of the solution was that we have our own sovereign AI. We make this thing called SUSE AI, which is a stack you can use to manage AI workloads on your own infrastructure. We use that pretty heavily internally and we run Llama on it. If you are doing things, and we have a few different places that we do that, it is all within our private infrastructure, so we make sure there is no chance that any data can escape. We only use models which can be vetted effectively.</p><p>Then there was more to it on the coaching and oversight side. What we ended up doing is getting pretty precise about how engineers use AI. We broke it down into three categories. The first is using it for your daily work, which is your statement completion and your debugging and that kind of thing. The second is using it for agentics, which is relieving your toil, letting agents take care of some things that used to create a lot of work or interruptions. The last part I call curve jumping. That is when you are going from zero to infinity, doing things with AI that you would not have tried before, like solving really deep problems in one big step.</p><p>We created a framework around those three different kinds of uses, and then we help engineering managers help their engineers pattern match. Okay, if I just need statement completion and debugging help, these are the tools I can use for that. If there is a sovereignty aspect to it, these are the tools for that work. These are good tools for this kind of agent. And then these are the frontier models that we provide to you for those curve jumping capabilities. It sounds very organized now, but there was a lot of experimentation and a lot of rapid innovation from the engineers. Some of the early adopter engineers led, and then we went back and tried to create some order out of that so we could spread what we learned around.</p><div><hr></div><p><em><strong>Q. Digital sovereignty is central to how SUSE thinks about its stack. How does that principle shape where AI can and cannot go inside your engineering workflows?</strong></em></p><p><strong>Rick Spencer:</strong> I don&#8217;t think it&#8217;s can or cannot. It&#8217;s more so how. Let me give you an example. For digital sovereignty, a lot of the things we build, we actually build in something called the internal build service, which is an instance of something called Open Build Service, which is a service we provide to everybody. Kubernetes is built on it. There are thousands and thousands of things built on it. The interesting thing in terms of digital sovereignty is that all the builds are offline. They literally are not connected to the internet. This is super important because you need to be able to prove that nothing happened during the build process. That is a lot easier to do if there was no internet connection.</p><p>So we have to go around the hard way. We have to make sure all the sources are there. You cannot pull anything live in the heat of the moment during build time. You cannot run post-install scripts. Now if you want to apply AI in that environment, let&#8217;s say you want to backport a patch to previous stable releases, can you do that in a sovereign way? Yes, you can, as long as we are running AI in a way that is able to run disconnected from the internet and we have complete visibility into everything it is doing. These things are not easy, but we have decades of experience with it that we can apply. In some cases we even train our own models to accomplish these things, and that way we know the model does not have some naughty time bombs built into it.</p><div><hr></div><p><em><strong>Q. When your engineers started integrating AI agents, where did it deliver productivity gains, and where did it create new problems?</strong></em></p><p><strong>Rick Spencer:</strong> Let me give you some examples. My favorite example isn&#8217;t really about code. We are an open source company, and we have all of this code within our dominion of control, in GitHub and here and there and everywhere. I don&#8217;t know if you remember the Trivy attacks last month, and just a spate of tool chain attacks. We had a response process for that, but it was predicated on those things occurring occasionally, not twice a week. So our security team wrote an agent that scans certain sites every hour. It says, okay, there is a reported compromised package, typically in NPM, sometimes in PyPI, different places. It finds those, and then it scans all of our open source code to see if we are using it anywhere. If we are, it writes a report and notifies us on Slack. So we know right where to pay attention right away.</p><p>Fortunately, so far we have not really been impacted because we have really good hygiene around our tool chains. But bad guys are really smart and work really hard, so we still want to stay super vigilant. That has just been such a huge relief, because now if you see a report of a tool chain attack, our agent was on it before we even knew about it. It saves so much toil, because we don&#8217;t have to send people out to check if we are using this package or do a search in this area of GitHub.</p><p>There are other areas like CVE mitigation. A CVE comes in, and an agent examines it. Is it even applicable? A lot of times the CVE comes in and the package is in the repo, but it is not being exposed in any way that it would matter. There is this thing called VEX, which is basically a file you provide along with the CVE database to explain whether the vulnerability is impacting you or not. That is really hard to do at the scale that CVEs are coming in, but the agents can do that for us pretty easily. That means we are focusing our attention not on keeping up with the crush of CVE reports, but on the actual vulnerabilities. Our attention is reserved to actually keep our customers safe.</p><div><hr></div><p><em><strong>Q. How do you think about measuring the impact of AI on your engineering teams?</strong></em></p><p><strong>Rick Spencer:</strong> We might have a different view on that than some people. We are really tending away from measurements that measure output and utilization, and we are trying to focus on impact. What that means is we don&#8217;t have leaderboards that show every developer and how many lines of code their agents submitted. I consider that garbage vanity metrics. Not helpful.</p><p>One of the main things we want to do is measure the impact of our use of AI without it being an extra burden on the development team. A lot of the tools out there assume you are a proprietary software company where everyone is working on a single code base, which is just not how an open source enterprise works. We are working on hundreds, if not thousands, of repositories all the time, and the work to maintain them is very different. So those utilization numbers and those developer-to-developer comparisons just don&#8217;t have value. I&#8217;d rather have engineers working than reporting.</p><p>So we are setting up metrics for different things, like how fast CVEs are being addressed, how fast patches are being backported, how fast our L3 responses are getting closed while maintaining the same NPS score. These are things where we have applied AI to different areas, so let&#8217;s focus on the business impact, not on the utilization.</p><p>That said, we are working on a set of dashboards right now so an engineering manager can look at the cost and utilization on their team to help with coaching. Let&#8217;s say an engineering manager has an eight person team. Hey, I noticed we are burning a lot of tokens. What are we actually doing that is burning that many tokens? I&#8217;m not sure we are getting value out of that. Or, hey, we have these seats for this LLM or code assistant we bought, but we are not using them. Are there areas where we could be? So we are definitely measuring the value from a business perspective, but we are really trying to decentralize and allow engineering managers to guide their teams on getting the most value out of AI, without it becoming a leaderboard game where developers feel exposed in some game that is not about providing value to customers.</p><div><hr></div><p><em><strong>Q. Whenever we talk about AI agents, we cannot avoid MCP. Why does it matter to so many companies today, and what does it unlock for engineering teams in your kind of environment?</strong></em></p><p><strong>Rick Spencer:</strong> MCP is critical, actually. If anyone is listening and does not know what I mean, a Model Context Protocol server is a little bit of code that runs and offers to an LLM, hey, here is some context you can use, and here are some tools, some actual things you can do. That turns a chatbot into an agent, because an agent can actually do things.</p><p>MCP does a few things that are really important. The first is just ease of use. A good MCP server provides structure to the LLM so that it is way easier to write a prompt to get the results you want. The LLM sees the MCP server is for this purpose, and these are the kinds of information the humans want out of it. You don&#8217;t have to include all that in the prompt. And it is actually really easy to write an MCP server with an LLM. If you have a decent model, it does not even need to be top tier. You say, hey, we have this bit of software we want to control with agents, this is our use case, and it will write an MCP server for you pretty easily. Then you can have a human go in and edit it.</p><p>But there is another part to it. We ship MCP servers with all of our products, and we think this is really important. In our view, the world is moving to a new paradigm. Before, as an administrator, you would think about all the applications you use to monitor and control your servers, your Kubernetes clusters, your workloads. Now we are moving into a mode where you don&#8217;t think that way. You think about writing agents, or chatting with the infrastructure to get the information you need, and then it is able to take action on your behalf without you having to worry about the specific syntax.</p><p>For that to work, those MCP servers have to have really good human knowledge encoded into them. If you think about our MCP servers for SLES, for Rancher, for Multi-Linux Manager, the key is that the experts in using that tool have crafted those MCP servers. It would be like, instead of you sitting down in front of a chatbot saying I need to figure out how to use Rancher, you are sitting down with the whole Rancher development team telling you how to prompt the chatbot. That encoding of knowledge makes the agentics way more powerful, because it is not guessing. Otherwise it has to look at the raw APIs and make a bunch of guesses, and there is no way as a human you will know if that is the right thing to do.</p><p>All that said, there is another really important thing MCP servers do, which is provide a place where you can, as an enterprise, bring some sanity and control to the usage. If you have MCP servers running, they are just servers. That means you can provide access ACLs to them. You can say the MCP server for this user is allowed to use these tools and not these tools. You can log the use of the MCP servers. We have our own gateway, but we also partnered with a company called StackLok that we talked a lot about at the last SUSECON. There are different gateways you can put into place as an enterprise to keep the MCP servers under control. You don&#8217;t give the LLMs access directly to tools, only the MCP servers, and then you can have that oversight and meet your compliance needs.</p><p>Even at a low level, you can put the MCP server, I call it, in jail. You can say, on the server, here is the user for this MCP server, here is a systemd process that only presents the actual compute resources it needs. Because you have to be thinking, for every MCP server you are running, there is an LLM out there trying to use it, and who knows what kind of prompt injections people are running. MCP servers also guard against things like the AI hallucinating something and deleting your production server, because you simply don&#8217;t provide that tool to it. This to me is one of the main roles SUSE has to play as part of this disruption, because we are bringing this agentic notion of how to manage all of your infrastructure.</p><div><hr></div><p><em><strong>Q. Cost is a real constraint when you are running AI at any scale. What does a practical cost mitigation approach look like for an engineering organization working the way SUSE does?</strong></em></p><p><strong>Rick Spencer:</strong> I can speak from our own experience. The fact of the matter is, if you are using a self-hosted AI, sure, you spend a lot on the big iron, and you are probably paying a company like SUSE for support. But nonetheless, there is a maximum cost there. Then the real question is, do you have the observability in place to make sure it is being utilized fully? That is a very different conversation. Are we getting full utilization out of our fixed costs, where we never have to worry about overrunning?</p><p>There is digital sovereignty, and sometimes they call this cost sovereignty, because no one can come back later and say, oh, by the way, we are changing our model. We have some suppliers where a lot of our developers were using seat-based pricing, and then over time they let us know, in plenty of time, that they are moving to usage-based pricing. That is a big change. We did not have sovereignty over the way they price it, whereas if you are hosting your own, you have that sovereignty over the pricing. So it is something to think about.</p><p>Another thing we use a lot is circuit breakers. Hey, we just noticed our Claude usage in the last minute was way too high, or Gemini, whatever you are using. That keeps runaway agents in check. It can be very frustrating for developers if they are trying to get work done and every single minute they are getting rate limited, but we are talking about cost controls, so you need to do the thing.</p><p>The other thing to say is that we are big believers in frontier models. We are not saying don&#8217;t use frontier models, but it is important to use them for the right things. You do not need a frontier model to understand your Python module and give you code completion. You just don&#8217;t need it for that. The frontier models are really for when you are in that curve jumping, super strategic mode. We have projects where we spend tens of thousands of dollars on frontier models, but they generated, who knows, a million or two million dollars in value, so the cost benefit was definitely there.</p><p>One thing we do with frontier models is, let&#8217;s say we need an agent for something. We use the frontier model to create an agent that can then be run on a much lower cost model. It will say, sure, I&#8217;ll write the Python scripts it needs to use, so it doesn&#8217;t have to try to do that inference every time. I&#8217;ll write the context file that works for that model. So you can start with the frontier model and then tell it to do things with your less expensive models, or even your own models that are in your own infrastructure.</p><p>When you see that needle move, you see people start adopting it, and you&#8217;ll see step functions in utilization of tokens. A certain engineer, the penny drops for them that they are in a new paradigm where, as a developer, they suddenly realize they are empowered to be ten times, a hundred times more effective using these tools. You can see day to day these little jumps. Oh, somebody figured it out. Someone figured it out. So then you need to go back, because you don&#8217;t want to stop them from getting that 100X improvement. You need to give them the right tools for the job.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Deep Engineering #52: Sam Keen on the Context Tax You Pay in Every Claude Code Session]]></title><description><![CDATA[Why every AI coding session starts from zero, and how to fix it with a system instead of a better prompt]]></description><link>https://deepengineering.net/p/issue52-context-tax-claude-code-sam-keen</link><guid isPermaLink="false">https://deepengineering.net/p/issue52-context-tax-claude-code-sam-keen</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Thu, 18 Jun 2026 16:38:44 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/869b39fe-96eb-403e-8485-74c8ce089864_2760x1240.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong><a href="https://www.eventbrite.co.uk/e/claude-code-for-software-engineering-from-prompts-to-systems-tickets-1988571262176?aff=deepeng">Claude Code for Software Engineering</a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.eventbrite.co.uk/e/claude-code-for-software-engineering-from-prompts-to-systems-tickets-1988571262176?aff=deepeng" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5k27!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 424w, https://substackcdn.com/image/fetch/$s_!5k27!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 848w, https://substackcdn.com/image/fetch/$s_!5k27!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 1272w, https://substackcdn.com/image/fetch/$s_!5k27!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5k27!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png" width="900" height="300" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:300,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.eventbrite.co.uk/e/claude-code-for-software-engineering-from-prompts-to-systems-tickets-1988571262176?aff=deepeng&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5k27!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 424w, https://substackcdn.com/image/fetch/$s_!5k27!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 848w, https://substackcdn.com/image/fetch/$s_!5k27!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 1272w, https://substackcdn.com/image/fetch/$s_!5k27!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.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>Join this interactive workshop to learn how to turn Claude Code from a session-by-session assistant into a repeatable engineering system, using structured context, reusable skills, scoped rules, hooks, and guardrails that work across real codebases and team workflows.</p><p>&#128467;&#65039; Friday, June 20 &#183; 10:30 AM EDT onwards</p><p style="text-align: center;"><span>Use code </span><strong>DEEPENG50</strong><span> for 50% off.</span></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.eventbrite.co.uk/e/claude-code-for-software-engineering-from-prompts-to-systems-tickets-1988571262176?aff=deepeng&quot;,&quot;text&quot;:&quot;Register here&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.eventbrite.co.uk/e/claude-code-for-software-engineering-from-prompts-to-systems-tickets-1988571262176?aff=deepeng"><span>Register here</span></a></p><div><hr></div><p><span>&#9997;&#65039; </span><strong><span>From the editor&#8217;s desk,</span></strong></p><p><span>Welcome to the 52nd issue of Deep Engineering!</span></p><p>A <a href="https://github.com/VILA-Lab/Dive-into-Claude-Code">recent study</a> pulled apart the architecture of Claude Code and found that only 1.6 percent of the codebase is actual AI decision logic, while the remaining 98.4 percent is the deterministic infrastructure that surrounds the model, including the permission gates, the context management, the tool routing, and the recovery logic that keep the whole thing usable. The agent loop at the center of it turns out to be a simple while loop, which means the genuine engineering effort sits in the systems built around the model rather than in the model itself.</p><p><span>This analysis lines up almost exactly with what most engineers working with AI tools are discovering through daily practice, which is that the thing slowing them down is rarely the intelligence of the model and is far more often the fact that none of the context they carefully supply in one session survives into the next. Supplying that missing context has quietly become the engineer&#8217;s job, and it gets paid at the start of every single session without anyone ever counting it.</span></p><p>This week <a href="https://www.linkedin.com/in/samkeen">Sam Keen</a>, an agentic engineering researcher, and former engineer at AWS and Nike, and the author of <a href="https://www.packtpub.com/en-in/product/clean-architecture-with-python-9781836642886">Clean Architecture with Python</a>, shares a practical way to stop paying that cost for good. His piece walks through how to convert the context you re-explain on repeat into a system that compounds across sessions, using the mechanisms Claude Code already gives you, and how to recognize the moment that system starts quietly working against you rather than for you.</p><p><span>Let&#8217;s get started.</span></p><div><hr></div><p><strong><span>Featured Newsletter: </span><a href="https://engineeringatscale.substack.com/">Engineering At Scale</a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://engineeringatscale.substack.com/" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c8fw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7dac87-ecd9-4c27-a811-8cc917c7ca63_698x696.jpeg 424w, https://substackcdn.com/image/fetch/$s_!c8fw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7dac87-ecd9-4c27-a811-8cc917c7ca63_698x696.jpeg 848w, https://substackcdn.com/image/fetch/$s_!c8fw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7dac87-ecd9-4c27-a811-8cc917c7ca63_698x696.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!c8fw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7dac87-ecd9-4c27-a811-8cc917c7ca63_698x696.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c8fw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7dac87-ecd9-4c27-a811-8cc917c7ca63_698x696.jpeg" width="292" height="291.16332378223495" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f7dac87-ecd9-4c27-a811-8cc917c7ca63_698x696.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:696,&quot;width&quot;:698,&quot;resizeWidth&quot;:292,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://engineeringatscale.substack.com/&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!c8fw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7dac87-ecd9-4c27-a811-8cc917c7ca63_698x696.jpeg 424w, https://substackcdn.com/image/fetch/$s_!c8fw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7dac87-ecd9-4c27-a811-8cc917c7ca63_698x696.jpeg 848w, https://substackcdn.com/image/fetch/$s_!c8fw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7dac87-ecd9-4c27-a811-8cc917c7ca63_698x696.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!c8fw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7dac87-ecd9-4c27-a811-8cc917c7ca63_698x696.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>A weekly column that makes databases, system design, and architecture easy to follow, with clear explanations, practical insights, and career advice for engineers building at scale.</p><p><strong><span>&#8594; </span><a href="https://engineeringatscale.substack.com/">Subscribe to Engineering At Scale</a></strong></p><div><hr></div><h1><span data-color="rgb(54, 55, 55)" style="color: rgb(54, 55, 55);">The Hidden Cost of Starting From Scratch</span></h1><p><em>Submitted by <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Sam Keen&quot;,&quot;id&quot;:11641009,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fbfbf069-838f-4d75-b1d6-b7edb01eca2c_1254x1254.png&quot;,&quot;uuid&quot;:&quot;275b7dcb-d4c4-4254-b875-4633e6ae1d7d&quot;}" data-component-name="MentionToDOM"></span></em></p><p>When you open a fresh Claude Code session, the assistant knows nothing about your project. It does not know where your tests live, it does not know the patterns this codebase uses, and it does not remember the conventions you walked it through the day before. So you explain all of it again, and then you do the same thing again tomorrow. </p><p>That re-teaching is a tax, and it is the easiest one to overlook because it never shows up on any gauge, which means you pay it at the start of every session without ever once counting what it costs you.</p><h2><span data-color="rgb(54, 55, 55)" style="color: rgb(54, 55, 55);">The bottleneck isn&#8217;t the model</span></h2><p>The real limiting factor in AI-assisted development right now is not how clever the model is, because the models are already more than capable enough for the work most teams are asking of them. The limiting factor is that none of that intelligence carries from one session into the next, and the job of supplying the missing context every single time has quietly been handed to you without anyone naming it as work.</p><p>Picture a senior engineer who forgets everything about your codebase overnight, every single night, and shows up the next morning brilliant and fast and genuinely helpful but starting again from absolute zero. You would not describe that person as a force multiplier, you would describe the arrangement as exhausting, and yet that is the default relationship most people have with their coding assistant. They end up blaming the model for the drag when the actual problem is that nothing they explained yesterday is still present today.</p><h2>Write the context down once</h2><p>The fix is to stop starting from scratch, which means writing the recurring context down once in a place the harness reads automatically so that it is present in every session without you having to lift a finger. Claude Code gives you several mechanisms for doing exactly this, and three of them are foundational. The most useful way to think about the three is by the specific kind of cost each one removes from your day.</p><p><strong>Agent files</strong>, written as CLAUDE.md, are your project&#8217;s standing memory, the place where the conventions and the layout and the way things get done here all live. You write them once and they load into every session, so you stop re-explaining the project from the beginning each time. The part most people underuse is that these files load hierarchically, which means a personal file can ride along on every session on your machine, a broader file can cover all of your coding work, and a project-specific file can sit on top of both, each one layering onto the last. The thing to remember is to keep them lean, somewhere around a couple hundred lines each rather than letting them sprawl.</p><p><strong>Skills</strong> capture the procedures you would otherwise walk through by hand every time, the multi-step moves where you first do one thing and then check another before continuing. A procedure you would normally re-explain becomes a procedure you simply invoke, and because a skill is not limited to instructions alone, it can bundle the scripts the agent runs, which means the repeatable move can carry real executable code rather than prose describing what the code should do.</p><p><strong>Hooks</strong> handle the corrections you would otherwise find yourself repeating, the lint nit and the formatting rule and the check you keep having to ask for. They fire at fixed points in the harness lifecycle, before or after a tool runs for instance, and because they sit outside the model&#8217;s control they run every single time regardless of whether the model would have remembered to do them. You give the note once and then you never have to give it again.</p><p>The pattern underneath all three mechanisms is the same one, because each of them converts a recurring cost into a single one-time write. That is what compounding actually means in this context, and it is the direct opposite of starting from scratch, since the investment you make is small and the payback lands in every session that follows it.</p><h2>Your setup can rot, here is how to catch it</h2><p>There is an honest catch worth naming here, and it is the place where the /context command earns its keep, because a compounding system can quietly rot over time. You install a skill pack and then forget it is even there. A CLAUDE.md that started out tight slowly fills up with things that mattered once and no longer do. The investment turns into freight without you noticing, and freight is really just the from-scratch tax wearing a slightly nicer costume.</p><p>The /context command is how you tell the difference, and it does one genuinely useful thing, which is that it makes the invisible visible. One command gives you a colored grid and a per-category breakdown of exactly what you are carrying before the conversation has even started. You do not need to master it, you only need to glance at it often enough to notice when something is wrong.</p><p>The last time I ran it, the single biggest chunk of my standing context was not the project memory I had carefully written, it was 14.4k tokens of skill packs I had installed on a whim and then never used even once. I had assumed my context was quietly working in my favor, and a five-second look told me otherwise. Culling them took about a minute, using /skills to deactivate the ones I never reach for and /plugin to drop a whole pack that had arrived bundled with something else.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!H9OX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77111332-5499-46cb-a963-24521563f285_1302x492.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!H9OX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77111332-5499-46cb-a963-24521563f285_1302x492.png 424w, https://substackcdn.com/image/fetch/$s_!H9OX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77111332-5499-46cb-a963-24521563f285_1302x492.png 848w, https://substackcdn.com/image/fetch/$s_!H9OX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77111332-5499-46cb-a963-24521563f285_1302x492.png 1272w, https://substackcdn.com/image/fetch/$s_!H9OX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77111332-5499-46cb-a963-24521563f285_1302x492.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!H9OX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77111332-5499-46cb-a963-24521563f285_1302x492.png" width="1302" height="492" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/77111332-5499-46cb-a963-24521563f285_1302x492.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:492,&quot;width&quot;:1302,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!H9OX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77111332-5499-46cb-a963-24521563f285_1302x492.png 424w, https://substackcdn.com/image/fetch/$s_!H9OX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77111332-5499-46cb-a963-24521563f285_1302x492.png 848w, https://substackcdn.com/image/fetch/$s_!H9OX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77111332-5499-46cb-a963-24521563f285_1302x492.png 1272w, https://substackcdn.com/image/fetch/$s_!H9OX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77111332-5499-46cb-a963-24521563f285_1302x492.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em><span data-color="rgb(54, 55, 55)" style="color: rgb(54, 55, 55);">My </span></em><span data-color="rgb(54, 55, 55)" style="color: rgb(54, 55, 55);">/context</span><em><span data-color="rgb(54, 55, 55)" style="color: rgb(54, 55, 55);"> readout: skills were the largest slice of standing overhead, bigger than the project memory I&#8217;d actually written.</span></em></figcaption></figure></div><p>That same readout flagged a second problem with a different fix, because the CLAUDE.md in my working directory had grown to 3,500 tokens without my noticing. I sat down with Claude and compacted it, cutting the irrelevant and the quietly duplicated, and it came back at 1,200 tokens, which is the same project memory carried at roughly a third of the weight.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Cuto!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe0673e-3b88-4e1c-b25b-fc2f2c54c1b8_1234x194.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Cuto!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe0673e-3b88-4e1c-b25b-fc2f2c54c1b8_1234x194.png 424w, https://substackcdn.com/image/fetch/$s_!Cuto!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe0673e-3b88-4e1c-b25b-fc2f2c54c1b8_1234x194.png 848w, https://substackcdn.com/image/fetch/$s_!Cuto!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe0673e-3b88-4e1c-b25b-fc2f2c54c1b8_1234x194.png 1272w, https://substackcdn.com/image/fetch/$s_!Cuto!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe0673e-3b88-4e1c-b25b-fc2f2c54c1b8_1234x194.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Cuto!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe0673e-3b88-4e1c-b25b-fc2f2c54c1b8_1234x194.png" width="1234" height="194" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/efe0673e-3b88-4e1c-b25b-fc2f2c54c1b8_1234x194.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:194,&quot;width&quot;:1234,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Cuto!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe0673e-3b88-4e1c-b25b-fc2f2c54c1b8_1234x194.png 424w, https://substackcdn.com/image/fetch/$s_!Cuto!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe0673e-3b88-4e1c-b25b-fc2f2c54c1b8_1234x194.png 848w, https://substackcdn.com/image/fetch/$s_!Cuto!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe0673e-3b88-4e1c-b25b-fc2f2c54c1b8_1234x194.png 1272w, https://substackcdn.com/image/fetch/$s_!Cuto!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe0673e-3b88-4e1c-b25b-fc2f2c54c1b8_1234x194.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Clarity helps the agent for exactly the same reason it helps a human reader, because a bloated and half-contradictory CLAUDE.md does not only cost you tokens, it actively muddies the very instructions you are leaning on to get good work out of the model. A lean file is easier for the model to follow in the same way that a tight brief is easier for a colleague to follow.</p><p>The specific number you land on does not really matter, but the habit does, so skim /context the way you would skim a credit-card statement, not obsessively but often enough to catch the recurring charge you forgot you ever signed up for.</p><h2><span data-color="rgb(54, 55, 55)" style="color: rgb(54, 55, 55);">Do the upfront work once</span></h2><p>Starting from scratch feels free because the cost is smeared so thin across every session you will ever run, but it is not actually free, and it is in fact one of the largest and quietest line items in the way you work.</p><p>So put in the upfront work of writing a lean memory file, building a few skills you genuinely use, and setting a couple of hooks that hold the line for you. Then keep curating it, because models change and your projects change, and a glance at /context now and then is what tells you which parts of your setup are still earning their place. The goal was never a clever prompt. The goal is a setup that already knows your project before you say a single word to it.</p><div class="callout-block" data-callout="true"><p><strong>Ad:</strong> Join Packt&#8217;s live workshop <strong><a href="https://www.eventbrite.co.uk/e/claude-code-beyond-prompts-tickets-1988571262176?aff=aiagentsimplified">Claude Code Beyond Prompts</a></strong> by <strong>Sam Keen</strong> on <strong>June 20</strong> and learn how to turn CLAUDE.md, skills, and hooks into a compounding coding system.</p><p>Use code <strong>CLAUDE60</strong> for 60% off. Limited to the first 10 sign-ups.</p></div><h2><span>&#128736;&#65039; </span><strong><span>Tool of the Week</span></strong></h2><p><strong><a href="https://github.com/yamadashy/repomix"><span data-color="rgb(17, 85, 204)" style="color: rgb(17, 85, 204);">Repomix</span></a></strong><span> &#8212; an open source tool that packs an entire repository into a single, AI-friendly file ready to feed to a coding agent, with token counting built in.</span></p><p><strong><span>Highlights</span></strong></p><ul><li><p><span>Packs a whole repository into a single structured file optimized for LLM consumption, removing the manual copy-paste that eats the start of every session.</span></p></li><li><p><span>Counts tokens per file and for the whole pack, so you see what context costs before you spend it rather than after.</span></p></li><li><p><span>Ships an official skill for Claude Code, Cursor, Codex, and Copilot, letting agents run Repomix directly inside the workflow.</span></p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/yamadashy/repomix&quot;,&quot;text&quot;:&quot;Learn more about Repomix&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/yamadashy/repomix"><span>Learn more about Repomix</span></a></p><div><hr></div><h2>&#128206; <strong>Tech Briefs</strong></h2><ul><li><p><strong><a href="https://www.anthropic.com/news/fable-mythos-access">Anthropic suspends Fable 5 and Mythos 5 worldwide</a></strong> - A US export control directive citing national security forced Anthropic to disable both frontier models for all customers, days after launch, with all other models unaffected.</p></li><li><p><strong><a href="https://github.com/openai/codex/releases">OpenAI Codex 0.140.0 ships</a></strong> - Codex adds Claude Code imports, unified mentions, and encrypted Amazon Bedrock API-key authentication.</p></li><li><p><strong><a href="https://github.com/github/copilot-cli/releases">GitHub Copilot CLI 1.0.63 released</a></strong> - A new <code>deferTools</code> option reduces MCP context bloat when tool search is enabled.</p></li><li><p><strong><a href="https://venturebeat.com/technology/xiaomis-new-open-source-agentic-ai-coding-harness-mimo-code-beats-claude-code-at-ultra-long-200-step-tasks">Xiaomi open-sources MiMo Code</a></strong> - Xiaomi&#8217;s terminal coding agent targets long tasks and offers free limited-time MiMo Auto access.</p></li><li><p><strong><a href="https://help.openai.com/en/articles/6825453-chatgpt-release-notes">ChatGPT adds memory summary controls</a></strong> - Users can delete memories, turn memory off, and directly correct their memory summary.</p></li></ul><div><hr></div><p>That&#8217;s all for today. Thank you for reading this issue of Deep Engineering.</p><p>We&#8217;ll be back next week with more expert-led content.</p><p>Keep building,</p><p>Saqib Jan</p><p>Editor-in-Chief, Deep Engineering</p><div><hr></div><p><em><span>If your company wants to reach senior developers, software engineers, and technical decision-makers, </span><a href="https://packt.omeclk.com/portal/wts/uc%5EcnN2dfNaqmD-kB-mo66%7C7g%5Ef%7Cb">speak to us about partnering</a><span> with Deep Engineering.</span></em></p>]]></content:encoded></item><item><title><![CDATA[Deep Engineering #51: Francesco Ciulla on Rust, Go, and Service-Level Engineering Decisions]]></title><description><![CDATA[On Rust versus Go, latency-sensitive services, memory overhead, deployment workflows, and the backend constraints that shape language choices]]></description><link>https://deepengineering.net/p/issue51-rust-vs-go-service-level-backend-decisions</link><guid isPermaLink="false">https://deepengineering.net/p/issue51-rust-vs-go-service-level-backend-decisions</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Thu, 11 Jun 2026 13:30:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/cdd4048e-b9ef-459f-8c4a-0825dd1211c6_1024x339.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong><a href="https://www.eventbrite.co.uk/e/build-production-ready-ai-applications-with-rust-claude-and-codex-tickets-1987053747248?aff=deepeng">Build Production-Ready AI Applications with Rust, Claude and Codex</a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.eventbrite.co.uk/e/build-production-ready-ai-applications-with-rust-claude-and-codex-tickets-1987053747248?aff=deepeng" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hTwW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F905c15b8-b174-4a4b-808a-965540151675_800x400.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hTwW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F905c15b8-b174-4a4b-808a-965540151675_800x400.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hTwW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F905c15b8-b174-4a4b-808a-965540151675_800x400.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hTwW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F905c15b8-b174-4a4b-808a-965540151675_800x400.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hTwW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F905c15b8-b174-4a4b-808a-965540151675_800x400.jpeg" width="800" height="400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/905c15b8-b174-4a4b-808a-965540151675_800x400.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:400,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.eventbrite.co.uk/e/build-production-ready-ai-applications-with-rust-claude-and-codex-tickets-1987053747248?aff=deepeng&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!hTwW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F905c15b8-b174-4a4b-808a-965540151675_800x400.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hTwW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F905c15b8-b174-4a4b-808a-965540151675_800x400.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hTwW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F905c15b8-b174-4a4b-808a-965540151675_800x400.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hTwW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F905c15b8-b174-4a4b-808a-965540151675_800x400.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>Learn how to use Claude and Codex as development partners for building reliable Rust applications faster. This hands-on workshop with <strong>Francesco Ciulla</strong> shows how to scaffold, refactor, debug, test, and productionize AI-assisted Rust code with confidence.</p><p style="text-align: center;"> Use code <strong>DEEPENG50</strong> for 50% off.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.eventbrite.co.uk/e/build-production-ready-ai-applications-with-rust-claude-and-codex-tickets-1987053747248?aff=deepeng&quot;,&quot;text&quot;:&quot;Register here&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.eventbrite.co.uk/e/build-production-ready-ai-applications-with-rust-claude-and-codex-tickets-1987053747248?aff=deepeng"><span>Register here</span></a></p><div><hr></div><p><strong>&#9997;&#65039; From the editor&#8217;s desk,</strong></p><p>Welcome to the <strong>51st</strong> issue of Deep Engineering!</p><p>The Rust team <a href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/">released version 1.96.0 on May 28</a>, shipping new Copy-compatible range types, stabilized assert macros, and Cargo security fixes. It is the kind of release that tells you something important about where the language is. Now on a steady six-week release cadence, Rust&#8217;s toolchain keeps getting more integrated, and each release moves the language further from its reputation as a difficult, specialist tool and closer to something engineering teams can simply rely on.</p><p>That maturity is part of what is changing the production calculus for engineering teams this year. <a href="https://it.linkedin.com/in/francesco-ciulla-roma/en">Francesco Ciulla</a>, author of <a href="https://www.packtpub.com/en-in/product/the-rust-programming-handbook-9781836208860">The Rust Programming Handbook</a> and head of developer relations at Zerops, has used both Rust and Go in production. His view on the Rust versus Go debate is neither dismissive of Go nor evangelistic about Rust.</p><p>Ciulla discussed how Rust and Go solve different backend problems, where Go still wins, where Rust&#8217;s flat latency and binary size arguments become genuinely decisive, and why his thinking on committing to Rust for a production backend has changed.</p><blockquote><p>Today&#8217;s expert insights are based on the broader conversation about Rust adoption we had with Ciulla. You can read our <a href="https://deepengineering.substack.com/p/issue-45-francesco-ciulla-building-production-systems-rust-without-rewrite">previous issue</a> or watch the full <a href="https://deepengineering.substack.com/p/try-rust-with-your-own-hands-and-eyes-francesco-ciulla">Q&amp;A here</a>.</p></blockquote><p>Let&#8217;s get started.</p><div><hr></div><p style="text-align: center;"><strong>Featured Newsletter: <a href="https://javatipsandtricks.substack.com/">Java Tips and Tricks </a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://javatipsandtricks.substack.com/" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ow34!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854fda9-0d61-4a3c-823c-dc8db51efe93_543x604.png 424w, https://substackcdn.com/image/fetch/$s_!ow34!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854fda9-0d61-4a3c-823c-dc8db51efe93_543x604.png 848w, https://substackcdn.com/image/fetch/$s_!ow34!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854fda9-0d61-4a3c-823c-dc8db51efe93_543x604.png 1272w, https://substackcdn.com/image/fetch/$s_!ow34!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854fda9-0d61-4a3c-823c-dc8db51efe93_543x604.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ow34!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854fda9-0d61-4a3c-823c-dc8db51efe93_543x604.png" width="307" height="341.48802946593" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7854fda9-0d61-4a3c-823c-dc8db51efe93_543x604.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:604,&quot;width&quot;:543,&quot;resizeWidth&quot;:307,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://javatipsandtricks.substack.com/&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ow34!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854fda9-0d61-4a3c-823c-dc8db51efe93_543x604.png 424w, https://substackcdn.com/image/fetch/$s_!ow34!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854fda9-0d61-4a3c-823c-dc8db51efe93_543x604.png 848w, https://substackcdn.com/image/fetch/$s_!ow34!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854fda9-0d61-4a3c-823c-dc8db51efe93_543x604.png 1272w, https://substackcdn.com/image/fetch/$s_!ow34!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854fda9-0d61-4a3c-823c-dc8db51efe93_543x604.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Subscribe to Java Tips and Tricks on Substack for practical Java insights, modern Java features, software design discussions, and updates from the Java ecosystem.</p><p><strong>&#8594; <a href="https://javatipsandtricks.substack.com/">Subscribe to Java Tips and Tricks</a></strong></p><div><hr></div><p>Expert Insights</p><h2>Rust and Go Are Better Compared Service by Service</h2><p><em>by <a href="https://in.linkedin.com/in/s-jan">Saqib Jan</a> with <a href="https://it.linkedin.com/in/francesco-ciulla-roma/en">Francesco Ciulla</a></em></p><p>Most engineering teams debating Rust versus Go for their next backend service are usually trying to answer the question too early, assuming the decision starts with the language rather than the service. </p><p><a href="https://it.linkedin.com/in/francesco-ciulla-roma/en">Francesco Ciulla</a>, author of <a href="https://www.packtpub.com/en-in/product/the-rust-programming-handbook-9781836208860">The Rust Programming Handbook</a> and head of developer relations at <a href="https://zerops.io/">Zerops</a>, thinks that framing misses the point. The useful question is not whether Rust is better than Go, or whether Go is more practical than Rust. It is whether the specific service being built has constraints that make one language&#8217;s trade-offs more valuable than the other&#8217;s.</p><p>The distinction Ciulla draws is practical. Go still earns its place in cloud infrastructure, CLI tooling, hiring, and teams that need a service working quickly without introducing a new adoption burden. Rust, in his view, becomes much harder to ignore when a service is constrained by memory use, latency predictability, high-concurrency performance, or the need to remove whole classes of runtime failure from the system. That is why the Rust versus Go debate becomes less useful the longer it stays at the language level. The decision only starts to make sense when it moves down to the service level.</p><h3>Most teams are asking the wrong question</h3><p>Most engineers who have followed the Rust versus Go conversation online will have encountered it as a tribal argument, with advocates on both sides treating the choice as a matter of identity rather than engineering judgment. Ciulla rejects that framing, and part of what makes his view useful is that he is not arguing from a Rust-only position. He currently works with Go at Zerops, where the company&#8217;s CLI is written in Go, and he has run Rust services in production on his own projects.</p><p>&#8220;I would never say that Go is a bad programming language,&#8221; Ciulla says. &#8220;You can feel how powerful Rust is because we are talking about completely different scenarios and still Rust has something to say. But that does not make Go bad.&#8221;</p><p>The more useful framing, he argues, is to stop treating Rust versus Go as a general-purpose language comparison and start treating it as a service-level engineering decision. The question is not whether an organization should adopt Rust instead of Go. The question is whether a specific service in the system has properties where Rust&#8217;s trade-offs are worth paying for, or whether Go&#8217;s simplicity, ecosystem, and hiring advantages matter more.</p><p>That reframe changes the conversation because it moves the decision away from preference and toward evidence. Once the team is looking at the service rather than the language, the relevant questions become much more concrete. Is memory use a real constraint? Is tail latency a business problem? Does the service sit on a critical path? Does the team have anyone who can review Rust code well enough to put it into production safely? Without those questions, the debate quickly becomes ideology dressed up as architecture.</p><h3>Go wins on hiring, tooling, and the Docker ecosystem</h3><p>Ciulla is careful not to turn the comparison into an anti-Go argument. Go is a natural fit for CLI tools, cloud infrastructure tooling, and the Docker and Kubernetes ecosystem. Docker is written in Go and Kubernetes is built on Go. For teams building tools that live inside that ecosystem, Go is the default for reasons that have little to do with language preference and everything to do with integration, community, and the availability of patterns the team can learn from.</p><p>The hiring argument also runs in Go&#8217;s favor, and Ciulla thinks engineering leaders should be honest about it. &#8220;In terms of finding Go engineers, probably at the moment it is easier,&#8221; he notes, &#8220;because there are probably more of them.&#8221; For a company that needs to move quickly and cannot afford a long search for specialized Rust talent, that matters. Staffing is not separate from engineering judgment. It is one of the constraints that determines whether a technical choice can survive contact with production.</p><p>Go also has lower adoption friction in general-purpose backend contexts where the performance ceiling is not the binding constraint. If a team is building a service that needs to be working by the end of the week, deployed reliably, and understood by the next engineer who touches it, Go&#8217;s simplicity and the breadth of its ecosystem are real advantages. Ciulla makes the same point more generally when talking about technology choices under deadline pressure. &#8220;When you need something simple, and you&#8217;re familiar already with Java or JavaScript, why don&#8217;t you use it?&#8221; The same principle applies to Go for teams already operating in that ecosystem.</p><p>That matters because Rust adoption is not free. It requires a different mental model, a compiler that forces decisions earlier, and at least one person on the team who knows the language well enough to validate what is being shipped. For a service that does not need Rust&#8217;s performance profile, those costs may not be worth paying.</p><div class="callout-block" data-callout="true"><p>Join <strong>Francesco Ciulla</strong> to learn how to build production-ready AI applications with Rust, Claude and Codex. <em><a href="https://www.eventbrite.co.uk/e/build-production-ready-ai-applications-with-rust-claude-and-codex-tickets-1987053747248?aff=deepeng">Register here</a></em></p></div><h3>Rust wins on performance and it is not a close contest</h3><p>Where Ciulla becomes more direct is performance. On raw performance, he does not see much ambiguity. &#8220;Check the benchmarks yourself and send me the link where Go beats Rust,&#8221; he says. &#8220;Sometimes they are at the same level. In terms of pure performance, there is no story.&#8221;</p><p>That bluntness is useful, but the more important argument in his interview is not about benchmark wins. It is about latency predictability. Languages that rely on garbage collection, including Go, Java, and Node.js, can introduce pauses when the collector runs. An HTTP request that arrives during one of those pauses may experience higher latency than one that does not, even though the service logic is identical.</p><p>&#8220;By not having a garbage collector on the backend side, you basically have flat latency,&#8221; Ciulla explains. &#8220;You don&#8217;t rely on luck, or on the user not being the unlucky one. It&#8217;s a problem that is removed.&#8221;</p><p>For most web applications running at moderate scale, that distinction may not matter enough to justify a language change. Ciulla&#8217;s point is not that every API should be rewritten in Rust. His argument is that services with strict latency requirements, high concurrency, or service-level objectives tied to consistent tail latency should be evaluated differently from ordinary backend services. In those cases, the lack of a garbage collector is not an aesthetic language feature. It changes the runtime behavior the team has to reason about.</p><p>The resource efficiency argument is equally concrete. Ciulla describes running a Rust web server in production and observing roughly four megabytes of RAM in development and five megabytes in production. On a one-gigabyte droplet, that means many small Rust services can sit idle at once without creating the same memory pressure a heavier runtime might introduce. That is not a benchmark designed to win an online argument. It is an operational fact that changes what an infrastructure team has to provision, monitor, and pay for.</p><p>That is where Rust&#8217;s case becomes strongest. Not when the team wants a language that is fashionable, and not when someone wants to win the Rust versus Go debate, but when a specific service is expensive, latency-sensitive, memory-constrained, or sitting on a path where runtime predictability matters.</p><h3>Deployment changes the operational argument</h3><p>One of the more practical points Ciulla makes is that Rust changes the shape of the deployment artifact. When you run cargo build on a Rust project, you get an architecture-specific executable binary. A Windows machine produces a Windows executable. A Mac produces a Mac executable. A Linux machine produces a Linux executable. You can also cross-compile by changing the target architecture through the compiler, which lets a team produce a Linux binary from another environment when the workflow requires it.</p><p>Ciulla&#8217;s preferred production workflow is to build the Rust binary directly inside the Docker image build process. &#8220;My flow is that I prefer to build the Rust binary directly when I build the Docker image,&#8221; he explains, &#8220;so I have something which is just deployable everywhere, a Linux executable running in a Docker container.&#8221;</p><p>The appeal is straightforward. The team gets a lightweight binary compiled for the right architecture, packaged inside a portable container. &#8220;The dream for operations is having an executable inside a Docker container,&#8221; he says. &#8220;You get something which is lightweight and can run everywhere Docker is installed.&#8221;</p><p>That matters for teams already containerizing services, which is most teams building at meaningful production scale. A Rust binary inside a container keeps the deployment artifact small while preserving the operational consistency teams expect from Docker. The container still matters because real systems rarely deploy one service by hand. They orchestrate many services, restart them, replace them, and scale them across environments. As Ciulla puts it, &#8220;We are not in the 90s anymore.&#8221;</p><p>The argument is not that Rust removes the need for containers. It is that Rust and containers fit together cleanly. Rust gives the team a compact executable artifact. Docker gives the team a repeatable deployment boundary. Together, they reduce some of the runtime and packaging overhead that teams accept as normal in other ecosystems.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://deepengineering.net/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 Packt Deep Engineering! Subscribe for free to receive new posts and support our 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><h3>Rust is ready for more production backends</h3><p>The most interesting part of Ciulla&#8217;s position is that it has changed. Two years ago, he would not have committed to building a paid SaaS product with a Rust backend. A year ago, he was still hedging. In 2026, he removes the qualification entirely. &#8220;If I had a paid product, I would use Rust,&#8221; he says. &#8220;Let&#8217;s remove the probably.&#8221;</p><p>That shift is not based on general enthusiasm for the language. Ciulla describes himself as skeptical by default, and his advice throughout the interview is to try technologies directly rather than rely on what advocates or critics say online. His confidence comes from the maturity he now sees in the Rust backend ecosystem, especially around Axum, which he says he would now use in production if he were building a SaaS or paid product.</p><p>The surrounding toolchain also strengthens the case. Cargo handles dependency management, building, testing, and documentation in a single integrated workflow. There is no equivalent of the npm versus yarn versus pnpm decision that JavaScript teams often navigate before they even get to the application itself. Running tests is cargo test. The integration is not a small ergonomic convenience. For teams that have spent years carrying build-system complexity, dependency churn, and fragmented tooling across projects, a coherent toolchain reduces the amount of process overhead attached to the language.</p><p>Ciulla sees that as part of why Rust&#8217;s reputation can lag behind its current reality. The language still has a learning curve, especially around ownership, lifetimes, and the borrow checker, but the ecosystem around the language has become more integrated rather than more fragmented. For experienced developers willing to learn Rust on its own terms, that changes the adoption equation.</p><h3>Start the decision with the service</h3><p>Ciulla&#8217;s adoption advice was consistent across our interview. Do not rewrite everything in Rust. Do not introduce it because the internet says it is the future. Do not make the language the strategy. Start with one service.</p><p>The right starting point, in his view, is a critical service with a real performance, latency, or memory problem. It might be a login service. It might be an API under heavy load. It might be a component that slows the rest of the system down. The point is to choose the service where Rust&#8217;s advantages are tied to an actual constraint rather than a general preference.</p><p>That is also where organizational readiness becomes unavoidable. If a team has no one who understands Rust well enough to review AI-generated code or validate a production deployment, the language can become a liability. &#8220;Who decides if the AI-generated Rust service is okay to put in production?&#8221; Ciulla asks. &#8220;You need the validation of an expert.&#8221;</p><p>That expert does not make Rust special. It makes Rust normal. Every new technology needs someone inside the organization who can tell the difference between code that compiles and code that should be shipped. Without that person, the team is not adopting a better tool. It is creating a new category of production risk.</p><p>For teams that do have the right service and the right internal expertise, Ciulla thinks the timing has changed. Rust is no longer only a systems language that backend teams admire from a distance. It is becoming a practical choice for the services where its properties matter most. The mistake is treating that as a universal recommendation. The opportunity is knowing exactly where it applies.</p><p>The Rust versus Go decision, then, is not really a Rust versus Go decision at all. It is a question about constraints. If the service needs simplicity, staffing depth, cloud tooling familiarity, and quick delivery, Go may be the better engineering choice. If the service needs predictable latency, low memory overhead, strong runtime control, and a deployment artifact that maps cleanly to containers, Rust deserves serious consideration. The senior engineering move is not to pick a side. It is to know which job each language is being asked to do.</p><div class="pullquote"><p><strong><a href="https://www.packtpub.com/en-in/product/the-rust-programming-handbook-9781836208860">Go deeper with Francesco Ciulla&#8217;s book</a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.packtpub.com/en-in/product/the-rust-programming-handbook-9781836208860" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DDAG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9c404-fa21-4711-886a-4f5269f7201e_2250x2775 424w, https://substackcdn.com/image/fetch/$s_!DDAG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9c404-fa21-4711-886a-4f5269f7201e_2250x2775 848w, https://substackcdn.com/image/fetch/$s_!DDAG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9c404-fa21-4711-886a-4f5269f7201e_2250x2775 1272w, https://substackcdn.com/image/fetch/$s_!DDAG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9c404-fa21-4711-886a-4f5269f7201e_2250x2775 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DDAG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9c404-fa21-4711-886a-4f5269f7201e_2250x2775" width="338" height="416.92857142857144" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bbe9c404-fa21-4711-886a-4f5269f7201e_2250x2775&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1796,&quot;width&quot;:1456,&quot;resizeWidth&quot;:338,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The Rust Programming Handbook&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.packtpub.com/en-in/product/the-rust-programming-handbook-9781836208860&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The Rust Programming Handbook" title="The Rust Programming Handbook" srcset="https://substackcdn.com/image/fetch/$s_!DDAG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9c404-fa21-4711-886a-4f5269f7201e_2250x2775 424w, https://substackcdn.com/image/fetch/$s_!DDAG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9c404-fa21-4711-886a-4f5269f7201e_2250x2775 848w, https://substackcdn.com/image/fetch/$s_!DDAG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9c404-fa21-4711-886a-4f5269f7201e_2250x2775 1272w, https://substackcdn.com/image/fetch/$s_!DDAG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9c404-fa21-4711-886a-4f5269f7201e_2250x2775 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><strong><a href="https://www.packtpub.com/en-in/product/the-rust-programming-handbook-9781836208860">The Rust Programming Handbook: An End-to-End Guide to Mastering Rust Fundamentals</a>,</strong> a practical guide to Rust&#8217;s ownership model, memory safety guarantees, concurrency patterns, trait system, and real-world use in systems and web programming.</p><p><strong><a href="https://www.packtpub.com/en-in/product/the-rust-programming-handbook-9781836208860">Explore the book here</a></strong></p></div><h3>In case you missed </h3><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;288199d3-4b2b-4952-b759-26a682e891e8&quot;,&quot;caption&quot;:&quot;View the latest HubSpot Developer Platform updates in Spring Spotlight&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Deep Engineering #45: Francesco Ciulla on Building Production Systems in Rust Without the Expensive Rewrite &quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:427210082,&quot;name&quot;:&quot;Saqib Jan&quot;,&quot;bio&quot;:&quot;/localhost&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997a788a-cd78-4f84-9b3b-c72ab6dc0153_1008x1008.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null},{&quot;id&quot;:11407185,&quot;name&quot;:&quot;Francesco Ciulla&quot;,&quot;bio&quot;:&quot;Developer Advocate at @dailydotdev\n&#183; Docker Captain &#128051;\n&#183; Public Speaker\n&#183; Building a 1 Million Community 22%&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b8c30606-10ba-4c87-a89b-af2f9dc27a01_400x400.jpeg&quot;,&quot;is_guest&quot;:true,&quot;bestseller_tier&quot;:null,&quot;primaryPublicationSubscribeUrl&quot;:&quot;https://francescociulla.substack.com/subscribe?&quot;,&quot;primaryPublicationUrl&quot;:&quot;https://francescociulla.substack.com&quot;,&quot;primaryPublicationName&quot;:&quot;Francesco's Newsletter&quot;,&quot;primaryPublicationId&quot;:1410908}],&quot;post_date&quot;:&quot;2026-04-30T16:32:00.000Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e29b888-c64d-4029-96f3-08e45522d077_656x375.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://deepengineering.substack.com/p/issue-45-francesco-ciulla-building-production-systems-rust-without-rewrite&quot;,&quot;section_name&quot;:&quot;Newsletter Issues&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:195995087,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:2,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1729053,&quot;publication_name&quot;:&quot;Packt Deep Engineering&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!H5BJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F736bc1ee-d689-497e-83a8-7d9bf9022eb9_600x600.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;10888e2c-73cc-4040-85d1-da5241e78d9f&quot;,&quot;caption&quot;:&quot;Francesco joined Deep Engineering Live to talk about Rust adoption strategy, organizational challenges, concurrency, deployment workflows, and where the language is headed in 2026.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Try Rust With Your Own Hands and Eyes with Francesco Ciulla&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:427210082,&quot;name&quot;:&quot;Saqib Jan&quot;,&quot;bio&quot;:&quot;/localhost&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997a788a-cd78-4f84-9b3b-c72ab6dc0153_1008x1008.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null},{&quot;id&quot;:11407185,&quot;name&quot;:&quot;Francesco Ciulla&quot;,&quot;bio&quot;:&quot;Developer Advocate at @dailydotdev\n&#183; Docker Captain &#128051;\n&#183; Public Speaker\n&#183; Building a 1 Million Community 22%&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b8c30606-10ba-4c87-a89b-af2f9dc27a01_400x400.jpeg&quot;,&quot;is_guest&quot;:true,&quot;bestseller_tier&quot;:null,&quot;primaryPublicationSubscribeUrl&quot;:&quot;https://francescociulla.substack.com/subscribe?&quot;,&quot;primaryPublicationUrl&quot;:&quot;https://francescociulla.substack.com&quot;,&quot;primaryPublicationName&quot;:&quot;Francesco's Newsletter&quot;,&quot;primaryPublicationId&quot;:1410908}],&quot;post_date&quot;:&quot;2026-06-11T10:33:12.044Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7c13c92-97ba-4fd9-949b-7a3eed180812_1920x1080.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://deepengineering.substack.com/p/try-rust-with-your-own-hands-and-eyes-francesco-ciulla&quot;,&quot;section_name&quot;:&quot;Interviews&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:201573753,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1729053,&quot;publication_name&quot;:&quot;Packt Deep Engineering&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!H5BJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F736bc1ee-d689-497e-83a8-7d9bf9022eb9_600x600.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><h2>&#128736;&#65039; Tool of the Week</h2><p><strong><a href="https://github.com/nextest-rs/nextest">cargo-nextest</a></strong> &#8212; a next-generation test runner for Rust that replaces cargo test with faster, more reliable test execution for production Rust projects.</p><p><strong>Highlights</strong></p><ul><li><p>Runs each test in its own process, surfacing hidden state sharing and enabling better parallelism than cargo test&#8217;s single-process model.</p></li><li><p>Retries flaky tests automatically, reducing noise in CI pipelines without manual intervention.</p></li><li><p>Outputs machine-readable JUnit XML, compatible with most CI systems out of the box.</p></li><li><p>Version 0.9.137 added a JSON schema for user configuration, standardizing nextest settings across a workspace.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/nextest-rs/nextest&quot;,&quot;text&quot;:&quot;Learn more about cargo-nextest&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/nextest-rs/nextest"><span>Learn more about cargo-nextest</span></a></p><div><hr></div><h1><strong>&#128206; Tech Briefs</strong></h1><ul><li><p><a href="https://docs.docker.com/desktop/release-notes/">Docker Desktop 4.77.0 released</a> - Marketplace extensions now install by pinned manifest digest, reducing tag-mutation risk after publication.</p></li><li><p><a href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/">Rust 1.96.0 released</a> - New Copy-compatible range types, assert_matches! macro stabilization, and two Cargo security fixes for third-party registry users.</p></li><li><p><a href="https://go.dev/doc/devel/release#go1.26.4">Go 1.26.4 released</a> - Security fixes ship for crypto/x509, mime, and net/textproto alongside compiler and runtime bug fixes.</p></li><li><p><a href="https://docs.docker.com/desktop/release-notes/">Docker Desktop security update</a> - Two container-to-host code execution CVEs in the Model Runner inference backend patched, with a Linux kernel backport fixing a container privilege escalation.</p></li><li><p><a href="https://github.com/rust-lang/rust-analyzer/releases">rust-analyzer update</a> - New diagnostics, predicate evaluation, and completion fixes improve daily Rust IDE feedback loops.</p></li></ul><div><hr></div><p>That&#8217;s all for today. Thank you for reading this issue of Deep Engineering.</p><p>We&#8217;ll be back next week with more expert-led content.</p><p>Keep building,</p><p>Saqib Jan</p><p>Editor-in-Chief, Deep Engineering</p><div><hr></div><p><em>If your company wants to reach senior developers, software engineers, and technical decision-makers, <a href="https://packt.omeclk.com/portal/wts/uc%5EcnN2dfNaqmD-kB-mo66%7C7g%5Ef%7Cb">speak to us about partnering</a> with Deep Engineering.</em></p>]]></content:encoded></item><item><title><![CDATA[Try Rust With Your Own Hands and Eyes with Francesco Ciulla]]></title><description><![CDATA[On adoption strategy, flat latency, and the year he stopped hedging on Rust for production]]></description><link>https://deepengineering.net/p/try-rust-with-your-own-hands-and-eyes-francesco-ciulla</link><guid isPermaLink="false">https://deepengineering.net/p/try-rust-with-your-own-hands-and-eyes-francesco-ciulla</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Thu, 11 Jun 2026 10:33:12 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b7c13c92-97ba-4fd9-949b-7a3eed180812_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://it.linkedin.com/in/francesco-ciulla-roma/en">Francesco Ciulla</a> has been building with Rust since 2022, working across web development, developer tooling, and content creation for a large technical audience online. He is a Docker Captain since 2021, a former full-stack developer at the European Space Agency on the Copernicus project, and currently head of developer relations at Zerops. </p><p>He is the author of <em><a href="https://www.packtpub.com/en-in/product/the-rust-programming-handbook-9781836208860">The Rust Programming Handbook</a></em>, published by Packt in December 2025. Francesco joined Deep Engineering Live to talk about Rust adoption strategy, organizational challenges, concurrency, deployment workflows, and where the language is headed in 2026.</p><p>You can <strong>read</strong> or <strong>watch</strong> the full conversation here:</p><div id="youtube2-KTKe3_dx9_8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;KTKe3_dx9_8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/KTKe3_dx9_8?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><em>This session was recorded live as part of the Deep Engineering Live Interview Series. The transcript below has been lightly edited for clarity and readability. Audience members joined the conversation and asked questions directly during the session.</em></p><div><hr></div><p><em><strong>Q. What does Rust adoption actually look like at the organizational level, and what does success look like for engineering teams introducing it?</strong></em></p><p><strong>Francesco Ciulla:</strong> Rust has been growing a lot in the past few years and I am glad I started learning it a bit earlier than most people. I started creating content in 2022 and 2023 and then began working on the Rust Programming Handbook around April 2023, which took about two years to publish.</p><p>On adoption at scale, there is the famous meme about rewriting everything in Rust, and like every good meme there is a bit of truth in it. But I think the best approach, from a practical perspective, is not to rewrite everything in Rust at the beginning. The best way to introduce Rust in a big project is to find the hard part that is slowing things down, the bottleneck of your services, and try to write one single service in Rust. That is the best way to approach it. And then you will probably see Rust slowly take over more of your codebase, but I mean that in a good sense.</p><div><hr></div><p><em><strong>Q. Amazon and other large organizations have noted the high cost and risk of adopting Rust without internal expertise, and the talent pool is also quite thin. What advice do you give engineering leaders planning to introduce Rust and acquire the right people?</strong></em></p><p><strong>Francesco Ciulla:</strong> As with every new technology, the problem is not the technology itself. It is how well the technology is understood by the people in the organization. I remember when I was working at the European Space Agency and Docker adoption was slow, not because of anything wrong with Docker, but because a new technology that is not well known internally creates friction. That is the bottleneck.</p><p>The best approach is to have a shepherd, someone who can bring real knowledge into the organization. Basically a senior Rust developer who already knows all the flows and who people can refer to when they get stuck. This is especially true in the AI era where everyone is writing code with AI assistance, but you still need validation. Who decides whether the AI-generated Rust service is safe to put in production? You need the validation of an expert. That said, this is not just a Rust rule. It is the golden rule of adopting any new technology.</p><div><hr></div><p><em><strong>Q. The Rust learning curve has a reputation for being steep. The borrow checker in particular causes a period of deep soul searching for newcomers. What is the best way for an experienced developer to learn to think in Rust, especially in an AI-accelerated world?</strong></em></p><p><strong>Francesco Ciulla:</strong> I actually gave a talk at Rust Nation UK recently with the deliberately provocative title Rust Is Hard to Learn, so feel free to fight me on this. Because I think the idea that Rust has a steep learning curve is more of a myth than a reality, and I believe it can be addressed quite quickly.</p><p>The biggest challenge is not the concepts themselves but the mindset. Rust has a unique way of handling memory, and even if you are a senior developer with 20 years of experience, if you try to learn Rust by comparing it directly to other programming languages, you will struggle. The more experience you have, the more you think you already know how things work. Fighting the borrow checker, understanding lifetimes and ownership, can feel overwhelming if you bring that baggage with you. But if you are open-minded and approach it as something genuinely new rather than as a variation on what you already know, you will get the full power of the language and understand why so many people are enthusiastic about it.</p><p>Rust has been voted the most loved programming language year after year, and loved means the people who have used it still want to use it. That is a meaningful metric. I would rather trust the judgment of people who have actually worked with Rust than form an opinion based on what someone said on Twitter. When I am an engineer, I prefer to try things with my own hands and my own eyes.</p><div><hr></div><p><em><strong>Q. When is Rust not the right choice for a team, despite all its advantages?</strong></em></p><p><strong>Francesco Ciulla:</strong> I should probably say never, because I am supposed to be biased for Rust. But I prefer to be honest. There are genuinely cases where Rust is not the ideal tool.</p><p>First, when you need something simple and it needs to be done immediately. If you are a junior developer who needs to deliver a working API today and you do not know Rust, this is not the moment to start learning it under deadline pressure. You can always refactor something later. When you need something that just works, go with the technology you already know well.</p><p>Second, the ecosystem argument is real. Python has better libraries for data science. JavaScript has a larger package ecosystem for certain kinds of web work. Rust integrates well with other languages, but if you need something that is native to another ecosystem, that is a real constraint rather than just a preference. Good engineers use the right tool for the problem, and the case for Rust is strongest when the problem involves performance, memory efficiency, or concurrency at a level where other languages start showing their limits.</p><div><hr></div><p><em><strong>Q. Google&#8217;s Android security team reported that memory safety vulnerabilities fell below 20 percent after prioritizing memory-safe languages. Are those kinds of productivity and code quality benefits common in practice when teams use Rust?</strong></em></p><p><strong>Francesco Ciulla:</strong> Yes they are, but I think productivity in Rust is not primarily about typing speed. Rust can feel verbose and you might write more slowly in some ways than in other languages. The biggest benefit is the lack of debugging depth. You spend more time thinking carefully upfront, but you spend almost zero time chasing segfaults or memory leaks in production. And we always underestimate that part.</p><p>We talk a lot about how efficiently we can write code, but if you need less time to debug your code you are effectively writing more logic per unit of time. That is the part people consistently underestimate. We only tend to count the time it takes to write the thing, not the time it takes to find and fix what breaks later.</p><p>I also think Rust is one of the best programming languages for working with AI-generated code specifically because of what it requires from you as the reviewer. After the AI generates code you still need to touch it, understand it, and validate it. Otherwise there is no difference from copying boilerplate off Stack Overflow. You still have to understand what the code does. If you have no control, either you are useless or you cause a problem. In both cases, that is not a good place to be.</p><div><hr></div><p><em><strong>Q. What makes Rust&#8217;s approach to concurrency different, and how does it actually help teams building multi-threaded systems?</strong></em></p><p><strong>Francesco Ciulla:</strong> The first time I learned concurrency was at university in Java, and it was treated as the final, advanced session of the course, something dangerous that required extra care and specialized knowledge. I think many engineers carry that experience as a kind of trauma around concurrency.</p><p>When I went to teach concurrency in Rust for a YouTube video, I expected it to be challenging. I started the example and in two minutes I was done. I had the opposite problem. It was too easy.</p><p>This is structural rather than accidental. Rust was created when multi-core processors were already standard. Concurrency was not retrofitted onto a model designed for single-threaded execution. It was built in from the start. And the ownership system that prevents data races at compile time is the same ownership system that governs memory safety everywhere else in the language. There is no separate concurrency model to learn. The properties that make Rust memory safe are the same properties that make concurrent code safe.</p><p>That said, I personally prefer to add concurrency once an application is already working and you want to use memory more efficiently. If doing that takes a day of extra effort and it reduces your server costs from a hundred dollars a month to twenty, it was worth it. If it takes three weeks of fighting with the runtime, you would probably rather just spend more on the server. We are talking about production-grade applications here, not weekend side projects.</p><div><hr></div><p><em><strong>Q. How does Rust&#8217;s concurrency model hold up when you are building low-level networking components like proxies, packet processors, or kernel modules, territory that has traditionally belonged to C?</strong></em></p><p><strong>Francesco Ciulla:</strong> There are more repositories in C for that kind of work, and that is just a historical fact. But I am already seeing people build protocols and low-level networking components in Rust, and I think with AI assistance this is becoming more practical and more doable than it was even a year ago.</p><p>Just the fact that we are seriously considering writing these things in Rust is a win for the language. Nobody ever suggested doing this kind of work in JavaScript, because at that level you need pure efficiency and developer experience is not on the table. Only languages with the right performance profile can even enter this conversation. And Rust&#8217;s readability is a genuine advantage in that domain specifically. Low-level code becomes very complex very fast, and the fact that you can read your own code tomorrow is a significant practical benefit when you are dealing with networking protocols. I am not saying Rust will replace C or C++. Languages rarely disappear. But we now have an option, and having that option is already a meaningful shift.</p><div><hr></div><p><em><strong>Q. What are the most common pitfalls you see developers run into with Rust?</strong></em></p><p><strong>Francesco Ciulla:</strong> I wrote an eighteen-page chapter on pitfalls in the book, so I can probably remember about half of them now. The biggest one is trying to write Rust as though it were another language. If you approach it with the patterns and assumptions you bring from other languages, you will have problems. The second is not trusting the compiler. Especially at the beginning, the instinct is to try to fix things your own way without reading what the compiler is actually telling you. The compiler is giving you very specific information and the errors are basically tutorials. They are helping you write better code. Learning to read them carefully rather than working around them is probably the single most important habit to develop early.</p><div><hr></div><p><em><strong>Q. Rust&#8217;s trait system and rich type semantics let developers encode invariants directly in the type system, but this power can also lead to very complex code. How should an experienced architect balance using the advanced type system versus keeping things simple?</strong></em></p><p><strong>Francesco Ciulla:</strong> If you want to build rockets, you need to use more complex tools. That is just the nature of it. I think the best approach is to build a solid foundation in the basics first. You should not be using traits without understanding what they are. In terms of code organization, Rust is the best language I have worked in for how it structures modules, files, and folders. At some point you will stop writing everything in a single file, and having a clear module structure helps you manage complexity as it grows.</p><p>You can also write straightforward Rust code up to a certain point. If you want to unlock the full potential, including unsafe Rust and raw performance, Rust allows you to remove the seat belts. But of course the code becomes more complex at that level. This is not unique to Rust though. The complexity of any project is always exponential. It starts simple, simple, simple, and then suddenly nobody knows what is going on anymore. Having solid fundamentals gives you the tools to manage that curve.</p><div><hr></div><p><em><strong>Q. Rust versus Go for microservices is a question many backend teams face right now. Is Rust ready to challenge Go in the web backend space?</strong></em></p><p><strong>Francesco Ciulla:</strong> Let me be clear first that Go is not a bad language. Docker is written in Go and I would never say that makes Go bad. I have a Docker bottle on my desk and I have been a Docker Captain since 2021. I also currently work at Zerops where we have a CLI written in Go and I read a lot of Go code myself. So I am not dismissing it.</p><p>On pure performance, the comparison between Rust and Go is not really a contest. Check the benchmarks yourself and send me the link where Go beats Rust. Sometimes they are at the same level. In terms of pure performance there is no story.</p><p>Where Go genuinely wins is on CLIs, cloud tooling, and developer ecosystem. Docker is written in Go, Kubernetes is built on Go. If you want to be in the DevOps space and write tools in that ecosystem, Go is the natural choice. It also has more engineers available in the job market right now, which matters if you are hiring.</p><p>From a developer perspective though, I would argue the opposite is worth considering. If there are fewer Rust engineers than Go engineers, being expert in Rust means less competition. I would rather be expert in a language where there is less competition than be one of millions of Go developers. But I understand that a company hiring today will probably find a good Go developer faster than a good Rust developer. Both arguments are valid depending on which side of that conversation you are sitting on.</p><div><hr></div><p><em><strong>Q. How does Rust affect build and deployment workflows in practice?</strong></em></p><p><strong>Francesco Ciulla:</strong> This is one of my favorite questions because it combines two of my favorite things. When you build a Rust application, you get architecture-specific executable binaries. If you run cargo build on your machine, you get an exe on Windows, an executable on Mac, and an executable on Linux. You can also cross-compile, changing the target architecture through the compiler, to produce a Linux binary on a Windows machine.</p><p>My preferred workflow for production is to build the Rust binary directly when building the Docker image. That way I have a Linux executable compiled inside the container, ready to run everywhere Docker is installed. The dream for operations teams is having a single lightweight binary inside a Docker container. You get the portability and scalability of containers with the minimal footprint of a Rust binary.</p><div><hr></div><p><em><strong>Q. Are there real operational benefits to shipping Rust services as smaller container images with lower runtime overhead?</strong></em></p><p><strong>Francesco Ciulla:</strong> Absolutely. The binary is the dream for operations teams because it is the most lightweight option. I mentioned earlier that my Rust web server uses four megabytes of RAM in development and five in production. On a one-gigabyte droplet you could theoretically run more than 200 such services in idle. That kind of resource profile changes what is economically viable to deploy.</p><p>You could in theory run the Rust executable directly without Docker, and for a single service that works fine. But if you need to orchestrate ten services on the same machine, containers are still the right answer for production-grade applications that need to scale. The slight overhead Docker adds is worth it many times over in terms of scalability, replaceability, and operational consistency. We are not in the 90s anymore.</p><div><hr></div><p><strong>Q. What use cases in web development do you see Rust excelling at?</strong></p><p><strong>Francesco Ciulla:</strong> When performance is really important, Rust is where it shines. If performance is not your main concern, you can go with more conventional choices. I am still a fan of Node.js for certain kinds of work.</p><p>One of the most underappreciated arguments for Rust in web services is flat latency. Languages with garbage collectors, including Go, Java, and Node.js, introduce periodic pauses when the collector runs. Those pauses can last hundreds of milliseconds. An HTTP request that arrives during a GC cycle gets a worse experience than one that does not. By not having a garbage collector on the backend side, you have flat latency. You do not rely on luck or on the user not being the unlucky one. That problem is simply removed.</p><p>The other scenario where Rust makes a clear case is when you have one service in your system that is significantly slower than everything else. There is always one in any sufficiently complex system. Sometimes it is not the service itself but the upstream dependencies it is calling. But when the service itself is the bottleneck, spending time to optimize it in Rust makes sense. Writing the whole application in Rust from scratch is only necessary if you are starting a new project or you genuinely want to have fun with the language. For most teams, the bottleneck service is where to start.</p><div><hr></div><p><em><strong>Q. What are the main challenges when integrating Rust into CI/CD pipelines and monitoring?</strong></em></p><p><strong>Francesco Ciulla:</strong> The honest answer is that since Rust has been in production for less time than other languages, there are fewer examples in the documentation for some specific integrations. This gap is closing quickly and will probably disappear in a couple of years, but if you are using a specific technology and looking for a Rust integration example, you may occasionally find the documentation lacking compared to what exists for JavaScript or Python.</p><p>The Rust toolchain itself is actually one of the language&#8217;s strongest points once you get used to it. Running tests is cargo test. It is integrated natively into the language and there is no equivalent of the npm versus yarn versus pnpm decision that JavaScript teams have to navigate before writing a single line of code. The ecosystem and toolchain are famous within the Rust community for being one of the things people love most about working in the language.</p><div><hr></div><p><em><strong>Q. The Linux kernel maintainers have declared Rust permanent and are planning components that require it. What does that endorsement signal about where Rust is headed?</strong></em></p><p><strong>Francesco Ciulla:</strong> It is great news and very bad news for Rust skeptics. The fact is that Rust is slowly getting adopted at bigger and bigger levels. You can see this on the government side, in military applications, and in security-critical domains where safety requirements are the highest. Just the fact that Rust was considered a viable option for kernel-level work was already a meaningful milestone, even before it succeeded. The language was competing in a domain that had been exclusively C and C++ territory for decades and it earned a permanent place there.</p><p>I will be genuinely happy when we stop having the conversation about whether Rust should be used, and we just start using it. Python does not get these conversations. Nobody asks whether you should use Python. I will be happy when Rust reaches that level of acceptance as a normal production choice. We are moving in that direction. Every day I see another positive signal.</p><div><hr></div><p><em><strong>Q. Where do you see the next phase of Rust growth happening?</strong></em></p><p><strong>Francesco Ciulla:</strong> I think the biggest shift is coming in web development backends, and I know this is an unpopular opinion in the Rust community where the language is traditionally associated with systems programming. But I am seeing companies with hundreds of developers reach out to tell me they are rewriting their backend services in Rust. These are not random side projects. These are companies making deliberate production decisions.</p><p>Two years ago I would not have committed to building a paid SaaS product in Rust. In 2024, probably not. In 2025, maybe. In 2026, yes, I would use it. The Axum framework in particular has matured to the point where I am confident recommending it for production. That was not true a year ago.</p><p>In the embedded space, Rust is already winning and I have largely stopped advocating for it there because the argument is settled. I am also seeing companies that manufacture embedded devices ship them with Rust as the default, which is a different story from developers experimenting with Rust on embedded hardware. When the producers of these devices choose Rust before selling them, that is a commercial signal.</p><div><hr></div><p><strong>A member of the audience asked: </strong>With the state of the industry right now, is it challenging for a junior developer to start their journey with Rust and find their first job?</p><p><strong>Francesco Ciulla:</strong> With the state of the industry right now, I think it is challenging for a junior developer to find a job regardless of which language they know. So let us remove Rust from that equation first.</p><p>You have two approaches here. One is to go as mainstream as possible, learn the most used framework, and compete for the highest volume of jobs. The problem with that approach is that you are also competing with the largest number of other candidates. I personally prefer the opposite approach. Since there are fewer Rust engineers than engineers in most other languages, being expert in Rust gives you a real differentiator.</p><p>If a job description lists JavaScript, React, SQL, Docker, Kubernetes, and then also mentions Rust, and there are two candidates and one of them knows Rust, that extra knowledge might be the thing that gets you the role. That is my honest view. The era of becoming strong in exactly one technology and finding a job with that alone is probably over. We need to be flexible. But dedicating some time to understanding the basics of Rust might make you shine in an interview in a way that knowing only mainstream technologies will not.</p><div><hr></div><p><em>Francesco Ciulla is the author of The Rust Programming Handbook, published by Packt, and head of developer relations at Zerops.</em></p>]]></content:encoded></item><item><title><![CDATA[Deep Engineering #50: Brian Allbee on Building Better Python Software]]></title><description><![CDATA[Brian Allbee on why most Python developers are optimising for correctness when they should be optimising for sustainability, and what that shift actually looks like in practice.]]></description><link>https://deepengineering.net/p/issue50-building-better-python-software-brian-allbee</link><guid isPermaLink="false">https://deepengineering.net/p/issue50-building-better-python-software-brian-allbee</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Thu, 04 Jun 2026 15:11:15 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c2a26cd4-2f69-448c-b36a-d4cbb68058ad_690x310.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong><a href="https://www.eventbrite.co.uk/e/claude-code-for-software-engineering-from-prompts-to-systems-tickets-1988571262176?aff=deepeng">Claude Code for Software Engineering</a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.eventbrite.co.uk/e/claude-code-for-software-engineering-from-prompts-to-systems-tickets-1988571262176?aff=deepeng" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5k27!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 424w, https://substackcdn.com/image/fetch/$s_!5k27!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 848w, https://substackcdn.com/image/fetch/$s_!5k27!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 1272w, https://substackcdn.com/image/fetch/$s_!5k27!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5k27!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png" width="900" height="300" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:300,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.eventbrite.co.uk/e/claude-code-for-software-engineering-from-prompts-to-systems-tickets-1988571262176?aff=deepeng&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!5k27!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 424w, https://substackcdn.com/image/fetch/$s_!5k27!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 848w, https://substackcdn.com/image/fetch/$s_!5k27!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 1272w, https://substackcdn.com/image/fetch/$s_!5k27!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.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>Join this interactive workshop to learn how to turn Claude Code from a session-by-session assistant into a repeatable engineering system, using structured context, reusable skills, scoped rules, hooks, and guardrails that work across real codebases and team workflows.</p><p>&#128467;&#65039; Friday, June 20 &#183; 10:30 AM EDT onwards</p><p style="text-align: center;"> Use code <strong>DEEPENG50</strong> for 50% off.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.eventbrite.co.uk/e/claude-code-for-software-engineering-from-prompts-to-systems-tickets-1988571262176?aff=deepeng&quot;,&quot;text&quot;:&quot;Register here&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.eventbrite.co.uk/e/claude-code-for-software-engineering-from-prompts-to-systems-tickets-1988571262176?aff=deepeng"><span>Register here</span></a></p><div><hr></div><p><strong>&#9997;&#65039; From the editor&#8217;s desk,</strong></p><p>Welcome to the <strong>50th</strong> issue of Deep Engineering!</p><p><a href="https://www.anthropic.com/news/expanding-project-glasswing">Anthropic expanded Project Glasswing on June 2</a>, extending Claude Mythos Preview to approximately 150 new organizations for codebase vulnerability scanning, after initial partners found more than 10,000 high-severity security flaws in production code. </p><p>AI can now find vulnerabilities in production systems that were presumably tested, reviewed, and shipped by engineering teams. The gap between code that compiles and code that holds up under real-world pressure is no longer theoretical.</p><p>That gap also has a cause. <a href="https://www.linkedin.com/in/brianallbee">Brian Allbee</a>, Staff Software Engineer at Cleerly and author of <a href="https://www.packtpub.com/en-us/product/hands-on-software-engineering-with-python-9781835888018">Hands-On Software Engineering with Python</a> (Packt), argues that programming focuses on the correctness of the code itself, while software engineering expands that focus to sustainability as change occurs. Too many developers optimize for code that works today, without enough attention to whether that code can be changed, tested, maintained, and handed off tomorrow.</p><blockquote><p>Allbee joined <a href="https://deepengineering.substack.com/p/hands-on-software-engineering-python-brian-allbee">Deep Engineering Live</a> to discuss what closing that gap looks like in practice. Today&#8217;s expert insights are based on that conversation, and you can read or watch the full <a href="https://deepengineering.substack.com/p/hands-on-software-engineering-python-brian-allbee">Q&amp;A here</a>.</p></blockquote><p>Let&#8217;s get started.</p><div><hr></div><p style="text-align: center;"><strong>Featured: <a href="http://daily.dev/">All the dev content that matters, in one personalized feed</a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="http://daily.dev/" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WB1m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb7b61d3-2791-4eb0-9529-449c16315ca3_1280x800.png 424w, https://substackcdn.com/image/fetch/$s_!WB1m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb7b61d3-2791-4eb0-9529-449c16315ca3_1280x800.png 848w, https://substackcdn.com/image/fetch/$s_!WB1m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb7b61d3-2791-4eb0-9529-449c16315ca3_1280x800.png 1272w, https://substackcdn.com/image/fetch/$s_!WB1m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb7b61d3-2791-4eb0-9529-449c16315ca3_1280x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WB1m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb7b61d3-2791-4eb0-9529-449c16315ca3_1280x800.png" width="466" height="291.25" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cb7b61d3-2791-4eb0-9529-449c16315ca3_1280x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1280,&quot;resizeWidth&quot;:466,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;http://daily.dev/&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!WB1m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb7b61d3-2791-4eb0-9529-449c16315ca3_1280x800.png 424w, https://substackcdn.com/image/fetch/$s_!WB1m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb7b61d3-2791-4eb0-9529-449c16315ca3_1280x800.png 848w, https://substackcdn.com/image/fetch/$s_!WB1m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb7b61d3-2791-4eb0-9529-449c16315ca3_1280x800.png 1272w, https://substackcdn.com/image/fetch/$s_!WB1m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb7b61d3-2791-4eb0-9529-449c16315ca3_1280x800.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="http://daily.dev/">daily.dev</a> is a professional network for developers, built around a personalized feed of the best content from across the dev ecosystem. Millions of developers use it to stay current with their stack, discover new tools and frameworks, and connect with a global community that shares what they&#8217;re learning. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;http://daily.dev/&quot;,&quot;text&quot;:&quot;Join for free at daily.dev&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="http://daily.dev/"><span>Join for free at daily.dev</span></a></p><div><hr></div><p>Expert Insights</p><h2>Building Better Python Software Is Not About Writing Better Code</h2><p><em>by <a href="https://in.linkedin.com/in/s-jan">Saqib Jan</a> with <a href="https://www.linkedin.com/in/brianallbee/">Brian Allbee</a></em></p><p>Most Python developers measure their work by whether the code runs, assuming the job is done once the function returns the right value, the tests pass, and the build is green. <a href="https://www.linkedin.com/in/brianallbee/">Brian Allbee</a>, Staff Software Engineer at Cleerly and author of <em><a href="https://www.packtpub.com/en-us/product/hands-on-software-engineering-with-python-9781835888018">Hands-On Software Engineering with Python</a></em> (Packt), thinks that measure is correct but incomplete, noting that the gap between correct code and sustainable software is where most Python developers stop growing without realizing it.</p><p>The distinction Allbee draws is precise. Programming, he explained in our live interview, is focused on &#8220;the correctness of the code itself,&#8221; whereas software engineering &#8220;starts expanding out into more of a focus on sustainability as change occurs.&#8221; That shift in focus sounds subtle, but it changes almost every decision an engineer makes, from how they structure a module and handle a growing codebase to how they talk about technical debt with the people who control the roadmap.</p><h2>The discipline that architecture cannot replace</h2><p>The instinct when a Python codebase starts to grow is to reach for architecture by breaking things into services, introducing abstractions, and redesigning the data model. Allbee&#8217;s experience points in a different direction. &#8220;I think most of the paths to success in that context, at least the ones that I can think of that I&#8217;ve seen, don&#8217;t really start with the architecture, but with discipline behind the process,&#8221; he shares.</p><p>The discipline he describes is specific and unglamorous, emphasizing the need to keep things as simple as possible while wrapping repeated processes into functions or methods, stressing &#8220;that teams should agree on documentation standards and stick to them until something unexpected comes up, and that developers must write code with testability in mind from the beginning, even when there is no immediate requirement for tests.&#8221; These practices do not require a new framework or a redesign because they rely on consistency, which is often much harder to achieve than architecture.</p><p>The reason discipline comes before architecture is that architecture without discipline produces complexity without clarity. Allbee, in <a href="https://deepengineering.substack.com/p/hands-on-software-engineering-python-brian-allbee">our interview</a>, shared a vivid example with the audience from his own experience regarding a system he encountered that had been written in Python by an engineer who came from a C# background, resulting in an architecture where every function and every class had its own isolated module. The functional layers of the system were seven or eight deep depending on the context, creating a project that was &#8220;ridiculously huge,&#8221; he recalls, and &#8220;way more complicated than it needed to be, and it was hard to manage... hard to maintain.&#8221;</p><p>The problem was not the language or incompetence, but rather a mental model built for a different environment being applied wholesale to Python. Allbee points to a concept from the book <em><a href="https://www.speakingsoftwareshow.com/episodes/code-that-fits-in-your-head-1">Code That Fits In Your Head</a></em><a href="https://www.speakingsoftwareshow.com/episodes/code-that-fits-in-your-head-1"> </a>to explain why this matters, because humans can only keep &#8220;five to seven bits of information in the front of their memory at a given point in time.&#8221; A system with seven layers of depth saturates that capacity before a developer has even started reasoning about what any individual layer does. </p><p>Allbee argues that developers must &#8220;keep it simple&#8221; and &#8220;collapse things down to the point where you don&#8217;t have to have 19 different classes and 15 different instances of, you know, all these other classes to deal with something that really should be capable of being managed as a single function.&#8221;</p><h2>Technical debt is a product decision, not a technical one</h2><p>One of the more practically useful things Allbee explains about managing an evolving Python system is that technical debt is not primarily a technical problem. &#8220;Technical debt is one of those product-level priorities,&#8221; he reasons, adding that &#8220;whoever&#8217;s making the prioritization decisions is going to be in control of when those get tackled, if they get tackled.&#8221;</p><p>That framing shifts where an engineer should focus their energy when technical debt is accumulating, meaning the work is not just to identify the debt but to communicate its consequences clearly enough that the people controlling the roadmap can make an informed decision. &#8220;Making sure that you can communicate effectively, here&#8217;s what the impact of this technical debt is to your product-level people or whoever&#8217;s making those decisions, is gonna be a key thing,&#8221; he adds. That requires being able to sit down and say clearly that if the team does not deal with a bug, it is going to lead to cascading issues, and the longer they put it off, the more likely it is to lead to a really significant problem that will take even longer to get past.</p><p>The teams that handle technical debt well, in Allbee&#8217;s experience, are the ones that treat it as a first-class concern rather than an emergency. The difference between those two approaches is almost entirely about communication, where debt that gets communicated early and framed in terms of product risk gets prioritized, while debt that surfaces as a crisis gets managed badly.</p><h2>Testing is a design decision</h2><p>The most common framing of testing in Python projects is that it is something you add to code that already exists, but Allbee&#8217;s position is that testability is a property of the code itself, meaning that designing for it from the beginning changes the shape of the code in ways that make it easier to understand, change, and hand off to other engineers.</p><p>His testing approach for his own projects is a method that &#8220;exercises valid and invalid inputs for all of the parameters of every callable in the project.&#8221; He shares, &#8220;You combine that with judicious monitoring of missing lines and a code coverage report, that has served really well for me in making sure that the targets of those tests are being both thoroughly and realistically exercised.&#8221; The more important principle underneath the practice is that tests are most valuable when they reflect how the system is actually used, not just how the code is structured.</p><p>In team contexts, Allbee advocates for explicit agreement about how tests are organized and what tools are involved. &#8220;I&#8217;ve seen what happens when different engineers who aren&#8217;t communicating with each other each go their own way,&#8221; he points out, noting that &#8220;the tests that result, even if they&#8217;re rigorous and well thought out, are oftentimes difficult to follow across different test modules.&#8221; The investment in agreement upfront produces a test suite that the whole team can confidently read, maintain, and extend.</p><p>On AI-generated code in testing contexts, Allbee recommends defining a test suite that only humans are permitted to modify, making it as rigorous and complete as possible, and then allowing AI to generate implementation code that must pass that suite. He explains the boundary by stating that you can tell the AI to &#8220;write all the code you want,&#8221; but it &#8220;must pass this test suite&#8221; and it does &#8220;not get to modify that test suite.&#8221; That boundary, he reasons, provides about as much coverage as can realistically be achieved when AI is involved in production code.</p><div class="callout-block" data-callout="true"><p><strong>Bring Claude Code into real engineering workflows, not just isolated coding sessions. <a href="https://www.eventbrite.co.uk/e/claude-code-for-software-engineering-from-prompts-to-systems-tickets-1988571262176?aff=deepeng2">Register here.</a></strong></p></div><h2>Concurrency is a design problem first</h2><p>Python&#8217;s performance limitations and its Global Interpreter Lock have been a recurring concern for engineers building high-throughput systems, and CPython&#8217;s free-threaded build has stirred interest in what Python might make possible beyond the GIL. Allbee is measured about expectations, highlighting that most Python code is IO-bound rather than CPU-bound, which is where the GIL has its most significant impact, though he is hopeful that the free-threaded model will open doors for more CPU-bound work to be written in Python.</p><p>The framing that matters most to many developers is not about the runtime at all. &#8220;Concurrency is a design problem before it&#8217;s a runtime problem,&#8221; he underscores, adding that having better concurrency support in the language really does not eliminate the need to understand how your processes are going to contend against each other, how to deal with data ownership at the scope of the code, or how failures can happen. His practical advice on concurrency reflects this directly by recommending that developers add it sparingly and only when there is an actual benefit that outweighs the overhead of handling errors, data contention, and coordination costs. &#8220;Optimize your clarity and correctness first,&#8221; he recommends, and &#8220;really only reach for concurrency when you understand where the time is actually being spent.&#8221;</p><h2>Cloud readiness is designing for volatility</h2><p>The question of what makes a Python application cloud-ready is one Allbee addresses in terms of design principles rather than tools or platforms. The containerized application is cloud-ready, he acknowledges, but so are function-as-a-service constructs like AWS Lambda functions, proving that the specific mechanism matters less than the underlying design orientation.</p><p>&#8220;The key concept that ties almost every cloud-resident system together, containerization, stateless design, any of those, is that they are inherently disposable,&#8221; he explains. Because a container can be killed at any time, a Lambda invocation could be terminated before it reaches a successful completion, and Kubernetes pods restarting are probably routine events, designing for that reality means building processes around the expectation that the hardware can disappear at any point in time.</p><p>Statelessness in that context is about making failure cheap. There is no state to manage and no need to write code to reacquire that state, meaning a process simply ends and is restarted, making recovery from a failure as simple as starting a new instance. &#8220;Statelessness and containerization matter more because they make failure cheap and recovery routine than for any other purpose or reason,&#8221; he says, arguing that this principle should sit near the top of the list of factors shaping design decisions for any system built to run in a cloud environment.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://deepengineering.net/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 Packt Deep Engineering! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>What senior engineers actually do</h2><p>The question of what separates an engineer ready for senior work from one who is not comes back to the same systems-oriented thinking that distinguishes engineering from programming, where the indicator is not technical mastery but curiosity about the system rather than just the isolated function.</p><p>&#8220;If they started demonstrating that they&#8217;re concerned with more than just is the code doing what it&#8217;s supposed to do,&#8221; he explains, &#8220;if there&#8217;s a certain amount of curiosity, why are we doing it this way, do they recognize the trade-offs, those are the things that I think start really indicating somebody is actually ready to go beyond just I&#8217;ve written this function, and it&#8217;s done, and it&#8217;s tested, and it works. Done. I&#8217;m finished.&#8221;</p><p>The senior engineers Allbee has tried to emulate and seen do their best work are not defined by the code they write but by the systems they shape and the teams they are enabling. That involves asking questions that guide less senior engineers to ask those same questions on their own, such as why the team is going down a certain road, what the benefits are, and what trade-offs exist. &#8220;There are always trade-offs,&#8221; he notes, emphasizing, &#8220;Always, always, always trade-offs.&#8221;</p><p>The advice he offers to Python developers trying to grow in an AI-accelerated world collapses to three core principles, which are to &#8220;think in systems,&#8221; to &#8220;design for change,&#8221; and to &#8220;optimize for your team.&#8221; If you come away thinking differently about why you write the code that you are writing and not just how, then that is the shift that matters. Since the language, tools, and expectations placed on Python engineers will inevitably keep growing, the engineers who hold up under those pressures are the ones who stopped measuring their work by whether the code runs and started asking what it will take for the system to survive.</p><div class="pullquote"><p><strong><a href="https://www.packtpub.com/en-us/product/hands-on-software-engineering-with-python-9781835888018">Go deeper with Brian Allbee&#8217;s book</a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.packtpub.com/en-us/product/hands-on-software-engineering-with-python-9781835888018" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8VAS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7bb37-8ccf-4fd6-9057-c6a4f217af4c_2250x2775 424w, https://substackcdn.com/image/fetch/$s_!8VAS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7bb37-8ccf-4fd6-9057-c6a4f217af4c_2250x2775 848w, https://substackcdn.com/image/fetch/$s_!8VAS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7bb37-8ccf-4fd6-9057-c6a4f217af4c_2250x2775 1272w, https://substackcdn.com/image/fetch/$s_!8VAS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7bb37-8ccf-4fd6-9057-c6a4f217af4c_2250x2775 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8VAS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7bb37-8ccf-4fd6-9057-c6a4f217af4c_2250x2775" width="309" height="381.1565934065934" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/caa7bb37-8ccf-4fd6-9057-c6a4f217af4c_2250x2775&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1796,&quot;width&quot;:1456,&quot;resizeWidth&quot;:309,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Hands-On Software Engineering with Python&quot;,&quot;title&quot;:&quot;Hands-On Software Engineering with Python&quot;,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.packtpub.com/en-us/product/hands-on-software-engineering-with-python-9781835888018&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Hands-On Software Engineering with Python" title="Hands-On Software Engineering with Python" srcset="https://substackcdn.com/image/fetch/$s_!8VAS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7bb37-8ccf-4fd6-9057-c6a4f217af4c_2250x2775 424w, https://substackcdn.com/image/fetch/$s_!8VAS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7bb37-8ccf-4fd6-9057-c6a4f217af4c_2250x2775 848w, https://substackcdn.com/image/fetch/$s_!8VAS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7bb37-8ccf-4fd6-9057-c6a4f217af4c_2250x2775 1272w, https://substackcdn.com/image/fetch/$s_!8VAS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7bb37-8ccf-4fd6-9057-c6a4f217af4c_2250x2775 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><strong>Brian Allbee</strong> explores these ideas in more depth in <em>Hands-On Software Engineering with Python</em>, a practical guide to building Python systems that are easier to test, maintain, evolve, and hand off.</p><p><strong><a href="https://www.packtpub.com/en-us/product/hands-on-software-engineering-with-python-9781835888018">Explore the book here</a></strong></p></div><h3>In case you missed </h3><p></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;f18d1d6b-4915-4374-94c7-b25bdf20dd98&quot;,&quot;caption&quot;:&quot;Brian Allbee joined Deep Engineering Live to talk about what separates engineering from programming, how to scale and refactor Python systems responsibly, and what it actually takes to grow into senior and staff-level roles.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Hands-On Software Engineering with Python with Brian Allbee&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:427210082,&quot;name&quot;:&quot;Saqib Jan&quot;,&quot;bio&quot;:&quot;/localhost&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997a788a-cd78-4f84-9b3b-c72ab6dc0153_1008x1008.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-06-03T12:30:00.000Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d4a795b5-9037-483c-9276-02a30b0de712_1920x1080.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://deepengineering.substack.com/p/hands-on-software-engineering-python-brian-allbee&quot;,&quot;section_name&quot;:&quot;Interviews&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:200469642,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1729053,&quot;publication_name&quot;:&quot;Packt Deep Engineering&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!H5BJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F736bc1ee-d689-497e-83a8-7d9bf9022eb9_600x600.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p></p><div><hr></div><h2>&#128736;&#65039; Tool of the Week</h2><p><strong><a href="https://github.com/astral-sh/ruff">Ruff</a></strong> - fast Python linting and formatting for teams trying to keep quality gates enforceable without slowing every commit.</p><p><strong>Highlights</strong></p><ul><li><p>Consolidates linting, import sorting, upgrade checks, and formatting behind one configuration surface.</p></li><li><p>Runs fast enough for pre-commit and CI workflows, which makes quality checks more likely to stay enabled.</p></li><li><p>Supports monorepos and hierarchical configuration, helping larger teams avoid one-off project rules.</p></li><li><p>Already used across major Python projects, making it a practical default rather than a niche experiment.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/astral-sh/ruff&quot;,&quot;text&quot;:&quot;Learn more about Ruff&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/astral-sh/ruff"><span>Learn more about Ruff</span></a></p><div><hr></div><h1><strong>&#128206; Tech Briefs</strong></h1><ul><li><p><a href="https://github.blog/changelog/2026-06-02-copilot-sdk-is-now-generally-available/">Copilot SDK is now generally available</a> - GitHub made Copilot SDK stable across six languages, letting teams embed agent workflows into internal tools.</p></li><li><p><a href="https://www.anthropic.com/news/expanding-project-glasswing">Anthropic expands Project Glasswing</a> - Project Glasswing now extends to 150 organizations, shifting AI vulnerability discovery toward coordinated patching capacity.</p></li><li><p><a href="https://pypi.org/project/pip/">Python pip 26.1.2</a> - Pip 26.1.2 shipped with Trusted Publishing attestations, tightening provenance for standard Python installation workflows across teams.</p></li><li><p><a href="https://docs.astral.sh/uv/guides/integration/gitlab/">Using uv in GitLab CI/CD</a> - Astral added GitLab CI guidance for uv images and cache pruning, simplifying reproducible Python pipelines outside GitHub.</p></li><li><p><a href="https://pypi.org/project/pyright/">Pyright 1.1.410</a> - Pyright 1.1.410 refreshed the Python wrapper package, keeping CLI and editor type checks aligned automatically.</p></li></ul><div><hr></div><p>That&#8217;s all for today. Thank you for reading this issue of Deep Engineering.</p><p>We&#8217;ll be back next week with more expert-led content.</p><p>Keep building,</p><p>Saqib Jan</p><p>Editor-in-Chief, Deep Engineering</p><div><hr></div><p><em>If your company is interested in reaching an audience of senior developers, software engineers, and technical decision-makers, you may want to </em><strong><a href="https://packt.omeclk.com/portal/wts/uc%5EcnN2dfNaqmD-kB-mo66%7C7g%5Ef%7Cb">advertise with us</a></strong><em>.</em></p>]]></content:encoded></item><item><title><![CDATA[Hands-On Software Engineering with Python with Brian Allbee]]></title><description><![CDATA[Brian Allbee joins Deep Engineering to discuss the mindset shift from writing code to engineering systems.]]></description><link>https://deepengineering.net/p/hands-on-software-engineering-python-brian-allbee</link><guid isPermaLink="false">https://deepengineering.net/p/hands-on-software-engineering-python-brian-allbee</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Wed, 03 Jun 2026 12:30:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d4a795b5-9037-483c-9276-02a30b0de712_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://www.linkedin.com/in/brianallbee">Brian Allbee</a> has been writing Python almost exclusively since 2012, working across cloud-based application development, machine learning integration at Dice.com, and backend systems in AWS using Step Functions and Python Lambdas.</p><p>Allbee, Staff Software Engineer at Cleerly and author of <em><a href="https://www.packtpub.com/en-us/product/hands-on-software-engineering-with-python-9781835888018">Hands-On Software Engineering with Python</a></em>, now in its second edition published by Packt, joined Deep Engineering Live to talk about what separates engineering from programming, how to scale and refactor Python systems responsibly, and what it actually takes to grow into senior and staff-level roles.</p><p>Watch the full conversation below.</p><div id="youtube2-s_3X-ERgvhg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;s_3X-ERgvhg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/s_3X-ERgvhg?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><em>This session was recorded live as part of the Deep Engineering Live Interview Series. The transcript below has been lightly edited for clarity and readability. Audience members joined the conversation and asked questions directly during the session.</em></p><div><hr></div><p><em><strong>Q. Tell us about your background and the kinds of systems you have worked on.</strong></em></p><p><strong>Brian Allbee:</strong> I have been programming almost exclusively in Python since early 2012. Prior to that I worked in C Sharp dot net, Flex markup language, and PHP for application development. I landed on Python at a job I started early in 2012 at an ad agency where they needed somebody to come in and build an internal application that was more performant than their off-the-shelf solution for asset management. I fell in love with the language a little before that position started, but I was very happy that a language audit I did reinforced that Python was still the way to go because it had everything they needed.</p><p>Since then I have done client-facing cloud management application work, a handful of customer-facing applications I cannot get into too much detail on because they are still covered under NDAs, and the last six years I spent doing machine learning implementation and integration for Dice.com on the team that eventually became their applied data science and AI team. Currently I am doing backend system development in an AWS cloud context with Step Functions and Python Lambdas to deal with health insurance processing.</p><div><hr></div><p><em><strong>Q. What distinguishes a true software engineering approach from just programming, particularly for Python developers working on real-world systems?</strong></em></p><p><strong>Brian Allbee:</strong> I think learning to think in terms of systems, not just implementations, is probably the main thing. I feel that holds true whether the backing language is Python or not, and it does not stop with just the systems that an engineer is writing. On the technical side it extends out to the entire toolchain, anything that shapes the code itself or determines how the code is managed or handled. But it also extends to what I would call nontechnical systems in the sense of a set of principles or procedures that define how something is done.</p><p>I basically feel that programming is really focused on making sure that the code is correct, the correctness of the code itself. Where software engineering starts expanding out into more of a focus on sustainability as change occurs.</p><div><hr></div><p><em><strong>Q. For Python developers aiming to move into senior or staff engineering roles, given how much AI is now part of development workflows, what skills or mindset shifts do they need beyond raw coding proficiency?</strong></em></p><p><strong>Brian Allbee:</strong> I think that same systems-oriented thinking is still the big dividing line, and I believe that will hold true even if LLM-based code generation turns out to be the next big thing that all of its proponents argue it will be. Even in those scenarios, manual interaction with code at the level of the syntax of the code itself might dwindle over time, but there are still going to be sensitive domains where some of that remains necessary. More importantly, engineers need to understand how that code fits together even if they did not write it, and why it fits together the way it does.</p><p>Hand in hand with that is a broader understanding of the problems being solved. Software engineering, like every other engineering discipline I am aware of, is concerned with solving problems usually while operating within some set of constraints. Software engineering focuses on solving those problems by creating systems, and that goes back to the whole systems-oriented thinking. But solving the problem requires understanding that problem first. Even if code generation becomes largely or completely automated, someone still has to own that system and understand its constraints and its potentials for failure and how it is expected to evolve over time.</p><div><hr></div><p><em><strong>Q. What are some of the best practices for updating, refactoring, and scaling an existing Python codebase as it evolves?</strong></em></p><p><strong>Brian Allbee:</strong> I think most of the paths to success in that context, at least the ones I can think of that I have seen, do not really start with the architecture but with discipline behind the process. The approaches that have worked for me or that I have seen work well for others include keeping things as simple as possible, wrapping processes that get used over and over again into functions or methods or whatever context works best whenever possible, and not being afraid to use structured data.</p><p>If you are working in a team, make sure the team has some agreement about how much in-code documentation and by extension comments are expected and what it should provide. The same kind of team-level agreement about what code standards you want to apply. Stick to those until something comes up that is not covered, and revise them as needed. It is a growing process.</p><p>Writing code with an eye towards making it testable is key even if there is not an immediate need for testing. Future you, if you are writing good tests, will come back and thank you if they could.</p><div><hr></div><p><em><strong>Q. Can you share an example from your experience of tackling technical debt or redesigning a Python system to improve its maintainability and performance?</strong></em></p><p><strong>Brian Allbee:</strong> Honestly, I really cannot. I do not have any dramatic war stories here because I have worked with generally exceptionally healthy teams that treated technical debt as a first-class concern, not as an emergency. Technical debt is one of those product-level priorities. Whoever is making the prioritization decisions is going to be in control of when those get tackled if they get tackled.</p><p>If there is significant technical debt, making sure that you can communicate effectively, here is what the impact of this technical debt is to your product-level people or whoever is making those decisions, is going to be a key thing. That means being able to sit down and say, I understand that you do not want us to deal with this bug or whatever it happens to be. If we do not deal with this, it is going to lead to this, then that, and the longer we put that off, the more likely it is to lead to a really significant problem and the longer it is going to take for us to get past that.</p><div><hr></div><p><em><strong>Q. Modern teams often grapple with how much upfront system design to do versus driving straight into coding. How do you find the right balance between careful architecture and rapid agile execution?</strong></em></p><p><strong>Brian Allbee:</strong> I think understanding the full final scope of a project, even if it is just at a very high level, is critical to one side of that balance. The other side is knowing, again even if just at a high level, what constraints and non-project expectations are in play. You mentioned agile. Even if some form of agile is not part of a team&#8217;s day-to-day processes, there are some takeaways from agile that I think can still be beneficial. The entire idea of delivering work and software frequently on some sort of cadence is one of those. Iterating against the smallest deliverable units that can be identified would be another major factor.</p><p>I do not think the real risk is too much design or too little. It is designing without understanding the constraints that are involved. Iterating on the smallest meaningful units of work is going to be the most practical way to find that right balance between design and execution.</p><div><hr></div><p><em><strong>Q. Python has introduced features like data classes, type hints, and static typing tools in recent versions. How have these modern language features shaped your approach to designing Python software, and how would you recommend engineers fully embrace type hints in large projects?</strong></em></p><p><strong>Brian Allbee:</strong> Not as much as it might sound like, actually. Before I turned to Python I was working with C Sharp dot net, which is a statically typed compiled language. I came to really like the idea of static typing from a programming perspective even in dynamically typed languages like Python and JavaScript. If you dig back far enough into some of my very old and now unsupported blogs, you will find I even wrote some blog posts about implementing that sort of a structure in Python back as far as version 2.7.</p><p>I definitely recommend using the typing system that is in the language right now. At worst, it is additional documentation that modern IDEs can pick up on to help an engineer working with the code. With the inclusion of just one third-party package, I like TypeGuard myself but there are others, it is possible to achieve runtime static-like type safety and static type-like behavior in Python code. And pre-deployment tools like MyPy are going to pick up on your type hints to give you some extra quality control going into that process. I think about whether you enforce types at runtime or not, the design clarity is worth it.</p><div><hr></div><p><em><strong>Q. In building robust Python applications, how do you approach data modeling and validation? When does Pydantic make sense and when are simpler options sufficient?</strong></em></p><p><strong>Brian Allbee:</strong> I think it depends on the scope and intentions of the project. Pydantic is great for projects where there are complex requirements that can be derived from something like a JSON or OAS schema. It is also good for projects that are responsible for generating those JSON or OAS schemas. The downside is it is a larger package, coming in at around two and a half megabytes or so for the module itself and its primary dependency. So if package size is a concern, that might not be the best choice.</p><p>There are other options. Fast JSON schema combined with regular Python dictionaries and lists is a solid alternative and it is much smaller. If there is no need for any kind of schema documentation but there is still a desire for type checking, type-annotated Python classes will probably get you 80 plus percent of the way there in my experience. If you need mutable data structures and that is all you need, data classes are a good option. If you need an immutable data structure and type checking is not a concern at the level of the code structure, I usually start with something like a named tuple.</p><p>I think the right data modeling tool depends less on popularity and more on the system&#8217;s constraints and the scale, scope, and longevity of the project.</p><div><hr></div><p><em><strong>Q. What are your go-to best practices for testing Python systems at scale? How do you balance unit, integration, and end-to-end tests, and how do you ensure the test suite stays reliable and useful over time?</strong></em></p><p><strong>Brian Allbee:</strong> For my own projects, I tend to like a testing approach that exercises valid and invalid inputs for all of the parameters of every callable in the project. You combine that with judicious monitoring of missing lines in a code coverage report, and that has served really well for me in making sure that the targets of those tests are being both thoroughly and realistically exercised.</p><p>In a working environment, I like for the team to come to some sort of consensus about how the tests are organized, what tools are involved, and so on. I have seen what happens when different engineers who are not communicating with each other each go their own way. The tests that result, even if they are rigorous and well thought out, are oftentimes difficult to follow across different test modules because different people write tests in different ways.</p><p>When integration or end-to-end testing is not feasible, I try to push unit tests closer to behavioral testing even if that increases mocking complexity. Those kinds of scenarios, unit testing can still go a long way. Ultimately, though, tests are most valuable when they reflect how the system is actually used, whether that is managed at a unit testing, integration testing, or system testing level, not just how that testing code or the code itself is structured.</p><div><hr></div><p><em><strong>Q. AI is now being used in areas like test generation, debugging, and even test maintenance. How should engineers think about AI in testing without compromising reliability and confidence in their systems?</strong></em></p><p><strong>Brian Allbee:</strong> I think the fundamental important thing there is going to be getting some sort of a consensus from anybody who is involved, all of the stakeholders, and anybody who is going to be held accountable for failures in the code, as to what the guardrails need to be. I like AI from the standpoint of code generation for things that are not sensitive. If it affects somebody&#8217;s lives or livelihoods, I do not want randomly generated code out there without really good guardrails.</p><p>The approach that I have seen and tried myself that has the most promise is to take a test-driven development approach and define a test suite, and only allow humans to modify that test suite. Make sure it is really good, really solid, really rigorous, and covers all of the business needs, everything that you can come up with. And then you can let an AI process go to town on the code as long as there is a clear boundary there. You can tell it, you can write all the code you want, it must pass this test suite, you do not get to modify that test suite. Let it go to town. At that point I think you are probably about as well covered as you can be.</p><div><hr></div><p><em><strong>Q. How should Python teams set up CI/CD pipelines to improve code quality and deployment reliability? What best practices help the most and what pitfalls should be avoided?</strong></em></p><p><strong>Brian Allbee:</strong> The goals are all the same for CI/CD regardless of the language involved. You have to fetch the code, you have to test it, you have to build it and package it, and you have to deploy it. The basic sequence is common across the board. There may be additional tasks like checking that the deployment process is well-formed, or aspects that are not tied directly to the code itself.</p><p>The main value that CI/CD adds is not necessarily the automation. It is the fast, automated, trustworthy feedback that you get from one of those processes. I would say look for places where you can generate that feedback, find the break points that are going to happen, and make sure that anything that fails gets surfaced in a meaningful, timely, and useful fashion.</p><div><hr></div><p><em><strong>Q. What makes a Python application cloud-ready, and what are the most important design principles to bear in mind?</strong></em></p><p><strong>Brian Allbee:</strong> Cloud-ready can mean different things to different organizations, different teams, or even individual people. A containerized application is cloud-ready provided that it can be deployed appropriately, but so too are function-as-a-service constructs like AWS Lambda functions and their equivalents in other provider spaces. It all depends ultimately on the final deployment expectations.</p><p>Some key things to bear in mind include leveraging environment variables to help control behavior in different cloud accounts or environments within those accounts. You will find that they can carry over from local development to deployment processes and build pipelines all the way out to your final deployed product. They can always be replicated and manipulated locally, and that makes things easier and faster to change in a deployed application without having to redeploy an entire stack.</p><p>Be aware of and actively seek out systems that cloud providers offer for things that you need to deal with. Secret storage is a great example. Pull a secret in one time when a container initializes or a Lambda starts up, and then do not touch it after that. Know the best practices and constraints for your final deployed code. A great example is AWS Lambda functions. You cannot run a Lambda function for more than fifteen minutes, so once you have a good idea of how long a process can take, set that timeout accordingly and test against it.</p><p>I think cloud-ready is less about where code runs and more about designing for volatility and external constraints.</p><div><hr></div><p><em><strong>Q. How do statelessness and containerization fit into building scalable cloud systems, and why do they matter?</strong></em></p><p><strong>Brian Allbee:</strong> If you think about it at a basic structural level, the key concept that ties almost every cloud resident system together, containerization, stateless design, any of those, is that they are inherently disposable. A container can be killed at any time. A Lambda invocation could be terminated before it reaches a successful completion. Kubernetes pods restarting are probably routine events. Even in a serverless context, a virtual machine can be stopped and restarted without warning. Recognizing that means designing your processes around the expectation that your hardware can disappear at any point in time.</p><p>Statelessness in that context is in a very real way about making failure of your hardware cheap. There is no state to manage, there is no need to write code to reacquire that state. A process ends and is restarted. Planning for failures and designing around the idea that recovery from a failure is just starting a new instance is probably near the top of the list of factors shaping design decisions.</p><p>In a container-based context, the container is at that point the smallest unit to replace. The key factor to keep in mind there is making sure that the startup behavior is consistent and predictable. Ensure that the environments are repeatable and allow a failed container to be replaced automatically and seamlessly rather than relying on any kind of manual troubleshooting process.</p><p>Statelessness and containerization matter more because they make failure cheap and recovery routine than for any other purpose or reason. That is what it comes right down to.</p><div><hr></div><p><em><strong>Q. A member of the audience asked: </strong>How critical is containerization to scaling systems?</em></p><p><strong>Brian Allbee:</strong> Containerization is one of the more popular mechanisms but it is not the only mechanism out there. Most of my experience with containerization has been in a cloud-oriented context, and the alternatives in an AWS context at least include things like Lambda functions, which technically are their own containers but you do not have to worry about containerization as one of the factors in your code that you are concerned with. You are literally just writing code to fit inside the context of that Lambda container and letting it go. It is a good skill to have, most definitely, something that is going to be of use and interest in a lot of jobs these days, but I do not know that it is a critical skill for all cases.</p><div><hr></div><p><em><strong>Q. A member of the audience asked: </strong>Does Flask scale well?</em></p><p><strong>Brian Allbee:</strong> The scaling question is so context-dependent that it is really hard to say definitively. In a containerized structure where your data store is completely separated from your Flask environment and application, and you can spin up and drop new instances of containers, I think it scales as well as anything else out there.</p><p>You will probably find that FastAPI is going to be more performant, but there is also a lot more work that has to happen in a FastAPI context. Flask is probably about in the middle. It is a good balance between a lot of stuff already supported versus speed of operation. And then at the other end you have something like Django where it does everything for everyone but it is not going to be as performant at an instance-by-instance level. After that, it is really going to end up depending on how well you can spread that load out through load balancing across containers running your application, regardless of whether it is Flask or FastAPI or Django or something completely homebrewed. That is probably where you are going to see the most scalability capability out of all of those options.</p><div><hr></div><p><em><strong>Q. What is one trade-off you see Python developers consistently get wrong when building systems?</strong></em></p><p><strong>Brian Allbee:</strong> The one I would say is most consistently seen in my experience is going back to the idea of overengineering. I want to write this as an object-oriented system because object-oriented is the way to go. And the same could be said for functional programming. Understand your problem space and design the solution around that problem space, because that is what you are trying to do, provide a solution for that specific problem space.</p><p>The best example in my personal experience was a system that was written in Python by somebody who came from a C Sharp background. The project was ridiculously huge. Every function had its own module. Every class had its own module. You put everything together, the functional layers of the system were seven or eight deep depending on the context.</p><p>Way more complicated than it needed to be, and it was hard to manage and hard to maintain. If I could have gone back and talked to, let us call him Steve, I probably would have said, Steve, there is this really good book out there called Code That Fits In Your Head. Read that. It is all about keeping things at a manageable level because psychologically humans can only keep five to seven bits of information in the front of their memory at a given point in time. You are talking about seven layers worth of depth in a project structure. That is already saturating things. Keep it simple. Collapse things down to the point where you do not have to have nineteen different classes and fifteen different instances of all these other classes to deal with something that really should be capable of being managed as a single function.</p><div><hr></div><p><em><strong>Q. How can you tell when an engineer is ready for senior-level work?</strong></em></p><p><strong>Brian Allbee:</strong> It goes back to what we started with. If they start demonstrating that they are concerned with more than just whether the code is doing what it is supposed to do, whether this function works, if there is a certain amount of curiosity about why are we doing it this way, what is the advantage of taking a functional programming approach versus a procedural versus an object-oriented one, what are the trade-offs, and do they recognise the trade-offs. Those are the things that start really indicating somebody is actually ready to go beyond just, I have written this function, it is done, it is tested, it works, I am finished.</p><p>The senior engineers that I have tried to emulate and that I have seen do their best work really are not defined by the code that they write but by the systems that they shape and the teams that they are enabling. That involves some gatekeeping, asking why we are going down this particular design path, or why are we not using this brand new library that has just shown up in the last three months. There is a lot of broader scope in asking those questions of less senior engineers and guiding them to learn how to ask those same questions on their own. Why do we go down this road? What is the benefit? What are the trade-offs? Because there are always trade-offs. Always.</p><div><hr></div><p><em><strong>Q. What motivated the second edition of Hands-On Software Engineering with Python, and what changed?</strong></em></p><p><strong>Brian Allbee:</strong> A good part of it was just the time lag. It was seven years between the first edition and the second. But Python itself has changed significantly, not so much in the language core but in the maturity of its tooling and the breadth of problems that it is now used to solve. The ecosystem around testing, packaging, automation, and deployment has grown in ways that significantly change how Python is used in real-world systems. Its adoption has also expanded dramatically, particularly in cloud and large-scale environments and also in AI, where it is very much a go-to language right now.</p><p>Today, Python engineers are frequently expected to think about architecture, performance, testing, and operational concerns in ways that just were not as common when the first edition was written. All of those growth areas and the dramatically increased surface area of use of the language kind of begged for further discussion.</p><p>The first edition tells the story of a fictitious company called Handmade Stuff that is just starting to develop an application structure to deal with what they are trying to accomplish as a company. The second edition takes that story forward and says, okay, we have this application and it is functional but less than optimal, and there is a significant impetus from the organization to move into the cloud. So what would that look like? A lot of the principles are still absolutely the same. You still need that system-level thinking, you still need to understand the problem space, you still have to work out how you are going to deploy this. What it looks like is going to be extremely different.</p><div><hr></div><p><em><strong>Q. What is the one piece of advice you would give to Python developers trying to grow into stronger engineers in an AI-accelerated world?</strong></em></p><p><strong>Brian Allbee:</strong> If you come away from thinking differently about why you write the code that you are writing, not just how, then you are moving in the right direction. Engineers are on the hook to develop and ship working code. But I will go back to my basic principles more than anything else. Think in systems. Design for change. If you are working in a team, optimise for your team.</p><p>Ask how easily the code could fit into a larger system, how it will change over time, and how your design choices will affect the product later for the people who have to work with it after you are done with it. That mindset shift is a key thing in enabling an engineer to grow into more senior roles and to build software that holds up under the real-world pressures that you are going to run into.</p><div><hr></div><p><em><a href="https://www.linkedin.com/in/brianallbee">Brian Allbee</a> is a Staff Software Engineer at Cleerly and the author of <a href="https://www.packtpub.com/en-us/product/hands-on-software-engineering-with-python-9781835888018">Hands-On Software Engineering with Python</a>, published by Packt.</em></p>]]></content:encoded></item><item><title><![CDATA[Deep Engineering Specials: Enterprise AI has an API problem]]></title><description><![CDATA[The next enterprise AI bottleneck is not model capability. It is whether agents can discover, understand, and safely use the systems they need to act on]]></description><link>https://deepengineering.net/p/enterprise-ai-has-an-api-problem</link><guid isPermaLink="false">https://deepengineering.net/p/enterprise-ai-has-an-api-problem</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Tue, 02 Jun 2026 16:16:05 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d09c63a2-7c9f-43b5-ad5f-8625b8ed2dca_690x310.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you have 30,000 APIs, you probably have 300,000 endpoints across your organization. While that sounds like a problem of scale, it is actually one of design. </p><p>With agents discovering and calling APIs at runtime rather than developers hardcoding them at build time, that design problem has become one of the most urgent infrastructure questions in enterprise engineering.</p><p><em>This month&#8217;s special issue digs into how APIs built for developers need to become discoverable, understandable, governed, and safe runtime capabilities for agents, with commentary from <a href="https://ch.linkedin.com/in/erikwilde">Erik Wilde</a>, Head of Enterprise Strategy at Jentic; <a href="https://www.linkedin.com/in/nandita-giri">Nandita Giri</a>, Senior Software Engineer at Microsoft; <a href="https://www.linkedin.com/in/swarnendurohan-gupta">Rohan Gupta</a>, Principal Product Manager at Harness; and <a href="https://www.linkedin.com/in/mayankbhola">Mayank Bhola</a>, Co-Founder and Head of Products at TestMu AI.</em></p><p>Let&#8217;s get started.</p><div><hr></div><p><strong>Special issue &#8212; June 2026</strong></p><h2>Your APIs were built for developers, not agents</h2><div class="pullquote"><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.linkedin.com/in/erikwilde/" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UR3A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde33cbd7-d094-4ae1-adb8-fbd6e9427d91_400x400.jpeg 424w, https://substackcdn.com/image/fetch/$s_!UR3A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde33cbd7-d094-4ae1-adb8-fbd6e9427d91_400x400.jpeg 848w, https://substackcdn.com/image/fetch/$s_!UR3A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde33cbd7-d094-4ae1-adb8-fbd6e9427d91_400x400.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!UR3A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde33cbd7-d094-4ae1-adb8-fbd6e9427d91_400x400.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UR3A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde33cbd7-d094-4ae1-adb8-fbd6e9427d91_400x400.jpeg" width="266" height="266" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de33cbd7-d094-4ae1-adb8-fbd6e9427d91_400x400.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:400,&quot;width&quot;:400,&quot;resizeWidth&quot;:266,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Erik Wilde (@dret) / Posts / X&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.linkedin.com/in/erikwilde/&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Erik Wilde (@dret) / Posts / X" title="Erik Wilde (@dret) / Posts / X" srcset="https://substackcdn.com/image/fetch/$s_!UR3A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde33cbd7-d094-4ae1-adb8-fbd6e9427d91_400x400.jpeg 424w, https://substackcdn.com/image/fetch/$s_!UR3A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde33cbd7-d094-4ae1-adb8-fbd6e9427d91_400x400.jpeg 848w, https://substackcdn.com/image/fetch/$s_!UR3A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde33cbd7-d094-4ae1-adb8-fbd6e9427d91_400x400.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!UR3A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde33cbd7-d094-4ae1-adb8-fbd6e9427d91_400x400.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>&#8220;You don&#8217;t just look for APIs when you&#8217;re writing an app. You kind of look for APIs every time you solve a problem.&#8221; &#8212; <a href="https://ch.linkedin.com/in/erikwilde">Erik Wilde</a>, Head of Enterprise Strategy at Jentic and OpenAPI Ambassador</p></div><p>Most large enterprises have no idea how many APIs they have. Ask them and the honest answer is usually somewhere between a guess and a shrug. What they do know is that the number is large, the endpoints are larger, and the documentation is somewhere between incomplete and missing. For years that was manageable because the people consuming those APIs could compensate. They had context, experience, and enough judgment to work around the gaps in a poorly written spec or an ambiguous parameter name.</p><p>For the better part of two decades, engineering teams designed APIs for a specific kind of consumer, a developer sitting at a keyboard, reading documentation, and making deliberate decisions about which endpoints to call and in what order. That consumer had context, experience, and the judgment to fill in the gaps that a poorly written spec inevitably left open. The API did not need to be perfect because the developer compensated for its imperfections at design time, before a single line of integration code was written.</p><p>That assumption breaks down when the consumer is an agent, says <a href="https://ch.linkedin.com/in/erikwilde">Erik Wilde</a>, Head of Enterprise Strategy at <a href="https://jentic.com/">Jentic</a> and OpenAPI Ambassador. Agents do not read between the lines, compensate for ambiguous parameter names, or infer the intent behind a generic error response. They act on what the contract says, at runtime, every time they need to solve a problem, and the gap between what most enterprise APIs offer and what agents actually need is where many AI projects begin to fail before they deliver measurable value.</p><p><a href="https://cdn.sanity.io/files/4zrzovbb/website/cd77281ebc251e6b860543d8943ede8d06c4ef50.pdf">Anthropic&#8217;s 2026 State of AI Agents Report</a> found that 46% of engineering teams cite integration with existing systems as their primary challenge when deploying agents, placing it above model capability, prompt quality, and every other factor on the list. The bottleneck is infrastructure, and that infrastructure depends on APIs that were never designed for this kind of consumer.</p><div><hr></div><p><strong>Masterclass:</strong> <strong><a href="https://www.eventbrite.co.uk/e/building-ai-ready-apis-with-agent-skills-tickets-1990383757398?aff=deepeng">Building AI-Ready APIs with Agent Skills</a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.eventbrite.co.uk/e/building-ai-ready-apis-with-agent-skills-tickets-1990383757398?aff=deepeng" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nAr1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77512a7b-9c4e-4e42-b1e0-1c12265d132b_800x267.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nAr1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77512a7b-9c4e-4e42-b1e0-1c12265d132b_800x267.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nAr1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77512a7b-9c4e-4e42-b1e0-1c12265d132b_800x267.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nAr1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77512a7b-9c4e-4e42-b1e0-1c12265d132b_800x267.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nAr1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77512a7b-9c4e-4e42-b1e0-1c12265d132b_800x267.jpeg" width="800" height="267" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/77512a7b-9c4e-4e42-b1e0-1c12265d132b_800x267.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:267,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.eventbrite.co.uk/e/building-ai-ready-apis-with-agent-skills-tickets-1990383757398?aff=deepeng&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!nAr1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77512a7b-9c4e-4e42-b1e0-1c12265d132b_800x267.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nAr1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77512a7b-9c4e-4e42-b1e0-1c12265d132b_800x267.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nAr1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77512a7b-9c4e-4e42-b1e0-1c12265d132b_800x267.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nAr1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77512a7b-9c4e-4e42-b1e0-1c12265d132b_800x267.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>Join <strong>OpenAPI Ambassadors</strong> <a href="https://ch.linkedin.com/in/erikwilde">Erik Wilde</a> and <a href="https://ie.linkedin.com/in/frank-kilcommins">Frank Kilcommins</a> for a hands-on masterclass on building AI-ready APIs with agent skills, covering OpenAPI, Overlay, Arazzo, semantic discovery, deterministic workflows, and governance guardrails for agent-driven integrations. </p><p>&#128467;&#65039; July 1, 2026 &#183; 10:30 AM &#8211; 1:30 PM ET &#183; Online</p><p style="text-align: center;">Use code <strong>DEEPENG50</strong> for 50% off.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.eventbrite.co.uk/e/building-ai-ready-apis-with-agent-skills-tickets-1990383757398?aff=deepeng&quot;,&quot;text&quot;:&quot;Register here&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.eventbrite.co.uk/e/building-ai-ready-apis-with-agent-skills-tickets-1990383757398?aff=deepeng"><span>Register here</span></a></p><div><hr></div><h2>Agents discover APIs at runtime, developers do not</h2><p><a href="https://deepengineering.substack.com/p/building-agent-ready-apis-in-production">In our live interview</a>, Wilde gave one of the clearest framings for how agent consumption differs from developer consumption. Developers search for APIs when building an application, make a decision, and hardcode the integration so it stays consistent for the lifetime of the application. Agents search for APIs at runtime, every time they encounter a problem they need to solve, against a catalog that may contain hundreds of thousands of options across a large enterprise.</p><p>That changes the API problem from documentation quality to runtime selection. The consumer is no longer a skilled person who can fill in the gaps of a poorly written spec. It is a machine that acts on exactly what the contract says, nothing more and nothing less, and it does so without the accumulated context that a developer brings to the integration process.</p><p>Wilde illustrated the scale of this problem by sharing a recent experience with a car manufacturer operating roughly 50,000 APIs and 500,000 endpoints across the organization. The point is not that this number is exceptional. For a large enterprise with decades of accumulated systems and services, it is closer to the normal condition than most teams would like to admit. What changes with agents is the cost of that normal condition. When the consumer needs to find the right capability at runtime, the selection problem alone can make the API landscape effectively unusable without a serious restructuring of how capabilities are described, organized, and exposed.</p><h2>Agents cannot compensate for spec drift</h2><div class="pullquote"><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.linkedin.com/in/nandita-giri/" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9qx9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648dfec6-6b09-4770-990c-8670faeb30ec_768x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9qx9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648dfec6-6b09-4770-990c-8670faeb30ec_768x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9qx9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648dfec6-6b09-4770-990c-8670faeb30ec_768x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9qx9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648dfec6-6b09-4770-990c-8670faeb30ec_768x768.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9qx9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648dfec6-6b09-4770-990c-8670faeb30ec_768x768.jpeg" width="266" height="266" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/648dfec6-6b09-4770-990c-8670faeb30ec_768x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:768,&quot;resizeWidth&quot;:266,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Profile image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.linkedin.com/in/nandita-giri/&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Profile image" title="Profile image" srcset="https://substackcdn.com/image/fetch/$s_!9qx9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648dfec6-6b09-4770-990c-8670faeb30ec_768x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9qx9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648dfec6-6b09-4770-990c-8670faeb30ec_768x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9qx9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648dfec6-6b09-4770-990c-8670faeb30ec_768x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9qx9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648dfec6-6b09-4770-990c-8670faeb30ec_768x768.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>&#8220;Think of the API as a contract with a very literal, very curious machine.&#8221; &#8212; <a href="https://www.linkedin.com/in/nandita-giri/">Nandita Giri</a>, Senior Software Engineer at Microsoft</p></div><p><a href="https://www.linkedin.com/in/nandita-giri/">Nandita Giri</a>, Senior Software Engineer at Microsoft with prior engineering experience at Meta and Amazon, works across agentic AI and automation, and the pattern she observes across organizations working to become AI-ready is consistent and predictable. Teams invest in producing a good OpenAPI specification at launch, treat it as a first-class deliverable at the time of release, and then watch the specification and the actual API behavior silently diverge over the following months as the code evolves faster than the documentation does.</p><p>For developer-facing APIs, this drift is a manageable nuisance because developers notice the discrepancy, ask questions in Teams, Slack or a GitHub issue, and someone eventually updates the documentation before the next consumer runs into the same problem. But for agent-facing APIs, spec drift is not a nuisance. It is a silent failure mode that is exceptionally difficult to trace because agents have no mechanism for noticing the discrepancy between what the spec says and how the API actually behaves. They act on what the spec says, encounter failures they cannot interpret without the surrounding context that a developer would have, and either produce incorrect results or abandon the task entirely without surfacing a meaningful error to the system that called them.</p><p>The only way to stop that drift from compounding, Giri argues, is to treat the specification as a first-class part of the release process on every change, with CI pipelines that validate spec fidelity against actual runtime behavior before deployment proceeds, not as a quarterly audit task but as a gate that blocks release when the spec and the actual behavior have diverged.</p><p>Giri is equally specific about what good specifications actually require for agent consumption, and her examples are concrete enough to apply immediately. A field called status that returns values 1, 2, and 3 is useless to an agent unless the spec also documents that 1 means New, 2 means In Progress, and 3 means Completed, because the agent has no way to infer that mapping from the field name or the values themselves. An endpoint that documents only that it returns a 400 error for bad input, without specifying which input combinations trigger that response, leaves an agent unable to prevalidate its requests or recover gracefully when the error occurs. A rate limit that appears only in external documentation and not in the spec itself is invisible to any agent that has not been specifically trained on that external documentation. These are not edge cases that organizations can deprioritize. They are the normal state of most enterprise API specifications, and they are a primary reason why agents fail in ways that produce poor results without surfacing a clear explanation of what went wrong.</p><p>The same distinction applies on the API producer side. Standard linting tools check structure, including whether a description field exists, whether it meets a minimum length, and whether required parameters are present. That structural check is genuinely useful as a first line of defense, but it cannot evaluate whether a description is written in a way that helps an agent understand what the operation is actually for.</p><p>A field that passes every linting rule can still be useless to an agent if it describes what the endpoint does technically without explaining the intent a consumer would bring to it. Descriptions need to represent intent, including what somebody would use the operation for, what constraints apply, and how the agent should reason about the result. The gap between a description that passes a linting check and a description that an agent can act on reliably is the gap that most teams are not yet closing, and closing it requires evaluation mechanisms that go beyond pattern matching on the specification itself.</p><h2>Cross-service inconsistency breaks agent workflows</h2><div class="pullquote"><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="http://linkedin.com/in/swarnendurohan-gupta" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JvYd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aebf22c-e52c-4f63-b5c6-90dd504787af_512x512.png 424w, https://substackcdn.com/image/fetch/$s_!JvYd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aebf22c-e52c-4f63-b5c6-90dd504787af_512x512.png 848w, https://substackcdn.com/image/fetch/$s_!JvYd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aebf22c-e52c-4f63-b5c6-90dd504787af_512x512.png 1272w, https://substackcdn.com/image/fetch/$s_!JvYd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aebf22c-e52c-4f63-b5c6-90dd504787af_512x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JvYd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aebf22c-e52c-4f63-b5c6-90dd504787af_512x512.png" width="270" height="270" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1aebf22c-e52c-4f63-b5c6-90dd504787af_512x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:512,&quot;width&quot;:512,&quot;resizeWidth&quot;:270,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Explore DevOps Insights from Rohan Gupta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;http://linkedin.com/in/swarnendurohan-gupta&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Explore DevOps Insights from Rohan Gupta" title="Explore DevOps Insights from Rohan Gupta" srcset="https://substackcdn.com/image/fetch/$s_!JvYd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aebf22c-e52c-4f63-b5c6-90dd504787af_512x512.png 424w, https://substackcdn.com/image/fetch/$s_!JvYd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aebf22c-e52c-4f63-b5c6-90dd504787af_512x512.png 848w, https://substackcdn.com/image/fetch/$s_!JvYd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aebf22c-e52c-4f63-b5c6-90dd504787af_512x512.png 1272w, https://substackcdn.com/image/fetch/$s_!JvYd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aebf22c-e52c-4f63-b5c6-90dd504787af_512x512.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#8220;It&#8217;s not just about connecting the dots for AI agents. It&#8217;s about making sure they understand what those dots mean.&#8221; &#8212; <a href="http://linkedin.com/in/swarnendurohan-gupta">Rohan Gupta</a>, Principal Product Manager at Harness</p></div><p><a href="http://linkedin.com/in/swarnendurohan-gupta">Rohan Gupta</a>, Principal Product Manager at <a href="https://www.harness.io/">Harness</a>, approaches the same problem from the perspective of an organization managing APIs across many teams and many services. His concern extends beyond the quality of any individual specification to the consistency of API design across the entire landscape. When agents operate in enterprise environments, they rarely interact with a single service in isolation. They move through workflows that cross multiple services, passing data and decisions from one system to another, and every inconsistency between how different teams have designed their APIs adds friction at the exact points where agents need to reason about how to connect things together.</p><p>Gupta&#8217;s view is that API specifications must be well-annotated and thoroughly documented so that agents can understand and execute the tasks they are given with accuracy and clarity, and that the design sloppiness which developers could historically compensate for becomes a structural blocker when the consumer is a machine reading a schema as its only source of truth. Missing descriptions, vague parameter names, inconsistent error handling patterns, and exposed implementation quirks that make no sense outside the context of the original development team all force agents into guesswork, and agents that guess tend to fail in ways that are difficult to reproduce and harder to debug than the original error would have been.</p><p>The governance problem becomes harder at the cross-service level. If one service in an agent&#8217;s workflow provides ambiguous or outdated information, the agent can be misled into triggering actions on a completely separate system in ways that no individual team would have anticipated or authorized. Lifecycle management for APIs that agents consume cannot focus only on backward compatibility within a single service anymore. It has to account for the cross-platform consistency and auditability of changes across every service in every workflow that agents are permitted to traverse, which is a meaningful expansion of what API governance has historically required.</p><h2>APIs that work for developers fail agents in production</h2><div class="pullquote"><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.linkedin.com/in/mayankbhola/" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-Evb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc010a6b-059a-4bf2-92a6-2007b6d92dfe_340x340.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-Evb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc010a6b-059a-4bf2-92a6-2007b6d92dfe_340x340.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-Evb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc010a6b-059a-4bf2-92a6-2007b6d92dfe_340x340.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-Evb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc010a6b-059a-4bf2-92a6-2007b6d92dfe_340x340.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-Evb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc010a6b-059a-4bf2-92a6-2007b6d92dfe_340x340.jpeg" width="264" height="264" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc010a6b-059a-4bf2-92a6-2007b6d92dfe_340x340.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:340,&quot;width&quot;:340,&quot;resizeWidth&quot;:264,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Mayank Bhola &#8211; Founder, LambdaTest | Startup Profile 2026 | Inc42&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.linkedin.com/in/mayankbhola/&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Mayank Bhola &#8211; Founder, LambdaTest | Startup Profile 2026 | Inc42" title="Mayank Bhola &#8211; Founder, LambdaTest | Startup Profile 2026 | Inc42" srcset="https://substackcdn.com/image/fetch/$s_!-Evb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc010a6b-059a-4bf2-92a6-2007b6d92dfe_340x340.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-Evb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc010a6b-059a-4bf2-92a6-2007b6d92dfe_340x340.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-Evb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc010a6b-059a-4bf2-92a6-2007b6d92dfe_340x340.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-Evb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc010a6b-059a-4bf2-92a6-2007b6d92dfe_340x340.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>&#8220;If you can&#8217;t explain why your agent made a decision, you&#8217;re not ready to go live.&#8221; &#8212; <a href="https://www.linkedin.com/in/mayankbhola/">Mayank Bhola</a>, Co-Founder and Head of Products at TestMu AI</p></div><p><a href="https://www.linkedin.com/in/mayankbhola/">Mayank Bhola</a>, Co-Founder and Head of Products at <a href="https://www.testmuai.com/">TestMu AI</a>, has a practitioner&#8217;s view of where the failure patterns actually surface when organizations move from building agentic systems in development to running them in production. The pattern he observes is consistent across teams and organizations. APIs that worked reliably for developer consumption fail at meaningful rates when agents start calling them, and the root cause is almost always constraints and rules that were documented in external guides or tribal knowledge rather than encoded explicitly in the specification itself, leaving agents with no mechanism for knowing those rules exist until they violate them and encounter a failure they cannot interpret.</p><p>The fix Bhola advocates for is not simply better documentation, because better documentation that lives outside the machine-readable contract is still invisible to agents. It requires rethinking how APIs surface information about their own behavior, making all constraints explicit within the spec itself and building API surfaces that are structured to reduce the cognitive overhead agents face when trying to understand what an endpoint does, when to call it, and what the consequences of calling it incorrectly might be. For organizations with established API landscapes, he recommends maintaining two parallel layers, with a legacy developer API preserving backward compatibility for existing integrations and an AI-optimized layer built on top of it that flattens nested data structures, makes all constraints and relationships explicit, and exposes capabilities at a level of abstraction that agents can act on without needing to combine multiple lower-level calls to accomplish a single business task.</p><p>Bhola believes the industry&#8217;s biggest blind spot is assuming that successful API consumption automatically leads to reliable agent behavior. In practice, many failures emerge after the API call succeeds. The agent selects the wrong tool, misinterprets context, follows an invalid reasoning path, or takes an action that technically satisfies the request but violates business intent. This is why validation infrastructure must be designed before deployment rather than after incidents occur.</p><p>Testing agentic systems requires teams to evaluate decision quality, tool selection accuracy, reasoning traceability, and behavioral consistency under changing conditions. The goal Bhola highlights is not just to verify outputs, but to understand whether the agent arrived at those outputs for the right reasons.</p><h2>Too many endpoints, not enough intent</h2><p>The structural problem underneath all of this is that most enterprise APIs are too fine-grained for agents to use reliably, even when every individual specification is perfectly written and maintained. As Wilde frames it, accomplishing anything meaningful often requires combining many different endpoints in a specific order that encodes implicit business logic which is obvious to a developer who understands the domain but entirely opaque to an agent that has only the API contracts to work from.</p><p>When doing something meaningful requires chaining thirty endpoints in the right sequence, agents become confused about how to combine them, inventive in ways that produce incorrect results, or they make errors partway through the sequence that cascade into larger failures that are difficult to unwind. Wilde&#8217;s position is that AI readiness requires reducing the number of endpoints agents are exposed to and improving the business alignment and intent-based nature of the APIs that remain, so that a workflow that wants to accomplish a task ideally needs only a single tool call rather than having to orchestrate many lower-level calls in the correct order. The solution he and his colleagues at Jentic are working toward is a workflow layer that sits above the existing fine-grained API landscape, exposing business-level capabilities that are designed for runtime discovery and agent consumption rather than for developer integration at build time.</p><p>This pattern already shows up in enterprise partner integrations. Organizations with complex APIs that they expose to partners face a specific version of the fine-grained problem, where a partner integrating with a large API surface has to understand the full landscape even when they only need a small part of it, and the engineering effort of that integration is significant enough to slow or block adoption entirely. </p><p>The solution Wilde describes is building purpose-built workflows for specific partners, so that a partner only needs to understand the workflows that were designed for their particular use cases rather than navigating the full API surface independently. The underlying APIs do not change. What changes is the layer of business-level capabilities that sits above them, designed for a specific consumer&#8217;s needs rather than for maximum flexibility across all possible consumers. The benefit for agents is the same as the benefit for partners, with fewer options to navigate, clearer intent at each step, and a much lower chance of combining things incorrectly.</p><p>The insight that makes this approach worth pursuing beyond its value for agents alone is one that Wilde makes explicit. This improvement is not only valuable for agents. Any developer who currently has to call fifteen underlying APIs to accomplish a task that should conceptually be a single operation would also benefit from a better-designed capability API on top of those underlying services. The investment in agent-readiness is an investment in the overall quality and usability of the API landscape, and the returns compound across every consumer of those APIs whether that consumer is a human developer or an autonomous agent running at runtime.</p><h2>The API layer is where the next two years are decided</h2><p>Wilde&#8217;s view of API lifecycle management is the right closing frame for this issue. Agents do not consume APIs the way developers do. They discover capabilities at runtime, decide whether a tool looks useful in the moment, and need machine-readable signals about what the API does, what constraints apply, what side effects it may trigger, and whether it is safe to keep using.</p><p>That changes how organizations need to think about versioning, deprecation, and governance. The old model assumes that a developer reads the documentation, notices a migration notice, and updates an integration on a schedule the team can manage. Agent-facing APIs need more of that information to be visible at runtime. If an API is being deprecated, if a capability is nearing sunset, or if a safer replacement exists, the consuming system needs a way to discover that signal before it makes a decision.</p><p>This is where API lifecycle management needs to move, and organizations that invest in the governance structures to support it now will be better positioned than those that wait for the pressure to become unavoidable. The agents are already in production, and the limiting factors are no longer model capability alone but integration, security, and operational scalability, which means the API layer is where the most consequential infrastructure work of the next two years will happen for most engineering organizations.</p><p>The same design assumption that broke enterprise APIs, that the consumer has context, judgment, and the ability to fill in gaps, is present in every other infrastructure layer that agents call at runtime. Wilde&#8217;s framing brings the issue back to a practical rule. Agents should not be used to compensate for infrastructure that fails to express intent, constraints, lifecycle state, or safe operating boundaries. The teams that build on infrastructure designed to make those signals explicit will ship more reliable agentic systems than those still working around infrastructure that was never designed for this kind of consumer.</p><div><hr></div><p>Thank you for reading this special issue of Deep Engineering on why the API layer has become the most consequential infrastructure problem in enterprise AI. </p><p>We&#8217;ll be back on Thursday with more expert-led content, and next month, on the first Tuesday of July, with another special issue.</p><p><strong>Keep building,<br></strong>Saqib Jan<br>Editor-in-Chief, Deep Engineering</p>]]></content:encoded></item><item><title><![CDATA[Deep Engineering #49: David Knickerbocker on Open Source Intelligence and Real-World AI Systems]]></title><description><![CDATA[Why messy, contradictory data changes how engineers should think about retrieval, judgment, and production AI]]></description><link>https://deepengineering.net/p/issue49-david-knickerbocker-open-source-intelligence-real-world-ai-systems</link><guid isPermaLink="false">https://deepengineering.net/p/issue49-david-knickerbocker-open-source-intelligence-real-world-ai-systems</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Thu, 28 May 2026 17:05:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b96406ea-9c17-4f34-9cc4-143870c16a5f_2752x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong><a href="http://daily.dev/">All the dev content that matters, in one personalized feed</a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="http://daily.dev/" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b-4k!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db2d351-66d6-477a-aac7-b5c9cd3ef8fe_800x500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!b-4k!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db2d351-66d6-477a-aac7-b5c9cd3ef8fe_800x500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!b-4k!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db2d351-66d6-477a-aac7-b5c9cd3ef8fe_800x500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!b-4k!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db2d351-66d6-477a-aac7-b5c9cd3ef8fe_800x500.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b-4k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db2d351-66d6-477a-aac7-b5c9cd3ef8fe_800x500.jpeg" width="800" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4db2d351-66d6-477a-aac7-b5c9cd3ef8fe_800x500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;http://daily.dev/&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!b-4k!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db2d351-66d6-477a-aac7-b5c9cd3ef8fe_800x500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!b-4k!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db2d351-66d6-477a-aac7-b5c9cd3ef8fe_800x500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!b-4k!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db2d351-66d6-477a-aac7-b5c9cd3ef8fe_800x500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!b-4k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db2d351-66d6-477a-aac7-b5c9cd3ef8fe_800x500.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><a href="http://daily.dev/">daily.dev</a> is a professional network for developers, built around a personalized feed of the best content from across the dev ecosystem. Millions of developers use it to stay current with their stack, discover new tools and frameworks, and connect with a global community that shares what they're learning. </p><p>Whether you're an early-career engineer levelling up or a senior dev tracking what's next, <a href="http://daily.dev/">daily.dev</a> makes sure the signal reaches you - without the noise. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;http://daily.dev/&quot;,&quot;text&quot;:&quot;Join for free at daily.dev&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="http://daily.dev/"><span>Join for free at daily.dev</span></a></p><div><hr></div><p><strong>&#9997;&#65039; From the editor&#8217;s desk,</strong></p><p>Welcome to the <strong>49th</strong> issue of Deep Engineering!</p><p>Earlier this month, CISA and its international cybersecurity partners released <em><a href="https://www.cisa.gov/resources-tools/resources/careful-adoption-agentic-ai-services">Careful Adoption of Agentic AI Services</a></em>, a guide for organisations adopting AI systems that can plan, use tools, access data, and act across digital environments. That changes the risk model because AI systems operating inside real workflows inherit risk from the surrounding data, permissions, tools, and context.</p><p>That risk is becoming easier to understand in practice. On 23 May 2026, Rohan Pandey of DigitalOcean and Archit Bhujang of Arizona State University published <em><a href="https://arxiv.org/abs/2605.24421">Poisoning the Watchtower</a></em>, which shows how logs, alerts, URLs, payloads, DNS queries, and usernames can carry attacker written instructions into LLM assisted security workflows.</p><p>AI systems do not only consume clean prompts from users. They consume context from operational systems, open web sources, documents, logs, tools, and knowledge bases that the model does not control. Once that context includes contradiction, deception, malicious text, or attacker controlled content, relevance alone becomes an unsafe target for retrieval and summarisation.</p><p><a href="https://www.linkedin.com/in/dkjapan">David Knickerbocker</a>, founder of <a href="https://www.verdantintel.com/">Verdant Intelligence</a> and author of <a href="https://www.packtpub.com/en-us/product/network-science-with-python-9781801073691">Network Science with Python</a> (Packt), builds systems for Open Source Intelligence (OSINT) environments where messy and adversarial data is normal. His perspective matters in this issue because the systems he builds separate observing from judging, treat claims as claims rather than facts, and preserve minority signals that simpler retrieval pipelines often discard.</p><blockquote><p>In <a href="https://deepengineering.substack.com/p/issue43-building-ai-that-sees-the-world-as-it-is-david-knickerbocker">issue 43</a>, we looked at Knickerbocker&#8217;s work on real-time knowledge graphs and AI systems that treat knowledge as a live stream of claims. Today&#8217;s issue continues that conversation with what OSINT teaches engineers about messy, adversarial data. You can also watch our interview or read the full Q&amp;A <a href="https://deepengineering.substack.com/p/knowledge-graphs-graphrag-and-real">here</a>.</p></blockquote><p>Let&#8217;s get started.</p><div><hr></div><p><strong><a href="https://www.eventbrite.co.uk/e/claude-code-for-software-engineering-from-prompts-to-systems-tickets-1988571262176?aff=deepeng">Claude Code for Software Engineering</a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.eventbrite.co.uk/e/claude-code-for-software-engineering-from-prompts-to-systems-tickets-1988571262176?aff=deepeng" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5k27!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 424w, https://substackcdn.com/image/fetch/$s_!5k27!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 848w, https://substackcdn.com/image/fetch/$s_!5k27!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 1272w, https://substackcdn.com/image/fetch/$s_!5k27!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5k27!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png" width="900" height="300" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:300,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.eventbrite.co.uk/e/claude-code-for-software-engineering-from-prompts-to-systems-tickets-1988571262176?aff=deepeng&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!5k27!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 424w, https://substackcdn.com/image/fetch/$s_!5k27!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 848w, https://substackcdn.com/image/fetch/$s_!5k27!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 1272w, https://substackcdn.com/image/fetch/$s_!5k27!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e48a8b5-0cba-47a2-853b-baf70c32c7d7_900x300.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Learn how to structure Claude Code with context, reusable skills, scoped instructions, and guardrails so it works reliably across real codebases and team workflows.</p><p>&#128467;&#65039; Friday, June 20 &#183; 10:30 AM EDT onwards</p><p style="text-align: center;"> Use code <strong>DEEPENG50</strong> for 50% off.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.eventbrite.co.uk/e/claude-code-for-software-engineering-from-prompts-to-systems-tickets-1988571262176?aff=deepeng&quot;,&quot;text&quot;:&quot;Register here&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.eventbrite.co.uk/e/claude-code-for-software-engineering-from-prompts-to-systems-tickets-1988571262176?aff=deepeng"><span>Register here</span></a></p><div><hr></div><p>Expert Insights</p><h2>Building AI Systems That Handle Contradiction at Scale</h2><p><em>by <a href="https://in.linkedin.com/in/s-jan">Saqib Jan</a> with <a href="https://www.linkedin.com/in/dkjapan">David Knickerbocker</a></em></p><p>Most engineers building AI systems have never had to question whether their data source is working against them. The data comes, is processed, retrieved, and the system responds. The assumption underneath all of that is that the source is cooperative, that it was created to convey information accurately, stored in a format designed for retrieval, and that what comes back when you query it is at least an honest attempt at an answer. The problem is that assumption is so embedded in how most AI systems are designed that it never gets examined.</p><p><a href="https://www.linkedin.com/in/dkjapan">David Knickerbocker</a>, founder of <a href="https://www.verdantintel.com/">Verdant Intelligence</a> and author of <a href="https://www.packtpub.com/en-us/product/network-science-with-python-9781801073691">Network Science with Python</a> (Packt), builds systems for environments where data is not clean, settled, or cooperative. His AI systems ingest from the open web, across sources that contradict each other, where some information may be misleading, incomplete, or adversarial. The engineering challenge is not only making retrieval accurate. It is making the system useful when the real world refuses to behave like a clean dataset.</p><h3>The assumption that data is helpful</h3><p>Engineers who have worked primarily with internal databases, structured APIs, or carefully assembled training sets carry a baseline assumption that data is cooperative. It was created to convey information accurately, stored in a format designed for retrieval, and accessed through interfaces that return what was asked for. The job of the retrieval system is to find the right thing efficiently.</p><p>Open-source intelligence does not work this way. When ingesting from the open web at scale, some fraction of what arrives is wrong, some is deliberately misleading, and some represents one side of a contested claim. For Knickerbocker, the ingestion layer is not the right place to decide what is true. &#8220;You can have two different groups that are in opposition from each other,&#8221; he says. &#8220;One group will say this is the truth, and another group will say this is the truth, and they will be in direct conflict with each other.&#8221; The system&#8217;s job, in that moment, is to capture what is being claimed and preserve enough context for judgment to happen later.</p><div class="pullquote"><p>&#8220;The real world is a messy space. It is not just that websites disagree with each other. Websites also have malware. If you point your servers at websites and you just download everything that is on them, then you need to be prepared for the consequences of downloading malware.&#8221;</p></div><p>The practical design response is to treat the system as an observer rather than an adjudicator. Knickerbocker draws that line clearly. &#8220;My systems do not care who is right or wrong,&#8221; he explains. &#8220;They just do not. My systems are observers.&#8221; The point is not neutrality as a value statement. It is an architectural boundary. The system captures what is being said, keeps competing claims visible, and avoids collapsing observation into judgment too early.</p><p>This distinction matters far beyond open-source intelligence. Any AI system that draws on user-generated content, social media, news, or unstructured enterprise data is working with material that was not created to be machine-readable and was not vetted before ingestion. The assumption that the data is trying to help is not just wrong in those environments. It is a liability.</p><p></p><h3>Bigger clusters are not more important than smaller ones</h3><p>One of the quieter failures in production NLP systems is the treatment of minority signals as noise. A similarity-based retrieval system returns the most representative results, which in practice means the most common results. A clustering pipeline that surfaces the largest groups first will consistently deprioritize small but significant signals. In a world where the interesting thing is often the outlier, that is a serious problem.</p><p>In open-source intelligence specifically, this failure mode has consequences. A small cluster of claims pointing toward something dangerous is not less important because it is small. A single source saying something that contradicts the majority view is not less worth capturing because it is in the minority. &#8220;Bigger clusters are not more important than smaller clusters,&#8221; Knickerbocker observes. &#8220;In open source intelligence, everything matters, top to bottom.&#8221;</p><p>Drawing from his engineering experience building these systems, Knickerbocker ensures his APIs return full context rather than a ranked shortlist. &#8220;If you use a tool to do a search to find out something, you are getting a snapshot of time,&#8221; he says. His systems are designed to capture what he calls the heartbeat of the internet. &#8220;If I use my API... it is going to come back with 10,000 things. My APIs do not return 10. They return full context.&#8221; That creates a harder downstream problem because the question is no longer how to retrieve the best few results. It is how to make a large, shifting body of claims usable without discarding the signals that do not look dominant at first.</p><p>The parallel for general AI systems is specific and direct. Any retrieval or summarisation pipeline that privileges majority signal is making a judgment call that the most common view is the most relevant one. That judgment call is often wrong, and it is invisible because the discarded minority signal never surfaces.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://deepengineering.net/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 Packt Deep Engineering! Subscribe for free to receive new posts and support our 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><h3>The difference between a claim and a fact</h3><p>Engineers trained on factual datasets tend to build systems that treat retrieved content as facts to be combined and presented. The underlying assumption is that if the source is credible and the retrieval is accurate, what comes back is true. In a contested information environment that assumption collapses immediately, and the design has to change with it.</p><p>Knickerbocker&#8217;s approach separates the task of capturing claims from the task of evaluating them. What a source says is observable. Whether what it says is correct requires judgment that depends on context, corroboration, and often human expertise that the system does not have. Turning that claim into an evaluated fact requires a different layer of judgment, and Knickerbocker is careful not to build that decision into the first act of ingestion. &#8220;I do not make that decision, and I do not allow my AI to make the decision what is true or what is false either,&#8221; he says. &#8220;I am more interested in what people are claiming is what is going on in the world.&#8221;</p><p>This design choice has a significant downstream consequence. It means the system can handle contradiction without breaking. Two sources saying opposite things about the same event are not a problem to resolve at the retrieval layer. They are two data points, both of which belong in the response. Knickerbocker simply logs these varied claims as parallel ribbons of information. The human or the downstream system that receives them can then apply judgment about which to act on, in what context, and with what confidence.</p><h3>The verification boundary</h3><p>One of the hardest design decisions in any AI system that works with real-world data is where to draw the line between surfacing an insight and making an actionable claim. The two feel similar at the output layer but require very different things from the system that produces them.</p><p>In our <a href="https://deepengineering.substack.com/p/knowledge-graphs-graphrag-and-real">live interview</a>, Knickerbocker was specific about where that line sits. &#8220;Everything that I do is intentional,&#8221; he shares. His real-time intelligence layer is built for awareness. It captures what is happening and surfaces it without making the final judgment on what should be done next. If a piece of intelligence looks actionable, the system does not automatically act on it. It surfaces the signal so a human or downstream process can decide whether it matters, who should see it, and what level of confidence is appropriate.</p><div class="pullquote"><p>&#8220;There are still certain parts that I like being a human being. Some things you just need to be aware of. Like, you do not need to respond to everybody. But it is good to know what is on the radar.&#8221;</p></div><p>In practice, this means that even when a piece of intelligence looks clearly actionable, the system does not act on it. It surfaces it. The routing of that intelligence to the right person or the right downstream process is a separate engineering and organisational problem, and conflating it with the retrieval problem produces systems that are either too conservative to be useful or too confident to be trusted.</p><p>This is a principle with broad application. AI systems that are asked to be both the observer and the actor tend to perform neither role well. Keeping the observation layer and the action layer separate, with a clear boundary between them, is one of the most reliable ways to build something that stays trustworthy as it scales.</p><h3>Entity extraction gets easier but never clean</h3><p>Entity extraction from clean text is comparatively well understood. The models are good, the cleanup is manageable, and the output is reliable enough for most downstream uses. Entity extraction from the open web at scale is a different challenge, not because the models are worse but because the data has properties that laboratory text does not.</p><p>Knickerbocker began this work in 2018, starting with part-of-speech tagging before NER models were mature, moving to spaCy as those models improved, and more recently using LLMs for extraction. The trajectory is one of improving reliability rather than changing fundamentals. &#8220;Entity extraction has improved a lot since 2015,&#8221; he notes. &#8220;I mostly have to just throw away less. I have less cleaning to do, and it gets things right a lot easier.&#8221;</p><p>What has not changed is the messiness. Natural language processing at scale on real-world text always produces noise. The question is how much noise is acceptable for the downstream use case and how to handle the cleaning efficiently. At the scale he describes from previous work, including entity extraction across internet-scale datasets, the cleaning cannot be purely manual. It has to be part of the pipeline rather than an editorial step applied after the fact.</p><p>He also flags a risk in the current extraction approach that is worth understanding. Older NLP models produced visible noise that engineers learned to catch and correct. LLM-based extraction produces outputs that look clean even when they are wrong, because the model is good at generating confident-looking text regardless of underlying accuracy.</p><div class="pullquote"><p>&#8220;LLMs are a little bit dangerous because the messiness goes away. People are a little bit more trusting of LLMs than older NLP. When you are using LLMs, everything just looks perfect. And that is kind of a dangerous downside too.&#8221;</p></div><p>The implication for engineers is that moving to LLMs for extraction does not reduce the need for validation. It makes validation harder to remember because the outputs no longer look like they need it.</p><h3>Building for the world that actually exists</h3><p>The thread running through Knickerbocker&#8217;s work is a commitment to grounding. He builds systems for the world as it is, not a cleaned version of it. That leads to a specific set of design choices: treat data as claims rather than facts, preserve minority signals, separate awareness from judgment, and let the system observe before any person or downstream workflow decides what to do next.</p><p>Those principles come from the kinds of environments Knickerbocker has worked in: data operations, cybersecurity, open-source intelligence, and production systems where the cost of getting something wrong is real. &#8220;The real world is a messy space,&#8221; he says. &#8220;Natural language processing is just messy. I have not seen it get really cleaned up yet.&#8221;</p><p>For engineers who have worked mostly with clean internal systems, that might sound like a warning about a narrow class of hard problems. It is broader than that. Any AI system that deals with content created by people, pulled from the web, generated by users, or routed through operational systems eventually has to confront the same condition. Real-world data is messy by default. The systems that handle it well are intentionally designed for that mess before it becomes a production failure.</p><div><hr></div><h3>In case you missed </h3><p></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;7b9be39e-b4b3-4942-92f8-1c092f6cf44f&quot;,&quot;caption&quot;:&quot;Real-time knowledge graphs, awareness before truth, and why an empty dataset is better than a hallucination&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Deep Engineering #43: David Knickerbocker on Building AI That Sees the World as It Is, Not as It Was&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:427210082,&quot;name&quot;:&quot;Saqib Jan&quot;,&quot;bio&quot;:&quot;/localhost&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997a788a-cd78-4f84-9b3b-c72ab6dc0153_1008x1008.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-04-16T15:30:00.000Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/542c8988-3aa8-439a-94c1-20a10d857430_716x421.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://deepengineering.substack.com/p/issue43-building-ai-that-sees-the-world-as-it-is-david-knickerbocker&quot;,&quot;section_name&quot;:&quot;Newsletter Issues&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:194401065,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:7,&quot;comment_count&quot;:2,&quot;publication_id&quot;:1729053,&quot;publication_name&quot;:&quot;Packt Deep Engineering&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!H5BJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F736bc1ee-d689-497e-83a8-7d9bf9022eb9_600x600.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;d5bd6b9c-b1b5-4c08-84a4-9c2a022c147e&quot;,&quot;caption&quot;:&quot;This conversation with David Knickerbocker keeps returning to a single conviction: the best engineering starts with intentional problem definition, and most AI failures happen when teams rush to use a tool before understanding what they are actually trying to build.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Knowledge Graphs, GraphRAG, and Real-Time AI in Production with David Knickerbocker&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:427210082,&quot;name&quot;:&quot;Saqib Jan&quot;,&quot;bio&quot;:&quot;/localhost&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997a788a-cd78-4f84-9b3b-c72ab6dc0153_1008x1008.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-04-15T12:30:00.000Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93b09a18-df5c-49af-93ca-6f4d45a26bdc_1920x1080.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://deepengineering.substack.com/p/knowledge-graphs-graphrag-and-real&quot;,&quot;section_name&quot;:&quot;Interviews&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:194390901,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:6,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1729053,&quot;publication_name&quot;:&quot;Packt Deep Engineering&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!H5BJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F736bc1ee-d689-497e-83a8-7d9bf9022eb9_600x600.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p></p><div><hr></div><h2><strong>&#128736;&#65039; Tool of the Week</strong></h2><p><strong><a href="https://github.com/microsoft/graphrag">GraphRAG</a> &#8212; A graph-based retrieval pipeline for unstructured text</strong></p><p>GraphRAG helps teams preserve relationships across messy documents, conflicting claims, and large text collections before asking an LLM to answer.</p><p><strong>Highlights:</strong></p><ul><li><p>Builds knowledge graphs from unstructured text instead of relying only on isolated chunks.</p></li><li><p>Links entities, claims, and topics so retrieval can use structure, not just similarity.</p></li><li><p>Supports local and global search for both narrow evidence lookup and corpus-level synthesis.</p></li><li><p>Gives engineers a practical starting point for testing graph-based RAG patterns.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/microsoft/graphrag&quot;,&quot;text&quot;:&quot;Learn more about GraphRag&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/microsoft/graphrag"><span>Learn more about GraphRag</span></a></p><div><hr></div><h1><strong>&#128206; Tech Briefs</strong></h1><ul><li><p><a href="https://support.claude.com/en/articles/15167101-get-started-with-claude-compliance-api-integrations">Claude Compliance API Integrations</a> - Compliance API integrations help IT and security teams govern Claude across connected enterprise workflows.</p></li><li><p><a href="https://meet.modelcontextprotocol.io/2026/05">MCP Events Working Groups</a> - Gateway, transport, registry, and agents groups advanced protocol work around tool-connected AI systems.</p></li><li><p><a href="https://ragflow.io/docs/release_notes">RAGFlow v0.25.6</a> - Browser agents and RAPTOR AHC mode expand RAGFlow from document retrieval into web-aware ingestion workflows.</p></li><li><p><a href="https://github.com/qdrant/qdrant/releases/tag/v1.18.1">Qdrant v1.18.1</a> &#8212; Vector dimension validation before WAL writes reduces ingestion failure risk during async upserts.</p></li><li><p><a href="https://github.com/weaviate/weaviate/releases/tag/v1.38.0-rc.0">Weaviate v1.38.0-rc.0</a> - Nested object filtering and namespace support improve retrieval precision for structured, multi-tenant corpora.</p></li></ul><div><hr></div><p>That&#8217;s all for today. Thank you for reading this issue of Deep Engineering.</p><p>We&#8217;ll be back next week with more expert-led content.</p><p>Keep building,</p><p>Saqib Jan </p><p>Editor-in-Chief, Deep Engineering</p><div><hr></div><p><em>If your company is interested in reaching an audience of senior developers, software engineers, and technical decision-makers, you may want to </em><strong><a href="https://packt.omeclk.com/portal/wts/uc%5EcnN2dfNaqmD-kB-mo66%7C7g%5Ef%7Cb">advertise with us</a></strong><em>.</em></p>]]></content:encoded></item><item><title><![CDATA[Compute Obsession Is Slowing Down AI Systems]]></title><description><![CDATA[Why data movement costs more than computation and what most engineers building AI systems are getting wrong because of it]]></description><link>https://deepengineering.net/p/compute-obsession-slowing-down-ai-systems</link><guid isPermaLink="false">https://deepengineering.net/p/compute-obsession-slowing-down-ai-systems</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Tue, 26 May 2026 05:30:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1d53f5cf-8656-4090-8fec-27c78e53b139_690x330.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Engineers building AI systems today tend to focus on compute first. It is typically about how many GPU cores, how many parameters, how much VRAM, and how to extract more from all of it. While the benchmarks are about throughput and inference speed, the infrastructure conversations are about scaling horizontally across more hardware.</p><p><a href="https://www.linkedin.com/in/jimledin">Jim Ledin</a>, a seasoned engineering leader, CEO of <a href="https://ledin.com/">Ledin Engineering</a> and author of <a href="https://www.packtpub.com/en-us/product/modern-computer-architecture-and-organization-9781806028023">Modern Computer Architecture and Organization</a> (third edition, Packt), thinks that framing misses the most important constraint in production AI systems. The bottleneck holding back real-world AI performance is not compute but data movement.</p><p>&#8220;Data movement can often be more expensive than the actual computation steps,&#8221; Ledin says. &#8220;The latency, especially moving large data structures across different levels of the memory hierarchy, can dominate and leave a lot of your compute bandwidth idle.&#8221; This is not a niche embedded systems concern. It is happening in the largest AI deployments in the world, and it is the reason hardware vendors like NVIDIA are designing systems the way they are today.</p><blockquote><p><strong>Continue reading</strong> or watch the full conversation with Jim Ledin below.</p></blockquote><div id="youtube2-Q21CJXfQLOk" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;Q21CJXfQLOk&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/Q21CJXfQLOk?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p></p><h2>Memory bandwidth is slowing your AI system more than your GPU is</h2><p>When a CPU or GPU requests data from memory and that data is not available in cache, the processor waits while the computation units sit idle. In a consumer application, that idle time seems like a minor inconvenience. But in an AI system processing large tensors continuously, it accumulates into a significant fraction of total runtime.</p><p>&#8220;AI workloads are becoming increasingly memory bandwidth limited,&#8221; Ledin shares, pointing to a dynamic that is reshaping how AI hardware gets built. &#8220;It is taking more time to bring data into the GPU or TPU memory than it is taking for the computation to take place on the data.&#8221; The raw ability to multiply matrices is no longer the binding constraint. But getting the data to the multipliers fast enough is.</p><p>This is exactly why high bandwidth memory exists. HBM modules are stacks of RAM chips built into a cube, physically close to the processing units, with far higher data transfer rates than conventional DRAM. &#8220;On a TPU card, you typically have several of these HBM modules,&#8221; Ledin explains, &#8220;and they have a far higher data rate for transferring data in and out of the GPU processing components than on a typical consumer grade GPU.&#8221; The engineering bet being made with systems like NVIDIA&#8217;s Blackwell architecture is that memory bandwidth is worth more than raw core count, because the cores are already faster than the data can reach them.</p><p>But there is a side effect that touches anyone buying consumer hardware. &#8220;A lot of the production capacity for memory is going into these high bandwidth memory modules, which cost a lot more for the purchaser and make a lot more money for the vendor,&#8221; Ledin observes. That is a direct reason DDR5 has been difficult to find and expensive when available. The memory fabs are prioritizing the more profitable HBM production, and consumer DRAM is downstream of that decision.</p><h2>The hardware cost your cloud bill is hiding</h2><p>Most software engineers, especially those working in cloud environments, treat the hardware as someone else&#8217;s concern. The abstraction is good enough, the managed services handle the infrastructure, and the code runs somewhere. Ledin&#8217;s argument is that this hands-off relationship with hardware has a real cost that shows up in performance and in cloud bills.</p><p>&#8220;If your code is accessing memory in inefficient patterns, if you are not using the cache memory within the processor in an effective manner, and if you are just moving data around more than is necessary, that can all have significant performance impacts,&#8221; he warns. The CPU requests data from memory, and if it is not in cache, it waits. &#8220;A lot of the time it is unavoidable, but the amount of latency can be minimized by different ways of optimizing algorithms.&#8221;</p><p>The mechanics are specific. When a modern CPU reads from DRAM, even a single byte triggers a 64-byte cache line transfer. The processor brings in a block of adjacent memory whether it needs all of it or not. If the algorithm then jumps to a different memory location, causes that block to be evicted from cache, and later needs it again, it has to re-read it from DRAM. That is wasted time. &#8220;For best efficiency, you would want your code to be working with data from that block before it moves on to something else,&#8221; Ledin explains, &#8220;rather than bouncing around to other memory locations.&#8221;</p><p>In a cloud environment, this inefficiency does not just slow things down. It costs money, and there is no incentive for cloud providers to surface it clearly. &#8220;You are paying for the usage of the system whether the CPU is actually crunching instructions or the CPU is idle waiting for a data item to come in from memory,&#8221; he points out. The cloud bill does not distinguish between productive cycles and stall cycles. Engineers who understand cache locality can write code that reduces stalls and therefore reduces cost, not just latency. Optimizing for cost comes down to understanding your memory access patterns and engineering around them, not just choosing the right managed tooling stack.</p><p>Drawing from his engineering work across embedded and production systems, Ledin shares a useful example. A Linux web server called Tux, which ran in kernel space to avoid user-to-kernel data transfers, developed a performance problem under high load because its per-request state data grew large enough to exceed the CPU&#8217;s level two cache. &#8220;Performance dropped off sharply,&#8221; he recalls. Engineers analyzed the cache behavior, restructured the data layout to keep per-request state smaller, and did the same for instruction caching by batching related processing together. &#8220;Fixes that they implemented increased the application performance by about 40%.&#8221; No new hardware, no architectural overhaul. Just understanding where the memory ceiling was and designing around it.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://deepengineering.net/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">Deep Engineering publishes weekly expert-led insights on systems design, architecture, and real-world engineering. <strong>Subscribe for free!</strong></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>GPUs are the right tool, but not always for the reason you think</h2><p>The assumption that GPUs are the correct architecture for AI workloads is not wrong, but it is incomplete in a way that matters for engineers making infrastructure decisions. Ledin draws a distinction that is often glossed over in the mainstream conversation about AI hardware.</p><p>&#8220;GPUs are probably the ideal architecture today for people and small companies that want to run language models locally,&#8221; he says, drawing from personal experience. He recently ran the Gemma 4 26-billion-parameter model on an NVIDIA RTX 4090, and for that use case the GPU is the right tool. But for larger-scale deployments running the much larger frontier models, the picture is different. &#8220;The trend there is for dedicated TPUs,&#8221; he notes.</p><p>The distinction matters because GPUs carry silicon dedicated to graphics work that has nothing to do with tensor operations. A consumer GPU has hardware for real-time video rendering, gaming pipelines, and display output. A TPU does not. &#8220;TPUs do not use up silicon for that purpose and focus everything on the tensor work,&#8221; Ledin explains. When you are running thousands of inference requests at scale, that difference in silicon allocation translates directly into efficiency at the workload that actually matters.</p><p>There is also the SIMT execution model to understand. Modern NVIDIA GPUs run 32 threads in lockstep, all executing the same instruction on different data streams simultaneously. This is efficient for linear, parallel workloads. When those threads hit a branch, a conditional where some threads take the if path and some take the else path, the hardware executes one side then goes back and executes the other. &#8220;You basically have effectively a pipeline stall where it has to go back and execute a different thread in that kind of situation,&#8221; Ledin highlights. The flexibility is there, but it comes at a cost. &#8220;Avoiding branching if possible can have a significant impact on performance.&#8221;</p><p>For engineers deciding where to run inference workloads, Ledin offers a practical heuristic. &#8220;The GPU only really becomes attractive when you have enough work for it to do that it can be parallelized and enough that it will amortize the costs associated with moving data onto the GPU, launching the kernels, and doing the management work to transfer data to and from the GPU.&#8221; If the workload is not large enough to keep the GPU busy, the CPU implementation may be faster because it avoids all that overhead entirely.</p><h2>Frameworks are hiding costs that engineers need to see</h2><p>Frameworks and libraries have made it possible to build sophisticated AI systems without ever thinking about what is happening in hardware. That is mostly a good thing. The abstraction accelerates development and reduces mistakes. But there is a point where abstraction stops being a benefit and starts hiding costs that need to be visible.</p><p>&#8220;Where it becomes dangerous to use too much abstraction is when it obscures what is happening with the data layout in memory and the execution patterns,&#8221; Ledin cautions. In performance-critical applications, the framework is making decisions about how data is structured and how the processor interacts with it. If the engineer does not know what those decisions are, they cannot tell when they are working against the hardware.</p><p>The practical approach Ledin recommends is a two-layer architecture. &#8220;Use the most expressive code at the edges of the system, and in the core, use more performance-aware code.&#8221; The boundary between those layers is not always obvious in advance, and finding it usually requires benchmarking rather than reasoning. But the principle is clear: abstractions are appropriate where they preserve meaning across the team, and they become a problem where they hide costs that affect the system&#8217;s ability to meet its requirements.</p><p>One specific pattern worth knowing is the array of structures versus structure of arrays tradeoff. A common data layout is an array of objects, where each object holds all the fields for one entity. For CPU cache efficiency, it can be significantly better to restructure this as a structure of arrays, where each field is stored as a separate array for all entities. &#8220;That might have a big impact on performance,&#8221; Ledin notes, because the CPU cache loads contiguous memory, and if the algorithm is operating on one field across many entities, the structure of arrays layout means each cache load is full of useful data rather than fields the algorithm is not touching.</p><h2>The skills that will matter when the hardware changes again</h2><p>The specific technologies that matter five years from now are difficult to predict, and Ledin is honest about that. &#8220;Four years ago when the previous version of my book came out, it was not at all clear to me, or I think a lot of people, what was going to be happening with AI in the coming years,&#8221; he says. Predicting which hardware architectures or AI frameworks will dominate is not the point. Building the mental model to understand them when they appear is.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.packtpub.com/en-us/product/modern-computer-architecture-and-organization-9781806028023" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qFZO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae0cb75-2765-4af0-bdaa-f6514e4ac96c_2250x2775 424w, https://substackcdn.com/image/fetch/$s_!qFZO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae0cb75-2765-4af0-bdaa-f6514e4ac96c_2250x2775 848w, https://substackcdn.com/image/fetch/$s_!qFZO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae0cb75-2765-4af0-bdaa-f6514e4ac96c_2250x2775 1272w, https://substackcdn.com/image/fetch/$s_!qFZO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae0cb75-2765-4af0-bdaa-f6514e4ac96c_2250x2775 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qFZO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae0cb75-2765-4af0-bdaa-f6514e4ac96c_2250x2775" width="336" height="414.46153846153845" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dae0cb75-2765-4af0-bdaa-f6514e4ac96c_2250x2775&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1796,&quot;width&quot;:1456,&quot;resizeWidth&quot;:336,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Modern Computer Architecture and Organization&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.packtpub.com/en-us/product/modern-computer-architecture-and-organization-9781806028023&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Modern Computer Architecture and Organization" title="Modern Computer Architecture and Organization" srcset="https://substackcdn.com/image/fetch/$s_!qFZO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae0cb75-2765-4af0-bdaa-f6514e4ac96c_2250x2775 424w, https://substackcdn.com/image/fetch/$s_!qFZO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae0cb75-2765-4af0-bdaa-f6514e4ac96c_2250x2775 848w, https://substackcdn.com/image/fetch/$s_!qFZO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae0cb75-2765-4af0-bdaa-f6514e4ac96c_2250x2775 1272w, https://substackcdn.com/image/fetch/$s_!qFZO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae0cb75-2765-4af0-bdaa-f6514e4ac96c_2250x2775 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><strong>3rd Edition</strong></figcaption></figure></div><p>The foundational skill is the ability to reason across abstraction layers. &#8220;The way to really understand the system requires the ability to reason across all of the abstraction layers from the software framework that you are working on at the top level, all the way down to the hardware that runs the code,&#8221; Ledin underscores. That does not mean reading assembly code for every application. It means understanding how pipelines and caches work and orienting code to work within those environments rather than against them.</p><p>The other shift is heterogeneous computing. Writing code that runs on a CPU is no longer sufficient context for many engineering problems. &#8220;It is also becoming more critical to understand heterogeneous computing environments,&#8221; Ledin says. &#8220;It is not just writing code that runs on a CPU. You might also have code that interacts with the GPU if you are running a parallelized algorithm on that, whether it is a language model or something else.&#8221; Domain-specific accelerators, TPUs, RISC-V implementations, and specialized inference chips are all becoming part of the environments that production engineers have to reason about. The engineers who will be most effective in that landscape are the ones who understand why those architectures make the tradeoffs they do, not just how to call their APIs.</p><div><hr></div><p><em>This article is based on <strong>Deep Engineering #46</strong>. You can read the full issue, including additional insights from Jim Ledin on modern computer architecture and AI infrastructure,</em></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;b15102d9-d90c-4b9c-a26f-9fb34ceb12fa&quot;,&quot;caption&quot;:&quot;Memory bandwidth, GPU trade-offs, and the infrastructure decisions that determine whether AI systems are resilient up in production.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Deep Engineering #46: Jim Ledin on Modern Computer Architecture and the AI Infrastructure Layer&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:427210082,&quot;name&quot;:&quot;Saqib Jan&quot;,&quot;bio&quot;:&quot;/localhost&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997a788a-cd78-4f84-9b3b-c72ab6dc0153_1008x1008.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null},{&quot;id&quot;:284339563,&quot;name&quot;:&quot;Jim Ledin&quot;,&quot;bio&quot;:&quot;Embedded system developer and cybersecurity tester. Author of \&quot;Modern Computer Architecture and Organization\&quot; and \&quot;Architecting High-Performance Embedded Systems.\&quot;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d7d3f2aa-9d0a-426d-b514-634881eff942_144x144.png&quot;,&quot;is_guest&quot;:true,&quot;bestseller_tier&quot;:null,&quot;primaryPublicationSubscribeUrl&quot;:&quot;https://jimledin.substack.com/subscribe?&quot;,&quot;primaryPublicationUrl&quot;:&quot;https://jimledin.substack.com&quot;,&quot;primaryPublicationName&quot;:&quot;Jim Ledin&quot;,&quot;primaryPublicationId&quot;:8979199}],&quot;post_date&quot;:&quot;2026-05-07T15:03:11.734Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8adf3738-2898-4207-9a54-e3709b1e9c3c_850x400.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://deepengineering.substack.com/p/issue-46-jim-ledin-computer-architecture-ai-infrastructure-layer&quot;,&quot;section_name&quot;:&quot;Newsletter Issues&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:196768803,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:11,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1729053,&quot;publication_name&quot;:&quot;Packt Deep Engineering&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!H5BJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F736bc1ee-d689-497e-83a8-7d9bf9022eb9_600x600.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div>]]></content:encoded></item><item><title><![CDATA[Deep Engineering #48: Erik Wilde on Agent-Ready APIs, Widespread MCP Adoption, and the OpenAPI Standards That Matter]]></title><description><![CDATA[On the abstraction level problem, the limits of linting, and why investing in your API foundation matters more than chasing the current delivery protocol]]></description><link>https://deepengineering.net/p/agent-ready-apis-mcp-adoption-openapi-standards</link><guid isPermaLink="false">https://deepengineering.net/p/agent-ready-apis-mcp-adoption-openapi-standards</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Thu, 21 May 2026 17:43:11 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d8a775e3-e4ed-4323-a21b-de0e1b0915e0_1266x530.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong><a href="https://www.eventbrite.co.uk/e/building-reliable-ai-agents-with-java-and-langchain4j-tickets-1987887565220?aff=deepeng">Building Reliable AI Agents with Java and LangChain4J</a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.eventbrite.co.uk/e/building-reliable-ai-agents-with-java-and-langchain4j-tickets-1987887565220?aff=deepeng" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xWNj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600ceae-059d-47a6-8f52-348d94ae7467_2160x1080.png 424w, https://substackcdn.com/image/fetch/$s_!xWNj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600ceae-059d-47a6-8f52-348d94ae7467_2160x1080.png 848w, https://substackcdn.com/image/fetch/$s_!xWNj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600ceae-059d-47a6-8f52-348d94ae7467_2160x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!xWNj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600ceae-059d-47a6-8f52-348d94ae7467_2160x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xWNj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600ceae-059d-47a6-8f52-348d94ae7467_2160x1080.png" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9600ceae-059d-47a6-8f52-348d94ae7467_2160x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.eventbrite.co.uk/e/building-reliable-ai-agents-with-java-and-langchain4j-tickets-1987887565220?aff=deepeng&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!xWNj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600ceae-059d-47a6-8f52-348d94ae7467_2160x1080.png 424w, https://substackcdn.com/image/fetch/$s_!xWNj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600ceae-059d-47a6-8f52-348d94ae7467_2160x1080.png 848w, https://substackcdn.com/image/fetch/$s_!xWNj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600ceae-059d-47a6-8f52-348d94ae7467_2160x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!xWNj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600ceae-059d-47a6-8f52-348d94ae7467_2160x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A hands-on workshop covering how to build production-grade AI agents using Java and LangChain4J.</p><p>&#128467;&#65039; Friday, June 13 &#183; 10:00 AM &#8211; 1:30 PM ET &#183; Online</p><p style="text-align: center;">2 for 1 deal is live. Use code <strong>DEEPENG50</strong> for 50% off.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.eventbrite.co.uk/e/building-reliable-ai-agents-with-java-and-langchain4j-tickets-1987887565220?aff=deepeng&quot;,&quot;text&quot;:&quot;Register here&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.eventbrite.co.uk/e/building-reliable-ai-agents-with-java-and-langchain4j-tickets-1987887565220?aff=deepeng"><span>Register here</span></a></p><div><hr></div><p>&#9997;&#65039; <strong>From the editor&#8217;s desk,</strong></p><p>Welcome to the <strong>48th</strong> issue of Deep Engineering!</p><p>Google <a href="https://blog.google/innovation-and-ai/technology/developers-tools/managed-agents-gemini-api/">announced Managed Agents in the Gemini API</a> two days ago at Google I/O, making it possible to spin up an agent that can reason, use tools, execute code, and browse the web with a single API call. The infrastructure work that previously required teams to build and manage sandboxes, scaffolding, and execution environments is being abstracted away. The capability is in public preview and Google is clear that outputs should be reviewed before use in sensitive workflows, but the direction is quite clear. Deploying agents is getting significantly easier.</p><p>What is not getting easier at the same pace is making the APIs those agents will call worth calling. APIs designed for actual developers, who can tolerate ambiguous descriptions, infer intent from sparse documentation, and navigate hundreds of operations to find the right one, do not work the same way for agents. Agents are less reliable at resolving ambiguous API semantics, choosing among many overlapping operations, and safely composing actions without machine-readable contracts and guardrails.</p><p><a href="https://ch.linkedin.com/in/erikwilde">Erik Wilde</a>, Head of Enterprise Strategy at <a href="https://jentic.com/">Jentic</a> and OpenAPI Ambassador at the <a href="https://www.openapis.org/">OpenAPI Initiative</a>, has spent considerable time on solving for that gap. We spoke with Wilde about what agent-ready actually means in practice, and he explained from his engineering purview why MCP will not fix a poorly designed API foundation, and what platform engineers should start planning for today.</p><blockquote><p>The expert insights in today's issue are based on our recent live interview with Wilde and you can read or watch the full Q&amp;A <a href="https://deepengineering.substack.com/p/building-agent-ready-apis-in-production">here</a>.</p></blockquote><p>Let&#8217;s get started.</p><div><hr></div><h4 style="text-align: center;"><strong>Featured Newsletter: <a href="https://machinelearningatscale.substack.com/">Machine Learning at Scale.</a></strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://machinelearningatscale.substack.com/" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GrnZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6adb71-dd8c-4a45-a8b2-2f452b0654fd_1129x944.jpeg 424w, https://substackcdn.com/image/fetch/$s_!GrnZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6adb71-dd8c-4a45-a8b2-2f452b0654fd_1129x944.jpeg 848w, https://substackcdn.com/image/fetch/$s_!GrnZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6adb71-dd8c-4a45-a8b2-2f452b0654fd_1129x944.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!GrnZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6adb71-dd8c-4a45-a8b2-2f452b0654fd_1129x944.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GrnZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6adb71-dd8c-4a45-a8b2-2f452b0654fd_1129x944.jpeg" width="316" height="264.21966341895484" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ea6adb71-dd8c-4a45-a8b2-2f452b0654fd_1129x944.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:944,&quot;width&quot;:1129,&quot;resizeWidth&quot;:316,&quot;bytes&quot;:205590,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:&quot;https://machinelearningatscale.substack.com/&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://deepengineering.substack.com/i/198600531?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6adb71-dd8c-4a45-a8b2-2f452b0654fd_1129x944.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_!GrnZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6adb71-dd8c-4a45-a8b2-2f452b0654fd_1129x944.jpeg 424w, https://substackcdn.com/image/fetch/$s_!GrnZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6adb71-dd8c-4a45-a8b2-2f452b0654fd_1129x944.jpeg 848w, https://substackcdn.com/image/fetch/$s_!GrnZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6adb71-dd8c-4a45-a8b2-2f452b0654fd_1129x944.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!GrnZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6adb71-dd8c-4a45-a8b2-2f452b0654fd_1129x944.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>Are you a SWE looking to upskill into ML systems? Get high quality ML system design content delivered to your inbox. Learn how to design and scale Machine Learning Systems.</p><p><strong>Subscribe to <a href="https://machinelearningatscale.substack.com/">Machine Learning at Scale</a></strong></p><div><hr></div><p><strong>&#129504; Expert Insights</strong></p><h2><strong>Your APIs Are Not Ready for Agents, and MCP Will Not Fix That</strong></h2><p><em>by <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Saqib Jan&quot;,&quot;id&quot;:427210082,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997a788a-cd78-4f84-9b3b-c72ab6dc0153_1008x1008.jpeg&quot;,&quot;uuid&quot;:&quot;3709f44c-b30e-491a-b737-39d98482143a&quot;}" data-component-name="MentionToDOM"></span> with <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Erik Wilde&quot;,&quot;id&quot;:149691045,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/87e21c23-bc24-4b52-8b8a-3146d31edbee_3024x3024.jpeg&quot;,&quot;uuid&quot;:&quot;3916d049-523c-4e50-a490-8dd50c6c08df&quot;}" data-component-name="MentionToDOM"></span> </em></p><p>The conversation about AI agents in enterprise software dominates engineering mindshare as to how agents will consume APIs and what it actually takes to make that consumption work reliably. Most organisations have taken the shortcut. They have built an MCP server, pointed it at their existing API landscape, and told themselves the agent problem is solved. <a href="https://ch.linkedin.com/in/erikwilde">Erik Wilde</a>, Head of Enterprise Strategy at <a href="https://jentic.com/">Jentic</a> and OpenAPI Ambassador at the <a href="https://www.openapis.org/">OpenAPI Initiative</a>, thinks that is the wrong bet, and his reasoning is specific enough to be useful.</p><p>&#8220;Whatever you invest in better APIs becomes useful for everybody,&#8221; Wilde affirms. &#8220;If you invest specifically in MCP, that investment is effectively scoped to LLM consumers.&#8221; The point is not that MCP is useless. It is that MCP is a delivery mechanism, and delivery mechanisms change. The API foundation underneath it does not change nearly as quickly, and if that foundation is poorly designed for the agents that will eventually consume it, no amount of tooling stacked on top of it will compensate. The organisations that will be in the strongest position in two years are the ones investing in the foundation now, not the ones chasing the current delivery protocol.</p><h3>The abstraction level problem</h3><p>The clearest way to understand what makes an API agent-ready is to look at a concrete example, and Wilde in our interview offered one that makes the problem immediately legible. The <a href="https://docs.github.com/en/rest">GitHub REST API</a> currently has around 1,100 operations. That is not unreasonable for a product as complex as GitHub. A developer can navigate 1,100 operations because they bring context, experience, and the ability to read documentation and infer intent. They know roughly what they are looking for and they can work toward it even when the path is not obvious.</p><p>An agent does not work that way. &#8220;For an agent to work directly with that GitHub API is pretty complex,&#8221; Wilde points out, &#8220;because a lot of those operations need to be combined in a certain way to result in the workflows that you really want to accomplish on GitHub.&#8221; The agent has to figure out not just what each individual operation does but how they compose, in what order, under what conditions, and with what dependencies. With 1,100 operations, the combinatorial space of possible workflows is enormous, and agents navigating it without guidance will produce unreliable results.</p><p>Now look at the GitHub MCP server, which has around 70 tools. Each of those tools represents a higher-level workflow, something a developer might actually want to accomplish on GitHub rather than a low-level operation that contributes to that accomplishment. The reduction from 1,100 to 70 is not a loss of capability. It is a gain in usability for the specific class of consumer that is trying to get things done rather than explore a surface. &#8220;What I would say,&#8221; Wilde argues on this point, &#8220;is that if you had a genuinely agent-friendly GitHub API, it might also just have around 70 operations.&#8221; The MCP server is not adding something new. It is providing the abstraction level that the underlying API should have provided in the first place.</p><p>This is the abstraction level problem, and it is the most important design question for engineering teams building API infrastructure that agents will consume. The APIs that were designed for developer flexibility, with many fine-grained operations that compose in powerful ways, are exactly the wrong shape for agents that need to accomplish specific goals reliably. The discipline of designing for agents is the discipline of asking what a consumer actually wants to accomplish and surfacing that at the API level, rather than exposing every atomic capability and leaving the composition to the consumer.</p><h3>What agent-ready actually means</h3><p>The properties that follow from the abstraction level insight are consistent and actionable. An API designed for agent consumption should not be too fine-grained, and its descriptions should be intent-based and written at a level that is meaningful for a language model rather than just technically accurate for a developer who already knows the domain. It should have examples, ideally multiple examples per operation rather than one, because examples are one of the most reliable ways for a model to understand what an operation actually does in practice. Its error messages should be meaningful enough that an agent encountering a failure has enough information to understand what happened and what it might do next.</p><p>&#8220;If an AI agent looks at a poorly described API and cannot figure out how it works, it will just move on to the next one,&#8221; Wilde notes. &#8220;It has less context. It has less experience. It does not really know as well as an actual developer what to do.&#8221; This is the practical consequence of the abstraction level problem at the description level. A developer reading a sparse API description can fill in the gaps from domain knowledge and engineering experience. An agent cannot do that reliably, and the result is not a helpful error or a clarifying question. It is a silent failure or a wrong action.</p><p>Wilde and his team have built a scoring mechanism for API readiness that makes these dimensions concrete. The scoring uses a combination of standard linting, running tools like <a href="https://stoplight.io/open-source/spectral">Spectral</a> and <a href="http://redocly.com/">Redocly</a> to check structural conditions, and LLM-based checks that evaluate whether descriptions are written in a way that is genuinely useful for an agent rather than just present. The distinction matters because a description that exists and passes a structural check may still be useless for an agent if it describes what an operation does technically without explaining what a consumer would use it to accomplish. &#8220;These descriptions need to represent intent,&#8221; Wilde highlights. &#8220;What is the intent of somebody who would use this operation?&#8221;</p><h3>Linting though necessary is not sufficient</h3><p>Linting has become standard practice in well-run API programs, and Wilde endorses it as a first line of defense. The popular tools are capable and in some cases open source, and the practice of defining shared rule sets that teams can discuss, extend, and maintain in version control is genuinely useful. But in our conversation he was clear that linting alone does not get you to agent-ready, and teams that treat it as the complete solution are leaving the most important problems unaddressed.</p><p>The structural checks that linting tools perform are exactly that. They can tell you whether a description field exists and whether it meets a minimum length requirement, but they cannot tell you whether the description is written in a way that helps an agent understand what the operation is for. They can flag a missing example but cannot evaluate whether the examples present give a model enough signal to use the operation correctly in a novel context. The gap between what linting checks and what agent readiness requires is the gap between structure and meaning, and closing it requires evaluation mechanisms that go beyond pattern matching on OpenAPI descriptions.</p><p>Wilde also makes an important point about rule set governance that is worth taking seriously. &#8220;I am not a big fan of just reusing existing rule sets,&#8221; he contends. &#8220;I would always say start owning this, build up your own in a collaborative fashion.&#8221; The Zalando and Adidas rule sets that circulate in the API community are useful references, but they were built for specific contexts and specific quality standards. Adopting them wholesale means inheriting decisions that were made for a different organisation&#8217;s constraints. The value of a rule set comes not just from the rules it contains but from the process by which those rules were agreed upon, which is a process that builds shared understanding of what good API design actually means in a particular context.</p><h3>MCP is a delivery mechanism, not a foundation</h3><p>MCP has been growing fast. It is now <a href="https://aaif.io/">under the Linux Foundation</a>, major model providers support it, and a growing number of enterprise vendors are shipping MCP servers as a standard part of their product offering. For engineers deciding where to invest, it looks like an obvious answer to the question of how to make APIs accessible to agents.</p><p>Wilde&#8217;s skepticism is not about MCP&#8217;s current momentum. It is about what MCP is and what it is not. &#8220;MCP is the current delivery mechanism,&#8221; he says. &#8220;You need a delivery mechanism, but I would not build too many things that are MCP-specific.&#8221; At Jentic, the team supports MCP because it is what the market expects right now, but they have deliberately avoided deep investment in MCP-specific infrastructure. If MCP were replaced by something else, the transition would be straightforward because the underlying work, making APIs well-described, well-structured, and semantically rich, would carry over entirely. That work is not MCP-dependent. It is foundational.</p><p>The risk for teams that invert this priority is real. Building an MCP server on top of a poorly designed API landscape means the MCP server inherits all of those same problems. Operations that are too fine-grained stay too fine-grained, descriptions that lack intent stay unreadable to a model, and error messages that tell a human nothing tell an agent even less. The wrapper changes the protocol by which those problems reach the agent, not the problems themselves.</p><h3>Open standards outlast any delivery protocol</h3><p>One of the clearest threads in Wilde&#8217;s thinking is the value of building on open standards rather than specific tools or protocols. This is not an abstract preference for openness. It is a practical argument about optionality. Teams that build their API practices on <a href="https://www.openapis.org/">OpenAPI</a>, <a href="https://www.openapis.org/arazzo-specification">Arazzo</a>, and <a href="https://learn.openapis.org/overlay/">Overlays</a> are building on specifications that are independent of any vendor, any model provider, and any current delivery protocol including MCP. When the next delivery mechanism arrives, or when the current tooling landscape shifts, the foundation remains.</p><p><a href="https://www.openapis.org/arazzo-specification">Arazzo</a> is worth understanding in this context. It is a workflow language published by the OpenAPI Initiative that allows you to describe sequences of API interactions in a standardised format. If accomplishing a particular goal requires calling five endpoints in a specific order with specific dependencies, Arazzo is the language for expressing that. For agents, which struggle with exactly this kind of multi-step composition, a well-constructed Arazzo workflow is one of the most useful things an API producer can provide. &#8220;Figuring out multi-step workflows is one of the hardest things for agents to do right now,&#8221; Wilde says, &#8220;and Arazzo is genuinely good at describing those. We just need to make it discoverable.&#8221;</p><p>Overlays, the third specification from the OpenAPI Initiative, provides a way to express changes to an OpenAPI description in a standardised diff format. &#8220;We use overlays,&#8221; Wilde shares, &#8220;to deliver improvement suggestions alongside API scores. When the scoring mechanism identifies that an API is not well-designed for AI consumption, it also produces an Overlay that shows exactly what would need to change to improve it.&#8221; That makes the gap between current state and agent-ready state concrete and actionable rather than a list of abstract recommendations.</p><h3>The APIs you design today will still be running in two years</h3><p>The practical implication of everything Wilde argues is a specific recommendation about timing. API landscapes change slowly. Whatever is designed or changed today will likely remain largely unchanged for one to three years. Agents are arriving in enterprise contexts incrementally but consistently. The customer support and HR agents that are already deployed broadly are the early wave, and the business agents with genuine decision-making authority are behind them.</p><p>&#8220;API landscapes evolve slowly,&#8221; Wilde says. &#8220;Whatever you design or change today, you will probably have around for a year or two or three before you touch it again.&#8221; The teams that start building API readiness for agents now are the teams whose infrastructure will be in the right shape when agents with more capability and more authority arrive. The teams that wait for agents to become mainstream before improving their APIs will find themselves doing expensive remediation work on a landscape that is already in production and already depended upon.</p><p>The recommendation is not to stop shipping features or to redesign everything at once. It is to make agent readiness a standard consideration in the decisions that are already being made. When writing a new operation, write the description for an agent as well as for a developer. When adding examples, add enough that a model can generalise. When defining error responses, add enough context that a consumer without domain knowledge can understand what happened. These are not large investments per decision and they compound over time into an API landscape that agents can actually use.</p><p>To this end, &#8220;All the platform people out there who are building API platforms or doing platform engineering,&#8221; Wilde says, &#8220;think about how all of this will change if you have more and more agentic actors and consumers in your organisation, and start planning for that today, even if you can say that right now you do not have it this much and it is going to be another year or two. It is going to arrive.&#8221;</p><div><hr></div><h3>In case you missed</h3><p><em>Here&#8217;s the full Q&amp;A with the interview video featuring Erik Wilde.</em></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;77abce22-b4ff-4d42-963d-6a98b9f31593&quot;,&quot;caption&quot;:&quot;Erik Wilde joined Deep Engineering Live interview session to talk about OpenAPI 3.2, what agent-ready APIs actually look like, and why he is more skeptical about MCP than most people expect.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Building Agent-Ready APIs in Production with Erik Wilde&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:427210082,&quot;name&quot;:&quot;Saqib Jan&quot;,&quot;bio&quot;:&quot;/localhost&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997a788a-cd78-4f84-9b3b-c72ab6dc0153_1008x1008.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null},{&quot;id&quot;:149691045,&quot;name&quot;:&quot;Erik Wilde&quot;,&quot;bio&quot;:&quot;Erik Wilde works in digital transformation and API management. Erik is the author of many articles, books, and speaks at conferences around the globe. His \&quot;Getting APIs to Work\&quot; YouTube channel provides updates about technologies, tools, and events.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/87e21c23-bc24-4b52-8b8a-3146d31edbee_3024x3024.jpeg&quot;,&quot;is_guest&quot;:true,&quot;bestseller_tier&quot;:null,&quot;primaryPublicationSubscribeUrl&quot;:&quot;https://gettingapistowork.substack.com/subscribe?&quot;,&quot;primaryPublicationUrl&quot;:&quot;https://gettingapistowork.substack.com&quot;,&quot;primaryPublicationName&quot;:&quot;Getting APIs to Work&quot;,&quot;primaryPublicationId&quot;:1702325}],&quot;post_date&quot;:&quot;2026-05-20T20:06:57.058Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/youtube/w_728,c_limit/iJXKkD5ySsY&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://deepengineering.substack.com/p/building-agent-ready-apis-in-production&quot;,&quot;section_name&quot;:&quot;Interviews&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:198599140,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1729053,&quot;publication_name&quot;:&quot;Packt Deep Engineering&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!H5BJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F736bc1ee-d689-497e-83a8-7d9bf9022eb9_600x600.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><h2><strong>&#128736;&#65039; Tool of the Week</strong></h2><p><strong><a href="https://github.com/stoplightio/spectral">Spectral</a></strong> &#8212; open-source JSON and YAML linter with built-in support for OpenAPI, Arazzo, and AsyncAPI</p><ul><li><p>Validates OpenAPI v3.1, v3.0, v2.0, Arazzo v1.0, and AsyncAPI v2.x out of the box.</p></li><li><p>Supports fully custom rule sets, letting teams build and own their own governance standards.</p></li><li><p>Integrates with VS Code, JetBrains, GitHub Actions, and Azure API Center for shift-left linting.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/stoplightio/spectral&quot;,&quot;text&quot;:&quot;Learn more about Spectral&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/stoplightio/spectral"><span>Learn more about Spectral</span></a></p><div><hr></div><h1><strong>&#128206; Tech Briefs</strong></h1><ul><li><p><a href="https://blog.google/innovation-and-ai/technology/developers-tools/managed-agents-gemini-api/">Google Managed Agents now in Gemini API</a> - A single API call now provisions an ephemeral Linux sandbox with code execution, web browsing, and tool use built in.</p></li><li><p><a href="https://www.cncf.io/blog/2026/05/05/announcing-kyverno-release-1-18/">Kyverno 1.18 released post-CNCF graduation</a> - First post-graduation release patches two SSRF CVEs and adds cleanup policy support to the Kubernetes policy engine.</p></li><li><p><a href="https://openai.com/index/dell-codex-enterprise-partnership/">OpenAI and Dell bring Codex to on-premises enterprise</a> - The partnership makes the Codex coding agent available in hybrid and air-gapped enterprise environments for the first time.</p></li><li><p><a href="https://cloud.google.com/blog/topics/developers-practitioners/io26-news-for-agent-developers-on-google-cloud">A2A protocol underpins Google&#8217;s full agent stack</a> - Agents built at any abstraction level can be called as sub-agents across the entire Google Cloud agent platform.</p></li><li><p><a href="https://www.devopsdigest.com/almost-half-of-ai-generated-code-fails-in-production">43% of AI-generated code fails in production</a> - Survey of 200 SRE leaders finds teams average three production redeploy cycles to verify a single AI-suggested fix.</p></li></ul><div><hr></div><p>That&#8217;s all for today. Thank you so very much for reading this issue of Deep Engineering.</p><p>We&#8217;ll be back next week with more expert-led content.</p><p>Stay awesome,</p><p>Saqib Jan</p><p>Editor-in-Chief, Deep Engineering</p><div><hr></div><p><em>If your company is interested in reaching an audience of senior developers, software engineers, and technical decision-makers, you may want to </em><a href="https://packt.omeclk.com/portal/wts/uc%5EcnN2dfNaqmD-kB-mo66%7C7g%5Ef%7Cb">advertise with us</a><em>.</em></p><p></p>]]></content:encoded></item><item><title><![CDATA[Building Agent-Ready APIs in Production with Erik Wilde]]></title><description><![CDATA[On OpenAPI 3.2, agent-ready APIs, and why MCP might not be the answer you think it is]]></description><link>https://deepengineering.net/p/building-agent-ready-apis-in-production</link><guid isPermaLink="false">https://deepengineering.net/p/building-agent-ready-apis-in-production</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Wed, 20 May 2026 20:06:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/iJXKkD5ySsY" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://ch.linkedin.com/in/erikwilde">Erik Wilde</a> has spent more than 12 years working on APIs in every form, from communication protocols to enterprise API platforms, governance frameworks, and now the question of what it takes for APIs to actually work for AI agents. He holds degrees in computer science from TU Berlin and a PhD from ETH Zurich, has contributed to multiple open standards, and is an OpenAPI Ambassador at the <a href="https://www.openapis.org/">OpenAPI Initiative</a>. He currently works at <a href="https://jentic.com/">Jentic</a>, where he focuses on making API landscapes usable for the next generation of agentic consumers. </p><p>Erik joined Deep Engineering Live interview session to talk about OpenAPI 3.2, what agent-ready APIs actually look like, and why he is more skeptical about MCP than most people expect.</p><p>Watch the full conversation below.</p><div id="youtube2-iJXKkD5ySsY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;iJXKkD5ySsY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/iJXKkD5ySsY?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><em><strong>A note on format</strong>: this session was recorded live as part of the Deep Engineering Live Interview Series. The transcript below has been lightly edited for clarity and readability. Audience members joined the conversation and asked questions directly during the session.</em></p><div><hr></div><p><em><strong>Q. Tell us about your background and how you ended up working on APIs.</strong></em></p><p>I have been working on APIs, in some shape or form, all of my life. I started with communication systems and protocols and then moved into the API space proper about 12 years ago. I have mostly worked for companies that sell enterprise software in that space, so typically API gateways and API platforms, the kinds of things where large companies have a lot of digital capabilities and a lot of those have APIs. More and more, companies have realized that the better you maintain, manage, extend, and govern that real estate, the easier it becomes to develop new applications and to realize potential that is within the company but needs a little bit of digging to get to.</p><p>Then about a year ago I met the two founders of Jentic, and they described to me what they were building. Very briefly, what they want to do is build a platform where agents can use APIs, because oftentimes the APIs that exist might not be the ideal ones for agents, and you also might want to control those agents a little more because you might not be confident they always do the right thing. We all know that AI has a tendency to sometimes have surprising ideas. I really liked that idea, so I decided to join. I have been at Jentic now for just over half a year and it has been a great experience. I still talk about APIs because in the end, without APIs, there is simply no AI.</p><p><em><strong>Q. OpenAPI 3.2 shipped last September. What changes have the highest operational impact for engineering teams, and which are mostly nice to have?</strong></em></p><p>3.2 is a maintenance release. It is backwards compatible and does not change things dramatically. What it is not, and I want to start there, is AI focused. That is what we are planning for the next version, 3.3, where we really want to think more aggressively about what it would take to make OpenAPI specifically more AI friendly.</p><p>That said, even in 3.2, some of the improvements are more meaningful than they might first appear. The tag system has been extended so that tags, which you use to group and annotate operations, are now a hierarchical space rather than a flat one. You can have tags and subtags and so forth. That is something people always wanted to do. The reason it matters for AI is that anything that makes an API description semantically richer, anything that allows descriptions to carry more meaning, is valuable for agents. So thinking about how you describe your APIs not just as technical endpoints but as semantic services, with rich schemas, descriptions at every level, and well-defined error messages, that is where I think the real operational value lies right now.</p><p>At Jentic we have released a scoring mechanism for APIs so you can find out whether your API is AI friendly or not. A lot of what that scoring looks at is the kinds of things that have always been good API design practice: put in more descriptions, include examples, make your error messages clear and actionable. The difference now is that where a human developer might look at a poorly described API and figure it out from experience and context, an agent that cannot figure out how an API works will simply move on to the next one. It has less context and less tolerance for ambiguity. So the APIs you design now will probably be around for a couple of years, and starting to think about this new class of consumers is worth doing today.</p><p><em><strong>Q. Streaming is also now explicitly supported in 3.2. When teams document streaming, what details separate readable from implementable and testable?</strong></em></p><p>Streaming always was something people were doing. I think it has just become so much more visible because that is how all the AI APIs work. When you use a chatbot and you watch the response appear word by word, that is streaming in action. And what 3.2 does is give you a slightly more explicit way to document that in OpenAPI. That is actually a very common pattern with OpenAPI improvements over the years. It is not that something entirely new is added. It is more that people can now formally document something they have been doing all along, but that was not well covered by the specification.</p><p>WebHooks are another good example of this. WebHooks have been popular for a long time. I was surprised when somebody gave me a statistic saying that around 60 percent of the 100 most popular APIs use WebHooks. That is a remarkably high number, but it makes sense because WebHooks are a convenient pattern. You do something with an API, and at some point the API can call you back and say this process is finished, go and fetch your results. People had been doing that for a long time, but it was never explicitly supported in OpenAPI. And then at some point the specification simply gets extended to cover what practitioners are already doing. That is what makes it more complete over time.</p><p><em><strong>Q. The 3.2 tag structure now supports nesting. How do you use tags as information architecture for large API catalogs, and how do you govern that taxonomy across teams?</strong></em></p><p>That is a good and very demanding question, because it goes well beyond OpenAPI and into whether you have a data dictionary or some general framework for how things get named in your organization. Organizations always have a hard time doing that because it is hard to agree on terms, and it is hard to make sure that everyone understands which terms exist, what they mean, and when to use them. Tags are no different. They give you a way to assign meaning to things in your OpenAPI description, but what that meaning is is entirely up to you.</p><p>Until now tags were relatively minor things. The typical pattern was to say here are all the operations about customers, here are all the operations about products, and so on, and documentation tools would then group things by tag. With the hierarchical tag structure in 3.2, you could go much further. You could have a hierarchy of unlimited depth if you want, where each thing in your API is linked to some kind of data dictionary or ontology. I have not seen people doing that yet, but I am pretty sure they will start.</p><p>That said, my recommendation would be not to go crazy building a complex standalone tag taxonomy inside OpenAPI. If you start introducing complex terminology with different hierarchies and groupings, you probably also need to align that with every other place in your organization where things get tagged, whether that is databases, document stores, or wherever you manage information. So check what your general information architecture looks like. What dictionaries or terminologies are already established? Then think about how you map those into the OpenAPI tag model rather than inventing a whole new taxonomy that lives only in your API descriptions.</p><p><em><strong>Q. On linting as a quality gate: how do you design a rule set taxonomy that maps cleanly to real ownership, the way platform teams and product teams each have different responsibilities?</strong></em></p><p>What linting is being used for right now is governance and a level of automation. The goal is that when people start designing or changing APIs they get quick feedback on whether they are following guidelines or not. A good number of organizations publish their rule sets openly on GitHub. I have a collection of around 30 or 40 publicly accessible ones. The Zalando ones are popular because they have been around for a while. Adidas has some solid ones. There are also some published by government and e-government initiatives. So there are plenty of references.</p><p>Linting is useful but it has real limitations. The popular tools, whether that is Spectral, Vacuum, or Redocly, all work in a similar way. You have rules that apply to certain parts of your OpenAPI description and they check for structural conditions. Something like, this operation must have a description and the description must be at least 20 characters. It is really a structural check. And that is useful. I would absolutely recommend doing it.</p><p>What I am not a big fan of is just reusing existing rule sets wholesale. I would always say start owning this, build up your own in a collaborative fashion. Have a GitHub repository somewhere where developers can propose and discuss new rules, argue for whether a guideline is worth following, and then get it merged into your shared rule set once there is enough agreement. You might also have different rules for different stages of the API lifecycle. Some rules are so important that every code check-in has to follow them. Others might only apply to APIs you expose to external partners, where you want higher quality standards. So you end up with rule sets that are tuned by the consumer type or the lifecycle stage, or both.</p><p>But as I said, linting has limits. At Jentic we use Spectral and Redocly as part of our API scoring checks, but we also have a good number of LLM-based checks, because if you are scoring APIs for AI readiness, what matters is not just whether a description field exists but whether it is written in a way that is actually useful for an agent. Those are the kinds of checks that typical linting tools cannot do because they operate at the structural level. So linting is a solid and by now fairly standard first line of defense, but also look a little beyond it.</p><p><em><strong>Q. How do you set severity levels like error, warning, and informational, and what is an exception policy that avoids lint fatigue without lowering the floor?</strong></em></p><p>Severity levels really should be what you would expect. If something is non-negotiable and needs to be fixed before anything moves forward, that is an error. There is no discussion. Then you have warnings, where the message is that this is not great but it is acceptable, though you should consider fixing it. It gives the developer a signal without blocking them. And then informational messages, which honestly I am not sure are that interesting for developers to act on directly. What I have seen done a couple of times is that informational-level messages are not really meant for developers to read at all. They are intended for downstream tooling. The linter surfaces an observation that is then picked up by some other tool in the pipeline. So the informational channel becomes a way for the linter to communicate with tooling downstream rather than with the developer.</p><p><em><strong>Q. On large specs with tens of thousands of lines, linting performance and PR feedback loops become real constraints. What repository or spec structuring patterns reduce friction without fragmenting the contract?</strong></em></p><p>What you probably want is to avoid always linting the whole thing. Large specifications are never in one file. They are assembled from a whole bunch of sources, schemas, references, and components from various places. So it makes much more sense to have your checks in place at those individual source locations rather than only at the assembled specification level. Instead of linting the full spec at the end of every pipeline run, start linting when you make changes to the schemas and the smaller pieces that feed into the overall description.</p><p>If you do that with a reasonable level of discipline, you avoid the compounding effect where you finally lint the big spec and get hit with hundreds of errors you have been quietly accumulating. Do not treat linting as the last step. Do it as early as possible, as close to where the change is actually happening as you can. That is the pattern that keeps the feedback loops short and the debt manageable.</p><p><em><strong>Q. There is a proposal for OpenAPI 3.3. What are you personally most interested in seeing there?</strong></em></p><p>For me, because of where I work right now, the big issue is how we could improve OpenAPI specifically with a focus on AI. We have not done that so far in any serious way. There are a whole bunch of discussions within the OpenAPI Initiative around how that could be done.</p><p>Some of it is about semantics. Some of it is about making clearer when and how long an API is actually going to be around, which is something agents care about in ways that human developers traditionally have not. Agents always use an API at runtime. They discover it, decide it looks like a good API to use, and then need to figure out what it does, what it does not do, what its side effects and constraints are. All of that could be surfaced in a much more accessible way through the API description itself rather than sitting only in human-facing documentation.</p><p>One idea I find genuinely interesting is the relationship between OpenAPI and Arazzo. Arazzo is a workflow language, published by the OpenAPI Initiative, that lets you orchestrate sequences of OpenAPI interactions. You can say: to accomplish this goal, call this endpoint, then that one, then that one. It is a simple orchestration language layered on top of OpenAPI. What would be really cool is if an OpenAPI description could link to an Arazzo workflow and say, if you use this operation, it actually makes the most sense as part of this workflow you can find over there. Figuring out multi-step workflows is one of the hardest things for agents to do right now, and Arazzo is genuinely good at describing those. We just need to make it discoverable. So that is one of the directions I would love to see 3.3 move in.</p><p>And as a reminder, the OpenAPI Initiative is open source and open to everyone. You do not need to be a member, you do not need to pay anything. The discussions happen primarily on Slack. If you have ideas or questions, just come and join. It is a very active and welcoming community. Check out openapis.org, and note that the S matters.</p><p><em><strong>Q. With MCP consolidating under the Linux Foundation&#8217;s AI foundation, what is the minimum governance surface an enterprise needs before agents can use tools broadly?</strong></em></p><p>I am still a little skeptical about MCP, honestly. I may very well be wrong, but what I would really encourage everyone to do is first think about your API estate and really invest in your APIs, rather than obsessing too much over MCP specifically. Whatever you invest in better APIs becomes useful for everyone. Developers can use it, agents can use it, partners can use it. If you invest specifically in MCP, that investment is effectively scoped to LLM consumers. And that may sometimes make sense, but it is important to keep in mind that the API landscape is the foundational layer you will be working with long term, and MCP may or may not stick around.</p><p>At Jentic we do support MCP because at this point you have to, but we are not deeply invested in MCP itself. If MCP went away and something else came along, that would not be a significant problem for us. We think of what we do as delivering capabilities to agents, and MCP is the current delivery mechanism. You need a delivery mechanism, but I would not build too many things that are MCP-specific. That would be my personal view.</p><p><em><strong>Q. From an audience member: what makes an API truly agent-ready in production compared to a standard REST API?</strong></em></p><p>One of the things I like to use as an illustration is the GitHub API. The current GitHub API version three has around 1,100 operations. GitHub is a complex product and there is a lot you can do with it, so 1,100 operations is not unreasonable. But for an agent to work directly with that API is quite complex, because a large number of those operations need to be combined in a certain way to produce the workflows that you actually want to accomplish on GitHub.</p><p>Now compare that to the GitHub MCP server, which has around 70 tools. Way fewer, and they are much higher level. They represent entire workflows, entire things you might want to do on GitHub, rather than the more atomic operations you find in the native API. What I would argue is that if you had a genuinely agent-friendly GitHub API, it might also just have around 70 operations. Not 1,100. Right now those 70 are available through MCP because that is what GitHub decided to build, and that is fine, but the point is that if you have an agent that wants to get things done, it will be significantly happier with 70 well-described higher-level operations than with 1,100 lower-level ones.</p><p>The properties that make an API agent-ready follow from that. It should not be too fine-grained. The descriptions should be written at a level that is meaningful for an LLM, which means intent-based and human-readable, not just technical. It should have examples, and ideally multiple examples rather than just one. Error messages should be meaningful and actionable, giving the agent enough information to understand what happened and what it might do next. And if you make those improvements, you almost certainly also improve the developer experience as a side effect, so it is not a speculative investment.</p><p><em><strong>Q. On API deprecation and sunsetting: how should agents handle the lifecycle signal that an API they depend on is entering a sunset cycle?</strong></em></p><p>Deprecation and sunsetting are genuinely important to me. I have written some small standards for how an API can actually surface that information at runtime. And I think we will see more and more of these runtime mechanisms being built out, because agents consume APIs at runtime by design. They discover an API, start using it, and then ideally they should also be able to discover that the API is only going to be available for another two weeks. At that point, a well-designed agent might alert someone, or start looking for a replacement, or whatever the right behavior is for that situation. What exactly to do about it is a separate design question. But as a consumer of an API, this is information that is relevant, and if we can surface it at runtime, consumers can react at runtime. That feels like an obviously good thing to pursue.</p><p><em><strong>Q. On request and response schema design: how do you design schemas so that an LLM can reliably choose the correct operation, handle partial failures, and avoid duplicating side effects?</strong></em></p><p>Schema design becomes part of the general question of how you design OpenAPI for AI consumption. You want descriptions in your schemas, not just in your operations, so that an LLM can understand what individual fields actually mean rather than just their names and types. Names that carry meaning help too. Parameters named X, Y, and Z are much harder for an agent to reason about than parameters with names that reflect their actual intent.</p><p>Beyond that, I think we are going to see interesting evolution in how APIs handle the granularity of what they return. Right now the standard REST model is relatively static: here is a request schema, here is a response schema. But if you are working with agents that are trying to minimise token usage and context pollution, there is a real case for APIs that can return only the fields that were actually asked for. GraphQL has a nice built-in capability for this, which is one of the things that makes it interesting for agentic use cases. REST does not have that natively, but you could layer something on top. We will see how that evolves, but it is one of the more interesting design questions in this space right now.</p><p><em><strong>Q. What workflow patterns show up repeatedly when enterprises actually start working with Jentic, and what makes them stable as APIs underneath them change?</strong></em></p><p>One example we were not expecting, which is always a good sign when you start talking to real enterprises, is the partner integration scenario. If you have a relatively complex API that you expose to partners, that is a large engineering effort for each of those partners. They have to understand the whole API even if they only need a small part of it.</p><p>What we now actively pursue, because it keeps proving useful, is creating specific workflows for specific partners. You say, this partner only wants to do these particular things, so they get a set of workflows built on top of the API that match their actual use cases. They do not need to understand the full API surface. They just need to understand the workflows that were created specifically for them.</p><p>And the stability point is interesting. As long as you develop your APIs in a backwards compatible way, those workflows remain stable even as the underlying APIs change. As a workflow user you do not even need to know that the APIs underneath now do additional things. You just keep invoking the same workflows and they continue to work. The moment you break a backwards compatible API is the moment you also break the workflows depending on it. So the discipline of backwards compatibility pays off at every layer.</p><p><em><strong>Q. Looking ahead six months, what should a senior engineer or platform engineer watch closely in standards, tooling, or governance for agent-facing APIs?</strong></em></p><p>What I would recommend, starting from tomorrow morning, is to begin thinking about agents in your planning even if you do not have them yet. And I acknowledge that the term agent has become fairly meaningless at this point. Everything seems to be called an agent now. But what I do see when talking with organisations is that certain types of agents are already getting real use, customer support agents and some HR agents being the most common. These are agents that are useful across industries, and you can mostly buy them, hook them up to your documentation, and they work.</p><p>What you see much less of right now, despite all the talk, is what I would call real business agents in production, where a piece of software can sense things, take action, and make decisions. Agents that actually have agency. And I believe we will see more and more of these, not necessarily all at once, but incrementally. You trust them with a little more next year, and a little more the year after.</p><p>Because of that, I would highly recommend making the AI readiness of your APIs part of your standard practice now. API landscapes evolve slowly. Whatever you design or change today will probably be around for a year or two or three before you touch it again. So ask yourself whether your linting and your design practices are optimising only for developer experience, or whether they are also starting to account for agent experience. The good news is that optimising for agent experience tends to improve developer experience as a side effect. You are not making a speculative bet. You are making something better for everyone while also preparing for what is coming. If you work on API platforms or in platform engineering, start thinking now about how your API landscape will need to evolve as you have more and more agentic consumers. Because it is going to arrive. That is at least my personal view.</p><div><hr></div><p><em><a href="https://ch.linkedin.com/in/erikwilde">Erik Wilde</a> is Head of Enterprise Strategy at <a href="https://jentic.com">Jentic </a>and an OpenAPI Ambassador at the <a href="https://www.openapis.org/">OpenAPI Initiative</a>. He is the creator of the Getting APIs to Work channel on YouTube. This interview was conducted by <a href="https://in.linkedin.com/in/s-jan">Saqib Jan</a>, Editor-in-Chief of Deep Engineering.</em></p>]]></content:encoded></item><item><title><![CDATA[Why Senior Engineers Fail System Design Interviews]]></title><description><![CDATA[Scoping, adaptability, and being exceedingly clear matter more than just knowing your tech stack in system design interviews.]]></description><link>https://deepengineering.net/p/why-senior-engineers-fail-system-design-interviews</link><guid isPermaLink="false">https://deepengineering.net/p/why-senior-engineers-fail-system-design-interviews</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Tue, 19 May 2026 20:19:10 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/bb2a37a3-e396-4fe6-8a55-f331e5572a15_1418x736.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most engineers presume that because they know their tech stack well enough, the system design interview will be easy. And why should they think any differently. They have shipped distributed systems at scale, debugged race conditions at 3am, and made the architectural calls that kept production stable under pressure. But then they walk into a system design interview with confidence and walk out having failed, often without understanding exactly why.</p><p><a href="https://in.linkedin.com/in/architagarwal984">Archit Agarwal</a>, Principal Member of Technical Staff at <a href="https://www.oracle.com/">Oracle </a>where he builds ultra-low-latency authorization services in Go, has interviewed hundreds of engineers. His observation about why experienced engineers fail is the most direct and honest assessment of this problem: they do not fail because they do not know what Kafka is or how DynamoDB handles consistency. They fail because of how they communicate. That single factor, how clearly and deliberately an engineer narrates their thinking, determines the outcome of most system design interviews more than any technical knowledge does.</p><h2>They jump to solutions before understanding the problem</h2><p>Agarwal described a pattern he sees play out repeatedly across interviews at every level of seniority. An interviewer gives a problem and within thirty seconds the candidate is already saying &#8220;I&#8217;ll use Redis, I&#8217;ll use Kafka, let&#8217;s go with microservices.&#8221; The interviewer has not said anything about scale. The candidate has not asked how many users the system needs to support, whether it is read-heavy or write-heavy, what the latency requirements are, or whether there are compliance constraints based on the geography of operation. They have skipped the part of the conversation that actually determines what should be built.</p><p>Those questions are not warm-up questions. They are the questions that drive the architecture. Nonfunctional requirements determine architecture, not the other way around. How many requests per second, what consistency model you need, whether you have a strict latency ceiling, these are the inputs. The architecture is the output. Engineers who skip to the output without gathering the inputs are designing in a vacuum, and the interviewer can see it the moment it happens. Agarwal&#8217;s recommendation is to spend the first one to two minutes of any system design interview doing nothing but alignment: gather functional requirements on what is being built and what the user actually needs, then gather nonfunctional requirements on scale, consistency, latency, and compliance. If you ask the right questions in those first two minutes, Agarwal says, you have already impressed the interviewer. They are listening properly now, engaged, and following where you are going rather than waiting for you to stumble.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://deepengineering.net/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 Packt Deep Engineering! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2><strong>They design everything at Google scale</strong></h2><p>Senior engineers have worked on large systems and that experience is genuinely valuable, but it also creates a bias that hurts them in interviews: the instinct to design for the most demanding possible version of any problem, whether the problem actually requires it or not. Agarwal is direct about this. Not every system needs to scale to Google. If you are designing an internal tool that will only ever be used by your company&#8217;s engineers, you do not need multi-region deployment, and you do not even need cloud infrastructure. You could run it on a local area network and it would be perfectly adequate for the problem at hand. The engineer who reaches for global infrastructure for a problem that does not need it is demonstrating a failure of judgment, not a depth of knowledge.</p><p>Good system design is about matching the architecture to the requirements you gathered in those first two minutes, not about showcasing every pattern you have ever learned across a career. The interviewer is not evaluating whether you know how to design at Google scale. They are evaluating whether you understand when to use which level of complexity and why, and that distinction is entirely invisible if you default to maximum complexity regardless of the constraints in front of you.</p><div><hr></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;45f78df8-1ffd-4b85-a665-d571d1e41c5f&quot;,&quot;caption&quot;:&quot;From monolith-to-services signals to &#8220;performance per dollar&#8221; and practical resilience under real attacks&#8212;clear choices you can defend in production and interviews.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Deep Engineering #36: Archit Agarwal on System Design Trade-offs &quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:140662997,&quot;name&quot;:&quot;Divya Anne Selvaraj&quot;,&quot;bio&quot;:&quot;Editor-in-Chief of Deep Engineering by Packt&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/309a6f07-27a6-40bf-ab99-d042556d816b_400x400.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null},{&quot;id&quot;:14853060,&quot;name&quot;:&quot;Archit Agarwal&quot;,&quot;bio&quot;:&quot;Principal Member of Technical Staff at Oracle, building ultra-low latency auth in Golang. Creator of The Weekly Golang Journal, turning system design theory into practical, high-performance code using language and SQL internals, cloud solutions.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d3d8661-57d3-4b2a-8e42-f789caf14aa6_200x200.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-02-26T13:30:47.032Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/837caa73-ceef-4856-b9c0-49f815314471_1536x1024.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://deepengineering.substack.com/p/deep-engineering-36-archit-agarwal&quot;,&quot;section_name&quot;:&quot;Newsletter Issues&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:188591840,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:3,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1729053,&quot;publication_name&quot;:&quot;Packt Deep Engineering&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!H5BJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F736bc1ee-d689-497e-83a8-7d9bf9022eb9_600x600.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><h2>They go quiet when they are thinking</h2><p>Senior engineers are often comfortable sitting with a difficult problem for several minutes before speaking, and in a production context that is a perfectly reasonable way to work through something complex. In a system design interview it reads as disengagement, and the interviewer has no way to tell whether you are making progress or whether you are stuck. Agarwal uses a phrase that reframes what good communication looks like in this context: the interviewer needs to be able to follow your brain&#8217;s commit history. Every decision you make, every trade-off you consider and reject, every assumption you surface and then validate or invalidate, should be spoken out loud as you make it, not as a performance or a monologue but as a live narration of your actual reasoning as it happens.</p><p>This serves two distinct purposes. It gives the interviewer genuine insight into how you think rather than just what conclusion you eventually reached, which is what they are actually evaluating. And it forces you to be more precise about your own reasoning, because articulating a decision out loud surfaces the assumptions underneath it in a way that thinking silently does not. Agarwal&#8217;s observation is that engineers who think out loud often catch their own errors in real time and self-correct naturally, and that self-correction is not a weakness. It is exactly the kind of flexible, honest thinking the interviewer is looking for.</p><h2>They defend their design when constraints change</h2><p>Experienced engineers have ownership instincts built over years of shipping and defending decisions in production. When they have built something they defend it, and in most professional contexts that instinct is appropriate. In a system design interview it becomes a liability the moment the interviewer introduces a constraint change mid-session, which Agarwal says he genuinely enjoys doing precisely because it reveals something important about the candidate.</p><p>Changing constraints are the normal reality of production engineering. Requirements shift, scale changes, new compliance requirements appear, and the ability to absorb a change, restate it clearly to confirm alignment, identify which parts of the design need updating and which parts remain intact, and then restructure calmly is exactly the capability that distinguishes an engineer who can operate in a real production environment from one who can only design under controlled conditions. The engineers who struggle here are the ones who treat the curveball as an attack on their design and respond by defending the original rather than adapting to the new information. Agarwal&#8217;s point is unambiguous: the interviewer is not trying to invalidate your architecture. They are trying to see whether you can hold your design lightly enough to change it when the situation demands it, which is something you will be required to do repeatedly in any engineering role worth having.</p><h2>They use jargon to sound credible instead of clarity to be understood</h2><p>Senior engineers have large vocabularies built from years of working across complex systems. Distributed systems, eventual consistency, CQRS, saga pattern, two-phase commit. These are real concepts with real meanings and knowing them is genuinely useful. But using them in rapid succession without grounding them in the specific problem being discussed is a signal that the engineer is performing knowledge rather than applying it, and experienced interviewers recognise the difference immediately.</p><p>Agarwal&#8217;s standard for communication in a system design interview is demanding but correct: your explanation should be clear enough that even a junior engineer could follow the reasoning without needing to already know the answer. Not dumbed down, and not simplified to the point of inaccuracy, but clear enough that every choice is grounded in the specific requirements of the system being designed rather than in a general desire to demonstrate familiarity with advanced concepts. The engineers who stand out in Agarwal&#8217;s interviews are not the ones with the most impressive vocabulary. They are the ones who make him feel like he is sitting with another engineer genuinely working through a problem together, which is exactly what a system design interview is supposed to be.</p><div><hr></div><p>The full conversation with Archit Agarwal is now live on Deep Engineering. </p><div id="youtube2-rOLA2NpKPfM" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;rOLA2NpKPfM&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/rOLA2NpKPfM?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div>]]></content:encoded></item><item><title><![CDATA[Rust Is Hard for the Engineers with the Most Experience]]></title><description><![CDATA[On the unlearning problem that trips up experienced engineers and the production payoff that makes it worth it]]></description><link>https://deepengineering.net/p/rust-is-hard-for-the-engineers-with-the-most-experience</link><guid isPermaLink="false">https://deepengineering.net/p/rust-is-hard-for-the-engineers-with-the-most-experience</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Mon, 18 May 2026 16:07:41 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f3cfa859-6cd7-4d3e-ab4b-31c7b0cd00c5_1440x660.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Rust, who would have thought, has ranked as the most loved programming language in the Stack Overflow developer survey for nine consecutive years. Honestly, I must admit this is an unusual kind of statistic because it measures not just adoption but retention. The engineers who use Rust want to keep using it, and that pattern has only deepened even as the language moved from systems programming curiosity to production infrastructure at companies including Amazon, Google, Meta, and Microsoft. Interestingly, the Linux kernel now carries Rust code without the experimental label it held for years. <a href="https://lists.debian.org/debian-devel/2025/11/msg00188.html">Debian&#8217;s APT package manager</a> is also introducing hard Rust dependencies this year.</p><p>The performance benchmarks and the memory safety arguments have been made, tested in production, and largely validated. But what the benchmarks do not explain is why so many experienced engineers find Rust genuinely difficult to work with, why the teams that adopt it often go through a period where velocity drops before it recovers, and what it actually takes to get good at it rather than just competent. These are the questions that sit behind the adoption numbers and they matter more than the numbers do for any engineer thinking seriously about where Rust fits in their work.</p><p><a href="https://www.linkedin.com/in/evan-williams-1512092">Evan Williams</a>, author of <em><a href="https://www.packtpub.com/en-ar/product/design-patterns-and-best-practices-in-rust-9781836209461">Design Patterns and Best Practices in Rust</a></em>, has been writing software for more than 40 years and came to Rust while building a hardware system that needed to be rock solid and run without access in a remote location. <a href="https://it.linkedin.com/in/francesco-ciulla-roma/en">Francesco Ciulla</a>, author of <em><a href="https://www.packtpub.com/en-us/product/the-rust-programming-handbook-9781836208860">The Rust Programming Handbook</a></em><a href="https://www.packtpub.com/en-us/product/the-rust-programming-handbook-9781836208860"> </a>and a Docker Captain who previously worked at the European Space Agency on the Copernicus project, started publishing Rust content in 2022 and 2023, earlier than most, and has since watched the language&#8217;s adoption from the inside. Their perspectives on Rust come from different parts of the stack and different kinds of work, but on the questions that actually trip engineers up, they are in close agreement.</p><blockquote><p><em>We interviewed Evan Williams and Francesco Ciulla separately for <a href="https://deepengineering.substack.com/s/newsletter-issues">Deep Engineering Newsletter</a> issues.</em></p></blockquote><h2>The engineer who struggles most is usually the most experienced one</h2><p>The reasonable assumption when a team introduces Rust is that the senior engineers will pick it up fastest. They have the most context, the most pattern recognition, and the most experience navigating unfamiliar codebases. In practice, the opposite tends to happen, and both Williams and Ciulla have seen it play out firsthand.</p><p>&#8220;The more experienced you are, the more years you have doing something in some other language, the more trouble you&#8217;re likely to have,&#8221; Williams says, &#8220;because you have patterns of thought that come from those languages that you don&#8217;t even realize are there.&#8221; The problem is not that experienced engineers consciously try to apply Java or C++ patterns to Rust. The problem is that those patterns are invisible to them, baked in over years of use until they no longer register as choices at all. The engineer is not making a decision when they reach for inheritance or shared mutable state. They are doing what has always worked, and Rust will not let them.</p><p>Ciulla put it more directly. &#8220;Even if you are a senior developer, even if you have twenty years of experience, if you want to try to learn Rust comparing it to other programming languages, you will fail, because it&#8217;s like learning something which is completely new.&#8221; He makes the case that this is not a reason to avoid Rust but a reason to go in with a specific kind of openness, one that experienced engineers often find harder to maintain than junior ones do precisely because they have more to unlearn. A developer learning Rust as their second or third language has no competing mental model to discard. A senior engineer with a decade long experience in Java has to dismantle instincts that have been reliable for years before they can build new ones, and that dismantling is the work that most people underestimate going in.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;ef4dcc9c-3432-4c97-99aa-2f125e7d6b37&quot;,&quot;caption&quot;:&quot;Francesco Ciulla has been building with Rust since 2022, has spoken about it internationally at conferences, and his perspective on Rust adoption is shaped less by enthusiasm for the language and more by a practitioner&#8217;s view of where it actually earns its place in a production system.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Deep Engineering #45: Francesco Ciulla on Building Production Systems in Rust Without the Expensive Rewrite &quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:427210082,&quot;name&quot;:&quot;Saqib Jan&quot;,&quot;bio&quot;:&quot;/localhost&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997a788a-cd78-4f84-9b3b-c72ab6dc0153_1008x1008.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null},{&quot;id&quot;:11407185,&quot;name&quot;:&quot;Francesco Ciulla&quot;,&quot;bio&quot;:&quot;Developer Advocate at @dailydotdev\n&#183; Docker Captain &#128051;\n&#183; Public Speaker\n&#183; Building a 1 Million Community 22%&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b8c30606-10ba-4c87-a89b-af2f9dc27a01_400x400.jpeg&quot;,&quot;is_guest&quot;:true,&quot;bestseller_tier&quot;:null,&quot;primaryPublicationSubscribeUrl&quot;:&quot;https://francescociulla.substack.com/subscribe?&quot;,&quot;primaryPublicationUrl&quot;:&quot;https://francescociulla.substack.com&quot;,&quot;primaryPublicationName&quot;:&quot;Francesco's Newsletter&quot;,&quot;primaryPublicationId&quot;:1410908}],&quot;post_date&quot;:&quot;2026-04-30T16:32:00.000Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e29b888-c64d-4029-96f3-08e45522d077_656x375.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://deepengineering.substack.com/p/issue-45-francesco-ciulla-building-production-systems-rust-without-rewrite&quot;,&quot;section_name&quot;:&quot;Newsletter Issues&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:195995087,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:2,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1729053,&quot;publication_name&quot;:&quot;Packt Deep Engineering&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!H5BJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F736bc1ee-d689-497e-83a8-7d9bf9022eb9_600x600.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><h2>Trusting the compiler is not a beginner tip</h2><p>The first thing most engineers do when the borrow checker rejects their code is look for the minimum change that will make it compile. That is the right approach in almost every other language and the wrong one in Rust, and it is where a significant amount of early frustration comes from.</p><p>&#8220;The golden rule is to trust the compiler, especially at the beginning,&#8221; Ciulla says. What he means is not passive acceptance but active reading. The borrow checker is not producing noise. It is producing information about what the program&#8217;s structure requires, and engineers who learn to read it that way move through the learning curve faster than engineers who treat every error as an obstacle to clear. The difference is subtle at first and significant over time.</p><p>Williams argues that the borrow checker is doing something more useful than preventing bugs. &#8220;The borrow checker is your friend because it prevents you from making a messy design. It prevents you from making a broken design. It prevents you from writing whole classes of bugs that you will then spend many hours trying to find,&#8221; he explains. &#8220;I have found it to be an incredible partner in writing code that allows me to sleep at night.&#8221; The reason it works this way is that Rust&#8217;s ownership rules enforce a discipline that experienced engineers in other languages apply selectively and inconsistently because those languages do not require it. A value has one owner. References are either shared and immutable or exclusive and mutable, never both. The compiler will not proceed until the code is explicit about who owns what and when.</p><p>&#8220;The principles that the borrow checker forces you to adhere to in Rust are the exact principles that you should be using in every programming language,&#8221; Williams reasons. &#8220;But you don&#8217;t have to. So it&#8217;s very easy to not think about those things.&#8221; That observation reframes what the borrow checker is. It is not an imposed restriction. It is a discipline that good engineers apply in other languages by habit and judgment, made non-negotiable and automatic in Rust.</p><p>The discipline extends from individual functions to the shape of the whole system. A program that handles ownership correctly at the function level has to handle it correctly across modules, across threads, and across component boundaries, because the same rules apply everywhere. &#8220;You need to think about who controls what, how it is controlled, and you need to start from the very beginning thinking about the boundaries of your program and the system architecture, dividing things up into areas of responsibility,&#8221; Williams underscores. &#8220;Because unlike Python or Java, you can&#8217;t have links going all over the place. The borrow checker is never going to accept that.&#8221; The result is that well-written Rust systems tend toward a specific architectural shape: data flows in one direction, ownership chains move forward and do not loop back, and the behavior of the system is legible from its structure in a way that systems with shared mutable state often are not.</p><p>The most underutilized expression of what this makes possible is the typestate pattern. It uses the type system to encode the state of a value at compile time in a way that makes invalid state transitions not just errors but programs that cannot be compiled at all. Williams reflects on it with visible enthusiasm. &#8220;It&#8217;s a way of developing state machines and systems that have state that evolves where invalid state transitions aren&#8217;t just errors, they&#8217;re impossible to write. The compiler won&#8217;t compile them,&#8221; he says. &#8220;It represents a huge advance in the way that such systems are written because now instead of runtime errors, you have a state machine that is guaranteed to work because every transition either is a valid transition or it won&#8217;t even compile. That&#8217;s an amazing thing.&#8221; The pattern was not invented for Rust, but the language&#8217;s ownership system and type handling make it practical in a way that other languages do not, and for systems where invalid state transitions are genuinely dangerous rather than merely inconvenient, it is one of the most concrete expressions of what Rust makes possible.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;caa3ca39-6118-4ad9-9d55-53c3803aabaf&quot;,&quot;caption&quot;:&quot;Evan Williams shares engineering insights on the borrow checker as a design tool, the object-oriented trap, and why the engineers who struggle most with Rust are often the most experienced ones.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Deep Engineering #47: Evan Williams on Why Experienced Developers Have the Hardest Time Learning Rust&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:427210082,&quot;name&quot;:&quot;Saqib Jan&quot;,&quot;bio&quot;:&quot;/localhost&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997a788a-cd78-4f84-9b3b-c72ab6dc0153_1008x1008.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-05-14T16:42:52.048Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43a42d88-ec70-4d7f-8213-85796343b4f5_677x337.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://deepengineering.substack.com/p/deep-engineering-47-why-experienced-developers-hardest-time-learning-rust&quot;,&quot;section_name&quot;:&quot;Newsletter Issues&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:197666671,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:11,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1729053,&quot;publication_name&quot;:&quot;Packt Deep Engineering&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!H5BJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F736bc1ee-d689-497e-83a8-7d9bf9022eb9_600x600.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><h2>What Rust actually gives you in production</h2><p>Ciulla&#8217;s case for Rust is grounded in things he measured when running a Rust web server on his own machine. It was consuming four megabytes at rest and five in production. &#8220;If you have a droplet with one gigabyte of RAM, you can have 200 plus services,&#8221; he notes, &#8220;of course in idle, but this proves that if you have a service that consumes a lot of RAM, it is worth thinking about.&#8221; For teams running infrastructure where memory costs money and density matters, the difference between a Rust service and an equivalent service in a garbage-collected language is not marginal.</p><p>The latency story is also specific. &#8220;By not having a garbage collector on the back end side, you basically have a flat latency,&#8221; Ciulla observes. &#8220;If a user makes an HTTP request when the garbage collector starts, it will experience a higher latency. Rust removes that problem entirely.&#8221; Go and Node.js both have garbage collectors that pause for collection cycles, and even short pauses measured in hundreds of milliseconds are enough to introduce latency spikes that affect users who are unlucky enough to hit the request at the wrong moment. Rust&#8217;s absence of a garbage collector means the latency profile is predictable rather than probabilistic, which matters significantly for services where consistency is as important as average throughput.</p><p>The deployment model is simpler than most engineers expect going in. A Rust project built with cargo produces a standalone binary for the target architecture, which packages cleanly into a container image. &#8220;If you build the executable when you build the Docker image, you have something which is just deployable everywhere,&#8221; Ciulla says. &#8220;A Linux executable running in a Docker container. That&#8217;s the dream.&#8221; The operational benefit is smaller images, faster startup, and a runtime with almost no overhead beyond the binary itself.</p><p>Williams approaches the production question from the correctness angle rather than the performance angle. The systems where Rust earns its place most clearly are the ones where failure has a real cost. &#8220;Systems that are mission critical in some way or other are really key Rust use cases,&#8221; he says. &#8220;All of these features combine into a whole that make Rust a really powerful language for doing things that have to work. Things where failure is monetarily or in human cost even a terrible problem.&#8221; The memory safety and the ownership model and the compile-time guarantees are not separate features. They are different expressions of the same underlying commitment: the program either demonstrates its correctness to the compiler or it does not compile.</p><p>Williams also reflects on something unexpected he discovered while writing the early chapters of his book, the ones covering what not to do in Rust. He went back and deliberately tried to write bad code, the kind of code that would illustrate the mistakes he was cautioning against, and found it harder than he expected. &#8220;When I went back and tried to write bad code in Rust, it was much harder than writing the good code,&#8221; he recalls. &#8220;That&#8217;s an interesting perspective that just didn&#8217;t even occur to me.&#8221; The language&#8217;s constraints push code toward a particular shape so consistently that departing from it requires actively working against the grain of the language rather than simply making a poor choice.</p><p>&#8220;The biggest benefit in Rust is about the lack of the debugging depth. You spend more time thinking up front, but you spend almost zero time chasing segfaults or memory leaks in production,&#8221; Ciulla remarks. &#8220;And we always underestimate this part. We always talk about the efficiency of the code, but if you need less time to debug your code, you&#8217;re basically writing more logic at the end of the day.&#8221; The upfront investment in getting the types and the ownership right is real, but the downstream debugging cost it removes is larger and does not diminish as the team becomes more experienced. It is simply gone.</p><h2>Where to start and where Rust is the wrong tool</h2><p>On the practical question of how to bring Rust into an existing codebase, both Williams and Ciulla give advice that converges almost exactly despite coming from different engineering contexts. Neither recommends starting with a rewrite.</p><p>&#8220;The best way to introduce Rust in a big project is to find that hard part that&#8217;s the bottleneck and try to write one single service in Rust,&#8221; Ciulla says. &#8220;And then you will see, probably slowly, Rust might take over your code base, but I mean this in a good sense.&#8221; Williams makes the same point with a specific warning about the temptation to go faster. &#8220;What you don&#8217;t want to do is jump into saying, we&#8217;re just going to rewrite our project in Rust now. Pick a small piece, focus on that, gain confidence and mastery of the language, and then use that to build upon it and start bringing in more things,&#8221; he says. Starting with a bounded, non-critical component gives the team room to move through the learning curve without the pressure of a production incident concentrating everyone&#8217;s attention on the wrong things.</p><p>Ciulla adds something worth noting about the AI-assisted workflow that is becoming standard for many engineers. &#8220;In this AI era, everyone is rushing stuff with AI, but you still need the validation,&#8221; he says. &#8220;Okay, AI wrote this Rust service, but now who decides if this is okay to put in production? Of course, you need the validation of an expert.&#8221; The Rust compiler catches a large class of errors automatically, but the errors that survive it, logic errors rather than memory errors, still require someone who understands the language well enough to see what the code is actually doing. Having at least one engineer on the team who knows Rust well enough to review AI-generated code is not optional.</p><p>Both are also direct about when Rust is not the right choice. Ciulla points to tight deadlines and fast prototyping as the clearest case against it. &#8220;If you need fast prototyping, you are familiar already with Java, JavaScript, why don&#8217;t you use it?&#8221; he says. &#8220;When the deadline is so close, probably it&#8217;s not the best way to try something new because something would go wrong, especially if you&#8217;re not an expert.&#8221; </p><p>Williams points to user interfaces as an area where the ecosystem is still catching up and the tooling gaps are large enough to make other languages more practical. &#8220;Doing a website in Rust is still kind of a feat,&#8221; he notes, &#8220;and it&#8217;s an awful lot easier to use the tools that everybody else is using to accomplish that goal.&#8221; The Python data science ecosystem is another area Ciulla names directly: the libraries are simply better established there, and using Rust for data science work means building against a thinner set of available tools than Python provides.</p><h2>Where Is the Ecosystem Headed</h2><p>Ciulla expects Rust to grow most significantly in the near term, and his prediction lands in a direction that surprises most of the Rust community. &#8220;I think the next big wave might be in web development,&#8221; he says, adding that he is aware this is an unpopular position in a community that still thinks of Rust primarily as a systems language. His reasoning is grounded in what he has been seeing directly: companies with hundreds of developers reaching out to tell him they are moving services to Rust for their web backends. &#8220;I get this news because I&#8217;m well known for talking about Rust and being quite vocal about it,&#8221; he observes. &#8220;I&#8217;m not talking about a person just doing this on a random Saturday night. I&#8217;m talking about companies that have hundreds of developers.&#8221; He points to Axum as the framework that has matured to the point where he would now use it in a production SaaS product, which he says was not true two years ago. Embedded systems, in his view, have already crossed the threshold where Rust&#8217;s place is settled.</p><p>Williams takes a longer view on how the ecosystem will evolve. &#8220;The ecosystem is going to get richer and people are going to be branching out in the set of use cases, hitting areas that right now Rust has relatively weak support for,&#8221; he says. &#8220;As larger and larger projects are built, there is going to be more refinement of the language itself, but more importantly, more refinement of the use of the language.&#8221; The patterns that make Rust work well at scale are still being discovered and codified. The language is stable, but the understanding of how to use it well is still developing, and that development is happening inside the teams building the largest Rust codebases.</p><p>What both conversations point toward is a language whose difficulty and whose value come from the same source. Rust is hard to learn for experienced engineers because it refuses to accommodate the habits that made them experienced. It is valuable in production because that same refusal, enforced by the compiler on every build, produces code whose behavior is predictable, whose data flows are legible, and whose failure modes are constrained to things the language cannot check rather than things the engineer forgot to check. The engineers who get the most out of it are the ones who stop trying to carry their existing instincts across and start letting the compiler teach them what the program actually needs.</p><div><hr></div><h4><em><strong>In case you missed</strong></em></h4><p><em>Here&#8217;s the full interview video featuring Evan Williams.</em></p><div id="youtube2--ElpmT7DCX4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;-ElpmT7DCX4&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/-ElpmT7DCX4?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div>]]></content:encoded></item><item><title><![CDATA[Deep Engineering #47: Evan Williams on Why Experienced Developers Have the Hardest Time Learning Rust]]></title><description><![CDATA[On the borrow checker as a design tool, the object-oriented trap, and why the engineers who struggle most with Rust are often the most experienced ones]]></description><link>https://deepengineering.net/p/deep-engineering-47-why-experienced-developers-hardest-time-learning-rust</link><guid isPermaLink="false">https://deepengineering.net/p/deep-engineering-47-why-experienced-developers-hardest-time-learning-rust</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Thu, 14 May 2026 16:42:52 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/43a42d88-ec70-4d7f-8213-85796343b4f5_677x337.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong><a href="https://www.eventbrite.co.uk/e/eval-driven-development-for-engineers-tickets-1987673491921?aff=deepeng">Eval Driven Development for Engineers</a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.eventbrite.co.uk/e/eval-driven-development-for-engineers-tickets-1987673491921?aff=deepeng" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ogRK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e501442-5ce4-4dd6-b286-3b65f129b544_2160x1080.png 424w, https://substackcdn.com/image/fetch/$s_!ogRK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e501442-5ce4-4dd6-b286-3b65f129b544_2160x1080.png 848w, https://substackcdn.com/image/fetch/$s_!ogRK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e501442-5ce4-4dd6-b286-3b65f129b544_2160x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!ogRK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e501442-5ce4-4dd6-b286-3b65f129b544_2160x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ogRK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e501442-5ce4-4dd6-b286-3b65f129b544_2160x1080.png" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e501442-5ce4-4dd6-b286-3b65f129b544_2160x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.eventbrite.co.uk/e/eval-driven-development-for-engineers-tickets-1987673491921?aff=deepeng&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!ogRK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e501442-5ce4-4dd6-b286-3b65f129b544_2160x1080.png 424w, https://substackcdn.com/image/fetch/$s_!ogRK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e501442-5ce4-4dd6-b286-3b65f129b544_2160x1080.png 848w, https://substackcdn.com/image/fetch/$s_!ogRK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e501442-5ce4-4dd6-b286-3b65f129b544_2160x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!ogRK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e501442-5ce4-4dd6-b286-3b65f129b544_2160x1080.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>This hands-on workshop teaches you to build reliable, production-ready AI systems using eval-driven development. Taught by <a href="https://www.linkedin.com/in/cloudanum/">Imran Ahmad</a>, Data Scientist and author of <em><a href="https://www.packtpub.com/en-us/product/50-algorithms-every-programmer-should-know-9781803246475?srsltid=AfmBOorcXTtocMMH1oL6pNvZ19CwHKuqSCqPVNf-C0khptLyBqafs9Dh">50 Algorithms Every Programmer Should Know</a></em>.</p><p>&#128467;&#65039; May 30 &#183; 11:00 AM &#8211; 3:30 PM ET </p><p style="text-align: center;">Use code <strong>EDD50</strong> for 50% off.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.eventbrite.co.uk/e/eval-driven-development-for-engineers-tickets-1987673491921?aff=deepeng&quot;,&quot;text&quot;:&quot;Register here&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.eventbrite.co.uk/e/eval-driven-development-for-engineers-tickets-1987673491921?aff=deepeng"><span>Register here</span></a></p><div><hr></div><p><strong>&#9997;&#65039; From the editor&#8217;s desk,</strong></p><p>Welcome to the <strong>47th</strong> issue of Deep Engineering!</p><p>Debian&#8217;s APT package manager is moving toward the Rust threshold its maintainers set more than six months ago. APT maintainer Julian Andres Klode<a href="https://lists.debian.org/debian-devel/2025/11/msg00188.html"> announced on the Debian developer mailing list</a> that hard Rust dependencies and Rust code would be introduced no earlier than May 2026, citing memory safety and stronger unit testing as reasons to move core parsing and signature-verification paths toward Rust and the Sequoia ecosystem. For a tool that underpins Debian, Ubuntu, and their many derivatives, this is not a marginal adoption story. It is Rust moving into infrastructure that enormous numbers of systems rely on every day.</p><p>That kind of decision does not get made because Rust is fashionable. It gets made because the language can shift whole classes of errors from production failures into compile-time constraints. That is precisely the argument <a href="https://www.linkedin.com/in/evan-williams-1512092">Evan Williams</a>, senior software engineer and author of <a href="https://www.packtpub.com/en-us/product/design-patterns-and-best-practices-in-rust-9781836209461">Design Patterns and Best Practices in Rust</a>, makes in this week&#8217;s issue. We spoke with Williams about what it actually takes to think in Rust, why the borrow checker is a design tool rather than a compiler obstacle, and why he found it harder to write bad Rust than good Rust when working on the book. You can <a href="https://deepengineering.substack.com/p/design-patterns-ownership-models-resilient-systems-rust-evan-williams">watch our interview or read the full Q&amp;A here</a>.</p><p>Let&#8217;s get started.</p><div><hr></div><h4 style="text-align: center;"><strong>Featured Newsletter: </strong><a href="https://www.devopsbulletin.com/">DevOps Bulletin</a></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vvSm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea1899b-2d52-43a6-adb8-ef38edd7ea42_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vvSm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea1899b-2d52-43a6-adb8-ef38edd7ea42_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!vvSm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea1899b-2d52-43a6-adb8-ef38edd7ea42_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!vvSm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea1899b-2d52-43a6-adb8-ef38edd7ea42_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!vvSm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea1899b-2d52-43a6-adb8-ef38edd7ea42_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vvSm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea1899b-2d52-43a6-adb8-ef38edd7ea42_1024x1024.png" width="313" height="313" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eea1899b-2d52-43a6-adb8-ef38edd7ea42_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;:313,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vvSm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea1899b-2d52-43a6-adb8-ef38edd7ea42_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!vvSm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea1899b-2d52-43a6-adb8-ef38edd7ea42_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!vvSm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea1899b-2d52-43a6-adb8-ef38edd7ea42_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!vvSm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea1899b-2d52-43a6-adb8-ef38edd7ea42_1024x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you work across DevOps, Cloud Native, AI and security and want a weekly read that surfaces the most relevant open-source tooling, stories, and insights in the space, <a href="https://www.devopsbulletin.com/">DevOps Bulletin</a> is worth adding to your reading list.</p><p><strong><a href="https://www.devopsbulletin.com/">Subscribe to DevOps Bulletin</a></strong></p><div><hr></div><p><strong>Expert Insights</strong></p><h2>Rust Makes It Harder to Write Bad Code Than Good Code</h2><p><em>by <a href="https://in.linkedin.com/in/s-jan">Saqib Jan</a> with <a href="https://www.linkedin.com/in/evan-williams-1512092">Evan Williams</a></em></p><p>Most engineers who struggle with Rust describe the same experience. The compiler rejects code that would compile without complaint in C++ or Java, and the borrow checker surfaces errors that feel arbitrary until, gradually, they start to feel like something else entirely. <a href="https://www.linkedin.com/in/evan-williams-1512092">Evan Williams</a>, author of <em><a href="https://www.packtpub.com/en-nz/product/design-patterns-and-best-practices-in-rust-9781836209461">Design Patterns and Best Practices in Rust</a></em> (Packt), has a precise name for what they are. They are design feedback, not feedback about syntax or style, but about the structure of the program itself, the shape of data flow, the discipline of ownership, and the decisions about who controls what and for how long. &#8220;Rust is your partner in doing that,&#8221; Williams says. &#8220;You can still write code with bugs in it, but Rust makes it harder to do that and easier to write code that&#8217;s going to be solid.&#8221;</p><p>That framing changes how to think about the borrow checker, and it changes how to think about what Rust actually is. Most languages make it easy to write code that works in isolation. Rust makes it hard to write code that fails in combination, and the difference matters more as systems grow.</p><h3>The borrow checker is enforcing design, not syntax</h3><p>Most engineers who pick up Rust treat borrow checker errors as obstacles to route around. The instinct is understandable because in Java or Python, the path from a failing compiler error to working code runs through adjustment: find what the compiler dislikes, change it, move on. Rust works differently, and engineers who apply the same strategy find that routing around the borrow checker is possible in the short term and damaging in the long term.</p><p>&#8220;The borrow checker is your friend because it prevents you from making a messy design. It prevents you from making a broken design. It prevents you from writing whole classes of bugs that you will then spend many hours trying to find,&#8221; Williams says. &#8220;I have found it to be an incredible partner in writing code that allows me to sleep at night.&#8221;</p><p>The reason the borrow checker behaves this way is structural. Java and Python allow data to be accessed from many places at once, which gives engineers flexibility but leaves the responsibility of managing that access entirely with the programmer. Rust removes that flexibility. A value has one owner. References are either shared and immutable or exclusive and mutable, never both at the same time. This constraint forces the programmer to be explicit about who owns what and when, because the compiler will not let the program proceed otherwise. The practical consequence is that programs which compile in Rust tend to have a quality that programs in other languages achieve only through discipline: their data flows are explicit. You can read a Rust program and understand, without running it, who controls which piece of state, when that control transfers, and what happens at the boundary.</p><p>&#8220;The principles that the borrow checker forces you to adhere to in Rust are the exact principles that you should be using in every programming language,&#8221; Williams reasons. &#8220;But you don&#8217;t have to. So it&#8217;s very easy to not think about those things.&#8221;</p><h3>The object-oriented trap</h3><p>The single most common mistake engineers make when getting started with Rust is treating it as an object-oriented language. It resembles one superficially, with structs, methods, and something that looks like encapsulation, but it has no inheritance, no abstract base classes, and no shared mutable state by default. An engineer who brings a Java or C++ mental model will find that the things they reach for instinctively are either unavailable or actively counterproductive.</p><p>&#8220;If you carry with you an object-oriented language mindset, then you&#8217;re going to have nothing but trouble,&#8221; Williams says. &#8220;The more experienced you are, the more years you have doing something in some other language, the more trouble you&#8217;re likely to have, because you have patterns of thought that come from those languages that you don&#8217;t even realize are there.&#8221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.packtpub.com/en-in/product/rust-for-c-developers-9781836206514" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1avs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d048692-ae54-47fa-9dfa-9c28d2b605a0_277x342.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1avs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d048692-ae54-47fa-9dfa-9c28d2b605a0_277x342.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1avs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d048692-ae54-47fa-9dfa-9c28d2b605a0_277x342.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1avs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d048692-ae54-47fa-9dfa-9c28d2b605a0_277x342.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1avs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d048692-ae54-47fa-9dfa-9c28d2b605a0_277x342.jpeg" width="317" height="391.3862815884477" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6d048692-ae54-47fa-9dfa-9c28d2b605a0_277x342.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:342,&quot;width&quot;:277,&quot;resizeWidth&quot;:317,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Rust for C++ Developers: Leverage your C++ expertise to write safer and faster systems code in Rust&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.packtpub.com/en-in/product/rust-for-c-developers-9781836206514&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Rust for C++ Developers: Leverage your C++ expertise to write safer and faster systems code in Rust" title="Rust for C++ Developers: Leverage your C++ expertise to write safer and faster systems code in Rust" srcset="https://substackcdn.com/image/fetch/$s_!1avs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d048692-ae54-47fa-9dfa-9c28d2b605a0_277x342.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1avs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d048692-ae54-47fa-9dfa-9c28d2b605a0_277x342.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1avs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d048692-ae54-47fa-9dfa-9c28d2b605a0_277x342.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1avs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d048692-ae54-47fa-9dfa-9c28d2b605a0_277x342.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><strong><a href="https://www.packtpub.com/en-in/product/rust-for-c-developers-9781836206514">Rust for C++ Developers</a></strong></figcaption></figure></div><p>This is a precise observation about how expertise transfers, or fails to. An engineer with ten years in Java has a large inventory of solutions to common problems, and most of those solutions depend on inheritance, shared mutable references, or runtime polymorphism through interfaces. In Rust, none of those approaches work as expected. The patterns are not wrong in their original context. They are wrong for this one, and the difficulty is that the engineer applying them does not recognize the mismatch until the borrow checker makes it unavoidable.</p><p>The design patterns that experienced engineers carry into Rust need to be examined before use, not applied by default. Some evolve into new forms because Rust&#8217;s enums and advanced generics make several classical patterns either less necessary or unnecessary entirely. Others require fundamental rethinking. The Singleton pattern, useful enough in Java and Python that engineers reach for it without deliberation, tends to become either redundant or actively problematic in Rust. &#8220;In Rust, it tends to be either completely unnecessary because other features of the language make it unneeded, or it tends to encourage designs that are really not necessary and where a much better approach could be used,&#8221; Williams says.</p><p>The replacement for inheritance in most cases is traits, which provide polymorphism without the coupling that comes from sharing a class hierarchy. The discipline required to work with traits well is the same discipline the borrow checker enforces on data: think about the boundaries, be explicit about what crosses them, and design the structure before writing the code.</p><h3>Ownership as architecture</h3><p>The ownership model does more than prevent bugs at the function level. It shapes the architecture of the system, because the rules that apply to individual values apply at every level of scale. A program that handles data ownership correctly in a single function has to handle it correctly across modules, across threads, and across the boundaries between components. The borrow checker enforces this at compile time, which means architectural decisions that in other languages can be deferred until the system grows large enough to break start being made from the beginning.</p><p>&#8220;You need to think about who controls what, how it is controlled, and you need to start from the very beginning thinking about the boundaries of your program and the system architecture, dividing things up into areas of responsibility,&#8221; Williams says. &#8220;Because unlike Python or Java, you can&#8217;t have links going all over the place. The borrow checker is never going to accept that.&#8221;</p><p>This constraint produces a specific architectural tendency in well-written Rust systems: data flows in one direction. Rather than components that hold references to each other in a web of mutual dependency, Rust systems tend toward chains of ownership that move in one direction and do not loop back. &#8220;By saying, I have a chain of ownership that moves down but never moves back up, you are now much more likely to have a system that is going to work,&#8221; Williams says. &#8220;Data flowing down is something that feels natural and smooth and just works. Data trying to fight the stream back up is going to end up giving you problems because the borrow checker is not going to like you.&#8221;</p><p>The architectural benefit of this tendency is legibility as much as correctness. A system where data flows in one direction is a system where behavior is predictable from the structure, and debugging does not require reconstructing who might have modified a value and when, because the ownership model makes that history explicit. </p><p>Williams illustrates this with an <a href="https://www.packtpub.com/en-nz/product/design-patterns-and-best-practices-in-rust-9781836209461">example from his book</a>, a miniature publish-and-subscribe system built to resemble Kafka at a much smaller scale. &#8220;Because Rust has move semantics, you know that if something leaves here and goes here, it&#8217;s now not here anymore. It&#8217;s there. There&#8217;s no question about things like having references dangling or anything like that. The clarity of things moving through the system, the clarity of being able to have immutable data in a lot of places and knowing who can and can&#8217;t modify any piece of data, it just makes the design of the system so clear and it makes it so much harder to make a system that doesn&#8217;t work,&#8221; he says.</p><h3>The typestate pattern</h3><p>The most underutilized expression of this architectural discipline in Rust is one that Williams returns to with visible enthusiasm. The typestate pattern uses the type system to encode the state of a value at compile time in a way that makes invalid state transitions not just errors but programs that will not compile.</p><p>&#8220;It&#8217;s a way of developing state machines and systems that have state that evolves where invalid state transitions aren&#8217;t just errors, they&#8217;re impossible to write. The compiler won&#8217;t compile them,&#8221; Williams says. &#8220;It represents a huge advance in the way that such systems are written because now instead of runtime errors, you have a state machine that is guaranteed to work because every transition either is a valid transition or it won&#8217;t even compile. That&#8217;s an amazing thing.&#8221;</p><p>The typestate pattern was not invented for Rust, but the language&#8217;s ownership system and its handling of types make it practical in a way that other languages do not. The result is that a class of bugs that normally surfaces at runtime, invalid transitions through a state machine, surfaces instead at compile time, before the program runs. For systems where correctness is not optional, this is a material improvement. &#8220;Not invented for Rust, but it fits Rust so perfectly, it&#8217;s hard to believe it,&#8221; Williams says.</p><h3>What this requires in practice</h3><p>None of this comes without a cost. The discipline that Rust enforces at compile time is discipline that engineers have to supply at design time, and for teams moving from other languages the transition is genuinely difficult. Williams is specific about where the difficulty concentrates. Velocity drops during the learning period, often enough that teams take it as a signal that the decision was wrong, and it usually is not. &#8220;Once the team becomes very well acquainted with Rust, velocity can increase dramatically, but there is a period of time where it seems like things have gotten worse,&#8221; he says.</p><p>The answer for most teams is to start with a small, non-critical piece of work rather than a rewrite of an existing system, with the goal of building familiarity in a context where the cost of roadblocks is low and then expanding from there. &#8220;What you don&#8217;t want to do is jump into saying, we&#8217;re just going to rewrite our project in Rust now. Pick a small piece, focus on that, gain confidence and mastery of the language, and then use that to build upon it and start bringing in more things,&#8221; Williams says.</p><p>There are also cases where Rust is the wrong tool. Prototyping benefits from the flexibility that Python provides and that Rust does not. Environments where the tooling is incomplete are not the right place to fight the language and the Rust ecosystem, while growing rapidly, still has gaps where Java or C libraries are well established. User interfaces are the clearest current example. But in systems where failure is expensive, where correctness cannot be approximated, and where the code has to remain understandable as the team around it changes, Rust&#8217;s constraints are not a cost. They are the point.</p><h3>The harder thing to write</h3><p>The most revealing observation Williams made came not from a question about patterns or architecture but from the experience of writing the early chapters of his book, the ones about what not to do. He went back and tried to write bad Rust deliberately, the kind of code that would illustrate the mistakes he was cautioning against, and it was harder than he expected.</p><p>&#8220;When I went back and tried to write bad code in Rust, it was much harder than writing the good code,&#8221; Williams says. &#8220;That&#8217;s an interesting perspective that just didn&#8217;t even occur to me.&#8221;</p><p>That observation captures something important about what the language is doing. Rust is not just a language with a strict compiler. Its constraints push code toward a specific shape, one that is explicit about data flow, deliberate about ownership, and structured around clear boundaries of responsibility. The engineers who find Rust most difficult are often the engineers with the most experience, because they have the most deeply held instincts to unlearn. And the engineers who find it most rewarding tend to be the ones who stop treating the borrow checker as an obstacle and start reading it as design feedback. The language is not rejecting their code. It is asking them to think more clearly about what the code is actually doing.</p><div><hr></div><h3>In case you missed </h3><p><em>Here&#8217;s the full Q&amp;A with the interview video featuring Evan Williams.</em></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;140e7e87-c811-4a40-a09c-86b76c37b154&quot;,&quot;caption&quot;:&quot;Evan Williams has been writing software for more than 40 years, across every layer of the stack and more programming languages than most engineers will encounter in a career. He recently sat down with Deep Engineering to talk about what that shift requires, which traditional patterns break in Rust, the typestate pattern he finds almost impossible to stop talking about, and why he discovered it is harder to write bad Rust than good Rust.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Design Patterns, Ownership Models, and Building Resilient Systems in Rust with Evan Williams&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:427210082,&quot;name&quot;:&quot;Saqib Jan&quot;,&quot;bio&quot;:&quot;/localhost&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997a788a-cd78-4f84-9b3b-c72ab6dc0153_1008x1008.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-05-13T18:07:20.569Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/youtube/w_728,c_limit/-ElpmT7DCX4&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://deepengineering.substack.com/p/design-patterns-ownership-models-resilient-systems-rust-evan-williams&quot;,&quot;section_name&quot;:&quot;Interviews&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:197553608,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1729053,&quot;publication_name&quot;:&quot;Packt Deep Engineering&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!H5BJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F736bc1ee-d689-497e-83a8-7d9bf9022eb9_600x600.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p></p><div><hr></div><h2><strong>&#128736;&#65039; Tool of the Week</strong></h2><p><strong><a href="https://github.com/rust-lang/rust-analyzer">rust-analyzer</a></strong> &#8212; Rust language server that provides IDE functionality for writing Rust programs.</p><p><strong>Highlights:</strong></p><ul><li><p>Surfaces Rust diagnostics, including ownership and borrow-checker errors from compiler checks, inline during editing.</p></li><li><p>Supports major LSP-compatible editors such as VS Code, Vim, Emacs, and Zed, with regular stable releases.</p></li><li><p>Widely used across the Rust ecosystem as the standard Rust IDE backend, including in workflows at organizations that build with Rust.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/rust-lang/rust-analyzer&quot;,&quot;text&quot;:&quot;Learn more about rust-analyzer&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/rust-lang/rust-analyzer"><span>Learn more about rust-analyzer</span></a></p><div><hr></div><h1><strong>&#128206; Tech Briefs</strong></h1><ul><li><p><a href="https://ubuntu.com/blog/dirty-frag-linux-vulnerability-fixes-available">Dirty Frag vulnerabilities disclosed in the Linux kernel</a> - Two CVEs in Linux ESP/IPsec and RxRPC components allow unprivileged local users to gain root on affected systems.</p></li><li><p><a href="https://lwn.net/Articles/1071776/">Linux 7.0.5 stable released with partial Dirty Frag fix</a> - Linux 7.0.5 ships a partial XFRM/ESP patch for Dirty Frag, with a second required fix still in development at release time.</p></li><li><p><a href="https://github.blog/changelog/2026-05-05-secret-scanning-with-github-mcp-server-is-now-generally-available/">GitHub secret scanning via MCP Server now generally available</a> - Credential scanning is now available in MCP-compatible coding agents before commits or pull requests, requiring GitHub Secret Protection to be enabled on the repository.</p></li><li><p><a href="https://www.neowin.net/news/linux-71-rc2-lands-as-ai-generated-patches-and-kvm-oddities-shake-up-the-kernel/">Linux 7.1-rc2 published</a> &#8212; KVM selftest renaming drove the unusual patch volume in rc2, with functional work covering driver and networking fixes throughout the tree.</p></li><li><p><a href="https://blogs.oracle.com/mysql/mysql-9-7-0-lts-is-now-available-expanded-community-capabilities-and-dynamic-data-masking-for-enterprise">MySQL 9.7.0 LTS generally available</a> - New MySQL LTS line ships the Hypergraph Optimizer in Community Edition, with Dynamic Data Masking remaining Enterprise-only in this release.</p></li></ul><div><hr></div><p></p><p>That&#8217;s all for today. Thank you so very much for reading this issue of Deep Engineering.</p><p>We&#8217;ll be back next week with more expert-led content.</p><p>Stay awesome, </p><p>Saqib Jan </p><p>Editor-in-Chief, Deep Engineering</p><div><hr></div><p><em>If your company is interested in reaching an audience of senior developers, software engineers, and technical decision-makers, you may want to </em><strong><a href="https://packt.omeclk.com/portal/wts/uc%5EcnN2dfNaqmD-kB-mo66%7C7g%5Ef%7Cb">advertise with us</a></strong><em>.</em></p><p>Thanks for reading Packt Deep Engineering! Subscribe for free to receive new posts and help grow our work.</p>]]></content:encoded></item><item><title><![CDATA[Design Patterns, Ownership Models, and Building Resilient Systems in Rust with Evan Williams]]></title><description><![CDATA[Why experienced developers have the hardest time, and what that tells you about the language]]></description><link>https://deepengineering.net/p/design-patterns-ownership-models-resilient-systems-rust-evan-williams</link><guid isPermaLink="false">https://deepengineering.net/p/design-patterns-ownership-models-resilient-systems-rust-evan-williams</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Wed, 13 May 2026 18:07:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/-ElpmT7DCX4" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://www.linkedin.com/in/evan-williams-1512092">Evan Williams </a>has been writing software for more than 40 years, across every layer of the stack and more programming languages than most engineers will encounter in a career. His book, <em><a href="https://www.packtpub.com/en-nz/product/design-patterns-and-best-practices-in-rust-9781836209461">Design Patterns and Best Practices in Rust</a></em><a href="https://www.packtpub.com/en-nz/product/design-patterns-and-best-practices-in-rust-9781836209461">, </a>published by Packt, is not a pattern catalogue. It is an argument for a different way of thinking about code entirely, aimed squarely at experienced developers who arrive in Rust carrying instincts that the language will refuse to accommodate. </p><p>He recently sat down with Deep Engineering to talk about what that shift requires, which traditional patterns break in Rust, the typestate pattern he finds almost impossible to stop talking about, and why he discovered it is harder to write bad Rust than good Rust.</p><p>Watch the full conversation below.</p><div id="youtube2--ElpmT7DCX4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;-ElpmT7DCX4&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/-ElpmT7DCX4?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><em>A note on format: the transcript below has been lightly edited for clarity and readability.</em></p><div><hr></div><p><em><strong>Q. You have been in software for a long time. Tell us about your background and how your journey started.</strong></em></p><p><strong>Evan Williams:</strong> I have been in the software business for horrifyingly more than 40 years. Surprisingly, given that, my journey started when I was 14 years old, in the 1970s. My father was a very skilled electrical engineer, and we built a computer in the basement together, which had a 6502 processor and 1K of RAM. He hoped that I would become an electrical engineer because of my interest in the electronics. I became a programmer because I thought the programming was the most fun part. I have since then grown up with the industry, not from the very beginning of it, but certainly from fairly early on, and in particular grown up with professional software development from the beginning. I&#8217;ve touched every part of the stack, many, many programming languages, many systems, and I am intensely interested by this. If they didn&#8217;t pay me to do it, I&#8217;d do it anyway.</p><p><em><strong>Q. You have worked with languages like C and Python. What initially drew you toward Rust?</strong></em></p><p><strong>Evan Williams:</strong> I&#8217;m interested in programming languages in general, and I had heard about Rust almost at the very start. I looked at it and I said, this looks kind of mildly interesting, I&#8217;ll just remember that. And then I forgot about it. But years later, Rust had just barely reached 1.0, and I was working on a hardware project that had a few interesting characteristics. It needed to be in a location that we couldn&#8217;t access easily. It wasn&#8217;t going to be on the internet. It needed to be rock solid because people depended on it. And it was remarkably complicated software. The team talked about it and we made the decision to go with Rust, which none of us knew at the time. We all learned it together. And that was where I caught the Rust bug and have not lost it since.</p><p><em><strong>Q. What motivated you to write a book on design patterns in Rust at this stage of your career?</strong></em></p><p><strong>Evan Williams:</strong> There are sort of two questions tied up in there. One is, why would I be writing a book at all at this stage of my career? And the answer to that is, I have been remarkably fortunate to have people help me throughout my career and help me grow. And it makes me incredibly happy to be able to pay that forward and help the people who are learning at this point to grow themselves. This book is a vehicle for me to help people. Why Rust design patterns? Because I think the interesting thing about dealing with design patterns in Rust is very often they&#8217;re not what you need, and very often the traditional ones are not exactly what you need, and very often they can cause you problems that you didn&#8217;t have to have. So I wanted to save people that frustration and help them move along the path in a way that is a lot less painful, by not making the same mistakes that I made.</p><p><em><strong>Q. Rust has been around for some time but is now seeing increased adoption. Why do you think this is the moment?</strong></em></p><p><strong>Evan Williams:</strong> For a long time there were a lot of people like me who were excited about Rust, and there were people who were early adopters who were pushing for it. But right now what we&#8217;re seeing is a world where the language has matured, the ecosystem has matured, it&#8217;s reached a kind of critical mass. Now when someone is thinking about doing a Rust project, they&#8217;re not pioneers who are wandering out into lands unknown. There&#8217;s a huge community, a huge set of packages and software, great learning resources, and there are people who have had success that you can see who have done amazing things with Rust. People feel more confident and feel safer venturing into using Rust for things, whereas before it was a little bit more of a risk in their mind.</p><p><em><strong>Q. What gaps does Rust fill compared to more established languages like C, Java, or Python?</strong></em></p><p><strong>Evan Williams:</strong> I could just go over sort of the normal thing and say high performance and memory safety, and all those things are true. But Rust is also a powerful modern language that has a good feature set. And I feel like there&#8217;s a design gap of sorts. One of the things that&#8217;s great about Rust, and I&#8217;ll probably keep returning to this topic, is if you need something to be correct, if you need to be able to count on the code that you write, Rust helps you. Rust is your partner in doing that. You can still write code with bugs in it, but Rust makes it harder to do that and easier to write code that&#8217;s going to be solid. I think that&#8217;s a huge gap that it fills.</p><p><em><strong>Q. What kinds of systems or use cases benefit most from adopting Rust today?</strong></em></p><p><strong>Evan Williams:</strong> Systems that are mission critical in some way or other are really key Rust use cases. Yes, Rust has high efficiency and the memory safety is very important. But all of these features combine into a whole that make Rust a really powerful language for doing things that have to work. Things where failure is monetarily or in human cost even a terrible problem. That&#8217;s one of the powers of the language and I think it&#8217;s great for those situations.</p><p><em><strong>Q. One of the recurring themes in your book is that developers need to think differently in Rust. What does that mindset shift actually involve?</strong></em></p><p><strong>Evan Williams:</strong> There are a few things associated with that. One is that Rust is not an object-oriented language. It kind of looks like an object-oriented language in some ways, but it&#8217;s not. And if you carry with you an object-oriented language mindset, then you&#8217;re going to have nothing but trouble. It&#8217;s also a language that requires you to think carefully about the design of your code before you start writing it. It&#8217;s very easy to get yourself into trouble in Rust if you don&#8217;t plan what you&#8217;re doing. You have to start thinking about data and how it&#8217;s handled in a different way. You have to think ahead of time about where the data is flowing through your program, what it is, where it is going, how long is it going to live, who is responsible for it. These are things that you don&#8217;t really have to think about when you&#8217;re writing a Python program or a Java program. Those are good design principles in all of those languages, but Rust requires it of you.</p><p><em><strong>Q. Many developers struggle with the borrow checker early on. How should they reframe it as a design tool rather than a limitation?</strong></em></p><p><strong>Evan Williams:</strong> The thing about the borrow checker is it&#8217;s there to help you, and it is very easy to get into a mode where you&#8217;re fighting with it and you feel like it&#8217;s your enemy. But in fact, what it is doing is encouraging you to build your code in a solid manner. It&#8217;s encouraging you to think about not just what data you have, but how it&#8217;s going to be used. In something like Java or Python, with some amount of plumbing you can get anything from anywhere. You don&#8217;t really have to design your program in a highly organized way where you&#8217;ve thought about the data flows. But you&#8217;re much better off if you do. I think the principles that the borrow checker forces you to adhere to in Rust are the exact principles that you should be using in every programming language. But you don&#8217;t have to. So it&#8217;s very easy to not think about those things. The borrow checker is your friend because it prevents you from making a messy design. It prevents you from making a broken design. It prevents you from writing whole classes of bugs that you will then spend many hours trying to find. I have found it to be an incredible partner in writing code that allows me to sleep at night.</p><p><em><strong>Q. What are the most common mistakes developers make when they try to apply patterns from other languages directly in Rust?</strong></em></p><p><strong>Evan Williams:</strong> The principal thing is, number one, trying to use Rust as if it&#8217;s an object-oriented language. It&#8217;s not going to work. Viewing the compiler errors as things that you need to figure out how to work around is something that virtually everybody who starts with Rust does. And I can&#8217;t emphasize this enough: one of the things that&#8217;s sort of interesting about Rust is the more experienced you are, the more years you have doing something in some other language, the more trouble you&#8217;re likely to have, because you have patterns of thought that come from those languages that you don&#8217;t even realize are there. That&#8217;s one of the things that can really get you into trouble. Treating the compiler errors and the problems with the borrow checker as things to work around as opposed to signals that your program needs some redesign, and thinking about things from an object-oriented perspective, those are the main traps.</p><p><em><strong>Q. Traditional design patterns were created with object-oriented languages in mind. How do they evolve when applied to Rust?</strong></em></p><p><strong>Evan Williams:</strong> In a number of different ways. First, some of them evolve into entirely new forms or almost out of existence, because being a modern language, Rust has things like enums and all sorts of very advanced use of generics. These are things that make a lot of these design patterns either less necessary or unnecessary. Another way that they evolve is that since there is no inheritance in the language, you have to rethink a lot of the design patterns where, say, you would have an abstract base class. You can&#8217;t have that because there&#8217;s no such thing. So you would lean into traits. And every single design pattern that you use is affected by the borrow checker and by memory discipline in a way that is not normal in something like Java or Python.</p><p><em><strong>Q. Are there any patterns that become unnecessary or even counterproductive in Rust?</strong></em></p><p><strong>Evan Williams:</strong> The one that immediately springs to mind is Singleton, which is so useful that I was using it before it had a name. But it&#8217;s useful in Python or Java. In Rust, it tends to be either completely unnecessary because other features of the language make it unneeded, or it tends to encourage designs that are really not necessary and where a much better approach could be used. There are a few occasions where the singleton pattern, as it stands, is actually useful, but more often than not, it&#8217;s getting you into trouble.</p><p><em><strong>Q. What Rust-specific patterns do you think are the most powerful and still underutilized?</strong></em></p><p><strong>Evan Williams:</strong> The one that I get so excited about that I have to limit myself so that I don&#8217;t spend the rest of this conversation talking about it is the typestate pattern. This is something that was not invented for Rust, but you would think that it had been because it works for Rust so perfectly. It&#8217;s a way of developing state machines and systems that have state that evolves where invalid state transitions aren&#8217;t just errors, they&#8217;re impossible to write. The compiler won&#8217;t compile them. It represents a huge advance in the way that such systems are written because now instead of runtime errors, you have a state machine that is guaranteed to work because every transition either is a valid transition or it won&#8217;t even compile. That&#8217;s an amazing thing and I love that feature. Not invented for Rust, but it fits Rust so perfectly, it&#8217;s hard to believe it.</p><p><em><strong>Q. Your book emphasizes clear data flow and system architecture. Why is unidirectional data flow so important in Rust systems?</strong></em></p><p><strong>Evan Williams:</strong> Thinking about the way data flows through your system in Rust is crucial because Rust makes it much more difficult to thread things back. As a general rule, because you can&#8217;t have many different clients holding on to different things in different places, especially not being able to write to different things in different places, having a clear direction of data flow makes it much clearer and much easier to create a consistent system that&#8217;s going to compile and work. By saying, I have a chain of ownership that moves down but never moves back up, you are now much more likely to have a system that is going to work in an environment where the number of references that can be held is very limited and you have to be very careful about memory safety. Data flowing down is something that feels natural and smooth and just works. Data trying to fight the stream back up is going to end up giving you problems because the borrow checker is not going to like you.</p><p><em><strong>Q. How does Rust&#8217;s ownership model influence architectural decisions at the system level?</strong></em></p><p><strong>Evan Williams:</strong> I think one of the crucial things about it is that because you have to be so thoughtful about how your data moves and who owns it, you have to also think about what that means for your system. You need to think about who controls what, how it is controlled, and you need to start from the very beginning thinking about the boundaries of your program and the system architecture, dividing things up into areas of responsibility. Because unlike Python or Java, you can&#8217;t have links going all over the place. The borrow checker is never going to accept that. Rust gives you lots of great tools for creating boundaries of abstraction that make it a lot simpler to write code that doesn&#8217;t have hidden or difficult-to-find connections between things. You know who owns things, you know who is able to write things. In order to do that, you have to be able to think about things ahead of time and think about what parts of your program own what, and create clear boundaries and areas of responsibility for each piece of the system that you build.</p><p><em><strong>Q. Can you share an example of how Rust leads to better system design compared to other languages?</strong></em></p><p><strong>Evan Williams:</strong> One of the examples in the book, one of the projects that we build in the book, is a miniature publish-and-subscribe system similar to Kafka, but very, very much smaller. It is amazing how easy it becomes to make something that is solid and clean in that circumstance. Because Rust has move semantics, you know that if something leaves here and goes here, it&#8217;s now not here anymore. It&#8217;s there. There&#8217;s no question about things like having references dangling or anything like that. The clarity of things moving through the system, the clarity of being able to have immutable data in a lot of places and knowing who can and can&#8217;t modify any piece of data, it just makes the design of the system so clear and it makes it so much harder to make a system that doesn&#8217;t work. By doing things that way, you have something where you can have a potentially very complicated system and yet have complete confidence that every piece of it individually is going to work right and that they&#8217;re going to work together as a system.</p><p><em><strong>Q. What are the real-world challenges that engineering teams face when adopting Rust in production?</strong></em></p><p><strong>Evan Williams:</strong>  One thing that often happens is that when a team adopts Rust, because of the challenges of learning to work in the language, velocity can go down at first. The team can find itself actually moving slower. Once the team becomes very well acquainted with Rust, velocity can increase dramatically, but there is a period of time where it seems like things have gotten worse. Another problem that often happens is that, as I said earlier, more experienced developers often have a harder time adapting to it. And the last thing I&#8217;ll mention, although it&#8217;s a lot better than it used to be, is Rust is still not 100% in terms of the kind of rich libraries that you&#8217;d find in, say, Java or C, which are just older languages. There&#8217;s more out there that supports those languages, although Rust is certainly catching up and it&#8217;s remarkable how far it&#8217;s come.</p><p><em><strong>Q. When would you advise against using Rust for a project?</strong></em></p><p><strong>Evan Williams:</strong> There are a few things. If you&#8217;re doing some kind of prototyping, Rust is harder to prototype in and you really want something more like Python. If you&#8217;re working in certain niche environments where the tooling is not there, that&#8217;s a place where you don&#8217;t want to try to fight with the tooling to try to get Rust to work. It&#8217;s good to just work with the native things that are there. There are places where a dynamic language like Python is just a much easier thing to use and will more perfectly fit what you&#8217;re trying to do. And I also think there are a few areas where Rust has the potential to do a lot but is still catching up. User interfaces, for example. There are certainly user interface frameworks and libraries, but doing a website in Rust is still kind of a feat. And it&#8217;s an awful lot easier to use the tools that everybody else is using to accomplish that goal.</p><p><em><strong>Q. What is the best way to introduce Rust to a team without overwhelming your developers?</strong></em></p><p><strong>Evan Williams:</strong> The thing that you need to do to start is find a piece of work that you can work on that has a limited scope and which is not in the critical path, because there are going to be roadblocks and bumps as people learn. What you don&#8217;t want to do is jump into saying, we&#8217;re just going to rewrite our project in Rust now. Pick a small piece, focus on that, gain confidence and mastery of the language, and then use that to build upon it and start bringing in more things.</p><p><em><strong>Q. How should developers balance performance, safety, and complexity when designing systems in Rust?</strong></em></p><p><strong>Evan Williams:</strong> One of the nice things about it is that all of those things sort of come with the language. The thing that developers need to do is focus on letting the language help you. Rust will give you all of those things if you focus on thinking in the language and using patterns and features that are natural to the language, as opposed to trying to retool something from another language that doesn&#8217;t really fit. There are so many things that people try to do to get around problems that they have where if they just use the features of the language as they exist and did things in a way that&#8217;s more natural to the language, all of those things just fall out.</p><p><em><strong>Q. How do you see Rust evolving over the next couple of years in terms of adoption and ecosystem?</strong></em></p><p><strong>Evan Williams:</strong> There are a couple of different ways you can answer that. The ecosystem is going to get richer and people are going to be branching out in the set of use cases, hitting areas that right now Rust has relatively weak support for, but where I think people are building all the time. As larger and larger projects are built, there is going to be more refinement of the language itself, but more importantly, more refinement of the use of the language. And I think this is important. This book that I wrote is not just about the language itself, but the way to use the language. And I think the Rust community and the people who are building in Rust are going to be defining and creating new ways to use it that are unique and leverage its power to do things that right now we haven&#8217;t even thought of.</p><p><em><strong>Q. Did any of your own assumptions about Rust change while you were writing the book?</strong></em></p><p><strong>Evan Williams:</strong> It&#8217;s interesting because one of the things that changed is I came to recognize, through working on the early chapters about what not to do, that in Rust it&#8217;s actually more work to do things wrong. And I think that&#8217;s one of the things that surprised me. I knew that you had to think in a new way and do things differently, but when I went back and tried to write bad code in Rust, it was much harder than writing the good code. That&#8217;s an interesting perspective that just didn&#8217;t even occur to me.</p><p><em><strong>Q. For developers picking up your book, what key takeaway do you hope they walk away with?</strong></em></p><p><strong>Evan Williams:</strong> The key takeaway is that the thing you want is not to learn a particular set of patterns. My book is full of what the title says, how to deal with design patterns in Rust. But the much more important thing is changing your mindset. If I can help people to recognize that there is a new mindset that they need, that&#8217;s the key thing. And I see so many people who become frustrated with Rust because Rust has such an unusual learning curve. In most languages, it&#8217;s sort of a steady progress. Maybe you plateau a little bit, but you&#8217;re always going up. With Rust, very often it seems like you&#8217;re learning and learning and learning and getting better and better. And when you reach a certain level of complexity in your programs, it feels like things are getting worse. And that&#8217;s because of the mindset. Helping people understand that will save them so much pain. That&#8217;s what I want people to take away from the book.</p><p><em><strong>Q. Is there something most developers underestimate about Rust?</strong></em></p><p><strong>Evan Williams:</strong> I think the thing that people perhaps underestimate about Rust is it&#8217;s not just about memory safety and all these other things. It&#8217;s a really powerful modern programming language. It brings so much to the table that has nothing to do with memory safety or thread safety or any of those other things or high performance. It&#8217;s just a very clean, beautiful language to write in because it brings so many modern innovations that other languages are sort of stuck having to drag along historic pieces of syntax alongside. Rust is a pleasure to write in. It&#8217;s just sometimes the borrow checker can be a little annoying.</p><div><hr></div><p><em><a href="https://www.linkedin.com/in/evan-williams-1512092">Evan Williams</a> is the author of <a href="https://www.packtpub.com/en-nz/product/design-patterns-and-best-practices-in-rust-9781836209461">Design Patterns and Best Practices in Rust</a>, published by Packt. This interview was conducted by <a href="https://www.linkedin.com/in/s-jan">Saqib Jan</a>, Editor-in-Chief of Deep Engineering.</em></p>]]></content:encoded></item><item><title><![CDATA[Deep Engineering #46: Jim Ledin on Modern Computer Architecture and the AI Infrastructure Layer]]></title><description><![CDATA[Memory bandwidth, GPU trade-offs, and the infrastructure decisions that determine whether AI systems are resilient up in production]]></description><link>https://deepengineering.net/p/issue-46-jim-ledin-computer-architecture-ai-infrastructure-layer</link><guid isPermaLink="false">https://deepengineering.net/p/issue-46-jim-ledin-computer-architecture-ai-infrastructure-layer</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Thu, 07 May 2026 15:03:11 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8adf3738-2898-4207-9a54-e3709b1e9c3c_850x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong><a href="https://www.vpdae.com/redirect/oxmujewa9r6jmrhyz62em0cftb6">View the latest HubSpot Developer Platform updates in Spring Spotlight</a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.vpdae.com/redirect/oxmujewa9r6jmrhyz62em0cftb6" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hxs6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe807db93-d946-4468-b471-e473ec937fe7_1320x660.png 424w, https://substackcdn.com/image/fetch/$s_!Hxs6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe807db93-d946-4468-b471-e473ec937fe7_1320x660.png 848w, https://substackcdn.com/image/fetch/$s_!Hxs6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe807db93-d946-4468-b471-e473ec937fe7_1320x660.png 1272w, https://substackcdn.com/image/fetch/$s_!Hxs6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe807db93-d946-4468-b471-e473ec937fe7_1320x660.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hxs6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe807db93-d946-4468-b471-e473ec937fe7_1320x660.png" width="728" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e807db93-d946-4468-b471-e473ec937fe7_1320x660.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:660,&quot;width&quot;:1320,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.vpdae.com/redirect/oxmujewa9r6jmrhyz62em0cftb6&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Hxs6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe807db93-d946-4468-b471-e473ec937fe7_1320x660.png 424w, https://substackcdn.com/image/fetch/$s_!Hxs6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe807db93-d946-4468-b471-e473ec937fe7_1320x660.png 848w, https://substackcdn.com/image/fetch/$s_!Hxs6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe807db93-d946-4468-b471-e473ec937fe7_1320x660.png 1272w, https://substackcdn.com/image/fetch/$s_!Hxs6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe807db93-d946-4468-b471-e473ec937fe7_1320x660.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><strong>See what&#8217;s new for the <a href="https://www.vpdae.com/redirect/oxmujewa9r6jmrhyz62em0cftb6">HubSpot Developer Platform! </a></strong></p><p>Ship faster with AI coding tools like Cursor, Claude Code, and Codex. Build MCP-powered AI connectors, run serverless functions with support for UI extensions, and use date-based versioning to streamline roadmap planning.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.vpdae.com/redirect/oxmujewa9r6jmrhyz62em0cftb6&quot;,&quot;text&quot;:&quot;Explore Updates&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.vpdae.com/redirect/oxmujewa9r6jmrhyz62em0cftb6"><span>Explore Updates</span></a></p><div><hr></div><p><strong>&#9997;&#65039; From the editor&#8217;s desk,</strong></p><p>Welcome to the <strong>46th</strong> issue of Deep Engineering!</p><p>This week, InfoQ analyzed what it actually took for <a href="https://www.infoq.com/news/2026/05/cloudflare-llm-infrastructure/">Cloudflare to run large language models efficiently on their global network</a>. The team built a custom inference engine called <a href="https://blog.cloudflare.com/cloudflares-most-efficient-ai-inference-engine/">Infire</a> from scratch in Rust, split model processing into two separate hardware stages because a single machine could not handle both efficiently, and compressed model weights by 15 to 22 percent to reduce what GPUs need to load and move during inference. The reason they had to do all of this is the same one that matters to every engineering team building AI systems: the hardware layer is not an abstraction you can ignore. It is the constraint that every other architectural decision is made around.</p><p>This pattern, where standard approaches to running AI workloads break down under real production constraints and the fix requires going back to the hardware layer, is one most engineering teams will eventually encounter. The engineers who avoid it are the ones who understood the hardware constraints before they started building, not after they hit them. Cloudflare&#8217;s <a href="https://blog.cloudflare.com/high-performance-llms/">engineering blog post</a> goes into the technical detail for teams who want to dig further.</p><p>This week we are featuring <a href="https://www.linkedin.com/in/jimledin">Jim Ledin</a>, CEO of <a href="https://ledin.com/">Ledin Engineering</a> and author of <a href="https://www.packtpub.com/en-us/product/modern-computer-architecture-and-organization-9781806028023">Modern Computer Architecture and Organization</a>, now in its third edition published by Packt. Ledin has over thirty years of experience working on embedded systems, safety-critical hardware, and cybersecurity. In this issue he breaks down what engineers building AI systems get wrong about the hardware layer and why it costs them.</p><p>Let&#8217;s get started.</p><div><hr></div><h3><a href="https://www.eventbrite.co.uk/e/architecting-production-ready-apis-for-agents-tickets-1986966927568?aff=deepeng">Architecting Production-Ready APIs for Agents</a></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.eventbrite.co.uk/e/architecting-production-ready-apis-for-agents-tickets-1986966927568?aff=deepeng" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TMPf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png 424w, https://substackcdn.com/image/fetch/$s_!TMPf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png 848w, https://substackcdn.com/image/fetch/$s_!TMPf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png 1272w, https://substackcdn.com/image/fetch/$s_!TMPf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TMPf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png" width="960" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:960,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.eventbrite.co.uk/e/architecting-production-ready-apis-for-agents-tickets-1986966927568?aff=deepeng&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!TMPf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png 424w, https://substackcdn.com/image/fetch/$s_!TMPf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png 848w, https://substackcdn.com/image/fetch/$s_!TMPf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png 1272w, https://substackcdn.com/image/fetch/$s_!TMPf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Most API ecosystems were not built for autonomous agent usage. This hands-on masterclass covers governed API design, OpenAPI specifications, and multi-API workflow modelling with Arazzo so your platform stays predictable and safe under automated usage.</p><p><em><strong>2 FOR 1</strong> deal is also live. Bring a colleague free and learn how to design AI-ready, governed APIs</em></p><p style="text-align: center;">Use code <strong>DEEPENG50</strong> for 50% off. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.eventbrite.co.uk/e/architecting-production-ready-apis-for-agents-tickets-1986966927568?aff=deepeng&quot;,&quot;text&quot;:&quot;Register here&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.eventbrite.co.uk/e/architecting-production-ready-apis-for-agents-tickets-1986966927568?aff=deepeng"><span>Register here</span></a></p><div><hr></div><p><strong>Expert Insights</strong></p><h2>Hardware Is Not Someone Else&#8217;s Problem </h2><p><em>by <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Saqib Jan&quot;,&quot;id&quot;:427210082,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997a788a-cd78-4f84-9b3b-c72ab6dc0153_1008x1008.jpeg&quot;,&quot;uuid&quot;:&quot;b6d1db25-f28c-44b6-b061-76c13060f148&quot;}" data-component-name="MentionToDOM"></span> with </em><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Jim Ledin&quot;,&quot;id&quot;:284339563,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:null,&quot;uuid&quot;:&quot;63f4d055-a492-421d-bb86-877ea9e10086&quot;}" data-component-name="MentionToDOM"></span></p><p>For most software engineers working in the cloud, hardware is an abstraction managed by someone else. You provision compute, write code, deploy, and pay the bill. What happens between the instruction and the silicon is not your concern. That assumption has always had a cost. In an AI-accelerated world, that cost is becoming visible in ways that are harder to ignore.</p><p>Jim Ledin, CEO of Ledin Engineering, has been working at the boundary where software meets silicon for over thirty years. His entry point into computer architecture was not a formal computer science curriculum. It was a Commodore 64, a joystick, and a drawing program so slow you could watch it move one pixel at a time.</p><blockquote><p>&#8220;That episode really cemented for me how important it is to understand what is going on in the hardware of a system, and not just write what you want to do in your favourite language,&#8221; Ledin reflects.</p></blockquote><p>He rewrote the inner loops of that drawing program in 6502 assembly, poking opcodes directly into memory, and the line shot across the screen faster than he could see. The lesson stayed with him across thirty years of embedded systems work, electric vehicle software, and cybersecurity testing on safety-critical hardware. Understanding what the hardware is actually doing is not an optimization exercise. It is the difference between software that works and software that works reliably under real constraints.</p><p>That distinction matters more now than it ever has, because the hardware layer is where most AI system performance problems actually live, and most of the engineers building those systems have never had to care about it before.</p><h3>Where the GPU consensus breaks down</h3><p>The idea that GPUs are the right architecture for AI workloads has become so widely accepted that most teams treat it as settled. Ledin&#8217;s view is more specific, and the specificity matters. For local and personal use, running models on a consumer GPU like an Nvidia RTX 4090, GPUs are the right choice. For large-scale deployments running the largest models, the picture is different.</p><p>The distinction comes down to what GPUs were actually designed to do. The &#8220;G&#8221; in GPU stands for graphics, and consumer GPUs still carry silicon dedicated to real-time video generation and gaming workloads. TPUs, by contrast, are built entirely around the tensor operations that dominate AI model processing. At least 80% of the execution time in a transformer-based model is matrix multiplications, and TPUs concentrate every transistor on exactly that work.</p><p>The more pressing constraint, though, is memory bandwidth. &#8220;AI workloads are becoming increasingly memory bandwidth limited. That means it is taking more time to bring data into the GPU or TPU memory than it is taking for the computation itself to complete,&#8221; Ledin explains.</p><p>This is the reason high-end AI systems use high bandwidth memory, or HBM, stacked RAM modules with far higher data rates than anything available on a consumer GPU. &#8220;It is also,&#8221; Ledin notes, &#8220;part of why DDR5 is becoming harder to find. Production capacity for memory is increasingly going into HBM modules for AI infrastructure rather than into consumer components.&#8221;</p><p>And so, for engineering teams choosing hardware for AI deployments, the implication is concrete: the GPU consensus is correct for a specific part of the problem space, and incomplete for the rest of it.</p><h3><strong>Data movement is the real cost</strong></h3><p>The performance conversation in AI engineering tends to focus on compute: cores, clock speed, parallelization. Ledin redirects it toward something that gets less attention and causes more problems.</p><p>&#8220;Data movement can often be more expensive than the actual computation steps. The latency of moving large data structures across different levels of the memory hierarchy can dominate and leave a lot of compute bandwidth idle,&#8221; he emphasizes.</p><p>This is not a new insight in systems engineering, but it is one that most application developers have never had to internalize because the abstractions they work with hide it. In a modern PC, reading a single byte from DRAM causes 64 bytes to be transferred into the CPU cache. If the code then bounces to other memory locations, causes those to be loaded into cache, and pushes that first block out, the next access to that original data requires fetching it again from DRAM. The latency compounds across every cache miss, and in AI workloads operating on large data structures, those misses accumulate fast.</p><p>The practical recommendation follows directly. Iterating across large data structures multiple times in an algorithm should be avoided wherever possible. Working through memory linearly, in a way that keeps recently accessed data in cache rather than evicting it, is the single most impactful optimization available to most AI system code. It does not require a new framework or a different hardware platform. It requires understanding what the hardware is doing with the data you give it.</p><p>In cloud environments, this understanding has a direct financial translation. &#8220;You are paying for the usage of the system whether the CPU is actually crunching instructions or sitting idle waiting for a data item to come in from memory,&#8221; Ledin warns. This is because inefficient memory access patterns do not just slow down a system. They inflate the bill for it.</p><h3>When abstraction becomes the problem</h3><p>Abstractions are one of the most effective tools available to software teams. They accelerate development, limit mistakes, and allow large teams to work on complex systems without every engineer needing to understand every layer. Ledin does not dispute any of this. His concern is more specific: abstractions that obscure hardware costs, in performance-critical applications, are not just unhelpful. They actively create risk.</p><p>&#8220;Where it becomes dangerous is when abstraction obscures what is happening with the data layout in memory and the execution patterns, basically how the processor is interacting with data as the algorithm proceeds,&#8221; he cautions.</p><p>The failure mode is not that abstractions break. It is that they make costs invisible until those costs produce an incident. An engineer works within an abstraction layer, the code looks correct at that level, and the performance problem lives underneath it in a layer the abstraction was designed to hide. By the time the problem surfaces in production, the context needed to diagnose it is buried.</p><p>Ledin&#8217;s recommendation is a two-layer design. Use the most expressive code at the edges of the system, where the abstractions are doing the most valuable work. Use performance-aware code in the core, where the hardware interaction is most consequential. The boundary between those layers is not fixed, and finding it requires benchmarking rather than intuition. But knowing the boundary needs to exist is the starting point. Teams that treat the expressive outer layer as the whole system tend to discover, under load, that the core was never designed for the hardware it runs on.</p><h3>The CPU versus GPU distinction, for engineers who have never had to care</h3><p>Most senior software engineers working today have built careers without ever needing to think about the difference between a CPU and a GPU. That is changing, and Ledin&#8217;s framing of the distinction is the most useful one available for engineers coming to it for the first time.</p><p>A CPU is optimized for low-latency execution of complex branching code. It is built to handle conditional logic, to predict branches and recover when predictions are wrong, and to minimize the latency cost of that work. A GPU is optimized for high-throughput execution of linear code across massively parallel workloads, and it works best when it is running the same instruction across thousands of data streams simultaneously with as little branching as possible.</p><p>The implication, therefore, for algorithm design is practical. &#8220;The GPU only really becomes attractive when you have enough work for it to do that it can be parallelised, and enough that it will amortise the costs associated with moving data onto the GPU, launching the kernels to execute the code, and doing the management work to transfer data to and from the GPU,&#8221; he points out.</p><p>That last point is the one most teams miss. A GPU is not a general purpose computer. It cannot run a program on its own. It needs to be started and managed from a CPU, and the overhead of moving data onto the GPU, scheduling the kernels, and moving results back is real. If the workload is not large enough and parallel enough to amortize that overhead, the CPU implementation wins, not because GPUs are slow, but because the cost of using them correctly exceeds the benefit for that specific workload.</p><p>Knowing where that line sits, for a specific algorithm running on specific hardware, is the kind of judgment that requires understanding what the hardware is actually doing. It cannot be read off from a benchmark or inferred from a framework&#8217;s documentation. It comes from the same place Ledin&#8217;s understanding came from: going one level deeper than the abstraction, and learning what happens when the instruction meets the silicon.</p><div><hr></div><h3>In case you missed </h3><p><em>Here&#8217;s the full Q&amp;A with the interview video featuring Jim Ledin.</em></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;17d0842b-96a6-4cfa-a547-e1dd0c21f97b&quot;,&quot;caption&quot;:&quot;Jim Ledin has been thinking about what happens between the instruction and the silicon for over thirty years.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Computer Architecture in an AI-accelerated World with Jim Ledin&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:427210082,&quot;name&quot;:&quot;Saqib Jan&quot;,&quot;bio&quot;:&quot;/localhost&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997a788a-cd78-4f84-9b3b-c72ab6dc0153_1008x1008.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-05-06T18:15:00.000Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f371179-665a-4e1b-939b-ad7b5b50839d_1920x1080.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://deepengineering.substack.com/p/computer-architecture-in-an-ai-accelerated-world&quot;,&quot;section_name&quot;:&quot;Interviews&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:196755940,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1729053,&quot;publication_name&quot;:&quot;Packt Deep Engineering&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!H5BJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F736bc1ee-d689-497e-83a8-7d9bf9022eb9_600x600.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p></p><p>If the hardware layer argument resonates, the article below by <a href="https://www.linkedin.com/in/leejpeterson">Lee Peterson</a>, VP of Secure WAN Product Management at <a href="https://www.cisco.com/">Cisco</a>, covers the same constraint from the networking and distributed compute angle.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;0c1e012e-2447-4eb9-aa91-095c03638118&quot;,&quot;caption&quot;:&quot;Artificial intelligence is entering a new phase with agentic AI, where autonomous systems perceive, decide, act, and learn without constant human oversight, operating independently across distributed environments while collaborating with other agents in real time.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Agentic AI Is Redefining Edge Infrastructure&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:427210082,&quot;name&quot;:&quot;Saqib Jan&quot;,&quot;bio&quot;:&quot;/localhost&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997a788a-cd78-4f84-9b3b-c72ab6dc0153_1008x1008.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-03-25T18:13:57.493Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/280cd0a1-f0d5-42aa-8e78-90ac44439a30_1200x628.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://deepengineering.substack.com/p/agentic-ai-is-redefining-edge-infrastructure&quot;,&quot;section_name&quot;:&quot;Thought Leadership&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:192122268,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1729053,&quot;publication_name&quot;:&quot;Packt Deep Engineering&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!H5BJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F736bc1ee-d689-497e-83a8-7d9bf9022eb9_600x600.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><h2><strong>&#128736;&#65039; Tool of the Week</strong></h2><p><strong><a href="https://github.com/vllm-project/vllm">vLLM</a></strong> - high-throughput, memory-efficient inference and serving engine for large language models</p><p><em>Cloudflare referenced it as the baseline they benchmarked their custom Infire engine against when building hardware-optimized inference at scale.</em></p><p><strong>Highlights:</strong></p><ul><li><p>PagedAttention eliminates the memory waste that causes most GPU out-of-memory failures in production inference.</p></li><li><p>Continuous batching processes requests in a dynamic stream rather than static batches, keeping GPUs saturated under real load.</p></li><li><p>Disaggregated prefill/decode runs compute-bound and memory-bound stages on separate hardware for better throughput.</p></li><li><p>Supports tensor parallelism, FP8 and NVFP4 quantization across multi-GPU deployments.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/vllm-project/vllm&quot;,&quot;text&quot;:&quot;Learn more about vLLM&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/vllm-project/vllm"><span>Learn more about vLLM</span></a></p><div><hr></div><h1><strong>&#128206; Tech Briefs</strong></h1><ul><li><p><a href="https://www.theregister.com/2026/05/03/inference_is_giving_ai_chip/">Inference gives AI chip startups a second chance</a> - Disaggregated inference, splitting prefill and decode across purpose-built silicon, is making GPU-only inference architectures look like the wrong default for large-scale production deployments.</p></li><li><p><a href="https://openai.com/index/mrc-supercomputer-networking/">OpenAI releases MRC for AI training networks</a> - OpenAI&#8217;s MRC shows frontier training now depends on failure-tolerant network design, making the interconnect layer a first-class engineering constraint rather than an infrastructure afterthought.</p></li><li><p><a href="https://claude.com/blog/claude-security-public-beta">Anthropic opens Claude Security public beta</a> - Claude Security moves vulnerability scanning closer to code review, triage, and patch creation, shifting security work earlier into the engineering workflow rather than treating it as a downstream audit step.</p></li><li><p><a href="https://workspaceupdates.googleblog.com/2026/05/agent-tools-and-security-updates-for-workspace-developers.html">Google opens Workspace MCP server preview</a> - Google is turning enterprise agents into a governed API and access-control problem, with MCP making the boundary between agent capability and enterprise data policy the next infrastructure challenge for platform teams.</p></li><li><p><a href="https://github.com/vllm-project/vllm/releases">vLLM v0.20.1 ships with DeepSeek V4 stabilization and FP4 improvements</a> - The patch release stabilizes DeepSeek V4 serving and improves FP32-to-FP4 conversion speed.</p></li></ul><div><hr></div><p>That&#8217;s all for today. Thank you for reading this issue of Deep Engineering.</p><p>We&#8217;ll be back next week with more expert-led content.</p><p>Stay awesome, </p><p>Saqib Jan </p><p>Editor-in-Chief, Deep Engineering</p><div><hr></div><p><em>If your company is interested in reaching an audience of senior developers, software engineers, and technical decision-makers, you may want to </em><strong><a href="https://packt.omeclk.com/portal/wts/uc%5EcnN2dfNaqmD-kB-mo66%7C7g%5Ef%7Cb">advertise with us</a></strong><em>.</em></p><p>Thanks for reading Packt Deep Engineering! Subscribe for free to receive new posts and help grow our work.</p>]]></content:encoded></item><item><title><![CDATA[Computer Architecture in an AI-accelerated World with Jim Ledin]]></title><description><![CDATA[On memory hierarchies, GPU mechanics, hardware abstractions, and what engineers get wrong by ignoring the hardware layer]]></description><link>https://deepengineering.net/p/computer-architecture-in-an-ai-accelerated-world</link><guid isPermaLink="false">https://deepengineering.net/p/computer-architecture-in-an-ai-accelerated-world</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Wed, 06 May 2026 18:15:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/9f371179-665a-4e1b-939b-ad7b5b50839d_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://www.linkedin.com/in/jimledin">Jim Ledin</a> has been thinking about what happens between the instruction and the silicon for over thirty years. He is the CEO of <a href="https://ledin.com/">Ledin Engineering</a>, an expert in embedded software and hardware design, and the author of <a href="https://www.packtpub.com/en-us/product/modern-computer-architecture-and-organization-9781806028023">Modern Computer Architecture and Organization</a>, now in its third edition, published by Packt. His career spans embedded systems development, battery management software for electric vehicles, and cybersecurity assessment and penetration testing for safety-critical systems including self-driving vehicles.</p><p>The <a href="https://www.packtpub.com/en-us/product/modern-computer-architecture-and-organization-9781806028023">third edition</a> comes out at a moment when the architecture conversation in software engineering has narrowed almost entirely to one question: what hardware should run AI workloads. Ledin&#8217;s answer is more nuanced than the GPU consensus suggests, and it is grounded in the kind of bottom-up reasoning that most application developers have never had to apply. </p><p>And this conversation covers where that consensus is incomplete, what engineers building AI systems are getting wrong about memory and parallelism, why abstraction layers become dangerous when they hide hardware costs, and what the architecture of a self-driving vehicle teaches you that distributed backend experience does not.</p><p>You can watch the full conversation below or read on for the complete Q&amp;A.</p><div id="youtube2-Q21CJXfQLOk" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;Q21CJXfQLOk&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/Q21CJXfQLOk?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><p><em><strong>Q. You have been working with embedded systems and hardware design for over thirty years. What first pulled you toward understanding what was happening at the hardware level rather than just writing code?</strong></em></p><p><strong>Jim Ledin:</strong> My first real exposure to computer architecture was in the 1980s when I had a Commodore 64 with its 6502 CPU. I wrote a simple basic program to do some screen drawing, basically moving a dot around the screen with the joystick and pushing the button to draw the lines. And it was slow. It was so slow you could watch it moving one pixel at a time. That was painful to try to do anything with.</p><p>As time went on I learned a little bit about 6502 assembly language. I found out there were ways you could implement that through the basic interpreter. What you had to do was write out your assembly code by hand, convert it to the opcodes and data bytes, and then poke those bytes into memory. Poke is the basic command. Then you could transfer control and execute them. After I took the inner loops of the drawing program and implemented them in that way, the speedup was amazing. It shot the line across the screen faster than you could see. That episode really cemented for me how important it is to understand what is going on in the hardware of a system, and not just write what you want to do in your favourite language.</p><p>My current work is focused on embedded systems development and testing, as well as implementing cybersecurity for those systems and doing cyber testing on them. I have done quite a bit of work with electric vehicles, battery-powered systems, the battery management software, as well as the powertrain control systems. Also implementing cyber testing to evaluate what kind of vulnerabilities may be present in systems and trying to exploit those to demonstrate whether or not they actually exist. I have been doing that for over thirty years, embedded initially and then later adding in the cybersecurity aspect.</p><p>The architecture of computer systems is at the boundary where performance, system security, and behaviour in real-world situations all meet. You really need to understand, across all those domains, that everything works as expected and intended. You need an understanding top to bottom, not just what your high-level software does, but also at the hardware level. Not necessarily saying you need to understand what your compiler is doing, but know how the hardware operates, what kinds of things cause you to run into limits, and what you can do differently to improve performance, reliability, and security.</p><div><hr></div><p><em><strong>Q. Your book Modern Computer Architecture and Organization is now in its third edition. What had changed enough in the field to make a new edition necessary?</strong></em></p><p><strong>Jim Ledin:</strong> The book is intended to start at the beginning. I do not assume that readers have any background or experience with computer architecture, assembly language instructions, memory cache, pipelines, or anything like that. We start with history, where did the first computing devices come from, how were they developed. It even starts back in the 1800s when Charles Babbage designed a mechanical computer intended to be a general purpose digital computing system. It never actually got built, but many of the principles he developed, including pipelining and distributed processing, were implemented in that design. I thought it was remarkable that those concepts were being worked out that far back in history.</p><p>Then the book goes through the vacuum tube era in the 1930s and 1940s, the Intel 4004, which was really the first microprocessor, and then on to the 8086, 8088, the PC, the 386, which is basically the same base architecture that modern Intel and AMD processors in your PC and server-based systems use today. The code running on these modern systems is highly compatible with those systems from decades ago. It has gone from 16 bits to 32 bits to 64 bits, adding capabilities without removing previous ones.</p><p>The book walks through that history and then goes into detail on how processors work, starting with the 6502. That processor is simple enough that you can understand what is going on with its registers. It only has three. Nothing about it is overwhelming. Once you understand it, you can build upon it to get to the modern processors, which are far more complex.</p><p>What changed substantially since the last version of the book was the rise of AI workloads, particularly the shift from the fastest CPU available to very highly parallelised systems optimised to perform matrix computations. The new version, which came out in March, has a chapter that goes into detail on how GPUs operate, from the top-level modular structure down to the granular details of processor cores. There is another new chapter on transformer-based models, looking at them not as someone who designs them but more like a mechanic who wants to take them apart. We work through what calculations actually occur in GPT-2, which was one of the earliest large language models to break through as something genuinely new and important. The current frontier models have obviously evolved quite a bit since then, but they share many of the same fundamental characteristics. If you can go through GPT-2 and understand how it works, you are a very long way toward understanding the latest models.</p><p>We are also seeing real diversification of architecture. There were many years where computers for most applications were based on the same Intel-type architecture, but now across different application areas you are seeing GPUs, TPUs, domain-specific accelerators for things like Bitcoin mining, local AI in cell phones and cars, and the open source RISC-V processor which is available to everybody. You can design your own chip based on it, implement it in an FPGA, do whatever you want. It is a rapidly growing line of processor development and the book covers all of it.</p><div><hr></div><p><em><strong>Q. The argument that GPUs are the right architecture for AI and LLM workloads is often treated as settled. Where is that consensus incomplete?</strong></em></p><p><strong>Jim Ledin: </strong>GPUs are probably the ideal architecture for people and small companies that want to run language models locally. I have recently gotten the Gemma 27 billion parameter model running on an Nvidia RTX 4090, which is about the top end of consumer GPUs available today. For local and personal use, GPUs are the way to go.</p><p>But for larger scale deployments running much larger models, the trend is toward dedicated TPUs. A tensor is basically a multi-dimensional array. A matrix is a two-dimensional array, and tensors have more dimensions. Tensors are used widely across AI models, and the work going on inside the processing of those models is largely matrix multiplications operating on broken-down portions of higher-dimensional tensors. A TPU is a processor similar in concept to a GPU, but very specifically focused on the work of large language model tensor processing. GPUs, as the first letter implies, also have silicon dedicated for generating real-time video and handling things like gaming and video creation. TPUs do not use silicon for that purpose. They focus everything on the tensor work.</p><p>That is why systems like the Nvidia Blackwell architecture, designed for large-scale data centre applications, are built to have many components interconnected with extremely high-speed data links, working together as a supercomputer. For larger models, consumer GPUs are not really used. It is more the dedicated hardware that focuses on that work.</p><p>Another factor is that AI workloads are becoming increasingly memory bandwidth limited. That means it is taking more time to bring data into the GPU or TPU memory than it is taking for the computation itself to complete. These very high-end systems are implemented using what is called high bandwidth memory, or HBM. An HBM module is basically a cube made of a stack of RAM chips, so they hold a lot of memory and have very high bandwidth. On a TPU card you typically have several of these HBM modules, and they have a far higher data rate for transferring data in and out of the processing components than on a typical consumer GPU. This is also part of why it is becoming hard to find DDR5 RAM chips. A lot of production capacity for memory is going into high bandwidth memory modules, which cost more for the purchaser and make more money for the vendor.</p><div><hr></div><p><em><strong>Q. Software engineers working in the cloud often treat hardware as someone else&#8217;s problem. What does your book argue they are getting wrong, and what does that cost them?</strong></em></p><p><strong>Jim Ledin:</strong> If you write software and just ignore the hardware limits, that can lead to a lot of hidden costs. If your code is accessing memory in inefficient patterns, not using the cache memory within the processor effectively, and moving data around more than necessary, that can have significant performance impacts.</p><p>If developers understand how the memory access and caching processes work at the hardware level, they can often tailor code to work more effectively within those constraints and minimise latency. When the CPU requests data from memory and it is not available in its cache, it has to wait. You are giving the processor downtime when you want it to be processing data. A lot of that is unavoidable, but the amount of latency can be minimised by different approaches to optimising algorithms.</p><p>As an example, in a modern PC, each time you read something from DRAM, even if it is just a single byte, 64 bytes are transferred into the CPU cache. That is what is available at that point for the processor to work with. For best efficiency, assuming you have options, you would want your code to be working with data from that block before it moves on to something else, rather than bouncing around to other memory locations. If you access several other locations that cause them to be loaded into cache, and then that first block gets evicted, and then you go back and read it again, now you have to reread it. That is inefficient. When possible, you want to work through memory in a linear way.</p><p>And if you are working in a cloud environment, this not only has those performance issues but also results in higher costs, because you are paying for the usage of the system whether the CPU is actually crunching instructions or sitting idle waiting for a data item to come in from memory.</p><div><hr></div><p><em><strong>Q. If you are building AI systems today, what are the hardware concepts that would most change how you designed them, and what do most engineers not understand well enough?</strong></em></p><p><strong>Jim Ledin:</strong> Data movement can often be more expensive than the actual computation steps. The latency of moving large data structures across different levels of the memory hierarchy can dominate and leave a lot of compute bandwidth idle. This is a concern even with the very highest performance AI-focused systems. Getting the memory access right relative to the processing is a genuine challenge. You definitely do not want to be iterating across large data structures multiple times in an algorithm if there is a way to avoid it. Going through data linearly is probably going to give the best performance.</p><p>As you increase parallelisation of algorithms across cores and processors and across GPUs and other devices, other constraints appear. Synchronisation, where tasks on different processors need to sync up, is a real constraint. The communication bandwidth between processors, whether they are inside the same device or communicating board to board or rack to rack, all of these affect the efficiency and speed of processing, not just the number of cores you can throw at a parallel algorithm. It is important to understand the cost associated with all of these interactions among parallel activities and optimise around them to get the best overall performance.</p><p>And then optimising compilers do a great job of scheduling instruction execution and keeping pipelines full, but there are things you can do in code that make it harder for them to do that, and things you can do that make it easier. In performance-critical inner loops, minimising branching can help avoid pipeline stalls. Part of what goes on in a modern processor is trying to predict what will happen at a branch in your code, an if-else type block. The processor may guess right, which means it is very efficient, or it may guess wrong and have to back up and start down the other path. If you can minimise or eliminate branching within the most performance-critical loops, that makes it easier for the optimiser and the rest of the system to run as efficiently as possible.</p><div><hr></div><p><em><strong>Q. What is actually happening under the hood in a GPU that makes it effective for AI workloads, at a level that goes beyond the standard explanation about parallelism?</strong></em></p><p><strong>Jim Ledin:</strong> Most of the processing in a transformer-based AI model, at least 80% of the execution time, is these tensor operations, which are implemented in hardware as matrix multiplications. GPUs and TPUs have very specialised multiply-and-accumulate hardware specifically designed to perform these operations.</p><p>The current generation of Nvidia GPUs implements what is called single instruction multiple thread, or SIMT, execution. A group of 32 threads runs in lockstep, meaning they are all executing the same instruction but on different data streams. SIMT also supports branching, so you can have if-else logic in the code. But this has a performance cost. If you are executing through a stream of data on SIMT code and you come to a conditional instruction where some threads take the if part and some threads take the else part, the hardware executes one side, the if part, only on the threads where that condition applies, then goes back and executes the else part for the other threads. At the end of the block, they sync up and resume in lockstep. Your code can have conditional logic in these lowest-level operational sequences, but there is the drawback that you effectively have a pipeline stall where it has to go back and execute a different thread. You have the flexibility, but there is a cost.</p><p>GPU and TPU performance comes as much from high memory bandwidth, getting data in and out as fast as possible, and latency minimisation, as it does from effective thread scheduling across the many thousands of cores within a GPU. All of these things, memory bandwidth, minimising latency, thread scheduling, and using SIMT effectively, all affect GPU performance in addition to the raw ability to parallelise across cores. You really need to manage all of these aspects to get the best performance, not just maximise core count.</p><div><hr></div><p><em><strong>Q. The memory hierarchy from cache to RAM to storage is often discussed in theory but rarely in practice. Can you give a concrete example of where a misunderstanding of memory hierarchy caused a real performance problem, and what the fix actually looked like?</strong></em></p><p><strong>Jim Ledin:</strong> There was a web server in some Linux distributions in the early 2000s called Tux, which ran in kernel space. It avoided a lot of the transfers from user space to kernel space that a web server normally has to perform. It only served static pages, because since it was running in kernel they did not give the pages dynamic generation capability.</p><p>One issue with this server was poor cache locality. The amount of data it kept active on each request seemed to be excessive. Under high load, with lots of users hitting it at once, the state information grew to exceed the size of the level 2 cache in the CPU. Performance dropped off sharply.</p><p>Some engineers examined that and determined that by evaluating the cache limitation against how the code was structured, they could reorganise it so the amount of data per request would be smaller and therefore remain within the cache limit up to a much larger level of usage. Similarly, instructions also have a cache in the CPU, and by reorganising the processing and batching some things, they were able to increase the degree to which instructions would remain in the instruction cache during web server processing. The fixes they implemented increased application performance by about 40%.</p><p>This was basically examining the behaviour of the application in the context of the limitations of the processor hardware and coming up with solutions that respected those limits. For other applications, similar fixes might involve restructuring data. A large array of structures might be more efficiently processed as a structure of arrays in a way that better aligns with cache limitations. But in these cases, while the design approach is to look at the limits of the system and try to work within them, to really understand what is going to have a big impact you need to implement it and benchmark it in a realistic environment.</p><div><hr></div><p><em><strong>Q. There is a growing tension between the abstraction layers that frameworks provide and the hardware cost those abstractions hide. At what point does that become a serious engineering problem?</strong></em></p><p><strong>Jim Ledin:</strong> Early on in the development cycle, abstractions are great. They can greatly accelerate development and limit mistakes. Where it becomes dangerous is when abstraction obscures what is happening with the data layout in memory and the execution patterns, basically how the processor is interacting with data as the algorithm proceeds. This is especially critical in large-scale real-time systems with demanding performance requirements.</p><p>In addition to using abstraction where it makes sense, engineers need to understand what is happening underneath the abstraction in performance-critical applications. I am not suggesting abandoning abstractions. They are entirely appropriate at the level where they preserve meaning and understanding across a team. But they begin to create a problem where they obscure the costs.</p><p>The most effective approach is a two-layer design. Use the most expressive code at the edges of the system, and in the core, use more performance-aware code. It is not always obvious where to place the boundary between performance-aware code and more expressive code. It may take some benchmarking, trials, and iterations to identify the best location for that boundary. But knowing you need to draw it is the starting point.</p><div><hr></div><p><em><strong>Q. You work on architectures for systems like self-driving vehicles. What makes those architectures fundamentally different from a standard distributed backend system, and what should engineers working in conventional contexts take from that?</strong></em></p><p>Jim Ledin: A self-driving vehicle is both real-time and safety-critical. The software must meet all of its deadlines, its time limits for producing a response, or that is not just a glitch to blow past, that is a system failure, and that cannot be tolerated. There must be fail-safe responses when unexpected situations occur. Only in the most extreme circumstances, like an unrecoverable hardware failure, would the system be able to stop processing.</p><p>A self-driving vehicle tightly couples sensing, computing, and actuating, seeing what is around it, deciding what to do, and steering and controlling vehicle speed. That is pretty different from loosely coupled distributed systems. A distributed system might typically implement retry mechanisms if something fails, and if a system goes down there are online and offline redundant capabilities that can be brought up, basically switching to a backup. Rather than using that approach, safety-critical vehicles provide a level of redundancy where dual processors operate in lockstep. If one experiences a failure, the system continues on the one good one until a repair can be made.</p><p>This can be extended further. The American space shuttles had three computers operating in parallel. One advantage of three over two is that if you have two computers and they give different answers, you have to decide which one is good and which is bad. If you have three and two give one answer and one gives another, you probably know the third is bad.</p><p>The way engineers working with conventional distributed systems can apply these principles is in situations where the design needs to be fault tolerant while minimising or eliminating processing interruptions. Rather than waiting for a failure to occur, you have enough running capability in operation simultaneously that you can detect a failure and keep things going the whole time while bringing up redundant capability. A lot of large systems already operate this way, but systems that do not could potentially deliver a higher availability level using these techniques.</p><div><hr></div><p><em><strong>Q. For engineers who want to build real working knowledge of systems and hardware, what is the most direct path in?</strong></em></p><p>Jim Ledin: Start by understanding how processors operate at the simplest level of a single instruction. There are four steps in an instruction: fetch, decode, execute, and write back. Fetch is when the processor retrieves the opcode bytes from memory. Decode is when the processor assigns work to units within it, like an ALU for an addition instruction. Execute is when it actually does the computation. And write back is where it stores the results in registers, in memory, and in status bits within the processor. Essentially all processors operate at that very low level.</p><p>That mental model then scales upward to more complex processors and their capabilities. That is the reason the book starts with the 6502 processor. It is pretty simple, only three registers, 8-bit, nothing about it is overwhelming. But once you understand it, you can build upon that knowledge to get to the modern processors, which have hundreds, if not more, instructions available and many divergent capabilities. It all builds upon those very simple foundations.</p><div><hr></div><p><em><strong>Q. Looking ahead five years, what skills will matter most for engineers working at the intersection of software, hardware, and AI?</strong></em></p><p><strong>Jim Ledin: </strong>The most important thing is to stay up to date and remain aware of changes as technology advances. Four years ago when the previous version of the book came out, it was not at all clear to me, or I think a lot of people, what was going to happen with AI in the coming years. Pay attention to what is going on around you. Pay less attention to announcements driven by financial considerations or hype from companies focused on their performance in the stock market. Pay more attention to what is actually having an impact in the real world, and learn more about those things.</p><p>The sources matter. There are trustworthy websites with genuinely good information about current ongoing activities in CPU development and other computer-related areas, as well as more in-depth sources like scientific papers if you are willing to dig in at that level. Even pursuing formal education, which does not necessarily mean going back to college, could mean taking online courses to develop depth in areas where you might be behind. Certificate programs can be a real path to updating your skills.</p><p>Today, the thing is AI. Developers do not just learn programming languages anymore. You need to be learning how to interact with AI and use it effectively to develop better software. The way to really understand these systems requires the ability to reason across all of the abstraction layers, from the software framework at the top level all the way down to the hardware that runs the code. You do not need to break out the assembly code generated by your build tools, though that is sometimes valuable and can be very helpful, either for learning purposes or if you are really in a hot inner loop that needs maximum optimisation. More often it is about understanding the constraints, how the processor works best with pipelines and caches, and orienting your code to work within those environments.</p><p>It is also becoming increasingly critical to understand heterogeneous computing environments. It is not just writing code that runs on a CPU. You might have code that interacts with a GPU for a parallelised algorithm, whether it is a language model or something else. And there are specialised accelerators that may be implemented within large-scale systems that speed up specific parts of the operation. There is a lot to learn, and it takes curiosity and sustained attention to stay current.</p><div><hr></div><p><em><strong>Q. How would you explain the CPU versus GPU distinction to a senior software engineer who has never had to care about it before?</strong></em></p><p><strong>Jim Ledin: </strong>A CPU is optimised for low-latency execution of complex branching code. Branches do have an impact on performance, but CPUs are designed to handle that and minimise it. GPUs work best with highly parallelised, high-throughput execution of linear code, operating on massively parallel workloads. GPU cores work best when they are going through parallel streams with minimal branching.</p><p>If you are developing an algorithm and you are not sure whether it should run on a CPU or be split between a CPU and a GPU, the GPU only really becomes attractive when you have enough work for it to do that it can be parallelised, and enough that it will amortise the costs associated with moving data onto the GPU, launching the kernels to execute the code, and doing the management work to transfer data to and from the GPU.</p><p>The GPU is really not a general purpose computer. It is more of a specialised device that needs to be managed by something else. You cannot write a program that just runs on a GPU. It needs to be started and managed from a CPU, and you need to get enough benefit from the work you are doing to make all of that worthwhile. If you cannot keep the GPU busy with this kind of work, the CPU implementation may actually win, because it avoids the data transfer and scheduling overhead entirely.</p>]]></content:encoded></item><item><title><![CDATA[Deep Engineering #45: Francesco Ciulla on Building Production Systems in Rust Without the Expensive Rewrite ]]></title><description><![CDATA[Memory safety, the borrow checker as your most patient teacher, and how to introduce Rust without the disruptive migration project that puts teams off]]></description><link>https://deepengineering.net/p/issue-45-francesco-ciulla-building-production-systems-rust-without-rewrite</link><guid isPermaLink="false">https://deepengineering.net/p/issue-45-francesco-ciulla-building-production-systems-rust-without-rewrite</guid><dc:creator><![CDATA[Saqib Jan]]></dc:creator><pubDate>Thu, 30 Apr 2026 16:32:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/6e29b888-c64d-4029-96f3-08e45522d077_656x375.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><a href="https://www.vpdae.com/redirect/oxmujewa9r6jmrhyz62em0cftb6">View the latest HubSpot Developer Platform updates in Spring Spotlight</a></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.vpdae.com/redirect/oxmujewa9r6jmrhyz62em0cftb6" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hxs6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe807db93-d946-4468-b471-e473ec937fe7_1320x660.png 424w, https://substackcdn.com/image/fetch/$s_!Hxs6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe807db93-d946-4468-b471-e473ec937fe7_1320x660.png 848w, https://substackcdn.com/image/fetch/$s_!Hxs6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe807db93-d946-4468-b471-e473ec937fe7_1320x660.png 1272w, https://substackcdn.com/image/fetch/$s_!Hxs6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe807db93-d946-4468-b471-e473ec937fe7_1320x660.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hxs6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe807db93-d946-4468-b471-e473ec937fe7_1320x660.png" width="717" height="358.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e807db93-d946-4468-b471-e473ec937fe7_1320x660.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:660,&quot;width&quot;:1320,&quot;resizeWidth&quot;:717,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.vpdae.com/redirect/oxmujewa9r6jmrhyz62em0cftb6&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Hxs6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe807db93-d946-4468-b471-e473ec937fe7_1320x660.png 424w, https://substackcdn.com/image/fetch/$s_!Hxs6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe807db93-d946-4468-b471-e473ec937fe7_1320x660.png 848w, https://substackcdn.com/image/fetch/$s_!Hxs6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe807db93-d946-4468-b471-e473ec937fe7_1320x660.png 1272w, https://substackcdn.com/image/fetch/$s_!Hxs6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe807db93-d946-4468-b471-e473ec937fe7_1320x660.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><strong>See what&#8217;s new for the <a href="https://www.vpdae.com/redirect/oxmujewa9r6jmrhyz62em0cftb6">HubSpot Developer Platform! </a></strong></p><p>Ship faster with AI coding tools like Cursor, Claude Code, and Codex. Build MCP-powered AI connectors, run serverless functions with support for UI extensions, and use date-based versioning to streamline roadmap planning.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.vpdae.com/redirect/oxmujewa9r6jmrhyz62em0cftb6&quot;,&quot;text&quot;:&quot;Explore Updates&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.vpdae.com/redirect/oxmujewa9r6jmrhyz62em0cftb6"><span>Explore Updates</span></a></p><div><hr></div><p><strong>&#9997;&#65039; From the editor&#8217;s desk,</strong></p><p>Welcome to the <strong>45th</strong> issue of Deep Engineering!</p><p>The<a href="https://www.tiobe.com/tiobe-index/"> TIOBE Index for April 2026</a> puts Rust at number 16, up from 18 last year. While the community widely expected it to break into the top 10, that momentum has slowed. TIOBE attributes this to adoption friction, noting that broader mainstream uptake has proven harder to achieve than the language&#8217;s early trajectory suggested.</p><p>The institutional picture, however, tells a different story. The<a href="https://www.nsa.gov/Press-Room/Press-Releases-Statements/Press-Release-View/Article/4223298/nsa-and-cisa-release-csi-highlighting-importance-of-memory-safe-languages-in-so/"> NSA and CISA issued joint guidance in June 2025</a> urging organisations to adopt memory-safe languages for national security systems and critical infrastructure.<a href="https://security.googleblog.com/2025/11/rust-in-android-move-fast-fix-things.html"> Google&#8217;s Android security team </a>reported that memory safety vulnerabilities, which accounted for 76% of Android bugs in 2019, fell below 20% for the first time in 2025 after the team prioritised writing new code in memory-safe languages.</p><p>The Linux kernel maintainers also made <a href="https://thenewstack.io/rust-goes-mainstream-in-the-linux-kernel/">Rust permanent</a>, making it a core part of the kernel. The argument about whether memory-safe systems programming languages belong in production is settled at the institutional level. The harder argument, therefore, is how engineering teams adopt it without the expensive, disruptive projects that give the language an undeserved reputation for being hard to introduce.</p><p><a href="https://it.linkedin.com/in/francesco-ciulla-roma/en">Francesco Ciulla</a>, author of <a href="https://www.packtpub.com/en-us/product/the-rust-programming-handbook-9781836208860">The Rust Programming Handbook</a> and head of developer relations at <a href="https://zerops.io/">Zerops</a>, directly challenges that perception. His framework starts not with the language&#8217;s strengths but with the one service in your system where Rust would make an undeniable, measurable difference. That is what this issue covers.</p><p>Let&#8217;s get started.</p><div><hr></div><h3><a href="https://www.eventbrite.co.uk/e/architecting-production-ready-apis-for-agents-tickets-1986966927568?aff=deepeng">Architecting Production-Ready APIs for Agents</a></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.eventbrite.co.uk/e/architecting-production-ready-apis-for-agents-tickets-1986966927568?aff=deepeng" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TMPf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png 424w, https://substackcdn.com/image/fetch/$s_!TMPf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png 848w, https://substackcdn.com/image/fetch/$s_!TMPf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png 1272w, https://substackcdn.com/image/fetch/$s_!TMPf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TMPf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png" width="960" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:960,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.eventbrite.co.uk/e/architecting-production-ready-apis-for-agents-tickets-1986966927568?aff=deepeng&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!TMPf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png 424w, https://substackcdn.com/image/fetch/$s_!TMPf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png 848w, https://substackcdn.com/image/fetch/$s_!TMPf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png 1272w, https://substackcdn.com/image/fetch/$s_!TMPf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b6d1f4f-46df-4942-b020-8b23edfc5c39_960x480.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Most API ecosystems were not built for autonomous agent usage. This hands-on masterclass covers governed API design, OpenAPI specifications, and multi-API workflow modelling with Arazzo so your platform stays predictable and safe under automated usage.</p><p><em><strong>2 FOR 1</strong> deal is also live. Bring a colleague free and learn how to design AI-ready, governed APIs</em></p><p style="text-align: center;">Use code <strong>DEEPENG50</strong> for 50% off. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.eventbrite.co.uk/e/architecting-production-ready-apis-for-agents-tickets-1986966927568?aff=deepeng&quot;,&quot;text&quot;:&quot;Register here&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.eventbrite.co.uk/e/architecting-production-ready-apis-for-agents-tickets-1986966927568?aff=deepeng"><span>Register here</span></a></p><div><hr></div><p><strong>Expert Insights</strong></p><h2>Rust Does Not Need to Replace Your Stack to Make It Better</h2><p><em>by <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Saqib Jan&quot;,&quot;id&quot;:427210082,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997a788a-cd78-4f84-9b3b-c72ab6dc0153_1008x1008.jpeg&quot;,&quot;uuid&quot;:&quot;b6d1db25-f28c-44b6-b061-76c13060f148&quot;}" data-component-name="MentionToDOM"></span> with <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Francesco Ciulla&quot;,&quot;id&quot;:11407185,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b8c30606-10ba-4c87-a89b-af2f9dc27a01_400x400.jpeg&quot;,&quot;uuid&quot;:&quot;cb0919f2-0c70-4b1f-8f6d-f4d5565d29c3&quot;}" data-component-name="MentionToDOM"></span> </em></p><p>Every engineering team that considers Rust tends to circle the same concerns. The language is difficult to learn, expensive to adopt, and more practically useful to systems programmers than to the teams building and running services at scale.</p><p><a href="https://www.linkedin.com/in/francesco-ciulla-roma">Francesco Ciulla</a>, author of <a href="https://www.amazon.in/Rust-Beginner-Professional-practical-proficient/dp/1836208871">The Rust Programming Handbook</a>, Docker Captain and head of developer relations at <a href="https://zerops.io/">Zerops</a>, says, "I've heard that conversation many times, and my response has always been that the framing is wrong from the start."</p><p>Ciulla has been building with Rust since 2022, has spoken about it internationally at conferences, and his perspective on Rust adoption is shaped less by enthusiasm for the language and more by a practitioner&#8217;s view of where it actually earns its place in a production system. That starting point matters, he says, because the teams that struggle with Rust adoption tend to start from the wrong question.</p><h3><strong>A joke that contains a kernel of truth</strong></h3><p>People in the Rust community have long joked about rewriting everything in Rust, and the memes around it have become something of a cultural shorthand for over-enthusiastic adoption. Like most good jokes, Ciulla acknowledges, it contains a kernel of truth. But the practical lesson is the opposite of what it implies. &#8220;The best way to introduce Rust in a big project is to find that hard part that is slowing things down, the bottleneck of all your services, and try to write one single service in Rust.&#8221; The rewrite everything instinct is how adoption projects become expensive and difficult to justify. The bottleneck-first instinct is how teams get a proof of concept that demonstrates real value before committing to anything broader.</p><p>The practical implication is that the adoption decision is not a language decision at the organizational level. It is an engineering decision at the service level. The question is not whether the organization should adopt Rust. The question is whether there is one service in the system that is slow, resource-intensive, or difficult to keep stable, where the properties Rust offers would make a measurable difference. If that service exists, it is the right place to start. If it does not, the case for introducing Rust at all is weaker than it might appear.</p><p>Ciulla&#8217;s production experience makes this concrete. Running a Rust web server on his own machine, he shared during our conversation that it used four megabytes of RAM in development and five in production. On a one-gigabyte droplet, that means more than 200 services running simultaneously in idle. That number is the kind of resource profile that changes what is economically viable to deploy, and it is the kind of argument that lands differently with an ops team than a language comparison ever could.</p><h3><strong>Flat latency is a real engineering argument</strong></h3><p>One of the most underappreciated technical arguments for Rust in production systems is not about speed in the raw throughput sense. It is about predictability. Languages that rely on garbage collection, including Go, Java, and Node.js, introduce periodic pauses when the collector runs. Those pauses can last hundreds of milliseconds. An HTTP request that arrives during a GC cycle experiences higher latency than one that does not. The user on the receiving end did not do anything differently. They were just unlucky.</p><p>Ciulla is candid about what this means in practice. &#8220;By not having a garbage collector on the back end side, you basically have flat latency. You don&#8217;t rely on luck, or on the user not being the unlucky one. It&#8217;s a problem that is removed.&#8221; For most web applications running at moderate scale, this distinction is invisible. For services with strict latency requirements, high concurrency, or SLAs that depend on consistent tail latency rather than average response time, it is one of the more significant architectural arguments available.</p><p>This connects to a broader point about where Rust earns its place and where it does not. The resource efficiency and latency predictability are not arguments for using Rust everywhere. They are arguments for using Rust in the specific services where those properties matter. A service that scrapes a website once a month does not need flat latency. A service handling a million concurrent users does. Knowing the difference is what separates a good adoption strategy from an expensive experiment.</p><h3><strong>Rust, when it is the wrong choice</strong></h3><p>Ciulla is honest about the cases where Rust is not the right tool, which is part of what makes his advocacy for it credible. If a team needs something simple and the deadline is tomorrow, Rust is probably the wrong choice. If a developer needs a working API by the end of the day and has no Rust experience, this is not the moment to start learning the language under delivery pressure. &#8220;When you need something simple, and you&#8217;re familiar already with Java or JavaScript, why don&#8217;t you use it?&#8221; The question is not rhetorical. It is the right question to ask before any technology adoption decision.</p><p>The ecosystem argument is also honest. Python has better libraries for data science. JavaScript has a larger package ecosystem for certain kinds of web work. Rust integrates well with other languages, but if what a team needs is native to another ecosystem, that is a real constraint rather than a preference. Good engineers use the right tool for the problem. The case for Rust is strongest when the problem involves performance, memory efficiency, or concurrency at a level where other languages start showing their limits.</p><h3><strong>The shepherd principle</strong></h3><p>One of the more practical observations Ciulla makes about organizational adoption is about knowledge rather than tooling. The bottleneck to Rust adoption at scale is rarely the language itself. It is whether the organization has someone who knows it deeply enough to validate the work being done in it. He draws the parallel to Docker adoption at the European Space Agency, where he worked and observed the tool move slowly not because of anything wrong with Docker, but because it was not well understood internally. The technology is never the problem, he points out. The knowledge is.</p><p>&#8220;You need the validation of an expert,&#8221; Ciulla says. In the era of AI-accelerated development, this point is sharper than it has ever been. Teams can now generate Rust code with AI assistance far faster than their ability to validate it has grown. That gap between generation speed and validation depth is where production incidents come from. Having at least one engineer on the team who understands the ownership model, the borrow checker, and the concurrency primitives well enough to review what the AI produces is not a nice-to-have. It is the thing that determines whether the Rust service is a genuine improvement or a liability waiting to surface.</p><h3><strong>Concurrency without the trauma</strong></h3><p>Most engineers who have worked with concurrency in Java or C++ carry a specific kind of wariness about it. The mental model for concurrency in older languages is that it is an advanced topic requiring extra care, specialized libraries, and a heightened awareness of race conditions and deadlocks. Ciulla describes learning concurrency in Java at university as the final, difficult session of the course, something treated as inherently dangerous and saved for the end of the degree.</p><p>His first attempt at a concurrency example in Rust produced the opposite experience. &#8220;When I had to teach concurrency in Rust in a YouTube video, I made an example in three minutes. I was done. I say okay, the basic example really lasted like two or three minutes because you just declare a couple of threads and literally done.&#8221; That experience reflects something structural about how Rust was designed. The language was created after multi-core processors were already standard. Concurrency was not retrofitted onto a model designed for single-threaded execution. It was built in from the start, and the ownership system that prevents data races at compile time is the same ownership system that governs memory safety everywhere else in the language. There is no separate concurrency model to learn. The properties that make Rust memory safe are the same properties that make concurrent code safe.</p><p>For teams building services that need to use available CPU resources efficiently, this is not a minor ergonomic improvement. It means that the gap between writing concurrent code and writing correct concurrent code is substantially smaller in Rust than in the languages most engineers have used before. The cost of concurrency, measured in debugging time and production incidents rather than lines of code, is genuinely lower.</p><h3><strong>The compiler is the most patient teacher on your team</strong></h3><p>The reputation Rust has for being difficult to learn is real, and Ciulla does not dismiss it. But his explanation for where the difficulty actually comes from is different from the common framing. The problem is not that the concepts are inherently harder than those in other languages. It is that Rust forces you to unlearn patterns that other languages allowed. Engineers who have spent years in C++ or JavaScript carry assumptions about how memory works, how mutability is managed, and what the runtime will silently fix for them. Rust does not fix those things silently. It surfaces them at compile time and requires you to address them explicitly before the code runs.</p><p>That shift in where the pain lands is the key insight. &#8220;Rust is not hard to learn,&#8221; Ciulla says. &#8220;It&#8217;s different. And this is how we should advocate for it.&#8221; The difficulty is front-loaded by design, because the language makes a deliberate trade of more friction during development in exchange for fewer failures in production. Teams that have spent significant time debugging null pointer exceptions, race conditions, or memory leaks in production understand this trade intuitively. The hours lost to a null pointer exception in production dwarf the hours spent fighting the borrow checker upfront.</p><p>The Rust compiler, which is the primary source of that upfront friction, is also the primary teaching tool the language provides. Error messages in Rust are unusually detailed and specific. They do not just tell you that something is wrong. They explain what rule was violated, show the relevant code, and often suggest a fix. Ciulla describes the compiler as a teacher rather than a gatekeeper, one that overcommunicates in the same way a good mentor does. &#8220;The errors in Rust are basically tutorials. They are helping you to write better code.&#8221; For teams introducing Rust to engineers who have not used it before, this property matters practically. The compiler is doing a significant part of the knowledge transfer work that would otherwise fall on the senior Rust engineer on the team.</p><h3><strong>Rust in the Linux kernel is paying off</strong></h3><p>The decision by the Linux kernel maintainers to not only allow Rust in the kernel but to plan for components that require it going forward is the kind of institutional endorsement the language community has been waiting for. Ciulla frames it clearly. Even if the experiment had failed, just the fact that Rust was considered a viable option for kernel-level work would have been a meaningful milestone. The language was competing in a domain that had been exclusively C and C++ territory for decades, and it earned a permanent place there.</p><p>For engineering leaders tracking where the industry is moving, this matters beyond the kernel itself. Government systems, military applications, and other security-critical domains are beginning to treat Rust as a default rather than an experiment. &#8220;Rust is slowly getting adopted at bigger and bigger levels,&#8221; Ciulla says. The adoption curve is not linear, but the direction is consistent. Teams that build internal expertise now are not chasing a trend. They are positioning ahead of a transition that is already underway in the most demanding environments in the industry.</p><h3><strong>The ecosystem argument is changing</strong></h3><p>One of the historically valid objections to Rust for web development was tooling maturity. Two years ago, Ciulla would not have committed to shipping a production SaaS product in Rust. Today he would, and the reason is specific rather than general. The <a href="https://docs.rs/axum/latest/axum/">Axum framework</a> has matured to the point where it is a production-grade choice for web APIs, and the broader ecosystem around async Rust has improved substantially. &#8220;In 2026, I will use it,&#8221; he says of building a paid product with Rust as the backend, dropping the qualification he would have applied even a year earlier.</p><p>The toolchain story is also one of Rust&#8217;s genuine advantages for teams evaluating the full cost of adoption. <a href="https://doc.rust-lang.org/cargo/">Cargo</a> handles dependency management, building, testing, and documentation in a single integrated tool. There is no equivalent of the npm versus yarn versus pnpm decision that teams arriving to JavaScript have to navigate before writing a single line of code. Running tests is cargo test. The integration is native to the language, not an ecosystem of competing choices layered on top of it. For teams that have spent time debugging JavaScript build configurations, this is not a small thing.</p><h3><strong>Rust in the AI accelerated development era</strong></h3><p>Ciulla makes an argument about Rust and AI that is worth sitting with. The claim is not that Rust is better for writing AI applications, though he has views on that too. The claim is that Rust may be one of the best languages to work in during the current period of AI-assisted development, specifically because of what it requires from the engineer reviewing AI-generated code.</p><p>When AI writes Rust code, the engineer validating it still has to understand ownership, borrowing, and the type system well enough to know whether the generated code is correct. The compiler will catch a large category of errors, but the human reviewer still needs to understand why the compiler is happy with a piece of code before shipping it. &#8220;If you have no control, either you are useless or you cause a problem. So in both cases, it&#8217;s not a good time for you.&#8221; That discipline, the requirement to understand what the code actually does rather than just accepting output that compiles, is not a burden unique to Rust. But it is more explicitly enforced by the language than in most alternatives, and that enforcement is valuable at a moment when the volume of AI-generated code is increasing faster than the average team&#8217;s ability to review it carefully.</p><div><hr></div><h2><strong>&#128736;&#65039; Tool of the Week</strong></h2><p><strong><a href="https://github.com/bahdotsh/wrkflw">wrkflw</a></strong> &#8212; open-source tool for validating and running GitHub Actions locally</p><p>wrkflw lets you validate and execute GitHub Actions workflows on your local machine before pushing, catching configuration errors and pipeline failures before they reach CI. Version 0.8.0 shipped this week. Built in Rust.</p><ul><li><p>Validates GitHub Actions workflow syntax locally before pushing to CI</p></li><li><p>Runs multi-step jobs and matrix builds without cloud dependency</p></li><li><p>Fast startup and low resource overhead from Rust&#8217;s binary compilation model</p></li><li><p>Catches pipeline failures early, reducing the feedback loop between code and CI</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/bahdotsh/wrkflw&quot;,&quot;text&quot;:&quot;Learn more about wrkflw&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/bahdotsh/wrkflw"><span>Learn more about wrkflw</span></a></p><div><hr></div><h1><strong>&#128206; Tech Briefs</strong></h1><ul><li><p><a href="https://www.ghacks.net/2026/04/13/linux-7-0-released-with-official-rust-support-and-new-code-for-sparc-and-alpha-cpus/">Linux 7.0 ships with Rust as an official core kernel language</a> - Rust loses its experimental tag in Linux 7.0, reaching full parity with C for kernel development after the Linux Kernel Maintainers Summit decision in December 2025.</p></li><li><p><a href="https://blog.rust-lang.org/2026/04/16/Rust-1.95.0/">Rust 1.95.0 released</a> - The latest stable release introduces <code>cfg_select!</code>, a compile-time macro for conditional configuration, and removes unstable support for custom target specifications on stable toolchains.</p></li><li><p><a href="https://blog.rust-lang.org/inside-rust/2026/04/17/crates-io-svelte-public-testing/">crates.io opens new Svelte-based frontend for public testing</a> - The Rust team invites the community to test the rebuilt crates.io frontend ahead of the planned production migration.</p></li><li><p><a href="https://github.com/rust-lang/cargo/pull/16796">Cargo stabilises build.warnings configuration</a> - The build.warnings field is now stable, giving teams a standardised way to configure compiler warning behaviour across workspace builds.</p></li><li><p><a href="https://zed.dev/blog/zed-1-0">Zed 1.0 ships</a> - The Rust-built code editor reaches stable release with GPU-accelerated rendering, real-time collaborative editing, Git integration, and native AI assistant support across macOS, Windows, and Linux.</p></li></ul><div><hr></div><p>That&#8217;s all for today. Thank you for reading this issue of Deep Engineering.</p><p>We&#8217;ll be back next week with more expert-led content.</p><p>Stay awesome, </p><p>Saqib Jan </p><p>Editor-in-Chief, Deep Engineering</p><div><hr></div><p><em>If your company is interested in reaching an audience of senior developers, software engineers, and technical decision-makers, you may want to </em><strong><a href="https://packt.omeclk.com/portal/wts/uc%5EcnN2dfNaqmD-kB-mo66%7C7g%5Ef%7Cb">advertise with us</a></strong><em>.</em></p><p>Thanks for reading Packt Deep Engineering! Subscribe for free to receive new posts and help grow our work.</p>]]></content:encoded></item></channel></rss>