<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[The Pragmatic Engineer: Deepdives]]></title><description><![CDATA[Long-form educational articles every Tuesday. These articles typically go deep into a topic relevant for software engineers or engineering managers, and tend to offer actionable advice.]]></description><link>https://newsletter.pragmaticengineer.com/s/deepdives</link><image><url>https://substackcdn.com/image/fetch/$s_!6TJt!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5ecbf7ac-260b-423b-8493-26783bf01f06_600x600.png</url><title>The Pragmatic Engineer: Deepdives</title><link>https://newsletter.pragmaticengineer.com/s/deepdives</link></image><generator>Substack</generator><lastBuildDate>Sun, 10 May 2026 08:58:50 GMT</lastBuildDate><atom:link href="https://newsletter.pragmaticengineer.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Gergely Orosz]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[pragmaticengineer@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[pragmaticengineer@substack.com]]></itunes:email><itunes:name><![CDATA[Gergely Orosz]]></itunes:name></itunes:owner><itunes:author><![CDATA[Gergely Orosz]]></itunes:author><googleplay:owner><![CDATA[pragmaticengineer@substack.com]]></googleplay:owner><googleplay:email><![CDATA[pragmaticengineer@substack.com]]></googleplay:email><googleplay:author><![CDATA[Gergely Orosz]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Designing Data-Intensive Applications: The Cloud & Doing the Right Thing]]></title><description><![CDATA[How the cloud changes the way we build applications, and why engineers&#8217; ethical choices matter more than ever. Excerpt from the book, &#8216;Designing Data-Intensive Applications&#8217;, 2nd edition]]></description><link>https://newsletter.pragmaticengineer.com/p/designing-data-intensive-applications-book-excerpt</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/designing-data-intensive-applications-book-excerpt</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 05 May 2026 16:46:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!C6W6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09e245ca-cbda-4c91-b38d-36c8074a7800_1310x940.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In 2016, <a href="https://martin.kleppmann.com/">Martin Kleppmann</a> published <em>&#8216;Designing Data-Intensive Applications&#8217;,</em> which quickly became a go-to book for those of us building backend applications and distributed systems. In it, Martin combined his experience as a startup founder with observations from his time at LinkedIn, and invested years of rigorous, fulltime research in the title.</p><p>Nine years later, he felt the time was ripe for an updated edition, with cloud computing much more widespread than in 2016. So, Martin teamed up with software engineer and investor, <a href="https://cnr.sh/">Chris Riccomini</a>, a former colleague at LinkedIn and the author of <a href="https://nostarch.com/missing-readme">The Missing README</a>, for a full refresh of the book which brings it right up to date for the present day.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!C6W6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09e245ca-cbda-4c91-b38d-36c8074a7800_1310x940.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!C6W6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09e245ca-cbda-4c91-b38d-36c8074a7800_1310x940.png 424w, https://substackcdn.com/image/fetch/$s_!C6W6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09e245ca-cbda-4c91-b38d-36c8074a7800_1310x940.png 848w, https://substackcdn.com/image/fetch/$s_!C6W6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09e245ca-cbda-4c91-b38d-36c8074a7800_1310x940.png 1272w, https://substackcdn.com/image/fetch/$s_!C6W6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09e245ca-cbda-4c91-b38d-36c8074a7800_1310x940.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!C6W6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09e245ca-cbda-4c91-b38d-36c8074a7800_1310x940.png" width="1310" height="940" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/09e245ca-cbda-4c91-b38d-36c8074a7800_1310x940.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:940,&quot;width&quot;:1310,&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;: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_!C6W6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09e245ca-cbda-4c91-b38d-36c8074a7800_1310x940.png 424w, https://substackcdn.com/image/fetch/$s_!C6W6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09e245ca-cbda-4c91-b38d-36c8074a7800_1310x940.png 848w, https://substackcdn.com/image/fetch/$s_!C6W6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09e245ca-cbda-4c91-b38d-36c8074a7800_1310x940.png 1272w, https://substackcdn.com/image/fetch/$s_!C6W6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09e245ca-cbda-4c91-b38d-36c8074a7800_1310x940.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>My copy of the new edition</em></figcaption></figure></div><p>Martin was recently on The Pragmatic Engineer Podcast, where <a href="https://newsletter.pragmaticengineer.com/p/designing-data-intensive-applications">we discussed</a> this updated volume and many related cloud computing matters. We also looked into some topics that have become less relevant over time, like details on MapReduce.</p><p>I asked Martin if this newsletter could share an excerpt of the updated edition of the book about a timeless, important topic, and he generously agreed. So, today we cover:</p><ol><li><p>Cloud versus self-hosting tradeoffs</p></li><li><p>Doing the right thing as a software engineer</p></li></ol><p>These excerpts are only part of the book; the first edition has been on my shelf for years and is now in well-worn condition. I jumped at the chance to get the second edition, and if you&#8217;re interested in building resilient systems, I recommend it as an excellent resource.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learning.oreilly.com/library/view/designing-data-intensive-applications/9781098119058/&quot;,&quot;text&quot;:&quot;Get the second edition of the book&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://learning.oreilly.com/library/view/designing-data-intensive-applications/9781098119058/"><span>Get the second edition of the book</span></a></p><p><em>My usual disclaimer: as with all my recommendations, I was not paid for this article, and none of the links are affiliates. See <a href="https://blog.pragmaticengineer.com/ethics-statement/">my ethics statement</a> for more.</em></p><div><hr></div><p><em>The excerpt below is from &#8220;<a href="https://learning.oreilly.com/library/view/designing-data-intensive-applications/9781098119058/">Designing Data-Intensive Applications&#8221; second edition</a>, by Martin Kleppmann and Chris Riccomini. Copyright &#169; 2026 Martin Kleppmann, Chris Riccomini. Published by O&#8217;Reilly Media, Inc. Used with permission.</em></p><h2>1. Cloud versus self-hosting tradeoffs</h2><p><em>This excerpt is from Chapter 1: &#8220;Trade-Offs in Data Systems Architecture&#8221;</em></p><p>For anything that an organization needs to do, one of the first questions is whether it should be done in-house or outsourced. That is, should you build or should you buy?</p><p>Ultimately, this is a question about business priorities. A common rule of thumb is that things that are a core competency or a competitive advantage of your organization should be done in-house, whereas things that are non-core, routine, or commonplace should be left to a vendor [<a href="https://world.hey.com/dhh/why-we-re-leaving-the-cloud-654b47e0">20</a>]. To give an extreme example, most companies do not fabricate their own CPUs, since it is cheaper to buy them from the semiconductor manufacturers.</p><p>With software, two important decisions to be made are who builds the software and who deploys it. The spectrum of possibilities is illustrated in Figure 1-2. At one extreme is bespoke software that you write and run in-house; at the other extreme are widely-used cloud services or SaaS products that are implemented and operated by an external vendor and that you access only through a web interface or API.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZkjW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75be7d6-2d6d-4564-a598-cfb501bbcc84_2048x384.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZkjW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75be7d6-2d6d-4564-a598-cfb501bbcc84_2048x384.png 424w, https://substackcdn.com/image/fetch/$s_!ZkjW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75be7d6-2d6d-4564-a598-cfb501bbcc84_2048x384.png 848w, https://substackcdn.com/image/fetch/$s_!ZkjW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75be7d6-2d6d-4564-a598-cfb501bbcc84_2048x384.png 1272w, https://substackcdn.com/image/fetch/$s_!ZkjW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75be7d6-2d6d-4564-a598-cfb501bbcc84_2048x384.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZkjW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75be7d6-2d6d-4564-a598-cfb501bbcc84_2048x384.png" width="1456" height="273" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c75be7d6-2d6d-4564-a598-cfb501bbcc84_2048x384.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:273,&quot;width&quot;:1456,&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_!ZkjW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75be7d6-2d6d-4564-a598-cfb501bbcc84_2048x384.png 424w, https://substackcdn.com/image/fetch/$s_!ZkjW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75be7d6-2d6d-4564-a598-cfb501bbcc84_2048x384.png 848w, https://substackcdn.com/image/fetch/$s_!ZkjW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75be7d6-2d6d-4564-a598-cfb501bbcc84_2048x384.png 1272w, https://substackcdn.com/image/fetch/$s_!ZkjW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75be7d6-2d6d-4564-a598-cfb501bbcc84_2048x384.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"><em>Figure 1-2. The spectrum of decisions on outsourcing software and its operations</em></figcaption></figure></div><p>The middle ground is off-the-shelf software (open source or commercial) that you self-host, or deploy yourself &#8211; for example, if you download MySQL and install it on a server you control. This could be on your own hardware (often called &#8216;on-premises,&#8217; even if the server is in a rented datacenter rack and not literally on your own premises), or on a virtual machine (VM) in the cloud (<em>infrastructure as a service</em>, or IaaS). There are more points along this spectrum, such as taking open source software and running a modified version of it.</p><p>A related question is how you deploy services, either in the cloud or on premises &#8211; for example, whether you use an orchestration framework such as Kubernetes. However, choice of deployment tooling is beyond the scope of this book, since other factors have a greater influence on the architecture of data systems.</p><h3>Pros &amp; Cons of Cloud Services</h3><p>Using a cloud service, rather than running comparable software yourself, essentially outsources the operation of that software to the cloud provider. There are good arguments for and against this approach. Cloud providers claim that using their services saves time and money and allows you to move faster compared to setting up your own infrastructure.</p><p>Whether using a cloud service is actually cheaper and easier than self-hosting depends very much on your skills and the workload on your systems, however. If you already have experience of setting up and operating the systems you need, and if your load is quite predictable (i.e., the number of machines you need does not fluctuate wildly), then it&#8217;s often cheaper to buy your own machines and run the software on them yourself [<a href="https://world.hey.com/dhh/why-we-re-leaving-the-cloud-654b47e0">21</a>, <a href="https://specbranch.com/posts/one-big-server/">22</a>].</p><p>On the other hand, if you need a system that you don&#8217;t already know how to deploy and operate, adopting a cloud service is often easier and quicker than learning to manage the system. Hiring and training staff specifically to maintain and operate the system can get very expensive. You still need an operations team when you&#8217;re using the cloud, but outsourcing the basic system administration can free up your team to focus on higher-level concerns.</p><p>Outsourcing the operation of a system to a company that specializes in running it can potentially result in better service, since the provider gains operational expertise from providing the service to many customers. On the other hand, if you run the service, you can configure and tune it to perform well on your particular workload. A cloud service would likely be unwilling to make such customizations on your behalf.</p><p>Cloud services are particularly valuable if the load on your systems varies a lot over time. If you provision your machines to be able to handle peak load, but those computing resources are idle most of the time, the system becomes less cost-effective. In this situation, cloud services have the advantage that they can make it easier to scale your computing resources up or down in response to changes in demand.</p><p>For example, analytical systems often have extremely variable load. Running a large analytical query quickly requires a lot of computing resources in parallel, but once the query completes, those resources sit idle until a user makes the next query. Predefined queries (e.g., for daily reports) can be enqueued and scheduled to smooth out the load, but for interactive queries, the faster you want them to complete, the more variable the workload becomes. If your dataset is so large that querying it quickly requires significant computing resources, using the cloud can save money as you can return unused resources to the provider rather than leaving them idle. For smaller datasets, this difference is less significant.</p><p>The biggest downside of a cloud service is that you have no control over it:</p><ul><li><p>If it is lacking a feature you need, all you can do is politely ask the vendor whether they will add it; you generally cannot implement it yourself.</p></li><li><p>If the service goes down, all you can do is wait for it to recover.</p></li><li><p>If you are using the service in a way that triggers a bug or causes performance problems, diagnosing the issue will be difficult. With software that you run yourself, you can get performance metrics and debugging information from the operating system to help you understand its behavior, and you can look at the server logs. With a service hosted by a vendor, you usually do not have access to these internals.</p></li><li><p>If the service shuts down or becomes unacceptably expensive, or if the vendor changes their product in a way you don&#8217;t like, you are at their mercy; continuing to run an old version of the software is usually not an option, so you&#8217;ll be forced to migrate to an alternative service [23]. This risk is mitigated if alternative services expose a compatible API, but for many cloud services there are no standard APIs, which raises the cost of switching, making vendor lock-in a problem.</p></li><li><p>If the cloud provider is in another country and a political conflict arises between that country and your own, you risk being locked out of the service due to imposed sanctions.</p></li><li><p>The cloud provider needs to be trusted to keep the data secure, which can complicate the process of complying with privacy and security regulations.</p></li></ul><p>Despite all these risks, it has become more and more popular for organizations to build new applications on top of cloud services, or to adopt a hybrid approach in which cloud services are used for some aspects of a system. However, cloud services will not subsume all in-house data systems. Many older systems predate the cloud, and for any services that have specialist requirements that existing cloud services cannot meet, in-house systems remain necessary. For example, very latency-sensitive applications such as high-frequency trading require full control of the hardware.</p><h3>Cloud-Native System Architecture</h3><p>Besides having a different economic model (subscribing to a service instead of buying hardware and licensing software to run on it), the rise of the cloud has also had a profound effect on how data systems are implemented on a technical level. The term &#8220;cloud native&#8221; is used to describe an architecture that is designed to take advantage of cloud services.</p><p>In principle, almost any software that you can self-host could also be provided as a cloud service, and indeed, such managed services are now available for many popular data systems. However, systems that have been designed from the ground up to be cloud native have been shown to have several advantages: better performance on the same hardware, faster recovery from failures, being able to quickly scale computing resources to match the load, and supporting larger datasets [<a href="https://media.amazonwebservices.com/blog/2017/aurora-design-considerations-paper.pdf">24</a>, <a href="https://www.microsoft.com/en-us/research/wp-content/uploads/2019/05/socrates.pdf">25</a>, <a href="https://www.usenix.org/system/files/nsdi20-paper-vuppalapati.pdf">26</a>]. Table 1-2 lists some examples of both types of systems.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GWaK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78c9fb84-7b57-4970-9dd3-64032ba79950_1268x378.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GWaK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78c9fb84-7b57-4970-9dd3-64032ba79950_1268x378.png 424w, https://substackcdn.com/image/fetch/$s_!GWaK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78c9fb84-7b57-4970-9dd3-64032ba79950_1268x378.png 848w, https://substackcdn.com/image/fetch/$s_!GWaK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78c9fb84-7b57-4970-9dd3-64032ba79950_1268x378.png 1272w, https://substackcdn.com/image/fetch/$s_!GWaK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78c9fb84-7b57-4970-9dd3-64032ba79950_1268x378.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GWaK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78c9fb84-7b57-4970-9dd3-64032ba79950_1268x378.png" width="1268" height="378" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/78c9fb84-7b57-4970-9dd3-64032ba79950_1268x378.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:378,&quot;width&quot;:1268,&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_!GWaK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78c9fb84-7b57-4970-9dd3-64032ba79950_1268x378.png 424w, https://substackcdn.com/image/fetch/$s_!GWaK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78c9fb84-7b57-4970-9dd3-64032ba79950_1268x378.png 848w, https://substackcdn.com/image/fetch/$s_!GWaK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78c9fb84-7b57-4970-9dd3-64032ba79950_1268x378.png 1272w, https://substackcdn.com/image/fetch/$s_!GWaK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78c9fb84-7b57-4970-9dd3-64032ba79950_1268x378.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>Table 1-2. Examples of self-hosted and cloud-native database systems</em></figcaption></figure></div><h4>Layering of cloud services</h4><p>Many self-hosted data systems have simple system requirements; they run on a conventional operating system such as Linux or Windows, they store their data as files on the filesystem, and they communicate via standard network protocols such as TCP/IP. A few systems depend on special hardware such as GPUs (for ML) or remote direct memory access (RDMA) network interfaces, but on the whole, self-hosted software tends to use generic computing resources: CPUs, RAM, a filesystem, and an IP network.</p><p>In a cloud, this type of software can be run in an IaaS environment, using one or more VMs (or instances) with a certain allocation of CPUs, memory, disk, and network bandwidth. Compared to physical machines, cloud instances can be provisioned faster and come in a greater variety of sizes, but otherwise they are similar to traditional computers: you can run any software you like on them, but you are responsible for administering it yourself.</p><p>In contrast, the key idea of cloud-native services is not only to use the computing resources managed by your operating system, but also to build upon lower-level cloud services to create higher-level services. For example:</p><ul><li><p>Object storage services such as Amazon S3, Azure Blob Storage, and Cloudflare R2 store large files. They provide more limited APIs than a typical filesystem (basic file reads and writes), but they have the advantage that they hide the underlying physical machines; the service automatically distributes the data across many machines so that you don&#8217;t have to worry about running out of disk space on any one machine. Even if some machines or their disks fail entirely, no data is lost.</p></li><li><p>Many other services are, in turn, built upon object storage and other cloud services. For instance, Snowflake is a cloud-based analytical database (data warehouse) that relies on S3 for data storage [<a href="https://www.usenix.org/system/files/nsdi20-paper-vuppalapati.pdf">26</a>], and some other services, in turn, build upon Snowflake.</p></li></ul><p>As always with abstractions in computing, there is no one right answer to what you should use. As a general rule, higher-level abstractions tend to be more oriented toward particular use cases. If your needs match the situations for which a higher-level system is designed, using the existing higher-level system will probably meet your needs with much less hassle than building it yourself from lower-level systems would. On the other hand, if no high-level system meets your needs, building it yourself from lower-level components is the only option.</p><h4>Separation of storage and compute</h4><p>In traditional computing, disk storage is regarded as durable (we assume that once something is written to disk, it will not be lost). To tolerate the failure of an individual hard disk, RAID (redundant array of independent disks) is often used to maintain copies of the data on several disks attached to the same machine. RAID can be implemented either in hardware or in software by the operating system, and it is transparent to the applications accessing the filesystem.</p><p>In the cloud, compute instances (VMs) may also have local disks attached, but cloud-native systems typically treat these disks more like an ephemeral cache and less like long-term storage. This is because the local disk becomes inaccessible if the associated instance fails, or if the instance is replaced with a bigger or a smaller one (on a different physical machine) to adapt to changes in load.</p><p>As an alternative to local disks, cloud services also offer virtual disk storage that can be detached from one instance and attached to a different one (e.g., Amazon EBS, Azure managed disks, and persistent disks in Google Cloud). Such a virtual disk is not a physical disk, but rather a cloud service provided by a separate set of machines that emulates the behavior of a disk (a block device, where each block is typically 4 KiB in size). This technology makes it possible to run traditional disk-based software in the cloud, but the block device emulation introduces overheads that can be avoided in systems that are designed from the ground up for the cloud [<a href="https://media.amazonwebservices.com/blog/2017/aurora-design-considerations-paper.pdf">24</a>]. The use of virtual disks also makes the application very sensitive to network glitches, since every I/O operation on the virtual block device is a network call [<a href="https://planetscale.com/blog/the-real-fail-rate-of-ebs">27</a>].</p><p>To address this problem, cloud-native services generally avoid using virtual disks and instead build on dedicated storage services that are optimized for particular workloads. Object storage services such as S3 are designed for long-term storage of fairly large files, ranging from hundreds of kilobytes to several gigabytes in size. The individual rows or values stored in a database are typically much smaller than this; cloud databases therefore typically manage smaller values in a separate service and store larger data blocks (containing many individual values) in an object store [<a href="https://www.microsoft.com/en-us/research/wp-content/uploads/2019/05/socrates.pdf">25</a>, <a href="https://blog.colinbreck.com/predicting-the-future-of-distributed-systems/">28</a>].</p><p>In traditional systems architecture, the same computer is responsible for both storage (disk) and computation (CPU and RAM), but in cloud-native systems, these two responsibilities have become somewhat separated, or disaggregated [<a href="https://dl.acm.org/doi/abs/10.1145/3514221.3526055">9</a>, <a href="https://www.usenix.org/system/files/nsdi20-paper-vuppalapati.pdf">26</a>, <a href="https://www.thenile.dev/blog/storage-compute-separation">29</a>, <a href="https://cloud.google.com/blog/products/databases/alloydb-for-postgresql-intelligent-scalable-storage">30</a>]: for example, S3 only stores files, and if you want to analyze that data, you will have to run the analysis code somewhere outside of S3. This implies transferring the data over the network.</p><p>Furthermore, cloud-native systems are often multitenant, which means that rather than having a separate machine for each customer, data and computation from several customers are handled on the same shared hardware by the same service [<a href="https://learning.oreilly.com/library/view/designing-data-intensive-applications/9781098119058/ch01.html#Vanlightly2023serverless">31</a>]. Multitenancy can enable better hardware utilization, easier scalability, and easier management by the cloud provider, but it also requires careful engineering to ensure that one customer&#8217;s activity does not affect the performance or security of the system for other customers [<a href="https://learning.oreilly.com/library/view/designing-data-intensive-applications/9781098119058/ch01.html#Jonas2019">32</a>].</p><h3>Operations in the Cloud Era</h3><p>Traditionally, the people managing an organization&#8217;s server-side data infrastructure were known as database administrators (DBAs), or system administrators (sysadmins). More recently, many organizations have tried to integrate the roles of software development and operations into teams with a shared responsibility for both backend services and data infrastructure; the DevOps philosophy has guided this trend. Site reliability engineers (SREs) are Google&#8217;s implementation of this idea [<a href="https://www.oreilly.com/library/view/site-reliability-engineering/9781491929117/">33</a>].</p><p>The role of operations is to ensure that services are reliably delivered to users (including configuring infrastructure and deploying applications) and to ensure a stable production environment (including monitoring and diagnosing any problems that may affect reliability). For self-hosted systems, operations traditionally involve a significant amount of work at the level of individual machines, such as capacity planning (e.g., monitoring available disk space and adding more disks before you run out of space), provisioning new machines, moving services from one machine to another, and installing operating system patches.</p><p>Many cloud services present an API that hides the individual machines implementing the service. For example, cloud storage replaces fixed-size disks with metered billing, where you can store data without planning your capacity needs in advance, and you are then charged based on the space used. Moreover, many cloud services remain highly available, even when individual machines have failed.</p><p>This shift in emphasis from individual machines to services has been accompanied by a change in the role of operations. The high-level goal of providing a reliable service remains the same, but the processes and tools have evolved.</p><p>The DevOps/SRE philosophy places greater emphasis on the following:</p><ul><li><p>Setting up automation; preferring repeatable processes over manual one-off jobs</p></li><li><p>Using ephemeral VMs and services rather than long-running servers</p></li><li><p>Enabling frequent application updates</p></li><li><p>Learning from incidents</p></li><li><p>Preserving the organization&#8217;s knowledge about the system, even as individuals come and go [<a href="https://queue.acm.org/detail.cfm?id=3434773">34</a>]</p></li></ul><p>With the rise of cloud services, a bifurcation of roles has occurred. Operations teams at infrastructure companies specialize in the details of providing a reliable service to a large number of customers, while the customers of the service spend as little time and effort as possible on infrastructure [<a href="https://www.pluralsight.com/resources/blog/cloud/the-future-of-ops-jobs">35</a>].</p><p>Customers of cloud services still require operations, but they focus on different aspects, such as choosing the most appropriate service for a given task, integrating services with each other, and migrating from one service to another. Even though metered billing removes the need for capacity planning in the traditional sense, it&#8217;s still important to know what resources you are using for which purpose so that you don&#8217;t waste money on cloud resources that are not needed. Capacity planning becomes financial planning, and performance optimization becomes cost optimization [<a href="https://medium.com/riskified-technology/over-pay-as-you-go-for-your-datastore-11a29ae49a8b">36</a>]. Additionally, cloud services do have resource limits or quotas (such as the maximum number of processes you can run concurrently), which you need to know about and plan for before you run into them [<a href="https://thenewstack.io/serverless-doesnt-mean-devopsless-or-noops/">37</a>].</p><p>Adopting a cloud service can be easier and quicker than provisioning and running your own infrastructure, although you still have to learn how to use the cloud service and perhaps work around its limitations. Integration among services becomes a particular challenge as a growing number of vendors offer an ever-broader range of cloud services targeting different use cases [<a href="https://erikbern.com/2021/11/30/storm-in-the-stratosphere-how-the-cloud-will-be-reshuffled.html">38</a>, <a href="https://benn.substack.com/p/the-data-os">39</a>]. ETL is only part of the story; operational cloud services also need to be integrated with each other. At present, we lack standards to facilitate this sort of integration, so it often involves significant manual effort.</p><p>Other operational aspects that cannot fully be outsourced to cloud services include maintaining the security of an application and the libraries it uses, managing the interactions between your own services, monitoring the load on your services, and tracking down the cause of problems such as performance degradations or outages. While the cloud is changing the role of operations, the need for operations is as great as ever.</p><h2>2. Doing the right thing as a software engineer</h2><p><em>The excerpt below is a section from Chapter 14, &#8220;Doing the Right Thing&#8221;</em></p><p>In the final chapter of this book, let&#8217;s take a step back. Throughout, we have examined a wide range of architectures for data systems, evaluated their pros and cons, and explored techniques for building reliable, scalable, and maintainable applications. However, we have left out a fundamental part of the discussion, which we should now fill in.</p><p>Every system is built for a purpose; every action we take has both intended and unintended consequences. The purpose may be as simple as making money, but the consequences may be far-reaching. We, the engineers building these systems, have a responsibility to carefully consider those consequences and to ensure that our decisions do not cause harm.</p><p>We talk about data as an abstract thing, but remember that many datasets are about people: their behavior, their interests, their identities. We must treat such data with humanity and respect. Users are humans too, and human dignity is paramount [<a href="https://schmud.de/posts/2024-08-18-data-is-a-bad-idea.html">1</a>].</p><p>Software development increasingly involves making important ethical choices. There are guidelines to help software engineers navigate these issues, such as the ACM Code of Ethics and Professional Conduct [<a href="https://www.acm.org/code-of-ethics">2</a>], but they are rarely discussed, applied, or enforced in practice. As a result, engineers and product managers sometimes take a cavalier attitude to privacy and the potential negative consequences of their products [<a href="https://www.linkedin.com/blog/engineering/archive/making-hard-choices-the-quest-for-ethics-in-machine-learning">3</a>, <a href="https://www.theguardian.com/commentisfree/2015/dec/06/algorithm-writers-should-have-code-of-conduct">4</a>].</p><p>A technology is not good or bad in itself &#8211; what matters is how it is used and how it affects people. This is true of a software system such as a search engine in much the same way as it is for a weapon like a gun. The ethical responsibility is ours to bear; it is not sufficient for software engineers to focus exclusively on the technology and ignore its consequences.</p><p>In contrast to much of computing, however, the concepts at the heart of ethics are not fixed or determinate in their precise meaning; they require interpretation, which may be subjective [<a href="https://cacm.acm.org/opinion/ethical-ai-is-not-about-ai/">5</a>]. What makes something &#8220;good&#8221; or &#8220;bad&#8221; is not well defined, and serious discourse on the subject among computing professionals is lacking [<a href="https://www.benzevgreen.com/wp-content/uploads/2019/11/19-ai4sg.pdf">6</a>]. Reasoning about ethics is difficult, but also too important to ignore. What does this entail? &#8220;Ethics&#8221; are not a checklist with which to comply; it&#8217;s a participatory and iterative process of reflection, in dialogue with people involved and accountability for the results [<a href="https://cacm.acm.org/opinion/ethics-as-a-participatory-and-iterative-process/">7</a>].</p><h3>Predictive Analytics</h3><p>Predictive analytics is a major part of why people are excited about big data and AI. It&#8217;s also an area that is fraught with ethical dilemmas. Using data analysis to predict the weather, or the spread of diseases, is one thing [<a href="https://cacm.acm.org/news/what-happens-when-big-data-blunders/">8</a>]; it is another matter to predict whether a convict is likely to reoffend, whether an applicant for a loan is likely to default, or whether an insurance customer is likely to make expensive claims [<a href="https://www.cl.cam.ac.uk/research/security/seminars/archive/video/2023-03-07-t196231.html">9</a>]. The latter have a direct effect on people&#8217;s lives.</p><p>Naturally, payment networks want to prevent fraudulent transactions, banks want to avoid bad loans, airlines want to avoid hijackings, and companies want to avoid hiring ineffective or untrustworthy people. From their point of view, the cost of a missed business opportunity is low, but the cost of a bad loan or a problematic employee is much higher, so it is expected for organizations to be cautious. If in doubt, they are better off saying &#8220;no&#8221;.</p><p>However, as algorithmic decision making becomes more widespread, someone who has (accurately or falsely) been labeled as risky by an algorithm may suffer a large number of &#8220;no&#8221; decisions. Systematically being excluded from jobs, air travel, insurance coverage, property rental, financial services, and other key aspects of society is such a large constraint on an individual&#8217;s freedom that it has been called &#8220;algorithmic prison&#8221; [<a href="https://www.theatlantic.com/technology/archive/2014/02/welcome-to-algorithmic-prison/283985/">10</a>]. In countries that respect human rights, the criminal justice system presumes innocence until proven guilty; on the other hand, automated systems can systematically and arbitrarily exclude a person from participating in society without any proof of guilt and little chance of appeal.</p><h4>Bias &amp; discrimination</h4><p>Decisions made by an algorithm are not necessarily any better or any worse than those made by a human. Everyone is likely to have biases, even if they actively try to counteract them, and discriminatory practices can become culturally institutionalized. There is hope that basing decisions on data, rather than subjective and instinctive human assessments, could be more fair and give a better chance to people who are often overlooked or disadvantaged in the traditional system [<a href="https://www.theatlantic.com/magazine/archive/2013/12/theyre-watching-you-at-work/354681/">11</a>].</p><p>When we develop predictive analytics and AI systems, we are not merely automating a human&#8217;s decision by using software to specify the rules for when to say &#8220;yes&#8221; or &#8220;no&#8221;; we are leaving the rules themselves to be inferred from data. However, the patterns learned by these systems are opaque: even if the data indicates a correlation, we may not know why. If the input to an algorithm carries a systematic bias, the system will most likely learn and amplify that bias in its output [<a href="https://www.theguardian.com/technology/2016/aug/03/algorithm-racist-human-employers-work">12</a>].</p><p>In many countries, anti-discrimination laws prohibit treating people differently depending on protected traits such as ethnicity, age, gender, sexuality, disability, or beliefs. Other features of a person&#8217;s data may be analyzed, but what happens if they are correlated with protected traits? For example, in racially segregated neighborhoods, a person&#8217;s postal code or even their IP address is a strong predictor of race. Put like this, it seems ridiculous to believe that an algorithm could somehow take biased data as input and produce fair and impartial output from it [<a href="https://www.scientificamerican.com/article/how-a-machine-learns-prejudice/">13</a>, <a href="https://www.ftc.gov/system/files/ftc_gov/pdf/EEOC-CRT-FTC-CFPB-AI-Joint-Statement%28final%29.pdf">14</a>]. Yet this belief often seems to be implied by proponents of data-driven decision making; an attitude that has been satirized as &#8220;machine learning is like money laundering for bias&#8221; [<a href="https://idlewords.com/talks/sase_panel.htm">15</a>].</p><p>Predictive analytics systems merely extrapolate from the past; if the past is discriminatory, they codify and amplify that discrimination [<a href="https://www.zdnet.com/article/artificial-intelligence-in-healthcare-is-racist/">16</a>]. If we want the future to be better than the past, moral imagination is required, and that&#8217;s something only humans can provide [<a href="https://www.amazon.com/Weapons-Math-Destruction-Increases-Inequality/dp/0553418815">17</a>]. Data and models should be our tools, not our masters.</p><h4>Responsibility and Accountability</h4><p>Automated decision-making raises the question of responsibility and accountability [<a href="https://www.amazon.com/Weapons-Math-Destruction-Increases-Inequality/dp/0553418815">17</a>]. If a human makes a mistake, they can be held accountable, and the person affected by the decision can appeal. Algorithms make mistakes too, but who is accountable when they go wrong? [<a href="https://www.nytimes.com/2016/08/01/opinion/make-algorithms-accountable.html">18</a>] When a self-driving car causes an accident, who is responsible? If an automated credit scoring algorithm systematically discriminates against people of a particular race or religion, is there any recourse? If a decision by your ML system comes under judicial review, can you explain to the judge how the algorithm made its decision? People should not be able to evade responsibility by blaming an algorithm.</p><p>Credit rating agencies are a classic example of collecting data to make decisions about people. A bad credit score makes life difficult, but at least a credit score is normally based on relevant facts about a person&#8217;s actual borrowing history, and any errors in the record can be corrected (although the agencies normally do not make this easy). Scoring algorithms based on machine learning, however, typically use a much wider range of inputs and are much more opaque, making it harder to understand how a particular decision has come about and whether someone is being treated in an unfair or discriminatory way [<a href="https://arxiv.org/abs/1606.08813">19</a>].</p><p>A credit score summarizes &#8220;how did you behave in the past?&#8221; whereas predictive analytics usually work on the basis of &#8220;who is similar to you, and how did people like you behave in the past?&#8221; Drawing parallels to others&#8217; behavior implies stereotyping people; for example, based on where they live (a close proxy for race and socioeconomic class). What about people put in the wrong bucket? Furthermore, if a decision is incorrect because of erroneous data, recourse is almost impossible [<a href="https://www.amazon.com/Weapons-Math-Destruction-Increases-Inequality/dp/0553418815">17</a>].</p><p>Much data is statistical in nature, which means that even if the probability distribution on the whole is correct, individual cases may well be wrong. For example, if the average life expectancy in your country is 80 years, that doesn&#8217;t mean you&#8217;re expected to drop dead on your 80th birthday. From the average and the probability distribution, you can&#8217;t say much about the age to which someone will live. Similarly, the output of a prediction system is probabilistic and may well be wrong in individual cases.</p><p>A blind belief in the supremacy of data for making decisions is not only delusional, but also positively dangerous. As data-driven decision making becomes more widespread, we will need to figure out how to avoid reinforcing existing biases, how to make algorithms accountable and transparent, and how to fix them when they inevitably make mistakes.</p><p>We will also need to figure out how to realize the positive potential of data and prevent it from being used to harm people. For example, analytics can reveal financial and social characteristics about personal lives. On the one hand, this power could be used to focus aid and support to help those who need it most. On the other hand, it is sometimes used by predatory businesses seeking to identify vulnerable people and sell them risky products such as high-cost loans or worthless college degrees [<a href="https://www.amazon.com/Weapons-Math-Destruction-Increases-Inequality/dp/0553418815">17</a>, <a href="https://www.commerce.senate.gov/wp-content/uploads/media/doc/12.18.13%20Senate%20Commerce%20Committee%20Report%20on%20Data%20Broker%20Industry.pdf">20</a>].</p><h4>Feedback loops</h4><p>Even with predictive applications with less immediately far-reaching effects on people, such as recommendation systems, there are difficult issues that we must confront. When services become good at predicting the content users want to see, they may end up showing them only opinions they already agree with, leading to echo chambers in which stereotypes, misinformation, and polarization can breed. We already know the impact that social media echo chambers can have on election campaigns.</p><p>When predictive analytics affect people&#8217;s lives, particularly pernicious problems arise because of self-reinforcing feedback loops. For example, consider the case of employers using credit scores to evaluate potential hires. You may be a good worker with a good credit score, but suddenly find yourself in financial difficulties due to a misfortune beyond your control. As you miss payments on your bills, your credit score suffers, and you will be less likely to find work. Joblessness pushes you toward poverty, which further worsens your score, making it even harder to find employment [<a href="https://www.amazon.com/Weapons-Math-Destruction-Increases-Inequality/dp/0553418815">17</a>]. It&#8217;s a downward spiral due to poisonous assumptions, hidden behind a camouflage of mathematical rigor and data.</p><p>As another example of a feedback loop, economists found that when gas stations in Germany introduced algorithmic prices, competition was reduced and prices for consumers went up because the algorithms learned to collude [<a href="https://economics.yale.edu/sites/default/files/clark_acex_jan_2021.pdf">21</a>].</p><p>We can&#8217;t always predict when such feedback loops may happen. However, many consequences can be predicted by thinking about an entire system (not just the computerized parts, but also the people interacting with it), in an approach known as &#8220;systems thinking&#8221; [<a href="https://www.amazon.nl/Thinking-Systems-Primer-Diana-Wright/dp/1844077268">22</a>]. We can try to understand how a data analysis system responds to different behaviors, structures, or characteristics. Does the system reinforce and amplify existing differences between people (e.g., making the rich richer or the poor poorer), or does it try to combat injustice? Even with the best intentions, we must beware of the possibility of unintended consequences.</p><h3>Surveillance</h3><p><em>The excerpt below is from another section in Chapter 14, &#8220;Doing the Right Thing&#8221;</em></p><p>As a thought experiment, try replacing the word &#8220;data&#8221; with &#8220;surveillance&#8221;, and observe whether common phrases still sound so good [<a href="https://x.com/hashbreaker/status/598076230437568512">23</a>]. How about this: &#8220;In our surveillance-driven organization we collect real-time surveillance streams and store them in our surveillance warehouse. Our surveillance scientists use advanced analytics and surveillance processing in order to derive new insights.&#8221;</p><p>This thought experiment is unusually polemical for this book, &#8220;<em>Designing <strong>Surveillance</strong>-Intensive Applications</em>&#8221;, but strong words are needed to emphasize this point. In our attempts to make software &#8220;eat the world&#8221; [<a href="https://a16z.com/why-software-is-eating-the-world/">24</a>], we have built the greatest mass surveillance infrastructure ever seen. We are rapidly approaching a world in which every inhabited space contains at least one internet-connected microphone, in the form of smartphones, smart TVs, voice-controlled assistant devices, baby monitors, and even children&#8217;s toys that use cloud-based speech recognition. Many of these devices have terrible security track records [<a href="https://arstechnica.com/information-technology/2016/01/how-to-search-the-internet-of-things-for-photos-of-sleeping-babies/">25</a>].</p><p>What is new compared to the past is that digitization has made it easy to collect large amounts of data about people. Surveillance of our location and movements, our social relationships and communications, our purchases and payments, and our health data has become almost unavoidable. A surveillance organization may end up knowing more about a person than that person knows about themselves; for example, identifying illnesses or economic problems before that individual is aware of them.</p><p>Even the most totalitarian, repressive regimes of the past could only dream of putting a microphone in every room and forcing every person to constantly carry a device capable of tracking their location and movements. Yet the benefits that we get from digital technology are so great that we now voluntarily accept this state of total surveillance. The difference is just that the data is being collected by corporations to provide us with services, rather than government agencies seeking control [<a href="https://www.schneier.com/books/data-and-goliath">26</a>].</p><p>Not all data collection necessarily qualifies as surveillance, but examining it as such can help us understand our relationship with the data collector. Why are we seemingly happy to accept surveillance by corporations? Perhaps you feel you have nothing to hide; in other words, you are totally in line with existing power structures, you are not a marginalized minority, and you needn&#8217;t fear persecution [<a href="https://grugq.tumblr.com/post/142799983558/nothing-to-hide">27</a>]. Not everyone is so fortunate. Or perhaps it&#8217;s because the purpose seems benign; it&#8217;s not overt coercion and conformance, merely better recommendations and more personalized marketing. However, combined with the discussion of predictive analytics from the last section, that distinction seems less clear.</p><p>We are already seeing behavioral data about driving, tracked by vehicles without drivers&#8217; consent, affecting their insurance premiums [<a href="https://www.ftc.gov/news-events/news/press-releases/2025/01/ftc-takes-action-against-general-motors-sharing-drivers-precise-location-driving-behavior-data">28</a>], and health insurance coverage that depends on people wearing a fitness tracking device. When surveillance is used to make decisions that hold sway over important aspects of life, such as insurance coverage or employment, it starts to appear less benign. Data analysis can also reveal surprisingly intrusive things; for example, the movement sensor in a smartwatch or fitness tracker can be used to work out what you are typing (e.g., passwords) with fairly good accuracy [<a href="https://arxiv.org/abs/1512.05616">29</a>]. Sensor accuracy and algorithms for analysis are only going to get better.</p><h2>Takeaways</h2><p>Thanks to Martin for writing this book, and to himself and Chris for doing a revamp for the second edition. The volume is now even more relevant to how we build systems in 2026 and beyond. You can purchase a hard copy from <a href="https://learning.oreilly.com/library/view/designing-data-intensive-applications/9781098119058/">the publisher&#8217;s website</a> or <a href="https://www.amazon.com/Designing-Data-Intensive-Applications-Reliable-Maintainable/dp/1098119061">Amazon</a>.</p><p>The first edition has a timeless quality because it focused on the fundamentals of large systems, and the new second edition follows the same approach, as laid out in its preface:</p><blockquote><p>&#8220;Although the landscape of technologies for processing and storing data is diverse and fast-changing, the underlying principles endure. If you understand those principles, you&#8217;re in a position to see where each tool fits in, how to make good use of it, and how to avoid its pitfalls. This book focuses on those principles.&#8221;</p></blockquote><p>Since the first edition appeared nine years ago, some things have changed in the tech industry:</p><ul><li><p><strong>Much greater focus on the cloud. </strong>Building large systems on top of cloud infrastructure is more common. This brings lower complexity as cloud primitives hide a lot of implementation complexity, but it also means accepting more risk because when the cloud is down, so is your system.</p></li><li><p><strong>Systems which AI tools build upon are more relevant. </strong>Vector databases, <a href="https://www.geeksforgeeks.org/python/pandas-create-test-and-train-samples-from-dataframe/">DataFrames</a> (for training datasets), and the processing of large amounts of training data with batch processing systems are relevant to anyone building production AI systems.</p></li><li><p><strong>Local-first software. </strong>Martin focuses on this area in his work, and with AI, we could see more demand for running models locally. Operating systems like Ubuntu are also <a href="https://newsletter.pragmaticengineer.com/i/195753987/4-betting-on-local-first-and-plans-for-agentic-workflows">focusing on this</a>.</p></li><li><p><strong>Formal methods. </strong>The advent of AI-generated code means this topic is getting more attention industry-wide, and the second edition covers it.</p></li><li><p><strong>Regulation and legal context. </strong>Regulations like the EU&#8217;s General Data Protection Regulation (GDPR) are something software engineers increasingly need to know about, and the book now covers it.</p></li></ul><p>If I had to summarize the evolution of the book in its second edition, it would be more focus on cloud and AI, and more on local-first software, testing, and how regulations affect engineers. Interestingly, this mirrors how the tech industry has developed over time, too.</p><p>I very much appreciate that the book closes with the final chapter focused on &#8220;doing the right thing&#8221; as a software engineer. Software systems have wide-ranging societal impact, and engineers working on these systems have a great say in what gets built, and how it gets built. As engineers, we owe it the very least to ourselves to consider the broader impact of our decisions &#8212; and doing so might also force us to make important ethical choices. There&#8217;s less discussion of the ethics angle on software engineering: and I&#8217;m glad that Martin and Chris did not shy away from going deeper into this topic.</p><p>If you&#8217;d like to get more background on the book &#8211; and on the hard parts of building large-scale systems &#8211; check out <a href="https://newsletter.pragmaticengineer.com/p/designing-data-intensive-applications">our podcast episode with Martin Kleppmann.</a></p>]]></content:encoded></item><item><title><![CDATA[How will AI change operating systems? Part 1: Ubuntu and Linux]]></title><description><![CDATA[A deepdive with the Canonical team into how AI is changing Ubuntu, why they&#8217;re betting on local-first LLMs, and a look into other Linux distributions]]></description><link>https://newsletter.pragmaticengineer.com/p/ubuntu-and-ai</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/ubuntu-and-ai</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 28 Apr 2026 14:25:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4X83!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa93367d9-f13e-4630-952d-68caf3c34f4e_1075x612.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>AI is affecting how many of us software engineers build; we&#8217;re prompting more code and producing much more of it. The tools are also adapting, with command-line interfaces gradually becoming more popular than IDEs. But what about operating systems? To find out, I reached out to the leading Linux distribution &#8211; the team at Ubuntu &#8211; and the Windows team, about how AI is changing their operating systems.</p><p>Today&#8217;s article focuses on Linux and Ubuntu, and we&#8217;ll cover Windows in a follow-up issue.<em> Obviously, I reached out to Apple but heard nothing back, unsurprisingly. If you&#8217;re reading this and happen to work at Apple, it&#8217;d be great to learn more!</em></p><p><a href="https://jnsgr.uk/">Jon Seager</a> is VP of Engineering at Canonical &#8211; the company behind Ubuntu &#8211; and has provided new details about what the team there has built for AI support, and some new ideas that they&#8217;re brewing up. Today, we cover:</p><ol><li><p><strong>Hardware enablement: support for GPUs, NPUs and DPUs. </strong>When you turn on a machine with AI accelerators, Ubuntu aims for the hardware to perform at its full potential. This means having proper driver support for PCs and cloud data centers&#8217; computing units.</p></li><li><p><strong>Hardware partnerships. </strong>Working closely with NVIDIA, AMD, and Intel means Ubuntu can support those vendors&#8217; new hardware from release day.</p></li><li><p><strong>CPU architecture variants</strong>. New versions in a CPU family add to, or change, features. An operating system needs to support a new version of the CPU architecture variant in order to fully utilize it. Ubuntu does this for the x86&#8209;64 family, making it a <em>lot</em> more performant on newer CPUs &#8211; while still supporting older CPUs.</p></li><li><p><strong>Local-first bet &amp; plans for agentic workflows</strong>. There&#8217;s a big focus on running local models and using &#8220;inference snaps&#8221; which help choose the right model with the right quantization. There is the intention to support agentic workflows at the OS level, one day, which is currently at the early exploration stage.</p></li><li><p><strong>Developer ecosystem</strong>. There&#8217;s a plan to add more support for AI dev tools, a focus on sandboxing at the OS level, a push to support ARM64 laptops more, and we touch on the popularity of Windows Subsystem for Linux (WSL).</p></li><li><p><strong>Engineering culture. </strong>A skeptical attitude to AI at Canonical has given way to one where experimentation is encouraged and devs<strong> </strong>lean into AI tools, but there are no targets for token usage or amounts of AI-generated code.</p></li><li><p><strong>What other Linux distributions are doing. </strong>Arch Linux takes the &#8220;DIY your AI setup&#8221; approach, Omarchy makes it easy to install AI tools, while Red Hat Enterprise Linux ships with AI integrated into the command-line and support for AI accelerators &amp; popular AI tools.</p></li></ol><p><em>The bottom of this article could be cut off in some email clients. <a href="https://newsletter.pragmaticengineer.com/p/ubuntu-and-ai">Read the full article uninterrupted, online.</a></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.pragmaticengineer.com/p/ubuntu-and-ai&quot;,&quot;text&quot;:&quot;Read the full article online&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.pragmaticengineer.com/p/ubuntu-and-ai"><span>Read the full article online</span></a></p><h2>1. Hardware enablement: support for GPUs, NPUs &amp; DPUs</h2><p>Jon mentioned he detects a &#8220;Dotcom Boom&#8221;-era vibe in the industry, like around when &#8220;web 1.0&#8221; was created, and indeed, lots of startups today aim to be the Google-style success story of this &#8220;AI era&#8221;. At Canonical, the team asked: what does that mean for Ubuntu as an operating system?</p><p>For instance, should Ubuntu join the competition and try to position itself closer to AI, or keep focusing on what they&#8217;ve done for decades: build an operating system? Jon said:</p><blockquote><p>&#8220;We need to make sure to remain a relatable and accessible system. I don&#8217;t think we should blur the line between application features and the OS itself. So, the most powerful thing we can do is hardware enablement.&#8221;</p></blockquote><p>Hardware enablement means that if a computer (typically, a laptop) has AI-related hardware, Ubuntu should allow it to make full use of it. This involves adding support for GPUs, NPUs, DPUs and other types of accelerator cards. Let&#8217;s briefly go through each.</p><h3>GPUs</h3><p>As is likely widely known by readers, &#8216;GPU&#8217; stands for Graphics Processing Unit. Originally built for graphics rendering, its #1 use case is no longer in video games but for AI training and inference. GPUs come in two forms:</p><ul><li><p>Integrated GPUs: located on the same <a href="https://en.wikipedia.org/wiki/Die_(integrated_circuit)">die</a> (integrated circuit) as the CPU, like GPUs on Apple&#8217;s M-series processors</p></li><li><p>Discrete GPUs: separate chips on their own board; often for gaming, or in standalone GPU rigs for AI and ML workloads</p></li></ul><p>NVIDIA leads the market in discrete GPUs for rigs with its <a href="https://www.nvidia.com/en-us/data-center/technologies/blackwell-architecture/">Blackwell family</a>, and in standalone GPU cards with the <a href="https://www.nvidia.com/en-us/geforce/rtx/">NVIDIA RTX</a> series. Other vendors like AMD offer GPUs for data centers (like the <a href="https://www.amd.com/en/products/accelerators/instinct/mi300.html">Instinct MI300 Series</a>) and for PCs with the <a href="https://www.amd.com/en/products/graphics/desktops/radeon.html">AMD Radeon</a> series.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!unR1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7757d200-11b3-4ad0-ac48-3cebcdcf78aa_1440x970.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!unR1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7757d200-11b3-4ad0-ac48-3cebcdcf78aa_1440x970.png 424w, https://substackcdn.com/image/fetch/$s_!unR1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7757d200-11b3-4ad0-ac48-3cebcdcf78aa_1440x970.png 848w, https://substackcdn.com/image/fetch/$s_!unR1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7757d200-11b3-4ad0-ac48-3cebcdcf78aa_1440x970.png 1272w, https://substackcdn.com/image/fetch/$s_!unR1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7757d200-11b3-4ad0-ac48-3cebcdcf78aa_1440x970.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!unR1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7757d200-11b3-4ad0-ac48-3cebcdcf78aa_1440x970.png" width="1440" height="970" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7757d200-11b3-4ad0-ac48-3cebcdcf78aa_1440x970.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:970,&quot;width&quot;:1440,&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_!unR1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7757d200-11b3-4ad0-ac48-3cebcdcf78aa_1440x970.png 424w, https://substackcdn.com/image/fetch/$s_!unR1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7757d200-11b3-4ad0-ac48-3cebcdcf78aa_1440x970.png 848w, https://substackcdn.com/image/fetch/$s_!unR1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7757d200-11b3-4ad0-ac48-3cebcdcf78aa_1440x970.png 1272w, https://substackcdn.com/image/fetch/$s_!unR1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7757d200-11b3-4ad0-ac48-3cebcdcf78aa_1440x970.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>Hands full: NVIDIA CEO Jensen Huang with the Blackwell GPU (left) and GB200 superchip. Source: <a href="https://fortune.com/2024/03/19/nvidia-new-blackwell-chip-ai-carbon-footprint-problem/">Forbes</a></em></figcaption></figure></div><h3>NPUs</h3><p>Neural Processing Units (NPUs) are also called &#8220;AI accelerators.&#8221; This is a dedicated block on the System-on-a-chip (SoC), on modern processors especially designed for running <a href="https://newsletter.pragmaticengineer.com/p/what-is-inference-engineering">AI inference</a> efficiently on&#8209;device. Since 2022, many modern processors have had a dedicated NPU block, including all Apple&#8217;s M-series chips (from M1 and up), Intel&#8217;s Core Ultra and Core Ultra &#8220;Series 2&#8221;, AMD&#8217;s Ryzen AI 300 series, and also Qualcomm&#8217;s Snapdragon X Elite and Snapdragon X Plus.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4X83!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa93367d9-f13e-4630-952d-68caf3c34f4e_1075x612.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4X83!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa93367d9-f13e-4630-952d-68caf3c34f4e_1075x612.png 424w, https://substackcdn.com/image/fetch/$s_!4X83!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa93367d9-f13e-4630-952d-68caf3c34f4e_1075x612.png 848w, https://substackcdn.com/image/fetch/$s_!4X83!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa93367d9-f13e-4630-952d-68caf3c34f4e_1075x612.png 1272w, https://substackcdn.com/image/fetch/$s_!4X83!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa93367d9-f13e-4630-952d-68caf3c34f4e_1075x612.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4X83!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa93367d9-f13e-4630-952d-68caf3c34f4e_1075x612.png" width="1075" height="612" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a93367d9-f13e-4630-952d-68caf3c34f4e_1075x612.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:612,&quot;width&quot;:1075,&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_!4X83!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa93367d9-f13e-4630-952d-68caf3c34f4e_1075x612.png 424w, https://substackcdn.com/image/fetch/$s_!4X83!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa93367d9-f13e-4630-952d-68caf3c34f4e_1075x612.png 848w, https://substackcdn.com/image/fetch/$s_!4X83!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa93367d9-f13e-4630-952d-68caf3c34f4e_1075x612.png 1272w, https://substackcdn.com/image/fetch/$s_!4X83!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa93367d9-f13e-4630-952d-68caf3c34f4e_1075x612.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>AMD&#8217;s Ryzen AI Pro Series 3000 processors have dedicated NPUs, like most modern laptop processors</em></figcaption></figure></div><p>A number shared for each NPU is TOPS. TOPS means Tera (trillions) of Operations Per Second, and the said operation is a &#8220;multiply-accumulate&#8221; (MAC) one, which <a href="https://www.qualcomm.com/news/onq/2024/04/a-guide-to-ai-tops-and-npu-performance-metrics">Qualcomm describes as:</a></p><blockquote><p>&#8220;A multiply-accumulate (MAC) operation executes the mathematical formulas at the core of AI workloads. A matrix multiply consists of a series of two fundamental operations: multiplication and addition to an accumulator. A MAC unit can, for example, run one of each per clock cycle, meaning it executes two operations per clock cycle. A given NPU has a set number of MAC units that can operate at varying levels of precision, depending on the NPU&#8217;s architecture.&#8221;</p></blockquote><p>How TOPS is calculated: TOPS = 2 &#215; MAC unit count &#215; Frequency / 1 trillion.</p><p>&#8220;Frequency&#8221; refers to the clock speed (cycles per second) at which an NPU and its MAC units (as well as a CPU or GPU) operate, which directly influences overall performance. Processors at higher frequencies allow for more operations, but higher frequencies also mean more energy consumed, heat generated, and battery life decreased. The TOPS number that&#8217;s quoted for processors is generally the peak operating frequency.</p><p>NPUs are often ideal for low-power, local inference, and for running smaller, local models. They can be useful for things like Local speech&#8209;to&#8209;text (dictation, captions, meeting transcription), video background blur/replacement or auto&#8209;framing, small local language summarization, etc. NPUs are more typical of laptop and PC processors, although some phone processors ship with them like the iPhone (A-series chips) and Google&#8217;s Tensor processor in Pixel phones. Basically, NPUs promise to bring efficiently-running local models on laptops one step closer.</p><h3>DPUs</h3><p>Data Processing Units (DPUs) are typically found in data centers, moving massive amounts of data fast. NVIDIA&#8217;s explanation:</p><blockquote><p>&#8220;The CPU is for general-purpose computing, the GPU is for accelerated computing, and the DPU, which moves data around the data center, does data processing.</p><p>A DPU is a new class of programmable processor that combines three key elements. A DPU is a system on a chip, or SoC, that combines:</p><ul><li><p>An industry-standard, high-performance, software-programmable, multi-core CPU, typically based on the widely used Arm architecture, tightly coupled to the other SoC components.</p></li><li><p>A high-performance network interface capable of parsing, processing and efficiently transferring data at line rate, or the speed of the rest of the network, to GPUs and CPUs.</p></li><li><p>A rich set of flexible and programmable acceleration engines that offload and improve applications&#8217; performance for AI and machine learning, zero-trust security, telecommunications, and storage, among others.&#8221;</p></li></ul></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DX7g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36c2607-8ed3-4da3-8fa9-c93d6dbf890d_1500x1020.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DX7g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36c2607-8ed3-4da3-8fa9-c93d6dbf890d_1500x1020.png 424w, https://substackcdn.com/image/fetch/$s_!DX7g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36c2607-8ed3-4da3-8fa9-c93d6dbf890d_1500x1020.png 848w, https://substackcdn.com/image/fetch/$s_!DX7g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36c2607-8ed3-4da3-8fa9-c93d6dbf890d_1500x1020.png 1272w, https://substackcdn.com/image/fetch/$s_!DX7g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36c2607-8ed3-4da3-8fa9-c93d6dbf890d_1500x1020.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DX7g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36c2607-8ed3-4da3-8fa9-c93d6dbf890d_1500x1020.png" width="1456" height="990" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b36c2607-8ed3-4da3-8fa9-c93d6dbf890d_1500x1020.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:990,&quot;width&quot;:1456,&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_!DX7g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36c2607-8ed3-4da3-8fa9-c93d6dbf890d_1500x1020.png 424w, https://substackcdn.com/image/fetch/$s_!DX7g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36c2607-8ed3-4da3-8fa9-c93d6dbf890d_1500x1020.png 848w, https://substackcdn.com/image/fetch/$s_!DX7g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36c2607-8ed3-4da3-8fa9-c93d6dbf890d_1500x1020.png 1272w, https://substackcdn.com/image/fetch/$s_!DX7g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36c2607-8ed3-4da3-8fa9-c93d6dbf890d_1500x1020.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>NVIDIA BlueField-3 DPU</em></figcaption></figure></div><p>Several major chipmakers manufacture DPUs, of which NVIDIA&#8217;s BlueField family is the most widespread. Others include AMD Pensando DPUs (Elba, Giglio), and Intel IPU / DPU cards (E2100, E2200 series).</p><p>DPUs are most commonly deployed inside Hyperscale cloud providers (AWS, Azure, GCP, OCI), or in AI and high-performance computing (HPC) data centers, or larger private clouds. DPUs make sense when GPU traffic is huge, or when the network telemetry overhead is so great that it could overwhelm the CPUs processing the data transfer.</p><h2>2. Hardware partnerships</h2><p>It&#8217;s easiest to add support to hardware by working with leading chip manufacturers, so Ubuntu has relationships with hardware vendors for that reason. As a result, the OS sometimes offers day-one support for cutting-edge AI supercomputers.</p><h3>Partnership with NVIDIA</h3><p>In September 2025, Canonical announced it would package and distribute the full NVIDIA CUDA toolkit directly within Ubuntu&#8217;s repositories. This deal collapsed into a single standard <a href="https://linuxize.com/post/how-to-use-apt-command/">apt</a> install, something that had previously been a multi-step manual installation process of downloading from NVIDIA&#8217;s site, importing GPG keys, pinning a separate APT repo &#8211; and praying nothing broke.</p><p>Packaging and distributing the CUDA toolkit makes developing with CUDA easier. From Jon:</p><blockquote><p>&#8220;One of the trickiest things for developers who have to use this tech is the dance of matching the right version of Python, with the right version of CUDA, with the right driver. Projects end up with different versions of CUDA, and then machines end up breaking because the driver configuration gets inadvertently broken along the way.</p><p>The number one thing we can do as an operating system is to make this setup as easy as possible.&#8221;</p></blockquote><p>Ubuntu&#8217;s strategy of working directly with chipmakers seems to be working. NVIDIA recently discontinued its custom NVIDIA DGX OS &#8212; a modified Ubuntu it maintained for years &#8212; and now ships plain Ubuntu. Jon:</p><blockquote><p>&#8220;Previously, NVIDIA shipped NVIDIA DGX OS for which NVIDIA had an agreement with Canonical where they could take Ubuntu, modify it with the kernel modules and software they needed, do some product-specific optimization, and ship that as NVIDIA DGX OS.</p><p>This more recent development sees NVIDIA just shipping Ubuntu as it comes.</p><p>When NVIDIA released the DGX Spark, a $4,000 AI workstation with an ARM64 chipset, it shipped running vanilla Ubuntu as the only supported operating system.&#8221;</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4om0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87eb9b54-c572-4157-8593-a5e8798bd0cc_2048x1298.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4om0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87eb9b54-c572-4157-8593-a5e8798bd0cc_2048x1298.png 424w, https://substackcdn.com/image/fetch/$s_!4om0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87eb9b54-c572-4157-8593-a5e8798bd0cc_2048x1298.png 848w, https://substackcdn.com/image/fetch/$s_!4om0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87eb9b54-c572-4157-8593-a5e8798bd0cc_2048x1298.png 1272w, https://substackcdn.com/image/fetch/$s_!4om0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87eb9b54-c572-4157-8593-a5e8798bd0cc_2048x1298.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4om0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87eb9b54-c572-4157-8593-a5e8798bd0cc_2048x1298.png" width="1456" height="923" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/87eb9b54-c572-4157-8593-a5e8798bd0cc_2048x1298.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:923,&quot;width&quot;:1456,&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_!4om0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87eb9b54-c572-4157-8593-a5e8798bd0cc_2048x1298.png 424w, https://substackcdn.com/image/fetch/$s_!4om0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87eb9b54-c572-4157-8593-a5e8798bd0cc_2048x1298.png 848w, https://substackcdn.com/image/fetch/$s_!4om0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87eb9b54-c572-4157-8593-a5e8798bd0cc_2048x1298.png 1272w, https://substackcdn.com/image/fetch/$s_!4om0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87eb9b54-c572-4157-8593-a5e8798bd0cc_2048x1298.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>NVIDIA DGX Spark AI supercomputer: one of several NVIDIA DGX servers powered by NVIDIA&#8217;s DGX OS</em></figcaption></figure></div><p>At CES 2026 in January, Canonical <a href="https://canonical.com/blog/nvidia-vera-rubin-ubuntu-support">announced</a> Ubuntu support for the NVIDIA Vera Rubin NVL72 rack-scale architecture, with day-one platform readiness in Ubuntu, version <a href="https://documentation.ubuntu.com/release-notes/26.04/">26.04 LTS</a> (Long-Term Support: at least 15 years for enterprise customers).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ORn3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d5121a-c63e-48eb-8d00-83acb326d458_1200x675.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ORn3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d5121a-c63e-48eb-8d00-83acb326d458_1200x675.png 424w, https://substackcdn.com/image/fetch/$s_!ORn3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d5121a-c63e-48eb-8d00-83acb326d458_1200x675.png 848w, https://substackcdn.com/image/fetch/$s_!ORn3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d5121a-c63e-48eb-8d00-83acb326d458_1200x675.png 1272w, https://substackcdn.com/image/fetch/$s_!ORn3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d5121a-c63e-48eb-8d00-83acb326d458_1200x675.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ORn3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d5121a-c63e-48eb-8d00-83acb326d458_1200x675.png" width="1200" height="675" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74d5121a-c63e-48eb-8d00-83acb326d458_1200x675.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:675,&quot;width&quot;:1200,&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_!ORn3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d5121a-c63e-48eb-8d00-83acb326d458_1200x675.png 424w, https://substackcdn.com/image/fetch/$s_!ORn3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d5121a-c63e-48eb-8d00-83acb326d458_1200x675.png 848w, https://substackcdn.com/image/fetch/$s_!ORn3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d5121a-c63e-48eb-8d00-83acb326d458_1200x675.png 1272w, https://substackcdn.com/image/fetch/$s_!ORn3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d5121a-c63e-48eb-8d00-83acb326d458_1200x675.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>The NVIDIA Vera Rubin NVL72 rack</em></figcaption></figure></div><h3>AMD and Intel</h3><p>It&#8217;s clear Ubuntu and NVIDIA enjoy a strong partnership, but Canonical aims to remain neutral, Jon says:</p><blockquote><p>&#8220;We have an amazing partnership with NVIDIA, but we do the same with Intel, the same with AMD, the same with Qualcomm, and the same with MediaTek because in reality there is hardware being released every day, and if we don&#8217;t maintain those partnerships, the ecosystem becomes even more fragmented than it already naturally is.&#8221;</p></blockquote><p>Last December, Ubuntu announced native support for AMD ROCm, and also ships with Intel&#8217;s OpenVINO toolkit. Ubuntu 26.04 LTS will be the first major distribution to natively package all three GPU compute stacks &#8212; NVIDIA, AMD, and Intel &#8212; with long-term enterprise support. Under Ubuntu Pro, ROCm LTS releases receive up to 15 years of security maintenance.</p><p><em>Security maintenance means that if vulnerabilities or critical incompatibilities are discovered in an LTS version, Canonical will patch them even if the upstream vendor no longer supports those versions and no longer backports security patches.</em></p><p>AMD Instinct accelerators are gaining traction in HPCs and sovereign AI deployments, as enterprises look for alternatives to CUDA-locked hardware. AMD&#8217;s SVP and Chief Software Officer, Andrej Zdravkovic, said the partnership would make it &#8220;easier for developers and enterprises to deploy AMD solutions on supported systems.&#8221;</p><p><strong>Chip vendors want to collaborate because it means less work for them to add operating system-level support.</strong> Jon:</p><blockquote><p>&#8220;It&#8217;s a win-win on both ends. Silicon companies are in the business of building the best chips they can, and partnering with Canonical means they have to concentrate on fewer things which are not their core focus. My hope is that partnering with Canonical helps them to focus on what they&#8217;re best at, while enabling us to help with what we&#8217;re best at: integrating, shipping and maintaining a Linux distribution.&#8221;</p></blockquote><h2>3. Architecture variants</h2><p>Modern x86 processors support multiple instruction set generations: x86_64 v1, v2, v3, v4, and v5. ARM has a similar hierarchy. Each generation adds capabilities, such as AVX-512 instructions that accelerate machine learning workloads.</p><p>Let&#8217;s take the x86_64 instruction set. The instruction set is versioned. These are the versions:</p><ul><li><p>For x86_64: v1, v2, v3, v4, v5&#8230;</p></li><li><p>For ARM: ARM v8.2, v8.3, v9&#8230;</p></li></ul><p><strong>Until recently, Ubuntu ran slower on newer CPUs in order to keep supporting older ones. </strong>So, when installing Ubuntu compiled for AMD64, the OS supported architecture variants for AMD64 v1.</p><p>Supporting v1 has the advantage that the oldest of AMD64 processors can run this Ubuntu version. But if Ubuntu decided to support v2 instructions, then v1 processors could not run the OS! The OS did not use the new instructions; for example, a modern processor with hardware accelerators like AVX-512, didn&#8217;t use them.</p><p><strong>Canonical has reworked its build infrastructure to produce binaries with </strong><em><strong>specific</strong></em><strong> architecture variant support.</strong> So, in the case of running an x86_64 v3 compatible processor, you can download an Ubuntu OS variant that&#8217;s compiled specifically for x86_64 v3.</p><p>One tradeoff the Ubuntu team had to make was building binaries several times, which takes up more processing time and storage at their end. Then again, the Ubuntu team doing this once means that users don&#8217;t need to do recompilation, which made it an easy tradeoff, Jon told me.</p><p>Now, Ubuntu supports x86_64 v3 as an architecture variant and plans to do more. Jon says:</p><blockquote><p>&#8220;Today, we&#8217;ve released x86_64 v3 as a variant, but the capability in our build and delivery pipelines unlocks the ability to add variants for the next RISC-V RVA versions, for ARMv9, ARMv10, ARMv11 and so on.</p><p>We will start now onboarding variants to make sure that when you go and buy your latest Snapdragon laptop, your operating system and all of the parts of it are using the silicon to its fullest.&#8221;</p></blockquote><p><strong>Adding support for architecture variants was a significant undertaking. </strong>Jon explains:</p><blockquote><p>&#8220;This work was especially complex because combined with having the hardware physically available in the build farm, Canonical also needed to make the build scheduler aware, and thread the capability through the build systems of Debian packages, Snaps, OCI images, virtual machine images, etc. As it stands, the capability exists for Debian packages, and support for further package types will land shortly.</p><p>In addition to the build infrastructure, work needed to be done on downstream package managers (apt, snap, &#8230;) and schedulers to ensure they pull the right version of packages, and consideration needs to be given to what happens if a VM containing x86_64 v3 code ends up trying to boot on v1 hardware, and so on.&#8221;</p></blockquote><h2>4. Betting on local-first &amp; plans for agentic workflows</h2><p>If you&#8217;ve tried to run an LLM locally on your machine, you&#8217;ll know it comes with friction. Jon:</p>
      <p>
          <a href="https://newsletter.pragmaticengineer.com/p/ubuntu-and-ai">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Learnings from conducting ~1,000 interviews at Amazon]]></title><description><![CDATA[Steve Huynh, formerly Principal Engineer at Amazon, shares observations from 10+ years of interviewing software engineers, and an excerpt from his new book, Technical Behavioral Interview]]></description><link>https://newsletter.pragmaticengineer.com/p/learnings-from-conducting-1000-interviews</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/learnings-from-conducting-1000-interviews</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 21 Apr 2026 12:49:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_3W5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc215ccd0-2cd3-4ab3-93a5-9ba11a7ba196_2048x1536.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Steve Huynh, formerly Principal Engineer at Amazon, shares observations from Bar Raiser, and an excerpt from his new book, Technical Behavioral Interview</em></p><p>Tech interviews have two parts: the technical interview &#8211; with a focus on things like coding, software architecture, problem solving &#8211; and the behavioral part &#8211; with a focus on past experience, and the situations that show you&#8217;d be a good fit at the company you&#8217;re interviewing with, along with things like attitude, motivation, culture fit. Technical interviews are going through a big change, thanks to AI tools: some companies are bringing in new, AI-assisted types of interviews, while others are trying to make &#8220;pre-AI&#8221; type interviews work.</p><p>What doesn&#8217;t seem to be changing is the second type of interviews: the behavioral ones. I&#8217;ve found the topic of behavioral interviews from a software engineer&#8217;s perspective somewhat under-discussed &#8211; even though this interview carries huge weight in securing an offer and what level you come in at. No matter how strong your technical skills are, especially at mid-sized and larger companies, you are unlikely to get an offer if you are deemed to not be a fit for what the company is looking for.</p><p>Steve Huynh was an engineer at Amazon for 17 years &#8211; I previously did a podcast episode with him on the reality of being a principal engineer at Amazon. During this time, Steve conducted nearly 1,000 interviews, of which around 600 were Bar Raiser ones. <em>Bar Raiser interviews are unique to Amazon: it&#8217;s an interview conducted by someone outside of the hiring team, with the goal of ensuring that the new hire raises the company&#8217;s talent bar.</em></p><p>After leaving the e-commerce giant, Steve spent 2 years researching and writing the book <a href="https://www.amazon.com/dp/1548441708">Technical Behavioral Interview: An Insider&#8217;s Guide</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_3W5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc215ccd0-2cd3-4ab3-93a5-9ba11a7ba196_2048x1536.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_3W5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc215ccd0-2cd3-4ab3-93a5-9ba11a7ba196_2048x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_3W5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc215ccd0-2cd3-4ab3-93a5-9ba11a7ba196_2048x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_3W5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc215ccd0-2cd3-4ab3-93a5-9ba11a7ba196_2048x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_3W5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc215ccd0-2cd3-4ab3-93a5-9ba11a7ba196_2048x1536.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_3W5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc215ccd0-2cd3-4ab3-93a5-9ba11a7ba196_2048x1536.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c215ccd0-2cd3-4ab3-93a5-9ba11a7ba196_2048x1536.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_3W5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc215ccd0-2cd3-4ab3-93a5-9ba11a7ba196_2048x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_3W5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc215ccd0-2cd3-4ab3-93a5-9ba11a7ba196_2048x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_3W5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc215ccd0-2cd3-4ab3-93a5-9ba11a7ba196_2048x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_3W5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc215ccd0-2cd3-4ab3-93a5-9ba11a7ba196_2048x1536.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>My copy of <a href="https://www.amazon.com/dp/1548441708">Technical Behavioral Interview: an Insider&#8217;s Guide</a></em></figcaption></figure></div><p>Today, we cover two topics on interviews and behavioral interviews:</p><p><strong>1. Learnings from conducting ~1,000 behavioral interviews at Amazon</strong>. Steve reflects of major observations from his 17 years at Amazon, covering:</p><ul><li><p>You&#8217;re over-prepared for one interview and unprepared for the other</p></li><li><p>How you deliver the story matters as much as the story itself</p></li><li><p>The interview is an audition for what it&#8217;s like to work with you</p></li></ul><p><strong>2. What companies are looking for during behavioral interviews</strong>. An excerpt from Steve&#8217;s new book, Technical Behavioral Interview, covering ~75% of a full chapter of the book (out of the 14 total chapters.) We get into:</p><ul><li><p>Understanding fit: role and company</p></li><li><p>The four dimensions that determine your level</p></li><li><p>What each level looks like</p></li><li><p>Reading and calibrating your own level</p></li><li><p>Researching what companies really value</p></li></ul><p><em>Longtime readers might remember Steve from my podcast with him a year back: <a href="https://newsletter.pragmaticengineer.com/p/what-is-a-principal-engineer-at-amazon">What is a Principal Engineer at Amazon? With Steve Huynh</a></em></p><p><em>My usual disclaimer: as with all my recommendations, I was not paid for this article, and none of the links are affiliates. See <a href="https://blog.pragmaticengineer.com/ethics-statement/">my ethics statement</a> for more.</em></p><p>With this, it&#8217;s over to Steve:</p><div><hr></div><h2>1. Learnings from conducting ~1,000 behavioral interviews at Amazon</h2><p>A Bar Raiser is a specially trained interviewer whose job is to ensure that every hire raises the average talent level at Amazon. I had veto power over any candidate. I sat on nearly a thousand interview loops across every level from intern to Principal Engineer.</p><p>After 50 or so interviews as a Bar Raiser, the patterns became impossible to miss. And this was the biggest one:</p><p>The candidates who didn&#8217;t get offers seldom failed because they lacked technical skill. <strong>They failed because of how they presented themselves.</strong></p><p>For sure, technical preparation is crucial, and I&#8217;m not telling you to skip it. But most candidates have massive blind spots when it comes to non-technical matters, which is a big problem. Why? Because that blind spot is where most hiring decisions are made.</p><p>The Bar Raiser who trained me put it this way:</p><p>Technical skills are the ante. They get you into the game. But they&#8217;re not what wins you the hand.</p><p>I didn&#8217;t fully appreciate what that meant until I&#8217;d seen candidates who were technically very strong get rejected because of everything else.</p><p>Think about it. By the time you&#8217;re sitting in a final round of interviews, you&#8217;ve already passed at least one technical screen or take-home assignment. The company already knows you could probably do the job. They already know you want to work with them.</p><p>But that&#8217;s not what the final round is for.</p><p><strong>The final round is when the team figures out whether they want to work with you.</strong> Being technically proficient is part of it, but it&#8217;s not all of it. Can you explain your thinking clearly when you&#8217;re stumped? How do you handle it when things go wrong? Can they picture you in a design review or in a tough conversation with a partner team?</p><p>Fit.</p><p>Fit is what decides most hiring outcomes, yet it&#8217;s the thing most candidates spend the least time preparing for. After nearly a thousand interviews, I can tell you exactly where the gap is and how you can close it.</p><h3>Learning #1: You&#8217;re over-prepared for one interview and unprepared for the other</h3><p>The average candidate preparing for a tech interview probably spends 95% of their time on technical preparation and 5% on everything else. Some spend literally zero on everything else.</p><p>I get why. Technical preparation feels concrete. You can grind coding problems and measure your progress. You can study system design patterns and feel yourself getting sharper. There&#8217;s a clear input/output relationship. Do more problems, get better at problems.</p><p>For most technical interviews, even if you haven&#8217;t seen the exact problem before, you can still do a decent job. It&#8217;s simply not possible to prepare for every problem, so it&#8217;s expected that you can reason through an unfamiliar coding question and pick up on hints the interviewer gives you. You can work through a system design problem by applying fundamentals you already know. It&#8217;s expected that you will encounter new questions during an interview, so it isn&#8217;t fatal if you&#8217;re a competent engineer who can think on your feet.</p><p>However, the non-technical rounds are the opposite. You cannot wing them and expect to do well. When an interviewer says, &#8220;Tell me about a time something went wrong on a project and how you handled it&#8221; and you haven&#8217;t thought about that question before, there is no hint they can give you. There&#8217;s no reasoning your way through it in real time. You either have a prepared story ready to go, or you&#8217;re going to mumble your way through a word salad while the interviewer watches.</p><p>I&#8217;ve seen this play out hundreds of times. A candidate would crush the coding round, then I would ask them about a difficult decision they made, and they would fall apart. They would pick a half-remembered example, start rambling, backtrack to add context they forgot, in the process losing track of the question. Then, five minutes later, they would land on something like, &#8220;So, yeah, it worked out in the end.&#8221;</p><p>These candidates were often strong coders, but that didn&#8217;t matter. At the debriefs, the feedback was always some version of &#8220;I couldn&#8217;t get a concrete answer about their experience. Every story was vague and unconvincing.&#8221; We couldn&#8217;t extend an offer when a candidate couldn&#8217;t articulate how they worked.</p><p>The technical bar was met, but the hiring decision was made in the behavioral round.</p><p>Here&#8217;s what&#8217;s frustrating about this. Non-technical preparation takes a fraction of the time for technical.</p><p>If you&#8217;re going to spend 80 to 100 hours preparing for an interview cycle, spending a single weekend on your stories might be the highest-leverage investment you make.</p><p>Ten hours of story prep can completely change the outcome of your behavioral rounds. Meanwhile, your 80th hour of LeetCode will give you almost nothing you didn&#8217;t already have at 60.</p><p>The returns on technical prep diminish rapidly. The returns on story prep are exponential because almost nobody does it at all.</p><p><strong>What to do:</strong> How are you currently splitting your interview prep time? If it&#8217;s 99% technical and 1% everything else, you&#8217;re over-indexed on the part with diminishing returns and under-indexed on the part where hiring decisions get made. You don&#8217;t need to cut your technical prep dramatically. Just reallocate. If you&#8217;re planning to spend 80 hours preparing, take 10 of those hours and move them to non-technical preparation. That reallocation will do more for your odds than 10 more hours working on practice problems.</p><h3>Learning #2: How you deliver the story matters as much as the story itself</h3><p>You can have the most impressive accomplishment of your career ready for your interview and completely waste it with bad delivery. The most common version of this is what I call the &#8220;ramble and stumble.&#8221;</p><p>The candidate starts talking, and you genuinely can&#8217;t tell if they&#8217;re figuring out the story as they go or if they&#8217;ve simply never said these words out loud before. Or they might give you five minutes of context and then still backtrack to add details they forgot. By the time they reach the outcome, you&#8217;ve lost track of how you got there.</p><p>Here&#8217;s something that&#8217;s always struck me as odd. If you had a big presentation at work, you&#8217;d spend hours preparing for it, right?. You&#8217;d think about the structure, the flow, the key points. You&#8217;d rehearse it. You might even do a couple of dry runs with a colleague. Nobody wants to walk into a presentation and wing it.</p><p>But in a job interview, where the stakes are arguably higher than any single presentation you&#8217;ll ever give? People wing those constantly. They walk in having never practiced their stories out loud. They might have thought about them, but they&#8217;ve never spoken the words, heard how they sound, or timed how long they take. Then they&#8217;re surprised when the words come out as a mess.</p><p>Think about any other high-stakes skill. You wouldn&#8217;t expect to be good at golf without practicing at the driving range. You wouldn&#8217;t expect to give a great keynote the first time you stepped on stage. Nobody calls a musician fake for rehearsing before a concert.</p><p>But for some reason, many people feel that preparing interview stories is inauthentic. As if it&#8217;s cheating somehow. As if the &#8220;real&#8221; version of you is the one that stumbles through an unrehearsed answer under pressure.</p><p>It&#8217;s not. The real you communicates clearly what you&#8217;ve done and what you&#8217;re capable of.</p><p><strong>What to do: </strong>Good delivery doesn&#8217;t require a lot of charisma or natural presentation skills, but it does require practice. Start with the two questions that come up in virtually every interview: &#8220;Tell me about yourself&#8221; and &#8220;Why do you want to work here?&#8221; Write down your answers. Then record yourself delivering them. Watch the recording and take notes. Where did you ramble? Where did you fill space with filler words? Did you look nervous? Then do it again. And again. Keep going until you watch the recording back and think &#8220;That sounds like someone I&#8217;d like to work with.&#8221;</p><p>Once those two are solid, pick stories from your career and do the same thing. This process will be uncomfortable at first. Most people hate watching themselves on camera. Do it anyway. Thirty minutes of this will up-level your interview performance much more than 20 hours of coding exercises could ever do.</p><h3>Learning #3: The interview is an audition for what it&#8217;s like to work with you</h3><p>Most candidates think the interview is an exam. If you get the right answers, then you&#8217;ll pass the test and get the job. That&#8217;s simply not how it works. Yes, you are being evaluated, and what you say matters. But there is no answer key. The interviewer doesn&#8217;t have a rubric with the &#8220;correct&#8221; responses to which they compare your answers. They&#8217;re forming an impression of you as a person, and that impression is far more nuanced than &#8220;right&#8221; or &#8220;wrong.&#8221;</p><p>By the time you&#8217;re sitting across from the interviewer, you&#8217;ve already jumped through some technical hoops. The company already has evidence from your resume that you can code or design systems at the level they need. That bar has been cleared. The final round goes deeper on the technical side, but it&#8217;s also trying to answer a completely different question: Would we want this person on the team? Would we trust their judgment in a crisis? Would they make our team&#8217;s software better or worse?</p><p>As a Bar Raiser, my specific job was to determine whether a candidate would raise the bar, meaning that they would be better than at least 50% of the people already at the company in that role.</p><p>The thing most people don&#8217;t realize is that the type of coding we asked about in interviews wasn&#8217;t what we did on the job. Nobody was writing algorithms on a whiteboard during their workday. The questions we asked tested problem-solving ability in an artificial environment.</p><p>But the behavioral questions, the soft questions, those tested situations we dealt with every single day. Navigating disagreements, handling projects that were going sideways, influencing without authority, making tradeoffs with incomplete information. These weren&#8217;t hypothetical scenarios pulled out of a textbook. They were just another Tuesday.</p><p>So when I asked a candidate to tell me about a time they had to push back on a stakeholder, I wasn&#8217;t waiting to hear the right answer; I was picturing them in our next planning and prioritization meeting. When they described how they handled a conflict on their team, I was asking myself whether I&#8217;d want to be in that room with them. Every answer was a preview of what it would be like to work alongside that person day to day.</p><p>The candidates who treated it like a test tried to figure out what I wanted to hear and then gave me that answer. That&#8217;s exactly the wrong approach. They gave polished, rehearsed answers with no rough edges and perfect endings where everything worked out and every decision was the right one. I&#8217;d walk out thinking &#8220;I have no idea what it would actually be like to work with this person.&#8221; And when that uncertainty showed up across multiple interviews in the debrief, it almost always turned into a &#8220;No.&#8221;</p><p><strong>What to do: </strong>For each story you&#8217;re preparing, stop thinking about what the interviewer wants to hear. Instead, think about what you&#8217;d want to hear from someone interviewing to join your team. You&#8217;d want to hear how they actually think. You&#8217;d want the real version of what happened, including the parts that were hard and the calls that were close. You&#8217;d want to walk away feeling like you understood what it would be like to work with them on a tough problem. Give your interviewer that same thing. Be honest and let them see how you think. That&#8217;s worth more than any polished answer.</p><h3>What ~1,000 interviews taught me</h3><p>After all those interviews, the lesson I keep coming back to is simple.</p><p><strong>The people who get hired are the ones who can walk into a room and tell a clear story. </strong>This story is about their work and their capabilities, and makes the interviewer think, &#8220;I want to work with that person.&#8221;</p><p>Being able to tell this story is a skill. And like any skill, it gets better with practice. Most people never practice it because they don&#8217;t think of it as something you can prepare for, but you can. And a little preparation here goes further than almost anything else you can do for your career.</p><h2 style="text-align: justify;">2. What companies are looking for during behavioral interviews</h2><p><em>The below are excerpts from Chapter 2 from <a href="https://www.amazon.com/dp/1548441708">Technical Behavioral Interview: An Insider&#8217;s Guide</a>. Some sections have been cut out and lightly edited for this article. Copyright &#169; 2026 Steve Huynh. Used with permission.</em></p><div><hr></div><p style="text-align: justify;">Technical skills alone don&#8217;t determine your offer. Otherwise, those who can solve the coding and system design problems would get the same result. Instead, companies use behavioral interviews to answer two critical questions: <em>Do you fit with both the role and the company?</em> And if you do fit<em>, at what level will you be most effective?</em></p><p style="text-align: justify;"></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!H27U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b79d6bb-4d5d-44eb-96eb-16014fdee589_1398x918.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!H27U!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b79d6bb-4d5d-44eb-96eb-16014fdee589_1398x918.png 424w, https://substackcdn.com/image/fetch/$s_!H27U!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b79d6bb-4d5d-44eb-96eb-16014fdee589_1398x918.png 848w, https://substackcdn.com/image/fetch/$s_!H27U!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b79d6bb-4d5d-44eb-96eb-16014fdee589_1398x918.png 1272w, https://substackcdn.com/image/fetch/$s_!H27U!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b79d6bb-4d5d-44eb-96eb-16014fdee589_1398x918.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!H27U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b79d6bb-4d5d-44eb-96eb-16014fdee589_1398x918.png" width="1398" height="918" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5b79d6bb-4d5d-44eb-96eb-16014fdee589_1398x918.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:918,&quot;width&quot;:1398,&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_!H27U!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b79d6bb-4d5d-44eb-96eb-16014fdee589_1398x918.png 424w, https://substackcdn.com/image/fetch/$s_!H27U!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b79d6bb-4d5d-44eb-96eb-16014fdee589_1398x918.png 848w, https://substackcdn.com/image/fetch/$s_!H27U!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b79d6bb-4d5d-44eb-96eb-16014fdee589_1398x918.png 1272w, https://substackcdn.com/image/fetch/$s_!H27U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b79d6bb-4d5d-44eb-96eb-16014fdee589_1398x918.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>Get both right, and you will receive an offer at the appropriate level. Get the fit wrong, and you&#8217;ll be rejected regardless of your skills. Get the level wrong, and you&#8217;ll be either down-leveled or rejected for being underqualified.</p><p style="text-align: justify;">This chapter explains how companies make their assessments of fit and level by analyzing the signals in your stories. Once you understand these dimensions, you&#8217;ll pick better stories and signal the right level.</p><h2 style="text-align: justify;">Understanding Fit: Role and Company</h2><p style="text-align: justify;">The primary consideration for any tech role is whether you have the technical skills to do the job. Companies will assess this mostly through the technical parts of the interview, for example, coding challenges, system design, or whatever technical evaluation matches your role. If you can&#8217;t demonstrate the core technical capability, nothing else matters.</p><p style="text-align: justify;">But technical skills alone don&#8217;t predict success. Companies learned this the hard way by hiring smart people who couldn&#8217;t work effectively in their environment. That&#8217;s why behavioral interviews focus on two additional types of fit:</p><p style="text-align: justify;"><strong>Role Fit:</strong> Can you handle the specific challenges and working conditions of this position? A backend role at a fast-growing startup requires different capabilities than a backend role at an established enterprise. The technical skills might be similar, but the role demands will be different.</p><p style="text-align: justify;"><strong>Company Fit:</strong> Will you thrive in the environment in which this organization operates? This goes beyond surface-level culture. They are assessing whether your working style, decision-making approach, and values match with how the company gets things done.</p><h2 style="text-align: justify;">How Companies Detect Fit Through Signals</h2><p style="text-align: justify;">Companies can&#8217;t directly ask the question, &#8220;Would you fit here?&#8221; What candidate would torpedo their chance of success by answering with a &#8220;No&#8221;? Instead, companies look for signals in your stories that indicate alignment or misalignment.</p><p style="text-align: justify;"><strong>Role Fit Signals</strong> emerge from how you describe handling situations similar to what the role requires:</p><ul><li><p style="text-align: justify;">If the role requires working with ambiguous requirements, do your stories show comfort with uncertainty?</p></li><li><p style="text-align: justify;">If the position involves cross-team coordination, do you show an ability to cope with organizational complexity?</p></li><li><p style="text-align: justify;">If the job needs rapid iteration, do your examples show shipping quickly and adjusting based on feedback?</p></li></ul><p style="text-align: justify;"><strong>Company Fit Signals</strong> come from the choices you made and how you describe them:</p><ul><li><p style="text-align: justify;">A company that values &#8220;bias for action&#8221; looks for stories that show you moving quickly despite incomplete information.</p></li><li><p style="text-align: justify;">An organization that prizes &#8220;customer obsession&#8221; wants to hear examples of you going deep to understand user needs.</p></li><li><p style="text-align: justify;">A place that emphasizes &#8220;radical transparency&#8221; seeks stories that show you sharing information openly, even when you&#8217;re uncomfortable.</p></li></ul><p style="text-align: justify;">The same story can send different signals to different companies. You spending three weeks perfecting a solution might demonstrate attention to quality at one company but analysis paralysis at another. Moving fast and fixing issues later demonstrates good judgment at a growth startup but recklessness at an established healthcare company.</p><h3 style="text-align: justify;">Common &#8220;Mis-Fits&#8221;</h3><p style="text-align: justify;">Even a talented candidate will get rejected sometimes if they are not a good fit. The same behaviors that are positive at one company can signal poor fit at another.</p><p style="text-align: justify;"><strong>Independence vs. Collaboration</strong>: This covers both how you work and how you make decisions. Some companies need people who pick up a problem, run with it, and come back with a solution. Others expect you to bring the team along at every step. These often go together: companies that want you to work solo also tend to want you to make calls on your own, and companies that want collaborative work also want group buy-in on decisions.</p><p style="text-align: justify;">If every story you tell involves going off and building something alone, consensus-driven companies will worry you&#8217;ll steamroll people or make choices that won&#8217;t stick. Flip it around: if every story involves checking with the group before you act, companies that prize individual ownership will wonder whether you can make a decision without a meeting.</p><p style="text-align: justify;"><strong>Speed vs. Thoroughness</strong>: Startups often need rapid experimentation, where you ship MVPs and iterate based on feedback, while companies in healthcare or finance require careful validation before any release. This tension also shows up in how teams think about code quality: some organizations will happily spend extra weeks on clean architecture, while others want a working solution on deadline even if the code needs cleanup later. Whereas stories about methodical testing might bore a startup, your &#8220;ship it and fix it&#8221; examples could terrify a medical device company.</p><p style="text-align: justify;"><strong>Excellence vs. Pragmatism</strong>: Some organizations value technical excellence and clean architecture above all else. Others need pragmatic solutions that ship on deadline even if imperfect. Focusing on perfect code fails at deadline-driven companies, just as accepting technical debt everywhere fails at companies maintaining critical infrastructure.</p><p style="text-align: justify;"><strong>Innovation vs. Stability</strong>: Some roles require creating new solutions and challenging existing approaches, while others need you to maintain and optimize proven systems. If you say that you&#8217;re constantly reinventing established processes, teams that value stability will not consider you a good fit. Conversely, stories that show you only follow existing patterns will disappoint teams that are looking for creative problem-solving</p><p style="text-align: justify;"><strong>Direct vs. Diplomatic</strong>: Some cultures prize radical candor and want you to say exactly what you think. Others value maintaining harmony and face-saving communication. If you are too blunt, you will not fit in well at a relationship-focused company. If you are not direct enough, you will not like working at a company that values &#8220;disagree and commit.&#8221;</p><p style="text-align: justify;"><strong>Data vs. Intuition</strong>: Some companies require data to justify every decision (&#8221;data-driven&#8221; cultures), while others trust experienced judgment and move on gut feel. Showing that you make decisions based on instinct does not impress analytical companies, and telling a company that values experienced judgment that you conduct three A/B tests to choose a button color will get you struck off their list.</p><p style="text-align: justify;"><strong>Specialist vs. Generalist</strong>: Large companies often want deep experts who master one domain, while smaller companies need people who are comfortable wearing multiple hats. Know which sort of company you are walking into.</p><p style="text-align: justify;">Once you understand fit, you can pick stories that match the company and the role.</p><h2 style="text-align: justify;">The Four Dimensions That Determine Your Level</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZC_j!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d2f9f7-4e20-440e-bfc8-b158f2668801_1398x918.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZC_j!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d2f9f7-4e20-440e-bfc8-b158f2668801_1398x918.png 424w, https://substackcdn.com/image/fetch/$s_!ZC_j!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d2f9f7-4e20-440e-bfc8-b158f2668801_1398x918.png 848w, https://substackcdn.com/image/fetch/$s_!ZC_j!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d2f9f7-4e20-440e-bfc8-b158f2668801_1398x918.png 1272w, https://substackcdn.com/image/fetch/$s_!ZC_j!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d2f9f7-4e20-440e-bfc8-b158f2668801_1398x918.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZC_j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d2f9f7-4e20-440e-bfc8-b158f2668801_1398x918.png" width="1398" height="918" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/17d2f9f7-4e20-440e-bfc8-b158f2668801_1398x918.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:918,&quot;width&quot;:1398,&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_!ZC_j!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d2f9f7-4e20-440e-bfc8-b158f2668801_1398x918.png 424w, https://substackcdn.com/image/fetch/$s_!ZC_j!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d2f9f7-4e20-440e-bfc8-b158f2668801_1398x918.png 848w, https://substackcdn.com/image/fetch/$s_!ZC_j!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d2f9f7-4e20-440e-bfc8-b158f2668801_1398x918.png 1272w, https://substackcdn.com/image/fetch/$s_!ZC_j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d2f9f7-4e20-440e-bfc8-b158f2668801_1398x918.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>Companies assess your level through four dimensions that appear in every story you tell. Each dimension reveals different aspects of your capability. Together, they show the company where you operate most effectively.</p><h3>Scope (Dimension #1)</h3><p>Scope provides a measure of the number of people on your team and, extending outward as you advance, whose work was affected by your actions. The greater the number affected, the higher your level for this dimension.</p><p style="text-align: justify;"><strong>Entry Level:</strong> Your work affects your own productivity and starts to help other team members. For example, you might improve how you handle assigned tasks or fix issues that were slowing down a few teammates.</p><p style="text-align: justify;"><strong>Mid Level:</strong> Your work affects aspects of the team and shapes how it operates. You might redesign a process that changes a significant part of how your team works or solve problems that affect most of the team&#8217;s effectiveness.</p><p style="text-align: justify;"><strong>Senior Level:</strong> Your work directly impacts your entire team and is beginning to influence at least one other team. Perhaps you create solutions that change how your whole team operates and affect workflows in adjacent teams, or you solve problems that require coordination with other groups. You may also start collaborating more closely with product or design partners on your immediate team&#8217;s work.</p><p style="text-align: justify;"><strong>Staff Level:</strong> Your work directly impacts at least two teams and is beginning to have an influence on the broader division or organization. Examples of this include developing technical strategies that change how multiple teams make decisions and solving problems that require buy-in across several parts of engineering. Your influence extends beyond engineering into product, design, and program management as you shape solutions that affect how cross-functional partners work.</p><p style="text-align: justify;"><strong>Principal Level:</strong> Your work affects many teams or changes how large parts of the organization operate. Perhaps you have created technical strategies that have influenced how dozens of teams make decisions. Or you have solved problems that cut across a large engineering organization. At this level, your influence regularly extends into business strategy, shaping decisions alongside product, design, program, and business leadership.</p><h3 style="text-align: justify;">Contribution (Dimension #2)</h3><p>Contribution captures what you did, not what happened around you. It is important to be precise about the line between &#8220;I&#8221; and &#8220;we.&#8221; Companies will expect to see evidence of increasing leadership and ownership as you advance in your career.</p><p><strong>Entry Level:</strong> You execute assigned work and are beginning to take ownership of small pieces. Examples: implementing solutions designed by others; fixing bugs in existing systems; taking full responsibility for well-defined features within larger projects.</p><p style="text-align: justify;"><strong>Mid Level:</strong> You own complete solutions from problem to implementation while also guiding others. Perhaps you have identified issues, designed the approaches, implemented them, and you have verified that they work, and you have helped your teammates understand the reasons for your decisions.</p><p style="text-align: justify;"><strong>Senior Level:</strong> You lead initiatives requiring coordination. You&#8217;re expected to make progress even when the requirements are unclear or the path forward is uncertain. Examples of this include driving technical decisions for your team; mentoring others through complex problems; architecting solutions to be implemented by others; and ensuring quality work outcomes for many people.</p><p style="text-align: justify;"><strong>Staff Level:</strong> You lead cross-team initiatives and establish technical direction, often in situations where the right approach isn&#8217;t obvious and stakeholders have competing priorities. This could look like defining technical approaches that are adopted by multiple teams, creating systems that enable other teams to solve problems on their own, or driving agreement on complex technical decisions across several teams.</p><p style="text-align: justify;"><strong>Principal Level:</strong> You create organizational capabilities and establish new ways of working. At this level, you&#8217;re frequently operating in highly ambiguous environments where you must define the problem before you can solve it. You might define technical standards that guide dozens of teams, build systems that enable others to solve entire classes of problems, or transform how the organization approaches its hardest challenges.</p><h3 style="text-align: justify;">Impact (Dimension #3)</h3><p>Impact shows what changed for the better as a result of your work. Companies want to see that your work produced results worth the investment. Strong stories put numbers on the impact and connect technical wins to business or user outcomes.</p><p style="text-align: justify;"><strong>Entry Level:</strong> You improve your personal productivity and are starting to help the team work better. Examples include reducing the time you spend on repetitive tasks, fixing issues that were slowing down teammates, or improving the quality of code in the areas you touch. Even simple measures matter at this level: time saved or bugs prevented.</p><p style="text-align: justify;"><strong>Mid Level:</strong> You improve team effectiveness in specific areas and influence team-wide practices. Perhaps you reduced deployment times for specific workflows, eliminated categories of bugs in your domain, or you created tools that have made the team more productive in particular areas. You can quantify these improvements and connect them to broader outcomes like feature velocity or reliability.</p><p style="text-align: justify;"><strong>Senior Level:</strong> You transform how your entire team works and are starting to have an impact beyond your team. For example, you might have introduced new workflows that changed your team&#8217;s capabilities. Or perhaps you eliminated major sources of operational problems, or the improvements that you have created have been adopted by adjacent teams. Your impact extends beyond just engineering metrics to product outcomes, user experience, or operational costs.</p><p style="text-align: justify;"><strong>Staff Level</strong>: You improve how multiple teams operate and drive organizational improvements. These sorts of impact come from achievements such as establishing practices that several teams adopt, solving infrastructure problems that were impeding multiple teams, or creating new capabilities that open up new types of work across teams. Your measurable impact can be tied to business metrics like revenue, customer retention, or time-to-market.</p><p style="text-align: justify;"><strong>Principal Level</strong>: You create organizational capabilities and drive strategic changes. Impact at this level could come from establishing technical foundations that dozens of teams use to build upon, solving problems that were blocking major business initiatives, or creating leverage that compounds benefits across the company. Your impact is measured in business outcomes and strategic capability, not just technical improvements.</p><h3 style="text-align: justify;">Difficulty (Dimension #4)</h3><p>Difficulty reflects the complexity of problems you&#8217;ve tackled, the constraints you have faced, and the trade-offs you have managed. Under this category, solving easy problems with big impacts is less impressive than hard problems solved well.</p><p style="text-align: justify;"><strong>Entry Level:</strong> You work on straightforward problems within established patterns. For example, you might face challenges learning new technologies or debugging unfamiliar code, but the path forward becomes clearer once you understand the problem or ask for help.</p><p style="text-align: justify;"><strong>Mid Level:</strong> You work through challenges and obstacles in your work. The problems you tackle have more moving parts and less obvious solutions. These could be competing requirements or having to work through technical complexity you haven&#8217;t seen before. Or perhaps you have had to manage dependencies within your team that affected your timeline or figure out solutions when the approach wasn&#8217;t immediately obvious.</p><p style="text-align: justify;"><strong>Senior Level:</strong> You manage constraints and make technical decisions with team-level architectural implications. The problems you solve involve multiple interacting systems and competing concerns. You might have to balance needs across multiple stakeholders with different priorities. Maybe you make architectural decisions that affect how your whole team works, or you have to work around technical limitations that require creative solutions, or solve problems that require you to address both technical and business factors.</p><p style="text-align: justify;"><strong>Staff Level: </strong>You manage competing trade-offs across multiple teams while handling problems with significant technical and organizational complexity. Examples of difficulty at staff level include:</p><ul><li><p style="text-align: justify;">Balancing different technical approaches when teams have genuinely conflicting needs.</p></li><li><p style="text-align: justify;">Creating solutions that affect how several teams work together.</p></li><li><p style="text-align: justify;">Making architectural decisions that have to work across diverse contexts.</p></li><li><p style="text-align: justify;">Getting teams to agree when the technically optimal solution differs for each team.</p></li></ul><p style="text-align: justify;"><strong>Principal Level:</strong> You handle fundamental trade-offs between competing organizational needs or solve problems where no clear solution exists. The complexity at this level often involves novel problems that lack established patterns or precedents. You might balance technical excellence against delivery speed at organizational scale; work within organizational constraints while maintaining technical integrity; create approaches for entire classes of problems the company hasn&#8217;t solved before; or make decisions that affect company strategy and require executive buy-in.</p><h3 style="text-align: justify;">What Each Level Looks Like</h3><p style="text-align: justify;">Here&#8217;s how the same types of accomplishments look across each level. These aren&#8217;t templates. They&#8217;re meant to help you develop a sense for the difference between a mid-level story and a senior one. Compare adjacent levels and notice what actually changes as you move up and down.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KY-A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac2b115d-cc3e-4f34-8143-a62b7b1b3eb1_1398x897.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KY-A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac2b115d-cc3e-4f34-8143-a62b7b1b3eb1_1398x897.png 424w, https://substackcdn.com/image/fetch/$s_!KY-A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac2b115d-cc3e-4f34-8143-a62b7b1b3eb1_1398x897.png 848w, https://substackcdn.com/image/fetch/$s_!KY-A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac2b115d-cc3e-4f34-8143-a62b7b1b3eb1_1398x897.png 1272w, https://substackcdn.com/image/fetch/$s_!KY-A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac2b115d-cc3e-4f34-8143-a62b7b1b3eb1_1398x897.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KY-A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac2b115d-cc3e-4f34-8143-a62b7b1b3eb1_1398x897.png" width="1398" height="897" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ac2b115d-cc3e-4f34-8143-a62b7b1b3eb1_1398x897.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:897,&quot;width&quot;:1398,&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_!KY-A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac2b115d-cc3e-4f34-8143-a62b7b1b3eb1_1398x897.png 424w, https://substackcdn.com/image/fetch/$s_!KY-A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac2b115d-cc3e-4f34-8143-a62b7b1b3eb1_1398x897.png 848w, https://substackcdn.com/image/fetch/$s_!KY-A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac2b115d-cc3e-4f34-8143-a62b7b1b3eb1_1398x897.png 1272w, https://substackcdn.com/image/fetch/$s_!KY-A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac2b115d-cc3e-4f34-8143-a62b7b1b3eb1_1398x897.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2 style="text-align: justify;">Researching What Companies Really Value</h2><p style="text-align: justify;">You&#8217;ll never have perfect information about what a specific company values, but a little focused research will often reveal surprising insights that most other candidates will miss. The difference between having even partial intelligence and going in blind can be whether or not you emphasize the right things in your stories.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jzl-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7366e636-8732-48d6-bccc-7e508c635992_1398x918.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jzl-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7366e636-8732-48d6-bccc-7e508c635992_1398x918.png 424w, https://substackcdn.com/image/fetch/$s_!jzl-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7366e636-8732-48d6-bccc-7e508c635992_1398x918.png 848w, https://substackcdn.com/image/fetch/$s_!jzl-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7366e636-8732-48d6-bccc-7e508c635992_1398x918.png 1272w, https://substackcdn.com/image/fetch/$s_!jzl-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7366e636-8732-48d6-bccc-7e508c635992_1398x918.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jzl-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7366e636-8732-48d6-bccc-7e508c635992_1398x918.png" width="1398" height="918" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7366e636-8732-48d6-bccc-7e508c635992_1398x918.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:918,&quot;width&quot;:1398,&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_!jzl-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7366e636-8732-48d6-bccc-7e508c635992_1398x918.png 424w, https://substackcdn.com/image/fetch/$s_!jzl-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7366e636-8732-48d6-bccc-7e508c635992_1398x918.png 848w, https://substackcdn.com/image/fetch/$s_!jzl-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7366e636-8732-48d6-bccc-7e508c635992_1398x918.png 1272w, https://substackcdn.com/image/fetch/$s_!jzl-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7366e636-8732-48d6-bccc-7e508c635992_1398x918.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><h3 style="text-align: justify;">Start With Your Recruiter</h3><p style="text-align: justify;">Most candidates treat recruiters as gatekeepers to avoid, but if you do this, you will waste your best source of insider information. Recruiters want you to succeed, because their performance is based on the number of accepted offers received by the candidates they put forward. They have prep materials, they know the interviewers&#8217; focus areas, and they understand what they are looking for.</p><p style="text-align: justify;">Ask your recruiter directly: &#8220;What should I know about this company&#8217;s current challenges?&#8221; Or &#8220;What competencies matter most for this role?&#8221; Or &#8220;Can you share any interview prep materials?&#8221; Many recruiters have documents about interview format, team priorities, or even the specific behavioral competencies they evaluate. The questions that are used as examples in the prep materials have a high likelihood of being asked in the interviews.</p><h3 style="text-align: justify;">Mine Publicly Available Information</h3><p style="text-align: justify;">When companies repeat certain words when describing job opportunities, they&#8217;re telling you what matters. For example, a job posting that mentions &#8220;fast-paced&#8221; several times signals something different than one emphasizing compliance. Those words are there for a reason.</p><p style="text-align: justify;"><strong>Where to dig:</strong></p><ul><li><p style="text-align: justify;"><strong>Engineering blogs:</strong> How do they describe their wins? What problems do they celebrate solving?</p></li><li><p style="text-align: justify;"><strong>Tech talks and conferences:</strong> What topics do their engineers present? Speed of delivery? Scale? Innovation?</p></li><li><p style="text-align: justify;"><strong>Open source contributions:</strong> What they choose to open source reveals their priorities. If they open source developer tools, this suggests they value community. If they are happy to make internal tools public, this shows transparency.</p></li><li><p style="text-align: justify;"><strong>Technical documentation:</strong> The existence of public API docs or technical guides (and the quality thereof) shows how they support both users and their own teams.</p></li><li><p style="text-align: justify;"><strong>Status pages and postmortems:</strong> Companies that publish detailed postmortems demonstrate that they value learning from failure. A company that shares their incident response processes likely has a strong operational culture.</p></li></ul><p style="text-align: justify;">Even companies without engineering blogs will leave traces. Product release patterns tell you about their development pace. Technology choices show their priorities: newer frameworks suggest a focus on innovation, whereas relying on proven technologies indicates they prefer stability.</p><h3 style="text-align: justify;">Look for Patterns in Discussions</h3><p style="text-align: justify;">Glassdoor, Blind, and Reddit contain gold buried amongst rubble. Ignore the rubble (e.g., individual rants). Instead, look for patterns across multiple posts. If five different people mention &#8220;lots of process&#8221; or &#8220;no work-life balance&#8221; or &#8220;amazing learning culture,&#8221; that&#8217;s a pattern you will want to know about.</p><p style="text-align: justify;">Pay attention to what people complain about and what they praise. Complaints about &#8220;too many meetings&#8221; may suggest the company has a collaborative, consensus-driven culture, or, alternatively, that productivity within the company is inhibited by an excessive number of meetings. Praise for &#8220;autonomy&#8221; indicates they trust their people to make decisions without checking in. Both types of comments reveal what behaviors the companies will reward.</p><h3 style="text-align: justify;">Talk to Current Employees</h3><p style="text-align: justify;">If you know someone at the company, ask them directly what behaviors get rewarded and, conversely, what behaviors will cause people to struggle. Skip surface-level queries about culture, and ask specific questions:</p><ul><li><p style="text-align: justify;">&#8220;When someone gets promoted here, what do they do to earn it?&#8221;</p></li><li><p style="text-align: justify;">&#8220;What behaviors get negative feedback?&#8221;</p></li><li><p style="text-align: justify;">&#8220;How does the team make decisions when there&#8217;s disagreement?&#8221;</p></li><li><p style="text-align: justify;">&#8220;What surprised you most about working here?&#8221;</p></li></ul><p style="text-align: justify;">Current employees will tell you truths the company website never would. Perhaps they&#8217;ll tell you that at their company, &#8220;customer obsession&#8221; really means checking usage data before writing code, or that &#8220;ownership&#8221; means being available to resolve production issues at two o&#8217;clock in the morning.</p><h3 style="text-align: justify;">What You&#8217;re Really Looking For</h3><p style="text-align: justify;">All this research serves one purpose: understanding what stories will resonate at your interview. Think of it as finding the real intersection between your experience and what they care about.</p><p style="text-align: justify;">If research reveals they prize speed over perfection, then emphasize stories that tell how you shipped quickly and iterated. If they value technical depth, highlight examples of diving deep to understand root causes. If they care about collaboration, make sure your story focuses on cross-team work rather than solo accomplishments.</p><p style="text-align: justify;">The research will also help you decide whether this company is the right place for you. If everything you learn suggests they value the kinds of behaviors you don&#8217;t naturally demonstrate or don&#8217;t want to develop, then perhaps you don&#8217;t need to pursue that particular role.</p><h3 style="text-align: justify;">Putting It All Together</h3><p style="text-align: justify;">Companies aren&#8217;t just evaluating whether you can do the job. They&#8217;re also assessing whether you&#8217;ll thrive in their specific environment and at what level you&#8217;ll be most effective. These two dimensions determine not just whether you will get an offer, but also whether that offer will position you for success.</p><p style="text-align: justify;">Understanding fit helps you know which of your experiences will connect most with what the company values. This small company needs someone who ships fast and figures things out alone. That enterprise needs someone who navigates processes and builds consensus. Neither is inherently better than the other. They&#8217;re simply different environments that reward different approaches.</p><p style="text-align: justify;">Understanding levels helps you position your stories appropriately. The same project can demonstrate entry-level execution, mid-level ownership, or senior-level leadership depending on your actual contribution and how you frame it. Get this wrong and you will either get rejected for overreaching or down-leveled for not properly communicating your capabilities.</p><p style="text-align: justify;">The payoff is immediate. You&#8217;ll pick better stories, focus on the right details, and make it easier for interviewers to see what you can do. You&#8217;ll make better decisions about which roles actually match who you are and what you want to do. The goal isn&#8217;t to get <em>any</em> offer. The goal is to get the <em>right</em> offer at the <em>right</em> level at the <em>right</em> company to ensure your success.</p><h2 style="text-align: justify;">Takeaways</h2><p><em>Gergely, again. </em>Thanks to Steve for both sharing his learnings, as an interviewer, and for sharing nearly a full chapter from his whole book. The book goes a lot deeper than the above sample chapter. A few of the ones I found helpful:</p><ul><li><p>High-signal storytelling (Chapter 3): a framework for explaining your work in a way that &#8220;sticks&#8221; with the interviewer</p></li><li><p>9 competencies with many examples and stories throughout the book: ones like &#8220;delivery&#8221; (Chapter 6), &#8220;earning trust and dealing with conflict&#8221; (Chapter 8) and &#8220;Strategic leadership and thinking big (Chapter 13)&#8221;</p></li><li><p>Examples of what interviewers typically see as key signals, yellow flags and red flags</p></li></ul><p>If you would like to have a fresh resource to prepare for behavioural interviews at tech companies, the full book offers far more explanations, tactics and exercises to do so:</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.amazon.com/dp/1548441708&quot;,&quot;text&quot;:&quot;Get the full book on Amazon&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.amazon.com/dp/1548441708"><span>Get the full book on Amazon</span></a></p><p><em>Steve also writes a newsletter titled <a href="https://alifeengineered.substack.com/about">A Life Engineered</a>: you can sign up to it <a href="https://alifeengineered.substack.com/about">here</a>.</em></p><p><strong>It&#8217;s helpful to understand how and why companies hire, and what they look for. </strong>To us engineers, hiring processes often look illogical from the outside. We&#8217;ll ask things like:</p><ul><li><p>&#8220;Why does the interview process not resemble day-to-day work?&#8221;</p></li><li><p>&#8220;I already have open source code I wrote: why does the company need to do a coding interview to confirm what is clear: that I need to code?&#8221;</p></li><li><p>&#8220;Why did I get a rejection, even though I did well on all of the interviews?&#8221;</p></li></ul><p>It feels to me that there are similarities between hiring and dating: both parties show up with goals and expectations in their head, which are often not communicated. Sometimes there&#8217;s a match; sometimes there is not. This phase of a relationship is often about &#8220;selling:&#8221; as a candidate on the job market, it&#8217;s about selling yourself, and convincing the company that you would be a fit for what they are looking for.</p><p><strong>Doing your research on the company is underrated, and not all that many candidates do so, in my observation. </strong>When I was a hiring manager at Uber, roughly half of the people who got on the call with me did not do <em>any</em> research about the company, and perhaps 1 out of 10 candidates did any research on the team they interviewed for &#8211; when we had public blog posts about our work, on the company blog! So those showing up prepared helped them stand out in the &#8220;motivation&#8221; dimension, from the get go.</p><p><strong>It all starts with being able to pass the &#8220;technical&#8221; interviews &#8211; but it&#8217;s a mistake to sleep on the &#8220;behavioural parts.&#8221; </strong>To state the obvious: candidates who do not do well on the technical interview rounds will not get offers. But I&#8217;ve personally had to say to several candidates who did great on the technical side of things, but turned out to be misaligned with what we were looking for, as confirmed on the behavioral rounds.</p><p>And I do believe you can uplevel in doing better on these behavioral rounds: starting with researching what the company&#8217;s culture is like, practicing how to present yourself better, and putting yourself in the shoes of the interviewers, understanding what they are looking for.</p><p>I know plenty of software engineers who refuse to do any preparation for interviews, staying &#8220;if the company doesn&#8217;t want me as I am, they don&#8217;t deserve me anyway.&#8221; This is a valid strategy, and can work for highly  in-demand professionals, the same way as showing up to a first date in sweatpants and slippers can still work out for highly attractive and desirable people. For the rest of us not as incredibly in-demand for a position we&#8217;re applying for: it&#8217;s probably worth putting in additional effort, in hopes for better outcomes during interviews.</p>]]></content:encoded></item><item><title><![CDATA[The impact of AI on software engineers in 2026: key trends]]></title><description><![CDATA[Our AI tooling survey finds concerns about mounting AI costs, more engineers hitting usage limits, and AI tools having uneven effects upon different types of engineers]]></description><link>https://newsletter.pragmaticengineer.com/p/the-impact-of-ai-on-software-engineers-2026</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/the-impact-of-ai-on-software-engineers-2026</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 14 Apr 2026 16:01:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Ekej!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174b9ab2-ef0b-4a40-ba4a-0de330620ff0_1324x758.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Recently, we <a href="https://newsletter.pragmaticengineer.com/p/ai-tooling-2026">ran a survey</a> asking readers of The Pragmatic Engineer how you use AI tools, which tools you use, what does and doesn&#8217;t work, and what it&#8217;s like working with AI, in general.</p><p>For today&#8217;s issue, we&#8217;ve dug into your 900+ responses to look for trends in AI tool usage among software engineers and engineering leaders. This article surfaces insights that are less about specific tools, and more about the effect these tools have on tech professionals. We cover:</p><ol><li><p><strong>Costs. </strong>Unsurprisingly, companies pay for most tool usage, and those responsible for budgets are increasingly nervous that AI-related costs are headed only one way: up.</p></li><li><p><strong>Usage limits. </strong>Around 30% of respondents say they have hit limits. Switching tools, upgrading plans, or moving over to API pricing are common responses.</p></li><li><p><strong>Impact on &#8220;Builders.&#8221; </strong>Folks who make larger code changes and do &#8220;quality-of-life&#8221; work are builders, and they&#8217;re also dealing with more AI slop. Some also grapple with a loss of professional identity.</p></li><li><p><strong>AI tools speed up &#8220;Shippers.&#8221; </strong>Engineers who focus more on getting things done are the most positive about AI tools. But they also add tech debt faster and might build the wrong things.</p></li><li><p><strong>&#8220;Coasters:&#8221; learning faster while generating AI slop. </strong>Less adept engineers can uplevel faster with AI, but they generate a lot of &#8220;AI slop&#8221; while doing so, which frustrates builders.</p></li><li><p><strong>Changing software engineer &amp; engineering manager (EM) roles.</strong> Engineers have to orchestrate and context switch more often, while engineering managers can be more hands on. It&#8217;s interesting to see the engineer and manager roles becoming more similar.</p></li><li><p><strong>Other impacts on the craft. </strong>We&#8217;re going from &#8220;how&#8221; to build to &#8220;what&#8221; to build, solo devs are seeing improved results, workloads are increasing with AI tools, and more.</p></li></ol><p>We previously published a detailed summary of the survey which focused on <a href="https://newsletter.pragmaticengineer.com/p/ai-tooling-2026">AI tooling for software engineers</a>, covering the most-used AI tools, trends, AI agent usage, company size and usage, and tools that engineers love.</p><h2>1. Costs</h2><p>Concern about the cost of AI tools is a trend throughout the survey, with around 15% of respondents mentioning it in some way.</p><p><strong>Tech companies foot the bill for the majority of spending on AI tools</strong>. More respondents say their employers pay for AI coding tools than those who say they pay themselves, and predictably, employers fund more expensive packages than what individuals buy personally.</p><p>Companies commonly pay for &#8220;max&#8221; plans with the likes of Claude Code, Cursor, and Codex (around $100-200/month per engineer), although some companies&#8217; budgets only stretch to $20/month per engineer &#8211; around the price point of GitHub Copilot, and the cheapest Claude or ChatGPT subscriptions.</p><p>The most-mentioned AI tool spending patterns:</p><ul><li><p><strong>When companies pay: </strong>~$200/month plans. Many have enterprise subscriptions, sometimes with subsidies and vendor lock-in. Some companies allow usage-based coverage on top of monthly plans.</p></li><li><p><strong>When personally paying for tools: </strong>~$20/month or free tiers. This can stack up across different tools. Around 5% of respondents have separate work and personal subscriptions, and free tier usage is widespread for personal use.</p></li></ul><p>For now, companies seem to be in the experimentation phase with AI tools, and several respondents say that they believe their companies have unsustainable AI-tooling budgets. This is likely because businesses are figuring out the best way of leveraging the tools, and the message to engineers at such places is to not worry about price and usage while that unfolds. A CTO at a small, US-based company shares:</p><blockquote><p><em>&#8220;</em>Right now, we&#8217;re not sweating the costs because we&#8217;re trying to evolve best practices for the tools, but that has resulted in some devs really blowing through budget, so we may start instituting caps on spending.&#8221;</p></blockquote><h3>Breaking the budget</h3><p>At small and mid-sized companies, leadership teams seem more comfortable about going over budget, than engineers running out of budget. There are more accounts from C-level folks and founders about racking up large bills than there are from engineers. A CPTO (Chief Product and Technology Officer) at a mid-sized company:</p><blockquote><p>&#8220;I ran up several monthly bills of $600 with Cursor. We have the dev team subscribed to ~$100/month plans. We&#8217;re now in the process of moving the rest of the team to Claude Code, as we can get more resources for around $100/month in cost.&#8221;</p></blockquote><p><strong>Top spenders can be allocated higher budgets.</strong> A number of tech businesses have separate, larger budgets for their heaviest AI users. A senior C++ engineer working in the video game industry says:</p><blockquote><p>&#8220;I&#8217;ve become my team&#8217;s AI champion. In theory, my limits are higher than normal, but I keep myself limited to what others can use, so I can show them useful things they can do.&#8221;</p></blockquote><p><strong>UK and EU companies worry more about budgets than US-based ones. </strong>Most responses which mention finance teams pushing back against spending even $30-50/month per engineer on AI tools are based in the UK and EU. One amusing example is a 10-person, seed-stage startup where the CEO questioned why they were paying as much as &#163;25/month per engineer for one of the cheapest AI tools around.</p><p>In general, it feels like European companies want to see clear value-add in order to justify an increase in tooling spend, whereas US companies are more comfortable with investing first and measuring impact later. At present, the impact of these tools is hard to quantify.</p><p><strong>A niche approach is that of AI teams educating devs to use cheaper models. </strong>Some European companies go as far as offering education to new joiners on using cheaper models. From an AI Enablement Lead at a 1,000+ person, digital transformation company:</p><blockquote><p>&#8220;Within our organisation, we&#8217;ve had incidents where our Claude users have overshot their limits. We&#8217;re now attempting to educate devs in knowing the difference between different models (knowing when to use Claude Sonnet versus Claude Opus).&#8221;</p></blockquote><h3>Cost trajectory worries</h3><p>The cost trajectory of AI tools is generally considered unsustainable in our survey.<strong> </strong>Devs using the tools heavily tend to hit usage limits, and their employers then have to pay more. At places with API-based pricing, usage is increasing. Those in leadership positions who are responsible for budgets are generally concerned about the direction of costs.</p><p><strong>Subsidies are keeping things at bay &#8211; for now. </strong>A common enough pattern in our survey is of heavily-subsidized enterprise plans that come with vendor lock-in. Several responses raise concerns about what will happen when the subsidies run dry. Experienced engineering leaders recall that cloud providers also played the same game of subsidizing for a few years, then raising prices when a customer was fully &#8220;locked in.&#8221;</p><p><strong>The AI hype cycle is dampening awkward conversations about budgets at some places. </strong>A principal engineer at a Fintech tells us:</p><blockquote><p>&#8220;The AI hype has created a special, generous budget for AI tools, and there&#8217;s no effective budget &#8211; yet!&#8221;</p></blockquote><p><strong>But some finance teams are getting grumpy. </strong>A CTO at a sports-tech company says:</p><blockquote><p>&#8220;It&#8217;s hard to keep our CFO supportive about investing in these tools because the productivity benefits have proven difficult to conclusively prove. The point that resonated the most was the loss of value when people hit daily limits: having to stop work immediately! Surprisingly, our CFO is still pushing back, despite having experience of getting a lot of value through their own AI usage with their spreadsheets.&#8221;</p></blockquote><p><strong>Most survey respondents think the price of AI tools will have to rise</strong>. If that happens, it would cause problems at several companies &#8211; particularly those in Europe:</p><blockquote><p>&#8220;I cannot see how the spend on AI tools is fiscally sustainable in its current form; Max 100 with Claude Code is $100 a month. A single small task powered by Kimi K2.5 using OpenCode is $5, mostly in input cost. If we assume that the third party inference providers are doing so at a sustainable price, the much more expensive Opus model cannot be sustainable, never mind profitable at these plan costs.&#8221; &#8212;<em> Founder at a seed-stage company, Europe.</em></p><p>&#8220;From the economic perspective, at some point, these companies will need more funding or profit, I&#8217;m curious how much it costs them to have a proper agent, and still become profitable. It feels slow when you run out of credits when working on repetitive tasks.&#8221; &#8212; <em>Principal Software Engineer at a seed-stage company, Europe</em></p></blockquote><h2>2. Usage limits</h2><p>Another major trend in our survey results is the topic of usage limits:</p><ul><li><p><strong>Hitting limits: ~30%</strong> of respondents. Running out of tokens or hitting reset limits is frustrating and disruptive, especially when you&#8217;re working on a task or are in a flow state. The majority of respondents who complain about hitting limits are on cheaper plans (typically $20/month.) But this issue is also mentioned about higher subscription levels.</p></li><li><p><strong>Under the limit: ~20%</strong> of respondents. Avoiding usage caps generally correlates with being on more expensive plans with higher limits, or in roles with enough non-coding work for it not to matter, or when devs do enough work &#8220;manually&#8221; for AI usage to not be an issue.</p></li></ul><h3>Why users of AI tools hit limits</h3><p>Common reasons cited in the survey:</p><p><strong>Being a new AI user or a power user. </strong>These are two distinct groups, but an engineering manager at a mid-sized company in Canada says that each one similarly blows through token limits for different reasons:</p><blockquote><p>&#8220;We&#8217;re mindful of trying to manage costs by setting AI spend limits across the org. We have two subsets of users at odds with each other:</p><ol><li><p>Individuals who are still learning and blow through their credits at an inordinate rate, forcing us to keep limits low.</p></li><li><p>Power users who hit the limit through regular use and apply pressure to raise the limit.</p></li></ol><p>It&#8217;s a tough balance.&#8221;</p></blockquote><p><strong>Using Opus for all work. </strong>A few engineers mention being careful about how they use Opus because it previously ate up their token budgets. Here&#8217;s a software engineer at a mid-sized company in Europe:</p><blockquote><p>&#8220;I made the mistake of using Opus in the past and burning through budgets quickly. Now, my routine is to start in &#8216;plan&#8217; mode with Opus. I then paste the acceptance criteria and description of the issue and let the plan mode figure it out. I then switch to Composer or Sonnet and have the agent take over from there.&#8221;</p></blockquote><p><strong>Mistakes that eat up tokens are easy to make. </strong>These include starting on work or a problem from the wrong end, using AI directly for a task rather than opting for a simple script, trying some new tool or technique that ends up consuming tokens (OpenClaw and Ralph Loops are cited), and others.</p><h3>What happens when the limit is hit?</h3><p>Hitting the limit with an AI tool is inconvenient and happens to many developers, who take a variety of next steps:</p><p><strong>Switch the model or tool. </strong>Around a quarter of respondents who hit limits mentioned switching. From a software engineer at working at Atlassian:</p><blockquote><p>&#8220;In my company, for Cursor and Windsurf we have monthly limits. Our internal coding tool (called codelassian) also has daily prompt and hourly token limits. When I hit a limit in one tool, I switch to the other.&#8221;</p></blockquote><p><strong>Upgrade to a pricier plan. </strong>When it&#8217;s an option, this is a no-brainer at most places, especially as the alternative would be devs twiddling their thumbs waiting for the limit to be reset. A senior engineering manager at a mid-sized company says:</p><blockquote><p>&#8220;In my team, we are regularly hitting session limits with Claude. We upgraded some teammates to the Max 20x plan &#8211; and on this plan we have not been hitting limits, so far.&#8221;</p></blockquote><p><strong>Adopt API-based pricing. </strong>This is the easiest way to keep working without abandoning a task you&#8217;re knees-deep in. A senior engineer at a large company says:</p><blockquote><p>&#8220;The company provides both the Claude and Copilot corporate offerings. When the limits are reached, I tend to use API keys that my teammates give me.&#8221;</p></blockquote><h2>3. Impact on &#8220;builders&#8221;</h2><p>We identified three different types of professional in the survey:</p><ul><li><p><strong>Builders</strong>: those who care about quality, good architecture, following good coding practices, and who talk about the craft of software engineering, etc.</p></li><li><p><strong>Shippers</strong>: those who primarily focus on outcomes for a product, features, testing, and experimenting with users. A fair number of leaders, managers, and engineers who were more hands-off with coding before AI tools are in this category, as are product engineers.</p></li><li><p><strong>Coasters</strong>: engineers who are not considered particularly good or great engineers, but they get the work done. They often do this without much taste or concern for quality, and seem to be mostly coasting along and doing what they&#8217;re told.</p></li></ul><p>The overall consensus in our survey results is that AI will amplify and multiply tendencies and patterns that existed before, and the impact of the tools varies accordingly among users. Let&#8217;s start with the impact we&#8217;ve observed upon builders in the responses:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ekej!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174b9ab2-ef0b-4a40-ba4a-0de330620ff0_1324x758.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ekej!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174b9ab2-ef0b-4a40-ba4a-0de330620ff0_1324x758.png 424w, https://substackcdn.com/image/fetch/$s_!Ekej!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174b9ab2-ef0b-4a40-ba4a-0de330620ff0_1324x758.png 848w, https://substackcdn.com/image/fetch/$s_!Ekej!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174b9ab2-ef0b-4a40-ba4a-0de330620ff0_1324x758.png 1272w, https://substackcdn.com/image/fetch/$s_!Ekej!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174b9ab2-ef0b-4a40-ba4a-0de330620ff0_1324x758.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ekej!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174b9ab2-ef0b-4a40-ba4a-0de330620ff0_1324x758.png" width="1324" height="758" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/174b9ab2-ef0b-4a40-ba4a-0de330620ff0_1324x758.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:758,&quot;width&quot;:1324,&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_!Ekej!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174b9ab2-ef0b-4a40-ba4a-0de330620ff0_1324x758.png 424w, https://substackcdn.com/image/fetch/$s_!Ekej!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174b9ab2-ef0b-4a40-ba4a-0de330620ff0_1324x758.png 848w, https://substackcdn.com/image/fetch/$s_!Ekej!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174b9ab2-ef0b-4a40-ba4a-0de330620ff0_1324x758.png 1272w, https://substackcdn.com/image/fetch/$s_!Ekej!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174b9ab2-ef0b-4a40-ba4a-0de330620ff0_1324x758.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>The good and bad of AI tools, as shared by respondents in the Builder archetype</em></figcaption></figure></div><p>Builders say they get value from AI tools in the following areas:</p><p><strong>Larger code changes. </strong>Builders generally find AI helpful for work like:</p><ul><li><p>Refactoring</p></li><li><p>Migrations</p></li><li><p>Improving test coverage</p></li><li><p>Carrying out large codebase changes</p></li></ul><p>All these are changes that are laborious, but not very challenging technically. They also require experience in knowing what you want to do and how to do it.</p><p><strong>Accomplishing &#8220;quality of life&#8221; tasks. </strong>Builders mention that with AI tools, they get to fix and improve things like nagging bugs that otherwise wouldn&#8217;t be &#8220;worth it&#8221; in time invested, but the barrier to entry is lower with AI.</p><p>A good example of this is in last week&#8217;s podcast <a href="https://newsletter.pragmaticengineer.com/p/dhhs-new-way-of-writing-code">with David Heinemeier Hansson (DHH)</a>, the creator of Ruby on Rails, in which he revealed how one of their engineers optimized P1 &#8211; the fastest 1% of web requests:</p><blockquote><p>&#8220;One of our most agent accelerated people asked: &#8220;What about P1? What about the floor? Can we fix the floor?&#8221; He found that the floor [of request speed] was 4 milliseconds.</p><p>Well, 4 milliseconds can add up if you have a bunch of fast requests. So, he just said: &#8220;We&#8217;re going to optimize P1. The fastest 1% of requests, we&#8217;re going to make them even faster.&#8221; He took it from 4 milliseconds to less than half a millisecond. He did this P1 project over a couple of days, like a side project.</p><p>He had an intuition that there was something here. He let agents run with it. The work ended up being 12 pull requests, and about 2,500 lines of code changed.</p><p>This is exactly why the explosion of the pie suddenly lets us look at problems we would never have contemplated looking at before.&#8221;</p></blockquote><p><strong>Typing is no longer a bottleneck. </strong>Some builders report falling even more in love with coding with the help of AI and agents, since physically typing out code is no longer a bottleneck for them. They enjoy being able to prompt. From one &#8220;builder&#8221;:</p><blockquote><p>&#8220;For someone who loves to build &#8211; but also values code quality, performance, reliability, and security &#8211; I ship a lot more quality code faster, if for no other reason than because the AI can read and write 100x faster than me. I get to stay at the conceptual level of shipping a product, and I can dive into debugging with the agent as needed. But if the agent has a good handle on the situation I can give it as much of the tedious parts as I wish.&#8221;<em> &#8211; Staff Engineer, at a large tech company, US</em></p></blockquote><p>The negative sides of AI tools, as experienced by builders:</p><ul><li><p><strong>More AI slop. </strong>Builders seem to be the most overwhelmed and derailed by reviewing a lot more AI-generated code. They can get frustrated with low-quality code shipped by colleagues which could be categorized as &#8220;AI slop.&#8221;</p></li><li><p><strong>More debugging. </strong>AI-generated code introduces bugs and issues, and builders tend to spend the most time debugging and fixing those issues.</p></li><li><p><strong>Identity loss. </strong>Some builder-types report a sense of identity loss and even some grief. Much of this relates to no longer doing hands-on coding because they cannot justify it, since AI agents generate pretty decent code faster than someone can type it.</p></li></ul><h2>4. AI tools speed up &#8220;Shippers&#8221;</h2><p>The &#8220;shipper&#8221; archetype thrives when they get things to production quickly. This group is by far the most enthusiastic about AI tools in survey responses. They are also the ones who praise &#8211; or hype up &#8211; the tools because of their personal experiences of shipping much faster with them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yBgU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66546d37-a053-4179-8750-3e7784309ac8_1278x742.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yBgU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66546d37-a053-4179-8750-3e7784309ac8_1278x742.png 424w, https://substackcdn.com/image/fetch/$s_!yBgU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66546d37-a053-4179-8750-3e7784309ac8_1278x742.png 848w, https://substackcdn.com/image/fetch/$s_!yBgU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66546d37-a053-4179-8750-3e7784309ac8_1278x742.png 1272w, https://substackcdn.com/image/fetch/$s_!yBgU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66546d37-a053-4179-8750-3e7784309ac8_1278x742.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yBgU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66546d37-a053-4179-8750-3e7784309ac8_1278x742.png" width="1278" height="742" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/66546d37-a053-4179-8750-3e7784309ac8_1278x742.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:742,&quot;width&quot;:1278,&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_!yBgU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66546d37-a053-4179-8750-3e7784309ac8_1278x742.png 424w, https://substackcdn.com/image/fetch/$s_!yBgU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66546d37-a053-4179-8750-3e7784309ac8_1278x742.png 848w, https://substackcdn.com/image/fetch/$s_!yBgU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66546d37-a053-4179-8750-3e7784309ac8_1278x742.png 1272w, https://substackcdn.com/image/fetch/$s_!yBgU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66546d37-a053-4179-8750-3e7784309ac8_1278x742.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>Good and bad things about AI tools for shippers</em></figcaption></figure></div><p>The biggest upsides mentioned by shippers:</p>
      <p>
          <a href="https://newsletter.pragmaticengineer.com/p/the-impact-of-ai-on-software-engineers-2026">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Cycles of disruption in the tech industry: with software pioneers Kent Beck & Martin Fowler]]></title><description><![CDATA[Parallels between technology shifts in the past decades and what we&#8217;re seeing with AI. Also: ways to avoid burnout when working with AI agents, TDD back in style, and more.]]></description><link>https://newsletter.pragmaticengineer.com/p/cycles-of-disruption-in-the-tech</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/cycles-of-disruption-in-the-tech</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 07 Apr 2026 16:27:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!6D40!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe801e0ca-cd70-4ed7-9d94-9ca1e44509a1_1594x1452.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The recent <a href="https://www.pragmaticsummit.com/">Pragmatic Summit</a> saw two legends of software development share a stage in what was one of the most popular sessions at our debut live event in San Francisco. In front of a packed audience, Martin Fowler and Kent Beck tackled a range of highly-relevant topics, with me hosting proceedings.</p><p>Martin and Kent go back decades, and Martin jokes that his career is &#8220;mostly about writing down Kent Beck&#8217;s ideas.&#8221; They first collaborated in the 1990s, and each has published influential books &#8211; &#8216;<em>Extreme Programming Explained&#8217; </em>and <em>&#8216;Test-Driven Development&#8217; </em>by Kent, and <em>&#8216;Refactoring&#8217; </em>and<em> &#8216;Patterns of Enterprise Application Architecture&#8217; </em>by Martin.</p><p>At the Pragmatic Summit, they each shared a wealth of hard-earned learnings and decades-worth of perspective, along with a healthy dose of skepticism. Needless to say, the conversation did not disappoint, and this article summarizes what we discussed in their own words. You can also <a href="https://youtu.be/CZs8J1ZD0CE">check out the full recording</a>.</p><p>We cover:</p><ol><li><p><strong>Technology shifts similar to AI. </strong>The arrival of the microprocessor, introduction of object-oriented languages, the Internet, and agile software development principles were all major changes &#8211; but one big difference was that it took time for these technologies to be adopted. Not so with AI.</p></li><li><p><strong>Agile and AI similarities. </strong>With Agile, company incentives were often misaligned, &#8220;snake oil&#8221; vendors were everywhere, and a &#8220;mid pack&#8221; of developers who resisted the change saw their career prospects hit. These trends look likely to repeat with AI.</p></li><li><p><strong>What&#8217;s happening inside companies</strong>. There&#8217;s some confusion &#8211; and even panic &#8211; at large companies, while AI tools don&#8217;t work nearly as well on large and complex codebases as on greenfield projects. Also, a &#8220;re-soloing&#8221; of software development is inbound.</p></li><li><p><strong>Avoiding burnout with AI agents</strong>. Set and maintain boundaries, and pay attention. Martin suggests to catch when you start producing &#8220;negative value&#8221;: that&#8217;s when to take a break.</p></li><li><p><strong>Unhealthy performance metrics.</strong> Companies are starting to measure things like frequency of pull requests &#8211; when they should be looking to quantify outcomes and results.</p></li><li><p><strong>Lower quality on purpose? </strong>It seems every business is optimizing for speed with AI, but quality can get dropped. Also: building features is more obvious with AI, than investing in &#8220;futures.&#8221;</p></li><li><p><strong>Test-Driven Development (TDD): tests no longer optional? </strong>Kent pioneered TDD, and today it&#8217;s more relevant than ever for working with AI.</p></li><li><p><strong>Thriving in an AI-native industry.</strong> Focus on working with agents to express your craft, try to get more enjoyment in <em>understanding</em> your domain, and take on more ambitious work.</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6D40!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe801e0ca-cd70-4ed7-9d94-9ca1e44509a1_1594x1452.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6D40!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe801e0ca-cd70-4ed7-9d94-9ca1e44509a1_1594x1452.png 424w, https://substackcdn.com/image/fetch/$s_!6D40!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe801e0ca-cd70-4ed7-9d94-9ca1e44509a1_1594x1452.png 848w, https://substackcdn.com/image/fetch/$s_!6D40!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe801e0ca-cd70-4ed7-9d94-9ca1e44509a1_1594x1452.png 1272w, https://substackcdn.com/image/fetch/$s_!6D40!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe801e0ca-cd70-4ed7-9d94-9ca1e44509a1_1594x1452.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6D40!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe801e0ca-cd70-4ed7-9d94-9ca1e44509a1_1594x1452.png" width="1456" height="1326" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e801e0ca-cd70-4ed7-9d94-9ca1e44509a1_1594x1452.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1326,&quot;width&quot;:1456,&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;: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_!6D40!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe801e0ca-cd70-4ed7-9d94-9ca1e44509a1_1594x1452.png 424w, https://substackcdn.com/image/fetch/$s_!6D40!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe801e0ca-cd70-4ed7-9d94-9ca1e44509a1_1594x1452.png 848w, https://substackcdn.com/image/fetch/$s_!6D40!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe801e0ca-cd70-4ed7-9d94-9ca1e44509a1_1594x1452.png 1272w, https://substackcdn.com/image/fetch/$s_!6D40!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe801e0ca-cd70-4ed7-9d94-9ca1e44509a1_1594x1452.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>Martin Fowler (center), Kent Beck (right), and me at The Pragmatic Summit</em></figcaption></figure></div><p><em>Before we start, a programming note: this week, there will be no The Pulse on Thursday &#8212; I&#8217;ll be attending <a href="https://www.ai.engineer/europe">AI Engineer Europe</a> in London on Thursday and Friday, including doing a fireside chat, and hosting one with Linear CTO Tuomas Artman.</em></p><h2>1. Technology shifts similar to AI</h2><p><strong>Do you recall a tech change as similarly promising and unpredictable as AI?</strong></p><p><strong>Martin: </strong>&#8220;Nothing has hit with the magnitude of AI. This is a whole size different from anything we&#8217;ve faced before. On a smaller scale, we were very much involved in the growth of object oriented languages, which scared a lot of people. It didn&#8217;t scare us so much because we were part of it.</p><p>Looking back, the internet had a huge impact on us all, and of course, Agile software development, too. Agile had a very big impact on a lot of organizations: you could tell by how hard they resisted it. We had to persuade people of the importance of these technological changes; yes, even the internet! It may sound surprising but there were people who didn&#8217;t think it was important.</p><p>The thing about AI is that today there is no argument about how important it is.&#8221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NR_1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819fa7b4-c3f3-4ab7-9a89-263e19893663_1600x1067.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NR_1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819fa7b4-c3f3-4ab7-9a89-263e19893663_1600x1067.png 424w, https://substackcdn.com/image/fetch/$s_!NR_1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819fa7b4-c3f3-4ab7-9a89-263e19893663_1600x1067.png 848w, https://substackcdn.com/image/fetch/$s_!NR_1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819fa7b4-c3f3-4ab7-9a89-263e19893663_1600x1067.png 1272w, https://substackcdn.com/image/fetch/$s_!NR_1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819fa7b4-c3f3-4ab7-9a89-263e19893663_1600x1067.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NR_1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819fa7b4-c3f3-4ab7-9a89-263e19893663_1600x1067.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/819fa7b4-c3f3-4ab7-9a89-263e19893663_1600x1067.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&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_!NR_1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819fa7b4-c3f3-4ab7-9a89-263e19893663_1600x1067.png 424w, https://substackcdn.com/image/fetch/$s_!NR_1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819fa7b4-c3f3-4ab7-9a89-263e19893663_1600x1067.png 848w, https://substackcdn.com/image/fetch/$s_!NR_1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819fa7b4-c3f3-4ab7-9a89-263e19893663_1600x1067.png 1272w, https://substackcdn.com/image/fetch/$s_!NR_1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819fa7b4-c3f3-4ab7-9a89-263e19893663_1600x1067.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>Martin Fowler (left) speaks at the Summit</em></figcaption></figure></div><p><strong>Kent: </strong>&#8220;The other analogy I have is the introduction of the microprocessor. Before that, computers were big boxes; you couldn&#8217;t move them around. If you wanted another computer, you&#8217;d mortgage your house for it. Having a computer was a <em>big</em> deal.</p><p>I was a kid in Silicon Valley with my dad as a programmer when the Intel 4004 hit the market [in 1971]. We went: &#8220;Wait a minute, that <em>chip</em> is a computer? Oh my goodness!&#8221; The possibilities of computing suddenly expanded thanks to it. If you could figure out how to write software on this chip and figure out how to design hardware around this thing, you could suddenly do things you hadn&#8217;t even imagined.</p><p>And so I think part of AI is this expansion of imagination. I&#8217;m writing projects that are ridiculously ambitious: I&#8217;m working on a persistent <a href="https://en.wikipedia.org/wiki/Smalltalk">Smalltalk</a>. I&#8217;m writing library-quality code for Rust.&#8221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Kug2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ad5f3-31fe-4454-b222-7b256dfde10d_1390x808.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Kug2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ad5f3-31fe-4454-b222-7b256dfde10d_1390x808.png 424w, https://substackcdn.com/image/fetch/$s_!Kug2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ad5f3-31fe-4454-b222-7b256dfde10d_1390x808.png 848w, https://substackcdn.com/image/fetch/$s_!Kug2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ad5f3-31fe-4454-b222-7b256dfde10d_1390x808.png 1272w, https://substackcdn.com/image/fetch/$s_!Kug2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ad5f3-31fe-4454-b222-7b256dfde10d_1390x808.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Kug2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ad5f3-31fe-4454-b222-7b256dfde10d_1390x808.png" width="1390" height="808" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/334ad5f3-31fe-4454-b222-7b256dfde10d_1390x808.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:808,&quot;width&quot;:1390,&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_!Kug2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ad5f3-31fe-4454-b222-7b256dfde10d_1390x808.png 424w, https://substackcdn.com/image/fetch/$s_!Kug2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ad5f3-31fe-4454-b222-7b256dfde10d_1390x808.png 848w, https://substackcdn.com/image/fetch/$s_!Kug2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ad5f3-31fe-4454-b222-7b256dfde10d_1390x808.png 1272w, https://substackcdn.com/image/fetch/$s_!Kug2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ad5f3-31fe-4454-b222-7b256dfde10d_1390x808.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>Kent predicts AI will expand software engineering like the Intel 4004 did. Source: <a href="https://www.intel.com/content/www/us/en/history/virtual-vault/articles/the-intel-4004.html">Intel</a></em></figcaption></figure></div><h3>Balancing skepticism and curiosity</h3><p><strong>What was the feeling in the industry during those revolutions, and the differences between professionals who thrived back then and those who didn&#8217;t?</strong></p><p><strong>Martin:</strong> &#8220;There was a mix of people chasing the hype and those saying, &#8220;this new thing is nothing special.&#8221; I think you&#8217;ve always got to have that balance of skepticism and curiosity, and to be selective about it. I mean, I have been completely skeptical about some big changes: Blockchain was one I was extremely skeptical about.</p><p>My skepticism is well-rooted because I&#8217;ve seen so much &#8220;snake oil&#8221; over the years. In fact, my skepticism has to be absolute and total, which means I have to be skeptical about my skepticism! To be that skeptical also requires curiosity: you&#8217;ve got to be curious enough to say &#8220;how do I probe in order to detect signs of something useful?&#8221;</p><p>You also need to be aware that your early interactions may not actually be a <em>true</em> signal. When I started playing around with AI, it was with GitHub Copilot a year and a half ago. I was pretty unimpressed; it would give you something wonderful, but most of the time it gave you such garbage that you would just delete it right away. If that had been my only impression of AI, I would&#8217;ve immediately flipped the &#8220;<a href="https://en.wikipedia.org/wiki/Bozo_bit">bozo bit</a>&#8221; on it, like I did with blockchain.&#8221;</p><p><strong>Kent:</strong> &#8220;Here&#8217;s the thing, the capabilities of AI can change week to week. I&#8217;ll try something with Gemini one week and it fails miserably. Then Claude Code works pretty well, and then it doesn&#8217;t. And then I try Gemini for the same thing and it works, when it hadn&#8217;t worked last week!</p><p>People want an answer, but the answer&#8217;s always changing. In this environment, you can&#8217;t possibly have <em>the </em>answer. That&#8217;s the bad news, but the good news is that nobody else has the answer either. So, you&#8217;re just as smart as everybody else because we&#8217;re all equally ignorant.&#8221;</p><h2>2. Agile and AI similarities</h2><p><strong>In 2001, the &#8216;Agile Manifesto&#8217; came out, of which you were both co-authors. I think many companies are expecting the same thing with AI as Agile promised: better, faster, cheaper software. But how did Agile adoption really play out?</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!o3em!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4d78ab-2662-4ef7-b18f-a25317de5dd5_1600x1067.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o3em!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4d78ab-2662-4ef7-b18f-a25317de5dd5_1600x1067.png 424w, https://substackcdn.com/image/fetch/$s_!o3em!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4d78ab-2662-4ef7-b18f-a25317de5dd5_1600x1067.png 848w, https://substackcdn.com/image/fetch/$s_!o3em!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4d78ab-2662-4ef7-b18f-a25317de5dd5_1600x1067.png 1272w, https://substackcdn.com/image/fetch/$s_!o3em!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4d78ab-2662-4ef7-b18f-a25317de5dd5_1600x1067.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o3em!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4d78ab-2662-4ef7-b18f-a25317de5dd5_1600x1067.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe4d78ab-2662-4ef7-b18f-a25317de5dd5_1600x1067.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&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_!o3em!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4d78ab-2662-4ef7-b18f-a25317de5dd5_1600x1067.png 424w, https://substackcdn.com/image/fetch/$s_!o3em!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4d78ab-2662-4ef7-b18f-a25317de5dd5_1600x1067.png 848w, https://substackcdn.com/image/fetch/$s_!o3em!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4d78ab-2662-4ef7-b18f-a25317de5dd5_1600x1067.png 1272w, https://substackcdn.com/image/fetch/$s_!o3em!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe4d78ab-2662-4ef7-b18f-a25317de5dd5_1600x1067.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>Full house: The conversation with Martin (left) and Kent (right) drew a large audience</em></figcaption></figure></div><p><strong>Kent:</strong> &#8220;It turns out people don&#8217;t want faster, cheaper, better! Inside some companies, the incentives are misaligned with actually achieving that. And so as geeks trying to achieve these improvements and saying: &#8220;it&#8217;s 40% better, 12% cheaper and less fattening,&#8221; people will punish you if that doesn&#8217;t align with <em>their</em> incentives inside organizations.</p><p>In the ideal organization, everybody would care about the same things, but that&#8217;s just not the way it works! So, if AI is coming along to promise the same things, we&#8217;re going to see the same reaction as before.&#8221;</p><p><strong>Martin:</strong> &#8220;An obvious difference is the sheer magnitude and speed there is with AI. Also, I think there will be a big difference between people who use it well and people who use it badly. The trick is figuring out how to use it well and putting the effort in to learn. There will be a big distinction between those two groups.</p><p>But I suspect there will still be some similarities with Agile. The core notions behind Agile and extreme programming are solid and good, but a huge snake-oil industry appeared around it &#8211; the &#8220;Agile industrial complex&#8221;, as I refer to it. This is also happening with AI right now, and it&#8217;s often hard to see the difference between snake oil and the real stuff.&#8221;</p><h3>AI as an amplifier</h3><p><strong>Kent:</strong> &#8220;AI is an amplifier. If you&#8217;re young and learning quickly, AI can amplify your learning. I personally think this is the golden age of the junior programmer. I get people coming to me all the time saying things like &#8220;my son started his second year in CS and wants to go into something more commercial like art history.&#8221; And I&#8217;d say, &#8220;this is like if you&#8217;re a carpenter and they just introduced the circular saw and you think, &#8216;oh, well, carpentry is over. Anybody can build a house now.&#8217; Well, no! Now, you have more powerful tools. You have less of the crummy work to do.</p><p>I think that young people are going to learn faster, and experienced folks who are working effectively are going to work quicker and more effectively.&#8221;</p><h3>Developers stuck in the middle</h3><p><strong>Kent: </strong>My concern is that there&#8217;s a &#8220;middle&#8221; of people who got into programming as a way to make money. If we look back at the Dotcom crash, there was a &#8220;mid pack&#8221; of such people who ended up going into real estate, more or less. But today, I don&#8217;t know where that &#8220;middle&#8221; will go, and it&#8217;s also much bigger now than 25 years ago.&#8221;</p><p><strong>Martin:</strong> &#8220;But that middle has also been &#8220;flushed out&#8221; to some degree by retrenchment in the software industry at the <a href="https://newsletter.pragmaticengineer.com/p/zirp">end of the zero interest rate period</a>. So, that&#8217;s an interesting difference because we&#8217;ve had these things occurring at once: the AI boom, and the economic headwinds of the past 2-3 years.</p><p>This is an interesting mix that wasn&#8217;t present in the &#8216;90s with the Dotcom Boom. Back then, it was pretty much <em>all</em> a solid boom.&#8221;</p><h3>Return of &#8220;let&#8217;s get rid of programmers!&#8221;</h3><p><strong>Kent: </strong>&#8220;Another interesting confluence of factors is the periodic, &#8220;we can get rid of all the programmers, woo-hoo&#8221; trend, which started with Cobol in the 1970s. With Cobol, business analysts were supposedly going to be able to write the programs, and the logic was that we wouldn&#8217;t need programmers anymore. That comes back repeatedly.</p><p>Agile, however, was definitely <em>not</em> a &#8220;let&#8217;s get rid of programmers&#8221; trend. With Agile, we wanted programmers to be more <em>effective</em> in their jobs. And since we started it, and were programmers, we were able to push that agenda pretty effectively.</p><p>However, today the &#8220;get rid of programmers&#8221; trend is repeating. As programmers, it behooves us to think about why they keep wanting to get rid of us. Some of that&#8217;s about us as programmers, and some of it not. Still, we should think about why people periodically want to axe us. In the end, this trend amps up the fear factor that everybody&#8217;s experiencing.&#8221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fZXk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c75e55a-42f8-42be-bac8-5af9c6d7ab19_1600x1067.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fZXk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c75e55a-42f8-42be-bac8-5af9c6d7ab19_1600x1067.png 424w, https://substackcdn.com/image/fetch/$s_!fZXk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c75e55a-42f8-42be-bac8-5af9c6d7ab19_1600x1067.png 848w, https://substackcdn.com/image/fetch/$s_!fZXk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c75e55a-42f8-42be-bac8-5af9c6d7ab19_1600x1067.png 1272w, https://substackcdn.com/image/fetch/$s_!fZXk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c75e55a-42f8-42be-bac8-5af9c6d7ab19_1600x1067.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fZXk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c75e55a-42f8-42be-bac8-5af9c6d7ab19_1600x1067.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4c75e55a-42f8-42be-bac8-5af9c6d7ab19_1600x1067.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&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_!fZXk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c75e55a-42f8-42be-bac8-5af9c6d7ab19_1600x1067.png 424w, https://substackcdn.com/image/fetch/$s_!fZXk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c75e55a-42f8-42be-bac8-5af9c6d7ab19_1600x1067.png 848w, https://substackcdn.com/image/fetch/$s_!fZXk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c75e55a-42f8-42be-bac8-5af9c6d7ab19_1600x1067.png 1272w, https://substackcdn.com/image/fetch/$s_!fZXk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c75e55a-42f8-42be-bac8-5af9c6d7ab19_1600x1067.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>In the middle of the discussion</em></figcaption></figure></div><h3>&#8220;Re-soloing&#8221; of programming</h3><p><strong>Kent:</strong> &#8220;A big trend is the &#8220;re-soloing&#8221; [reduced in-person collaboration] of programming.</p><p>A big part of extreme programming (XP) was creating a safe social environment for basically antisocial people.<em> </em>On an XP team, people are talking to each other for hours a day, and are happy to do so because it&#8217;s set up to be a positive experience.</p><p>Now, I see programmers saying, &#8220;I&#8217;ve got six agents, so really I&#8217;m managing a team.&#8221; No, you&#8217;re not: you&#8217;re using six tools at once, which is fine, but it&#8217;s very different from having a conversation with somebody who sees things slightly differently, or has a different energy level from you on the day.</p><p>We used to have programmers in individual offices with doors, and you&#8217;d shut the door and slide the pizza underneath. That was easy to manage, but then along came this messy, social, complicated, chaotic process of software development, which just happened to produce really good results.</p><p>But now, instead of 50 people on my team, I can have five and they don&#8217;t have to talk to each other, and each can have 10 agents. Is that the same? No, it&#8217;s not.&#8221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NdVf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d1f960-88db-4779-bee7-6511138902c0_1600x1062.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NdVf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d1f960-88db-4779-bee7-6511138902c0_1600x1062.png 424w, https://substackcdn.com/image/fetch/$s_!NdVf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d1f960-88db-4779-bee7-6511138902c0_1600x1062.png 848w, https://substackcdn.com/image/fetch/$s_!NdVf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d1f960-88db-4779-bee7-6511138902c0_1600x1062.png 1272w, https://substackcdn.com/image/fetch/$s_!NdVf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d1f960-88db-4779-bee7-6511138902c0_1600x1062.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NdVf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d1f960-88db-4779-bee7-6511138902c0_1600x1062.png" width="1456" height="966" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/97d1f960-88db-4779-bee7-6511138902c0_1600x1062.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:966,&quot;width&quot;:1456,&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_!NdVf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d1f960-88db-4779-bee7-6511138902c0_1600x1062.png 424w, https://substackcdn.com/image/fetch/$s_!NdVf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d1f960-88db-4779-bee7-6511138902c0_1600x1062.png 848w, https://substackcdn.com/image/fetch/$s_!NdVf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d1f960-88db-4779-bee7-6511138902c0_1600x1062.png 1272w, https://substackcdn.com/image/fetch/$s_!NdVf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d1f960-88db-4779-bee7-6511138902c0_1600x1062.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>Swag: As well as the usual merch at the Summit, there were books by speakers, including Martin and Kent</em></figcaption></figure></div><h3>More effective two-pizza teams &amp; the future of pairing</h3><p><strong>Martin: </strong>&#8220;Are we seeing two-pizza teams [of 5-10 people] becoming one-pizza teams because agents don&#8217;t eat pizza, or do we see two-pizza teams staying and becoming much more effective and capable? My bet is on more effective two-pizza teams.</p><p>We&#8217;re beginning to see some interesting feedback in terms of pair programming. With pair programming, is it one human and the genie (AI) programming, or is it two humans and one genie? If it&#8217;s two of us, perhaps we can control the genie a bit better, and we also have interaction.</p><p>I&#8217;ll be very interested in reports of people trying to control genies in pairs, possibly even beyond pairs. There&#8217;s also the whole &#8216;mob programming&#8217; thing, and how that will go with genies. I don&#8217;t necessarily think that one person and many genies is the right answer.&#8221;</p><p><strong>Kent</strong>: &#8220;My experience of pairing with two humans, plus one or more genies, has been very positive. And the fact the AI is slow is really nice. Every time models come out and are faster, I&#8217;m like, &#8220;Oh, there&#8217;s less time to talk.&#8221; When the AI goes away for three minutes, we can talk about our philosophy of naming, or how we express conditionals, or about what we should be doing next. But if it pops back in 15 seconds, you don&#8217;t have time for that conversation.&#8221;</p><h2>4. Avoiding burnout with AI agents</h2><p><strong>Do you find yourself getting close to burnout, especially when spinning up multiple threads? Do you have strategies for managing the mental impact?</strong></p>
      <p>
          <a href="https://newsletter.pragmaticengineer.com/p/cycles-of-disruption-in-the-tech">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[What is inference engineering? Deepdive]]></title><description><![CDATA[Many engineers use inference daily, but inference engineering is a bit obscure &#8211; and an area rich with interesting challenges. Philip Kiely, author of the new book, &#8220;Inference Engineering,&#8221; explains]]></description><link>https://newsletter.pragmaticengineer.com/p/what-is-inference-engineering</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/what-is-inference-engineering</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 31 Mar 2026 17:01:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FctC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39fe534-3703-4096-acc3-fcc01d4d5d00_1600x1200.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Two years ago, we learned about <a href="https://blog.pragmaticengineer.com/how-does-chatgpt-work/">how LLMs work</a> at a high level from <a href="https://blog.pragmaticengineer.com/how-does-chatgpt-work/">the ChatGPT team</a>, and today, almost all software engineers use large language models (LLMs) in our day-to-day work. The most visible part of using an LLM is <strong>inference</strong>; when an existing model takes an input (prompt) and generates an output, one token at a time. So, with AI models and AI agents everywhere across the tech industry in 2026, that means so is inference.</p><p><strong>And now, inference engineering is becoming more widespread, too, as open LLM models grow more capable. </strong>This is because with closed models, inference engineering is done only by the AI engineers who build the model, whose number might add up to a few thousand globally. In contrast, with the open models which tech companies are adopting, it&#8217;s possible to tweak them to perform better at inference. For example, Cursor built its new Composer 2.0 model <a href="https://newsletter.pragmaticengineer.com/i/192229275/backlash-after-cursor-hides-that-composer-2-is-based-on-open-source-model">on top of</a> the open Kimi 2.5 model, and successfully used plenty of inference engineering approaches to make it even faster.</p><p>So, based on this industry-wide prevalence and the related need for superior technical performance, it&#8217;s worth understanding a bit about what inference engineering actually is, and some interesting approaches worth knowing about, as a software engineer.</p><p>For some answers, I turned to <a href="https://x.com/philipkiely">Philip Kiely</a>, a software engineer who has been working for four years at the inference startup, Baseten. With his hard-earned experience, Philip has written an excellent, in-depth book about precisely this topic, <em>&#8220;Inference Engineering.&#8221;</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FctC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39fe534-3703-4096-acc3-fcc01d4d5d00_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FctC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39fe534-3703-4096-acc3-fcc01d4d5d00_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!FctC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39fe534-3703-4096-acc3-fcc01d4d5d00_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!FctC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39fe534-3703-4096-acc3-fcc01d4d5d00_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!FctC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39fe534-3703-4096-acc3-fcc01d4d5d00_1600x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FctC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39fe534-3703-4096-acc3-fcc01d4d5d00_1600x1200.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f39fe534-3703-4096-acc3-fcc01d4d5d00_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!FctC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39fe534-3703-4096-acc3-fcc01d4d5d00_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!FctC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39fe534-3703-4096-acc3-fcc01d4d5d00_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!FctC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39fe534-3703-4096-acc3-fcc01d4d5d00_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!FctC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39fe534-3703-4096-acc3-fcc01d4d5d00_1600x1200.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>My personal copy of Inference Engineering</em></figcaption></figure></div><p>In today&#8217;s issue, we cover:</p><ol><li><p><strong>Setting the stage: why is inference so important? </strong>More capable, widespread, open models are driving demand for inference engineering.</p></li><li><p><strong>What is inference? </strong>As the phase that comes after training a model, the inference layer introduces new engineering challenges like batching, caching, and quantization.</p></li><li><p><strong>When is inference engineering needed?</strong> Investing in this area is typically worth it when your product and usage scales up, and there are product requirements which a current, off-the-shelf solution lacks.</p></li><li><p><strong>What hardware does inference use? </strong>Datacenter GPUs are the most common, while on-premises, air-gapped GPUs are also employed.</p></li><li><p><strong>What software does inference use? </strong>Commonly-used software includes NVIDIA&#8217;s CUDA and Dynamo, as well as hardware-agnostic projects like PyTorch, vLLM, and others, which are growing in popularity.</p></li><li><p><strong>What infrastructure does inference need? </strong>Autoscaling is a baseline requirement. Kubernetes is a popular choice for autoscaling inside a cluster, while multi-cloud inference might be necessary for high-scale use cases.</p></li><li><p><strong>Five approaches to make inference faster. </strong>Quantization (reducing the numerical precision of a model&#8217;s weights), speculative decoding (taking advantage of spare compute to generate &#8220;draft tokens&#8221;), caching, parallelism (tensor parallelism and expert parallelism) and disaggregation (separating the prefill and decode phases to run on separate workers, not the same GPU).</p></li></ol><p>This deepdive uses a few abbreviations and concepts that are everyday lingo for inference engineers, but maybe are not for those less versed in the domain:</p><ul><li><p><strong>CUDA: </strong>Compute Unified Device Architecture. NVIDIA&#8217;s proprietary API to program NVIDIA GPUs for high-performance computing, including LLM-related use cases.</p></li><li><p><strong>TTFT</strong>: time to first token. Think of this as the &#8220;time to process the prompt.&#8221; This metric determines the perceived responsiveness of models and GenAI systems.</p></li><li><p><strong>TPS</strong>: tokens per second. Akin to a model&#8217;s &#8220;typing speed.&#8221;</p></li><li><p><strong>ITL</strong>: intertoken latency. The time between generating one token and the next.</p></li><li><p><strong>KV cache</strong>: key-value cache. The cached results of the attention algorithm, reused between requests to speed up inference. <em>We cover more on KV cache in the <a href="https://newsletter.pragmaticengineer.com/i/141865286/challenge-1-kv-cache-and-gpu-ram">Scaling ChatGPT deepdive</a>.</em></p></li><li><p><strong>Prefill / decode: </strong>the two phases of inference. Prefill is when the model takes the full input and processes tokens, outputting the KV cache. Decode is the phase in which the model generates one token at a time.</p></li><li><p><strong>MoE</strong>: Mixture of Experts. An architecture that enables models to be pretrained with far less compute. <a href="https://huggingface.co/blog/moe#what-is-a-mixture-of-experts-moe">More details on this approach.</a></p></li></ul><p>Below is an introduction to inference adapted from Philip&#8217;s book, &#8220;<em>Inference Engineering,&#8221; which </em>is <a href="https://baseten.com/inference-engineering">free to download as an e-book</a>. Physical copies are currently sold out, but Philip is printing more as fast as possible.</p><p><em>My usual disclaimer: as with all my recommendations, I was not paid to mention this book, and no links in this article are affiliates. See my <a href="https://blog.pragmaticengineer.com/ethics-statement/">ethics statement</a> for more.</em></p><p><em>With that, it&#8217;s over to Philip:</em></p><h2>1. Setting the stage: why is inference so important?</h2><p>Inference is the most valuable category in the AI industry, but inference engineering, on the other hand, is still in its infancy. In their work, inference engineers work across the stack from CUDA to Kubernetes in pursuit of faster, less expensive, and more reliable serving of generative AI models in production.</p><p>When ChatGPT launched in late 2022, there were perhaps a few hundred inference engineers in the world, and they didn&#8217;t call themselves that. These specialists mostly worked at frontier labs like OpenAI, Midjourney, and Anthropic, or at big tech companies like Google and NVIDIA.</p><p>Back then, it looked like this might be the way of the AI industry: that training generative AI models would be so hard and expensive that only a handful of companies would develop closed models and thereby require inference engineering for production serving. In that alternate future, the rest of the world would be mere consumers of AI via APIs, renting intelligence a token at a time.</p><p>Three years later, it turns out that training generative AI models is indeed both hard and expensive &#8211; but it&#8217;s not so hard and expensive to be limited to a handful of players. Instead, a proliferation of open models &#8211; more than two million and counting on <a href="https://huggingface.co/">Hugging Face</a> (the &#8220;GitHub for AI&#8221;) &#8211; means that today every engineer can now deploy their own intelligence to power AI products.</p><p>Research labs around the world, from OpenAI and NVIDIA Nemotron in America, to Mistral AI and Black Forest Labs in Europe, to Alibaba Qwen, DeepSeek AI, Z AI, and Moonshot AI in China, regularly release open models of all modalities.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hir-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb80caa-61e3-4346-bafc-3ffda6aa18bf_1600x1305.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hir-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb80caa-61e3-4346-bafc-3ffda6aa18bf_1600x1305.png 424w, https://substackcdn.com/image/fetch/$s_!Hir-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb80caa-61e3-4346-bafc-3ffda6aa18bf_1600x1305.png 848w, https://substackcdn.com/image/fetch/$s_!Hir-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb80caa-61e3-4346-bafc-3ffda6aa18bf_1600x1305.png 1272w, https://substackcdn.com/image/fetch/$s_!Hir-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb80caa-61e3-4346-bafc-3ffda6aa18bf_1600x1305.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hir-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb80caa-61e3-4346-bafc-3ffda6aa18bf_1600x1305.png" width="1456" height="1188" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6fb80caa-61e3-4346-bafc-3ffda6aa18bf_1600x1305.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1188,&quot;width&quot;:1456,&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_!Hir-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb80caa-61e3-4346-bafc-3ffda6aa18bf_1600x1305.png 424w, https://substackcdn.com/image/fetch/$s_!Hir-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb80caa-61e3-4346-bafc-3ffda6aa18bf_1600x1305.png 848w, https://substackcdn.com/image/fetch/$s_!Hir-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb80caa-61e3-4346-bafc-3ffda6aa18bf_1600x1305.png 1272w, https://substackcdn.com/image/fetch/$s_!Hir-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb80caa-61e3-4346-bafc-3ffda6aa18bf_1600x1305.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">Well over two million open models on Hugging Face, 25 times more than five years ago</figcaption></figure></div><p>Despite closed models getting smarter and cheaper, the movement into open models is accelerating, which differ by the availability of their weights:</p><ul><li><p><strong>Closed model: </strong>A proprietary model whose weights are unavailable to the public, like GPT-5 and Claude Sonnet.</p></li><li><p><strong>Open model: </strong>A model whose weights are publicly available, like Llama or DeepSeek, and which is usually released under the MIT license, or a similar permissive license (some models restrict commercial use, so always double-check license terms).</p></li></ul><p>Before December 2024, there was a meaningful gap in intelligence between closed and open models, but when DeepSeek V3 and R1 were released, that gap disappeared. <em>Note from Gergely: we previously covered <a href="https://newsletter.pragmaticengineer.com/p/the-pulse-122-deepseek-rocks-the">how DeepSeek&#8217;s release rocked the AI industry.</a></em></p><p>Today, new closed models are matched by open models within months if not weeks, and occasionally, open models like Kimi K2 Thinking even exceed closed models&#8217; capabilities for brief periods.</p><p>Despite the fact that open models are constantly chasing closed models on benchmarks, they nonetheless change the equation for AI product builders. And as both types improve, closed and open models cross capability thresholds.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TyQk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0874a12e-2bf7-4ab8-80ce-19ba8db78283_1600x1096.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TyQk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0874a12e-2bf7-4ab8-80ce-19ba8db78283_1600x1096.png 424w, https://substackcdn.com/image/fetch/$s_!TyQk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0874a12e-2bf7-4ab8-80ce-19ba8db78283_1600x1096.png 848w, https://substackcdn.com/image/fetch/$s_!TyQk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0874a12e-2bf7-4ab8-80ce-19ba8db78283_1600x1096.png 1272w, https://substackcdn.com/image/fetch/$s_!TyQk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0874a12e-2bf7-4ab8-80ce-19ba8db78283_1600x1096.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TyQk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0874a12e-2bf7-4ab8-80ce-19ba8db78283_1600x1096.png" width="1456" height="997" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0874a12e-2bf7-4ab8-80ce-19ba8db78283_1600x1096.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:997,&quot;width&quot;:1456,&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_!TyQk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0874a12e-2bf7-4ab8-80ce-19ba8db78283_1600x1096.png 424w, https://substackcdn.com/image/fetch/$s_!TyQk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0874a12e-2bf7-4ab8-80ce-19ba8db78283_1600x1096.png 848w, https://substackcdn.com/image/fetch/$s_!TyQk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0874a12e-2bf7-4ab8-80ce-19ba8db78283_1600x1096.png 1272w, https://substackcdn.com/image/fetch/$s_!TyQk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0874a12e-2bf7-4ab8-80ce-19ba8db78283_1600x1096.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>Open and closed models improve rapidly, making new products possible</em></figcaption></figure></div><p>In 2022, it was impossible to build the kinds of AI-native products that define the industry today. But over time, closed models got smarter and new categories like customer service voice agents and AI-powered IDEs became possible. The early models were slow, expensive, and unreliable, but the capabilities were there and AI engineers began building companies around them.</p><p><strong>As open models crossed the same capability thresholds, these folks began using them to replace closed models.</strong> Many also began fine-tuning open models to cross capability thresholds faster, and even exceed closed model quality in their specific product and domain.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!k0BW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F776ec68f-41aa-401d-8f4f-8afb231ab590_1600x1096.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!k0BW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F776ec68f-41aa-401d-8f4f-8afb231ab590_1600x1096.png 424w, https://substackcdn.com/image/fetch/$s_!k0BW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F776ec68f-41aa-401d-8f4f-8afb231ab590_1600x1096.png 848w, https://substackcdn.com/image/fetch/$s_!k0BW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F776ec68f-41aa-401d-8f4f-8afb231ab590_1600x1096.png 1272w, https://substackcdn.com/image/fetch/$s_!k0BW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F776ec68f-41aa-401d-8f4f-8afb231ab590_1600x1096.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!k0BW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F776ec68f-41aa-401d-8f4f-8afb231ab590_1600x1096.png" width="1456" height="997" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/776ec68f-41aa-401d-8f4f-8afb231ab590_1600x1096.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:997,&quot;width&quot;:1456,&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_!k0BW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F776ec68f-41aa-401d-8f4f-8afb231ab590_1600x1096.png 424w, https://substackcdn.com/image/fetch/$s_!k0BW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F776ec68f-41aa-401d-8f4f-8afb231ab590_1600x1096.png 848w, https://substackcdn.com/image/fetch/$s_!k0BW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F776ec68f-41aa-401d-8f4f-8afb231ab590_1600x1096.png 1272w, https://substackcdn.com/image/fetch/$s_!k0BW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F776ec68f-41aa-401d-8f4f-8afb231ab590_1600x1096.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>Customizing open models retains control over latency, reliability, and economics</em></figcaption></figure></div><p>Switching to open models means the opportunity to use inference engineering to make the models powering AI products better in new ways:</p><ul><li><p><strong>Latency:</strong> Closed model APIs are built for throughput, but open models can be optimized for real-time applications.</p></li><li><p><strong>Availability: </strong>While APIs for GPT and Claude are stuck at two nines of uptime, it&#8217;s possible to achieve four nines or better with dedicated deployments of open models.</p></li><li><p><strong>Cost:</strong> Open models are often at least 80 percent less expensive at scale.</p></li></ul><p>So, whereas three years ago it looked like inference engineering was a niche field, the fact is that today, every company aiming to build truly differentiated and competitive AI products needs an inference strategy.</p><p>AI-native startups like Cursor, Clay, Gamma, and Mercor are redefining hypergrowth by building products that rely on open and in-house models. Leading digital native companies like Notion and Superhuman succeed by deeply integrating AI capabilities into their category-defining products.</p><p>Elsewhere, a new generation of blended research and engineering teams &#8211; World Labs, Writer, Mirage, and dozens more &#8211; are building businesses by training and productizing their own foundation models.</p><p>Adoption is even strong in enterprise and regulated industries, which historically were slow to adopt new technologies. Companies like OpenEvidence, Abridge, and Ambience are making generative AI ubiquitous in healthcare, while at the world&#8217;s largest companies, AI initiatives are moving past the pilot stage into massive user adoption. Market-wide demand for inference means that everyone from developers to executives has the opportunity to learn inference engineering and use it to advance their career and business.</p><p>I&#8217;ve been incredibly fortunate to have a front-row seat in the fastest-moving market in history over the last four years at Baseten, where we power mission-critical inference for the best AI products, including every company listed in the previous paragraphs.</p><p><strong>The good news is that you are early. </strong>There are still relatively few professionals working on inference, and newcomers can become experts quickly. Also, the potential and impact of inference is becoming ever clearer, but the domain is still in its infancy. That means there are enormous opportunities to solve novel, interesting, and deeply technical problems at all levels of the stack.</p><h2>2. What is inference?</h2><p>Inference is the second phase of a generative AI model&#8217;s lifecycle:</p><ul><li><p><strong>Training:</strong> The process of learning model weights from data.</p></li><li><p><strong>Inference:</strong> Serving generative AI models in production.</p></li></ul><p>During the past decade&#8217;s machine learning (ML) boom, hundreds of thousands of data scientists and ML engineers became familiar with the full lifecycle of training and inference for ML models.</p><p>Inference for classic ML models is relatively straightforward. In the early days of Baseten, we ran inference for models built with tools like XGBoost on lightweight CPUs with a simple software stack.</p><p>In contrast, inference for generative AI models is complex. You can&#8217;t simply take model weights, get some GPUs, and expect inference to be fast and reliable enough for large-scale production use. Doing inference well requires three layers:</p><ul><li><p><strong>Runtime:</strong> Optimizing the performance of a single model on a single GPU-backed instance.</p></li><li><p><strong>Infrastructure:</strong> Scaling across clusters, regions, and clouds without creating silos, while maintaining excellent uptime.</p></li><li><p><strong>Tooling:</strong> Providing engineers working on inference with the right level of abstraction to balance control with productivity.</p></li></ul><p>These three layers must work together to create a system that can handle mission-critical inference at scale.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Aqry!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5fc58-2204-4293-820e-c6b60467e165_1595x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Aqry!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5fc58-2204-4293-820e-c6b60467e165_1595x1600.png 424w, https://substackcdn.com/image/fetch/$s_!Aqry!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5fc58-2204-4293-820e-c6b60467e165_1595x1600.png 848w, https://substackcdn.com/image/fetch/$s_!Aqry!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5fc58-2204-4293-820e-c6b60467e165_1595x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!Aqry!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5fc58-2204-4293-820e-c6b60467e165_1595x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Aqry!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5fc58-2204-4293-820e-c6b60467e165_1595x1600.png" width="1456" height="1461" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cba5fc58-2204-4293-820e-c6b60467e165_1595x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1461,&quot;width&quot;:1456,&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_!Aqry!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5fc58-2204-4293-820e-c6b60467e165_1595x1600.png 424w, https://substackcdn.com/image/fetch/$s_!Aqry!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5fc58-2204-4293-820e-c6b60467e165_1595x1600.png 848w, https://substackcdn.com/image/fetch/$s_!Aqry!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5fc58-2204-4293-820e-c6b60467e165_1595x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!Aqry!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5fc58-2204-4293-820e-c6b60467e165_1595x1600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A complete inference stack includes runtime and infrastructure optimizations</figcaption></figure></div><p>The runtime layer is responsible for ensuring an individual model running on a GPU (or across several GPUs in a single instance) runs as performantly and efficiently as possible. This layer depends on a sophisticated software stack, from CUDA, to PyTorch, to inference engines like vLLM, SGLang, and TensorRT-LLM. Low-level optimization is important, with kernels like FlashAttention delivering significant performance gains.</p><p>The runtime layer relies on a number of model performance techniques that apply new research to the challenges of inference on generative AI models:</p><ul><li><p><strong>Batching:</strong> Run incoming requests in parallel, weaving them together on a token-by-token basis to increase throughput.</p></li><li><p><strong>Caching:</strong> Reuse the KV cache &#8211; the cached results of the attention algorithm &#8211; between requests that share prefixes.</p></li><li><p><strong>Quantization:</strong> Lower the precision of select pieces of the model to access more compute and reduce memory burden.</p></li><li><p><strong>Speculation:</strong> Generate and validate draft tokens to produce more than one token per forward pass during decode.</p></li><li><p><strong>Parallelism:</strong> Efficiently leverage more than one GPU to accelerate large models without introducing new bottlenecks.</p></li><li><p><strong>Disaggregation:</strong> Separate the two phases of LLM inference, prefill and decode, onto independently scaling workers.</p></li></ul><p>These model performance techniques are used for all modalities and not just LLMs, such as vision language models, embedding models, automatic speech recognition, speech synthesis, image generation, and video generation, which extend the capabilities of AI systems and require their own inference optimizations. But these runtime optimizations are not enough: no matter how performant a single instance of a model server is, it will eventually receive more traffic than it can handle. This is not a CUDA problem or a PyTorch problem, it&#8217;s a systems problem that needs to be solved at the infrastructure layer.</p><p>The nature of infrastructure problems changes at each level of scale. At first, the problems are around autoscaling: knowing when to add and remove replicas, and figuring out how to do so quickly.</p><p><strong>Past a certain scale &#8211; generally a few hundred GPUs &#8211; infrastructure problems are defined by capacity.</strong> To get access to enough GPUs, inference engineers begin spreading workloads across multiple regions and cloud providers. This quickly leads to silos, where models in one cluster may be starved for resources while other clusters have unused capacity. The final level of scale in infrastructure is a global system that treats all available resources as a single unified pool of compute.</p><p>Thoughtful multi-cloud infrastructure also improves reliability, protecting against downtime in any individual region or cloud provider. And for global applications, running inference near to end users improves end-to-end latency.</p><p>Once these runtime and infrastructure capabilities are built, they need to be presented at the appropriate level of abstraction. Inference providers like Baseten and internal teams building inference need to consider what tooling and developer experience to provide as the critical third layer in a complete inference platform.</p><p>Of course, developer experience is subjective. For inference, one extreme is the black box: give a platform model weights, and get back an API. At the other extreme is providing only basic constructs for compute, network, disk, and so forth.</p><p>The right developer experience is somewhere in the middle, where inference engineers have enough control to run mission-critical inference confidently, and enough abstraction to work productively.</p><p>This article &#8211; which is an excerpt of <em>Inference Engineering</em> &#8211; presents an overview of the technologies and techniques that power inference across all three layers of runtime, infrastructure, and tooling.</p><h2>3. When is inference engineering needed?</h2><p>Inference engineering adds speed and scale to AI products by optimizing production serving of generative models. Optimization means identifying the best solution from a range of options.</p><p>Before optimizing model performance and building robust infrastructure, you need to know what &#8220;best&#8221; means for your product; many performance improvements come from making tradeoffs in latency, throughput, and quality. In practice, optimization is often about finding the right balance, rather than maximizing a single factor.</p><p>For example, NFL players are big, fast, and strong. But they&#8217;re not as big as sumo wrestlers, fast as Olympic sprinters, or strong as champion powerlifters. Their bodies and skills are optimized to fulfill the specific demands of their position over the course of a full season.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BjhW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0e2b2-8865-4806-9c03-58289d752f05_1600x805.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BjhW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0e2b2-8865-4806-9c03-58289d752f05_1600x805.png 424w, https://substackcdn.com/image/fetch/$s_!BjhW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0e2b2-8865-4806-9c03-58289d752f05_1600x805.png 848w, https://substackcdn.com/image/fetch/$s_!BjhW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0e2b2-8865-4806-9c03-58289d752f05_1600x805.png 1272w, https://substackcdn.com/image/fetch/$s_!BjhW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0e2b2-8865-4806-9c03-58289d752f05_1600x805.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BjhW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0e2b2-8865-4806-9c03-58289d752f05_1600x805.png" width="1456" height="733" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5cd0e2b2-8865-4806-9c03-58289d752f05_1600x805.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:733,&quot;width&quot;:1456,&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_!BjhW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0e2b2-8865-4806-9c03-58289d752f05_1600x805.png 424w, https://substackcdn.com/image/fetch/$s_!BjhW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0e2b2-8865-4806-9c03-58289d752f05_1600x805.png 848w, https://substackcdn.com/image/fetch/$s_!BjhW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0e2b2-8865-4806-9c03-58289d752f05_1600x805.png 1272w, https://substackcdn.com/image/fetch/$s_!BjhW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0e2b2-8865-4806-9c03-58289d752f05_1600x805.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>Like elite athletes, inference services must be specialized for the demands of their workloads</em></figcaption></figure></div><p>Similarly, your inference system must be optimized to fulfill the specific demands of your model, product, and traffic. The more constraints you can introduce, the better the outcomes that can be achieved.</p><p>You should know:</p><ul><li><p><strong>Model requirements: </strong>Which model(s) do you need to run inference on?</p></li><li><p><strong>Application interface: </strong>How will inputs be delivered to the model, and how is the output expected to be formatted?</p></li><li><p><strong>Latency budget: </strong>How fast does your product need to respond to a user action, end-to-end?</p></li><li><p><strong>Unit economics: </strong>How much sense does it make to spend on a per-request, per-user, or per-month basis?</p></li><li><p><strong>Usage patterns: </strong>How many concurrent users are you serving, and is there any pattern to their usage (e.g., more activity during business hours)?</p></li></ul><p>Early in building an AI product, the answers to these questions may not be clear. At this point, it&#8217;s often better to use off-the-shelf APIs whenever possible, rather than investing in dedicated inference. But as a product scales, the requirements become clear and inference engineering becomes a worthwhile pursuit.</p><h2>4. What hardware does inference use?</h2><p>Inference engineering relies on accelerators: powerful hardware designed to load terabytes of data and perform trillions of operations per second.</p><p>The most common type of accelerator for inference is the GPU, and the market leader in GPUs for inference is NVIDIA. My book focuses on inference engineering for NVIDIA GPUs in the datacenter, and also covers other vendors of datacenter accelerators and local inference.</p><p>Across vendors, there are three types of GPUs on the market:</p><ul><li><p><strong>Datacenter GPUs: </strong>Racked servers with interconnected high-performance GPUs. Example: NVIDIA B200.</p></li><li><p><strong>Workstation GPUs: </strong>Individual desktop GPUs for professional workflows. Example: NVIDIA RTX Pro 6000.</p></li><li><p><strong>Personal computing GPUs: </strong>Individual desktop GPUs for everyday use. Example: NVIDIA GeForce RTX 5090.</p></li></ul><p>Inference at scale uses datacenter GPUs mounted on racks: refrigerator-sized chassis with standardized power, networking, and cooling.</p><p>Datacenter GPUs like the <a href="https://www.nvidia.com/en-us/data-center/dgx-b200/">NVIDIA B200</a> offer the highest individual performance, and more importantly, include high-bandwidth GPU-to-GPU interconnects, are installed in highly standardized configurations, and are available by the millions in datacenters worldwide.</p><p>I doubt there is a B200 GPU running under your desk, but if there is, please send me a picture! Instead, inference on datacenter GPUs runs in one of three modes:</p><ul><li><p><strong>Cloud: </strong>GPUs are rented in someone else&#8217;s datacenter, usually hyperscalers like AWS and GCP, or neoclouds like CoreWeave and Nebius.</p></li><li><p><strong>On-premises: </strong>GPUs are purchased and installed in a datacenter that you control directly.</p></li><li><p><strong>Air-gapped: </strong>GPUs are installed on-prem and you need to physically access the GPUs to run inference.</p></li></ul><p>Most inference engineers use cloud GPUs. Large enterprises and governments run on-prem and air-gapped deployments, but cloud-based GPUs offer the flexibility and access that fast-growing AI products need to scale.</p><p>Even with constraints, navigating the hardware landscape is complex. From variations between cloud providers, to NVIDIA&#8217;s personal naming conventions, there are many nuances in selecting the right accelerator.</p><h2>5. What software does inference use?</h2><p>NVIDIA&#8217;s market dominance in the inference space is in no small part due to the robust, mature software ecosystem around its hardware. Hardware iteration cycles are slow. Best-in-class hardware companies like Apple and NVIDIA release new architectures and generations at most annually, with two-year release cycles being more common. But software iteration is fast. Often, to run a newly released open model on day zero, you need to install a nightly build or other pre-release version of each software dependency just to get support for the new model.</p><p>Software&#8217;s fast iteration cycle and lower barrier to entry dramatically expands the landscape of inference engineering. There are countless companies building software at various levels of the inference stack, in contrast to hardware, which centers on NVIDIA and a few competitors.</p><p>For inference engineers, these are some of the key software players:</p><ul><li><p><strong>NVIDIA:</strong> Invests heavily in its own sometimes-proprietary software ecosystem, from CUDA up to Dynamo.</p></li><li><p><strong>Hugging Face:</strong> Maintains a model registry for all open models plus <a href="https://huggingface.co/docs/transformers/en/index">transformers</a> (models built on the <a href="https://en.wikipedia.org/wiki/Transformer_(deep_learning)">transformer architecture</a>), and <a href="https://huggingface.co/docs/diffusers/index">diffusers</a> (models built on the <a href="https://en.wikipedia.org/wiki/Diffusion_model">diffusion-based</a> generative ones).</p></li><li><p><strong>The Linux Foundation:</strong> Maintains hardware-agnostic projects like PyTorch and vLLM.</p></li><li><p><strong>LMSYS Org:</strong> Develops essential tools for inference and evaluation, most notably SGLang.</p></li></ul><p>There are thousands more companies, universities, and research institutions making essential open-source contributions to inference. Over time, technologies have been built at increasing levels of abstraction:</p><ul><li><p><strong>CUDA: </strong>Direct communication to the GPU for explicit control over computations and memory.</p></li><li><p><strong>Deep learning frameworks: </strong>Abstractions over CUDA for training, exporting, and running neural networks in Python.</p></li><li><p><strong>Inference engines: </strong>Highly configurable PyTorch-backed inference for common architectures.</p></li><li><p><strong>NVIDIA Dynamo: </strong>Sits on top of inference engines to power large-scale deployments.</p></li></ul><p>Most inference engineering today happens at the higher levels of abstraction, configuring and deploying inference engines and orchestrating inference across multiple GPUs. No matter which level of the stack you work at, it&#8217;s essential to have a strong mental model for the adjacent levels of abstraction to guide your work.</p><h2>6. What infrastructure does inference need?</h2><p>When you scale production traffic, your assumptions are rigorously tested. Everything from input and output sequence lengths, to traffic patterns, to what topic a user decides to chat about; they all impact your observed performance in production. And maintaining secure, robust infrastructure is an entirely different skillset from optimizing model inference on the GPU.</p><p>No matter how fast and efficiently a single instance can serve a model, the service will be overwhelmed if traffic gets high enough. It&#8217;s an infrastructure problem, not with PyTorch or CUDA, and it requires a different mindset and different technologies.</p><p>Scaling in production introduces new complexities about where and how to get GPUs, balance traffic across them, and prevent downtime. The goal of autoscaling is to ensure you always have enough resources to serve all incoming requests, while maintaining latency SLAs and without wasting money on idle GPUs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!k4ge!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58d466c2-fc03-4920-80ba-909b6d08a471_1600x939.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!k4ge!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58d466c2-fc03-4920-80ba-909b6d08a471_1600x939.png 424w, https://substackcdn.com/image/fetch/$s_!k4ge!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58d466c2-fc03-4920-80ba-909b6d08a471_1600x939.png 848w, https://substackcdn.com/image/fetch/$s_!k4ge!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58d466c2-fc03-4920-80ba-909b6d08a471_1600x939.png 1272w, https://substackcdn.com/image/fetch/$s_!k4ge!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58d466c2-fc03-4920-80ba-909b6d08a471_1600x939.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!k4ge!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58d466c2-fc03-4920-80ba-909b6d08a471_1600x939.png" width="1456" height="854" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/58d466c2-fc03-4920-80ba-909b6d08a471_1600x939.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:854,&quot;width&quot;:1456,&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_!k4ge!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58d466c2-fc03-4920-80ba-909b6d08a471_1600x939.png 424w, https://substackcdn.com/image/fetch/$s_!k4ge!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58d466c2-fc03-4920-80ba-909b6d08a471_1600x939.png 848w, https://substackcdn.com/image/fetch/$s_!k4ge!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58d466c2-fc03-4920-80ba-909b6d08a471_1600x939.png 1272w, https://substackcdn.com/image/fetch/$s_!k4ge!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58d466c2-fc03-4920-80ba-909b6d08a471_1600x939.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>Without autoscaling, inference systems waste resources during traffic lulls and miss SLAs during traffic spikes</em></figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5hww!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5223ec4d-8b1e-4eb4-86f2-364e026cf470_1600x939.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5hww!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5223ec4d-8b1e-4eb4-86f2-364e026cf470_1600x939.png 424w, https://substackcdn.com/image/fetch/$s_!5hww!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5223ec4d-8b1e-4eb4-86f2-364e026cf470_1600x939.png 848w, https://substackcdn.com/image/fetch/$s_!5hww!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5223ec4d-8b1e-4eb4-86f2-364e026cf470_1600x939.png 1272w, https://substackcdn.com/image/fetch/$s_!5hww!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5223ec4d-8b1e-4eb4-86f2-364e026cf470_1600x939.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5hww!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5223ec4d-8b1e-4eb4-86f2-364e026cf470_1600x939.png" width="1456" height="854" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5223ec4d-8b1e-4eb4-86f2-364e026cf470_1600x939.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:854,&quot;width&quot;:1456,&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_!5hww!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5223ec4d-8b1e-4eb4-86f2-364e026cf470_1600x939.png 424w, https://substackcdn.com/image/fetch/$s_!5hww!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5223ec4d-8b1e-4eb4-86f2-364e026cf470_1600x939.png 848w, https://substackcdn.com/image/fetch/$s_!5hww!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5223ec4d-8b1e-4eb4-86f2-364e026cf470_1600x939.png 1272w, https://substackcdn.com/image/fetch/$s_!5hww!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5223ec4d-8b1e-4eb4-86f2-364e026cf470_1600x939.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>A strong autoscaling system for inference matches resources to demand</em></figcaption></figure></div><p>Autoscaling systems use Kubernetes, an open-source container orchestration system, along with a cluster-level system for provisioning and deallocating compute. Kubernetes can run one or more replicas of a model container, each on its own instance. An instance includes the GPUs and other hardware resources that the container requires.</p><p>Unless your traffic is unusually consistent, there probably isn&#8217;t a specific number of replicas that perfectly matches your needs.</p><p>Autoscaling is the practice of dynamically adjusting the number of replicas allocated to a given model within a cluster. There are two ways to make autoscaling decisions:</p><ul><li><p><strong>Utilization:</strong> Scale up or down based on GPU utilization signals like memory usage or compute usage.</p></li><li><p><strong>Traffic:</strong> Scale up and down based on the number of requests being processed in the system.</p></li></ul><p>Utilization and traffic don&#8217;t always match. For example, in LLM prefill, a few requests with hundreds of thousands of uncached input tokens could cause much higher utilization than many small requests with high cache hit rates.</p><p>Traffic-based scaling decisions can be made proactively, while utilization is a lagging indicator. Use both in combination to keep system resources matched with demand.</p><p>When designing a traffic-based autoscaling system, you want to configure five factors:</p><ul><li><p><strong>Min replicas:</strong> What is the minimum number of replicas that stay running, regardless of traffic?</p></li><li><p><strong>Max replicas:</strong> What is the maximum number of replicas you can allocate when traffic is high?</p></li><li><p><strong>Autoscaling window:</strong> How long is the sliding timeframe used to measure traffic and make autoscaling decisions?</p></li><li><p><strong>Scale down delay:</strong> For how long after a scale-down is suggested do you wait, in case there&#8217;s another traffic spike?</p></li><li><p><strong>Concurrency target:</strong> How many requests can each replica handle at once?</p></li></ul><p>The exact configuration determines how well the autoscaling system achieves its goals of maintaining latency SLAs without wasting resources. For example, increasing the scale-down delay prevents premature scaledowns for spikey traffic, but could result in unnecessary spend after traffic has properly cooled down.</p><p>Autoscaling within a single cluster works up to a certain point, but high-volume deployments serving a global user base need thousands of GPUs distributed around the world.</p><p>It&#8217;s straightforward to build multi-cloud inference as a collection of siloed compute across different cloud providers. But in these setups, there&#8217;s no way to use inter-cloud compute fluidly, and moving workloads across clouds is a tedious, error-prone process.</p><p>True multi-cloud inference requires building a multi-region, multi-provider bin packing tool, which treats distinct pools of compute as fungible with each other. Like Kubernetes within a single cluster, multi-cloud capacity management must take a global view, enabling global scheduling.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hHbk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40620524-e497-4f72-9f40-c84605d4461f_1600x1007.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hHbk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40620524-e497-4f72-9f40-c84605d4461f_1600x1007.png 424w, https://substackcdn.com/image/fetch/$s_!hHbk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40620524-e497-4f72-9f40-c84605d4461f_1600x1007.png 848w, https://substackcdn.com/image/fetch/$s_!hHbk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40620524-e497-4f72-9f40-c84605d4461f_1600x1007.png 1272w, https://substackcdn.com/image/fetch/$s_!hHbk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40620524-e497-4f72-9f40-c84605d4461f_1600x1007.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hHbk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40620524-e497-4f72-9f40-c84605d4461f_1600x1007.png" width="1456" height="916" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/40620524-e497-4f72-9f40-c84605d4461f_1600x1007.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:916,&quot;width&quot;:1456,&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_!hHbk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40620524-e497-4f72-9f40-c84605d4461f_1600x1007.png 424w, https://substackcdn.com/image/fetch/$s_!hHbk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40620524-e497-4f72-9f40-c84605d4461f_1600x1007.png 848w, https://substackcdn.com/image/fetch/$s_!hHbk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40620524-e497-4f72-9f40-c84605d4461f_1600x1007.png 1272w, https://substackcdn.com/image/fetch/$s_!hHbk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40620524-e497-4f72-9f40-c84605d4461f_1600x1007.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>A multi-cloud approach extends the idea of control and workload planes to a multi-cluster, multi-region system</em></figcaption></figure></div><p>Running true multi-cloud inference unlocks:</p><ul><li><p><strong>Capacity:</strong> Pool capacity from multiple providers for greater, more flexible GPU access.</p></li><li><p><strong>Redundancy: </strong>Split inference across providers for resiliency against outages.</p></li><li><p><strong>Latency:</strong> Run inference close to end users to reduce network latency overhead.</p></li><li><p><strong>Compliance: </strong>Run inference in compliance with data sovereignty and other regulatory requirements.</p></li></ul><p>Scaling from one cluster in one cloud to many clusters in many clouds requires a new coordination layer. A multi-cloud architecture contains:</p><ul><li><p><strong>Control plane:</strong> Handles model deployment and global scaling decisions, receives real-time event streams.</p></li><li><p><strong>Workload planes:</strong> Handles direct inference traffic and in-cluster scaling decisions, reports utilization and demand.</p></li></ul><p>This separation of responsibilities ensures that individual workload planes can serve traffic independently. If something happens to the control plane or any given workload plane, other workloads should be unaffected.</p><h2>7. Five approaches to make inference faster</h2><p>One of the coolest things about working in inference engineering is that, unlike many industries where new academic research takes years or decades to be adopted, techniques from new papers are live in production within months or even weeks.</p><p>But there is a gap to bridge between research and production, and some of the most visible inference engineering work of all comes from doing so.</p><p>Real-world traffic defies constraints. But with volume, you can adapt systems over time to match the changing nature of usage. Tuning the parameters of inference engines, speculation algorithms, and model servers isn&#8217;t a one-time task. Instead, either through iterative deployments or dynamic runtime adjustments, you can continuously improve the performance of an inference system.</p><p>Finding the right combination of techniques and configurations takes patient experimentation. I remember an internal hackathon during which one of Baseten&#8217;s inference engineers worked on an autocomplete model for code, and ended up trying 77 different configurations via a handwritten script before finding a non-obvious solution that doubled TPS (tokens per second) for a customer&#8217;s model.</p><p>Sometimes, techniques are symbiotic or incompatible, which makes inference optimization even more complex. For example, quantizing the KV cache alleviates a bottleneck in disaggregation, but increasing batch sizing reduces the compute available for speculation. An inference engineer&#8217;s challenge is always to create a balanced set of optimizations that delivers more than the sum of its parts.</p><p>Let&#8217;s look into the key categories of applied research for inference acceleration: quantization, speculation, caching, parallelism, and disaggregation.</p><h3>Approach #1: Quantization</h3><p>Quantization means reducing the numerical precision of a model&#8217;s weights. It improves latency (both TTFT [time to first token] and TPS, increases system throughput, and opens up headroom for other optimizations like disaggregation, speculation, and prefix caching to be even more effective. But when it goes wrong, quantization can materially reduce a model&#8217;s output quality.</p><p>Models are trained with weights, activations, and other components represented in a certain native number format. Usually, this is <a href="https://en.wikipedia.org/wiki/Bfloat16_floating-point_format">BF16</a> or <a href="https://en.wikipedia.org/wiki/Half-precision_floating-point_format">FP16</a>, although 8-bit and 4-bit native precisions are becoming more popular for training.</p><p>Post-training quantization works by changing those model weights and other values from their native number format, to a lower-precision format. Cutting precision in half improves performance in both phases of inference:</p><ul><li><p><strong>Prefill: </strong>Compute-bound prefill now runs on lower-precision Tensor Cores with twice the FLOPS.</p></li><li><p><strong>Decode: </strong>Memory-bound decode now loads half as much data per value, effectively doubling memory bandwidth.</p></li></ul><p>Working with quantized data introduces overheads, so it&#8217;s not linearly twice as fast to go from 16 to 8 bits. In practice, quantization down a single level of precision generally offers 30%-50% better performance for LLMs. The catch with quantization is that it runs the risk of reducing a model&#8217;s output quality, and has the potential to introduce precision errors throughout the calculations that power inference.</p><p>Precision errors compound over time. Consider what happens when you square and cube different precisions of Pi:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VrYE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8988ece-35ae-4377-9551-ca6adc714317_902x308.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VrYE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8988ece-35ae-4377-9551-ca6adc714317_902x308.png 424w, https://substackcdn.com/image/fetch/$s_!VrYE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8988ece-35ae-4377-9551-ca6adc714317_902x308.png 848w, https://substackcdn.com/image/fetch/$s_!VrYE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8988ece-35ae-4377-9551-ca6adc714317_902x308.png 1272w, https://substackcdn.com/image/fetch/$s_!VrYE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8988ece-35ae-4377-9551-ca6adc714317_902x308.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VrYE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8988ece-35ae-4377-9551-ca6adc714317_902x308.png" width="902" height="308" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e8988ece-35ae-4377-9551-ca6adc714317_902x308.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:308,&quot;width&quot;:902,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:32978,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.pragmaticengineer.com/i/192753237?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8988ece-35ae-4377-9551-ca6adc714317_902x308.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VrYE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8988ece-35ae-4377-9551-ca6adc714317_902x308.png 424w, https://substackcdn.com/image/fetch/$s_!VrYE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8988ece-35ae-4377-9551-ca6adc714317_902x308.png 848w, https://substackcdn.com/image/fetch/$s_!VrYE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8988ece-35ae-4377-9551-ca6adc714317_902x308.png 1272w, https://substackcdn.com/image/fetch/$s_!VrYE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8988ece-35ae-4377-9551-ca6adc714317_902x308.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 of the work in quantization is in preventing precision errors and minimizing their impact on the final model output.</p><p>Sixteen-bit, 8-bit, and 4-bit precisions are the primary formats for inference. Number formats contain:</p><ul><li><p><strong>Precision:</strong> The number of bits used to express a single value in the format. For example, FP16 uses 16 bits.</p></li><li><p><strong>Type:</strong> Whether these bits are interpreted to represent an integer (non decimal) or a floating-point number (decimal).</p></li><li><p><strong>Scale factor:</strong> A multiplier used to map values from a low-precision format back to the higher-precision format.</p></li></ul><p>Combined, these attributes determine the two factors behind how well a number format represents the values used in inference:</p><ul><li><p><strong>Dynamic range:</strong> The difference between the lowest and highest value that can be represented in the format.</p></li><li><p><strong>Granularity:</strong> The number of parameters or other values that are quantized along a single scale factor.</p></li></ul><p>Dynamic range is essential to low-precision inference without quality loss. Sixteen bits can represent 65,536 distinct values, while 8 bits can only represent 256 different values. The dynamic range is the distribution of these values &#8211; the difference between the smallest and largest available value.</p><p>Dynamic range explains why floating-point formats are better than integer formats for inference. Floating-point formats have three properties:</p><ul><li><p><strong>Sign: </strong>A single bit that represents whether a number is positive or negative.</p></li><li><p><strong>Exponent: </strong>A set of bits that, taken together, represent an exponent factor.</p></li><li><p><strong>Mantissa: </strong>A set of bits that together represent the base value multiplied by two to the exponent.</p></li></ul><p>An FP8 number in an E4M3 data format means it has a 4-bit exponent and a 3-bit mantissa, with the remaining bit for the sign. Integer formats only have sign and value bits.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mHG6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689475aa-baa7-44f7-9ad9-8cb5d3dda6b6_1600x933.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mHG6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689475aa-baa7-44f7-9ad9-8cb5d3dda6b6_1600x933.png 424w, https://substackcdn.com/image/fetch/$s_!mHG6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689475aa-baa7-44f7-9ad9-8cb5d3dda6b6_1600x933.png 848w, https://substackcdn.com/image/fetch/$s_!mHG6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689475aa-baa7-44f7-9ad9-8cb5d3dda6b6_1600x933.png 1272w, https://substackcdn.com/image/fetch/$s_!mHG6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689475aa-baa7-44f7-9ad9-8cb5d3dda6b6_1600x933.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mHG6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689475aa-baa7-44f7-9ad9-8cb5d3dda6b6_1600x933.png" width="1456" height="849" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/689475aa-baa7-44f7-9ad9-8cb5d3dda6b6_1600x933.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:849,&quot;width&quot;:1456,&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_!mHG6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689475aa-baa7-44f7-9ad9-8cb5d3dda6b6_1600x933.png 424w, https://substackcdn.com/image/fetch/$s_!mHG6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689475aa-baa7-44f7-9ad9-8cb5d3dda6b6_1600x933.png 848w, https://substackcdn.com/image/fetch/$s_!mHG6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689475aa-baa7-44f7-9ad9-8cb5d3dda6b6_1600x933.png 1272w, https://substackcdn.com/image/fetch/$s_!mHG6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689475aa-baa7-44f7-9ad9-8cb5d3dda6b6_1600x933.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>Floating-point number formats have exponent and mantissa bits, along with the sign bit</em></figcaption></figure></div><p>The exponent in floating-point numbers gives it a higher dynamic range, meaning it can better express very large and very small numbers. This is important because outlier values are significant in inference, and floating-point number formats better represent outliers after quantization.</p><p>Within floating-point formats, there are multiple options at each precision, like FP4, MXFP4, and NVFP4. These formats differ in granularity, or in the number of values quantized by a single scale factor.</p><p>Quantization can be applied at three levels:</p><ul><li><p><strong>Tensor level: </strong>Calculate a single scale factor for the entire QKV tensor.</p></li><li><p><strong>Channel level: </strong>Calculate a different scale factor for each feature vector within the tensor.</p></li><li><p><strong>Block level: </strong>Within each feature vector, divide the vector into blocks of N values and calculate a scale factor for each block.</p></li></ul><p>More granular quantization has a lower chance of smoothing over outliers, which preserves quality. However, more granularity also introduces extra overhead for storing and applying scale factors.</p><p>The components of a model have varying sensitivities to quantization. Reducing the precision of more sensitive components runs a higher risk of quality degradation. From the least to most sensitive components:</p><ol><li><p><strong>Weights: </strong>the linear layers are least sensitive to quantization.</p></li><li><p><strong>Activations: </strong>The intermediate output of activation functions are only somewhat sensitive to quantization. They are rarely quantized as they are such a tiny fraction of the model&#8217;s weights.</p></li><li><p><strong>KV cache: </strong>The cached values from the attention calculation are moderately sensitive to quantization.</p></li><li><p><strong>Attention: </strong>The attention layers of a model are highly sensitive to quantization, especially equations like softmax.</p></li></ol><p>Within each component, you can get more selective about quantization.</p><p>Even in linear layers and activations &#8211; generally the least sensitive to quantization due to their size &#8211; early and late layers, like the input and output layers of the neural network, may be left in their original precision as these layers are more sensitive.</p><p>While quantizing weights and activations helps performance, KV cache quantization gives an additional boost to techniques like prefix caching and disaggregation. The KV cache is a valuable resource and quantizing it allows inference engines to store more of it in memory and read it more quickly.</p><p>However, the KV cache for each token is used by each subsequent token. This means precision errors introduced by quantization can compound from token to token. Compounding errors are exactly why attention layers are the riskiest to quantize: not only is attention very sensitive to dynamic range, but each attention calculation relies on the results of each previous attention calculation. Therefore, over a sequence of thousands of tokens, errors accumulate quickly.</p><p>All but the most aggressive quantization schemes run functions like softmax in their original precision.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!C71B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf0898f-e872-4167-8d6b-9e019982e65a_1453x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!C71B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf0898f-e872-4167-8d6b-9e019982e65a_1453x1600.png 424w, https://substackcdn.com/image/fetch/$s_!C71B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf0898f-e872-4167-8d6b-9e019982e65a_1453x1600.png 848w, https://substackcdn.com/image/fetch/$s_!C71B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf0898f-e872-4167-8d6b-9e019982e65a_1453x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!C71B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf0898f-e872-4167-8d6b-9e019982e65a_1453x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!C71B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf0898f-e872-4167-8d6b-9e019982e65a_1453x1600.png" width="1453" height="1600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bbf0898f-e872-4167-8d6b-9e019982e65a_1453x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:1453,&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_!C71B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf0898f-e872-4167-8d6b-9e019982e65a_1453x1600.png 424w, https://substackcdn.com/image/fetch/$s_!C71B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf0898f-e872-4167-8d6b-9e019982e65a_1453x1600.png 848w, https://substackcdn.com/image/fetch/$s_!C71B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf0898f-e872-4167-8d6b-9e019982e65a_1453x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!C71B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf0898f-e872-4167-8d6b-9e019982e65a_1453x1600.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>Quantization risk is low for weights and activations, moderate for KV cache, and high for attention</em></figcaption></figure></div><p>A moderate approach to low-precision inference uses a format like FP8 with high dynamic range &#8211; if possible, a microscaling format like MXFP8 &#8211; to carefully quantize select linear layers, activations, and often KV cache values. Even with these high dynamic range formats, components of the attention layer are rarely quantized.</p><h3>Approach #2: Speculative decoding</h3><p>The decode phase of LLM inference is an autoregressive process in which tokens are generated one at a time. The bottleneck on decode is memory bandwidth, with compute sitting idle at low-to-moderate batch sizes as weights are read from memory.</p><p>Speculative decoding takes advantage of that spare compute to try and generate multiple tokens per forward pass through the target model. If an inference engine could generate two, three, or even more tokens for each round-trip of weights through memory, it would generate far more tokens per second. Note, speculative decoding only improves TPS / ITL (inter-token latency), not TTFT (time to first token.)</p><p>There are multiple algorithms for speculative decoding and they share a common mechanism:</p><ol><li><p>The speculator generates one or more <strong>draft tokens</strong>.</p></li><li><p>The <strong>target model</strong> &#8211; or the underlying model that you&#8217;re trying to accelerate &#8211; performs <strong>validation</strong> on these tokens to check if they match what the model would generate.</p></li><li><p>The target model accepts any valid draft tokens and generates an additional token itself, completing the forward pass.</p></li></ol><p>This generates N+1 tokens per forward pass, or iteration through the decode loop, where N is the number of accepted draft tokens.</p><p>Generating draft tokens is not free, it takes both compute and memory. However, it is much faster for a target model to validate a draft token than to generate an original token. If you imagine a sudoku puzzle, solving it is hard, but checking if the solution is correct is very easy. For the target model, generating a token is like solving a sudoku, while validating a draft token is like checking a finished sudoku.</p><p>The performance uplift from any speculative decoding strategy depends on three factors:</p><ol><li><p><strong>Draft token cost: </strong>Time taken to generate a draft token.</p></li><li><p><strong>Draft sequence length: </strong>The number of draft tokens generated per forward pass.</p></li><li><p><strong>Token acceptance rate:</strong> The percentage of draft tokens accepted by the target model.</p></li></ol><p>Token acceptance rate is high early in the draft sequence, but draft tokens get less reliable deeper in the sequence.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yXtg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa828ac-64d7-41cb-9cf3-37a308efabfb_1182x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yXtg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa828ac-64d7-41cb-9cf3-37a308efabfb_1182x1600.png 424w, https://substackcdn.com/image/fetch/$s_!yXtg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa828ac-64d7-41cb-9cf3-37a308efabfb_1182x1600.png 848w, https://substackcdn.com/image/fetch/$s_!yXtg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa828ac-64d7-41cb-9cf3-37a308efabfb_1182x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!yXtg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa828ac-64d7-41cb-9cf3-37a308efabfb_1182x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yXtg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa828ac-64d7-41cb-9cf3-37a308efabfb_1182x1600.png" width="1182" height="1600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2aa828ac-64d7-41cb-9cf3-37a308efabfb_1182x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:1182,&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_!yXtg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa828ac-64d7-41cb-9cf3-37a308efabfb_1182x1600.png 424w, https://substackcdn.com/image/fetch/$s_!yXtg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa828ac-64d7-41cb-9cf3-37a308efabfb_1182x1600.png 848w, https://substackcdn.com/image/fetch/$s_!yXtg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa828ac-64d7-41cb-9cf3-37a308efabfb_1182x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!yXtg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa828ac-64d7-41cb-9cf3-37a308efabfb_1182x1600.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">Speculative decoding from draft token generation and validation to prefix acceptance with subsequent token generation</figcaption></figure></div><p><strong>Aim for short, high-percentage sequences</strong> because while generating and validating tokens is inexpensive relative to generating tokens in the original model, it still comes with meaningful overhead. Additionally, once a single draft token is rejected as wrong, all subsequent tokens in the sequence are also rejected.</p><p>Working with speculation is interesting because so many factors affect token acceptance rate. The big one is the temperature parameter &#8211; higher temperatures yield token distributions that are harder to predict, reducing the effectiveness of speculative decoding. But even factors as simple as subject matter can make a difference on acceptance rate if the draft model or additional decoder head used for speculation is better versed in, say, math than history.</p><p>Another limitation on speculative decoding is that it&#8217;s most useful at low batch sizes where there are spare compute cycles. At higher batch sizes, speculative decoding must be dynamically disabled as compute is too saturated to afford verification.</p><p>Each speculation algorithm navigates these tradeoffs differently, and careful implementation of the right algorithm for the situation can lead to major improvements in TPS.</p><h3>Approach #3: Caching</h3><p>During prefill, the inference engine builds a KV cache (a store of keys and values for each token) on the input sequence. It then updates the KV cache for each token during decode. As inference is autoregressive, the value for each new token depends on the value of every previous token in the sequence.</p><p>Every inference engine uses KV caching by default on a request-by-request basis. Without KV caching, LLM inference would be unbearably slow since each previous value in the entire sequence would need to be recalculated for each subsequent token.</p><p>However, engineers can get more utility from the KV cache by reusing it between requests rather than solely within each inference sequence.</p><p>Consider the following two prompts, each with four tokens on most tokenizers:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1jj0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa294de82-8f97-475a-baa2-fb0e9bb83329_1600x970.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1jj0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa294de82-8f97-475a-baa2-fb0e9bb83329_1600x970.png 424w, https://substackcdn.com/image/fetch/$s_!1jj0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa294de82-8f97-475a-baa2-fb0e9bb83329_1600x970.png 848w, https://substackcdn.com/image/fetch/$s_!1jj0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa294de82-8f97-475a-baa2-fb0e9bb83329_1600x970.png 1272w, https://substackcdn.com/image/fetch/$s_!1jj0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa294de82-8f97-475a-baa2-fb0e9bb83329_1600x970.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1jj0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa294de82-8f97-475a-baa2-fb0e9bb83329_1600x970.png" width="1456" height="883" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a294de82-8f97-475a-baa2-fb0e9bb83329_1600x970.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:883,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;: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_!1jj0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa294de82-8f97-475a-baa2-fb0e9bb83329_1600x970.png 424w, https://substackcdn.com/image/fetch/$s_!1jj0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa294de82-8f97-475a-baa2-fb0e9bb83329_1600x970.png 848w, https://substackcdn.com/image/fetch/$s_!1jj0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa294de82-8f97-475a-baa2-fb0e9bb83329_1600x970.png 1272w, https://substackcdn.com/image/fetch/$s_!1jj0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa294de82-8f97-475a-baa2-fb0e9bb83329_1600x970.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>A pair of four-token sequences with two-token matching prefixes</em></figcaption></figure></div><p>By default, the inference engine has to run prefill on all four tokens of each prompt. But the first tokens of each prompt &#8211; &#8220;Weather in&#8221; &#8211; form a shared prefix between the pair.</p><p>With prefix caching, you can reuse the KV cache from the first request to improve TTFT on the second request by skipping prefill on the first two tokens and reading in the existing KV cache instead.</p><p>When you see pay-per-token APIs charge less for &#8220;cache hit&#8221; input tokens than &#8220;cache miss&#8221; tokens, this is why: reusing cached tokens takes very little compute power and time. As an inference engineer, you can apply the same principle to reduce latency, improve throughput and therefore save money on your own deployments.</p><p>Saving two tokens won&#8217;t make a big impact on TTFT, but prefix caching can skip prefill on thousands of tokens in certain domains:</p><ul><li><p><strong>Complex system prompts: </strong>Agents, customer-facing chatbots, RAG scaffolds, and tool calls often feature long, complex system prompts on every call.</p></li><li><p><strong>Code completion: </strong>Code completion, code generation, and other coding functions require passing the same thousands of lines of code as shared context.</p></li><li><p><strong>Documents and retrieval: </strong>Document summarization, question answering, and retrieval all add repeated context ahead of user prompts.</p></li><li><p><strong>Multi-turn conversations: </strong>Ordinary conversations repeat back every message in a chat template, increasing the savings from prefix caching with every turn.</p></li></ul><p>Prefix caching works from the start of the input sequence until the first non-repeated token. The fourth token in the weather example, a question mark, is shared between the two input sequences. However, the prefix ends at the first non-repeated token, so the fourth token isn&#8217;t read from cache.</p><p>Since prefixes end at the first unique token, your context engineering determines TTFT savings. Consider a different approach to the same prompt:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ehf3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65f49c0-53a8-49cf-bade-4144a02a728b_1600x871.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ehf3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65f49c0-53a8-49cf-bade-4144a02a728b_1600x871.png 424w, https://substackcdn.com/image/fetch/$s_!ehf3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65f49c0-53a8-49cf-bade-4144a02a728b_1600x871.png 848w, https://substackcdn.com/image/fetch/$s_!ehf3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65f49c0-53a8-49cf-bade-4144a02a728b_1600x871.png 1272w, https://substackcdn.com/image/fetch/$s_!ehf3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65f49c0-53a8-49cf-bade-4144a02a728b_1600x871.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ehf3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65f49c0-53a8-49cf-bade-4144a02a728b_1600x871.png" width="1456" height="793" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b65f49c0-53a8-49cf-bade-4144a02a728b_1600x871.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:793,&quot;width&quot;:1456,&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_!ehf3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65f49c0-53a8-49cf-bade-4144a02a728b_1600x871.png 424w, https://substackcdn.com/image/fetch/$s_!ehf3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65f49c0-53a8-49cf-bade-4144a02a728b_1600x871.png 848w, https://substackcdn.com/image/fetch/$s_!ehf3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65f49c0-53a8-49cf-bade-4144a02a728b_1600x871.png 1272w, https://substackcdn.com/image/fetch/$s_!ehf3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65f49c0-53a8-49cf-bade-4144a02a728b_1600x871.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>A pair of four-token sequences with no prefix match. The first tokens are different, so it doesn&#8217;t matter that the next three are the same</em></figcaption></figure></div><p>Here, there is no savings from prefix caching, as the very first token differs between the two sequences, even though every subsequent token is the same. To take advantage of prefix caching, ensure that novel tokens are as late in your prompt as possible.</p><h3>Approach #4: Parallelism</h3><p>Tensor Parallelism (TP) should be your default strategy for multi-GPU model inference. It supports dense models like Llama 405B, and the MoE (mixture of experts) models that currently dominate the open model landscape.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hyIE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3fca43a-177d-483f-aaaa-09a77d7ded48_1600x635.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hyIE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3fca43a-177d-483f-aaaa-09a77d7ded48_1600x635.png 424w, https://substackcdn.com/image/fetch/$s_!hyIE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3fca43a-177d-483f-aaaa-09a77d7ded48_1600x635.png 848w, https://substackcdn.com/image/fetch/$s_!hyIE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3fca43a-177d-483f-aaaa-09a77d7ded48_1600x635.png 1272w, https://substackcdn.com/image/fetch/$s_!hyIE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3fca43a-177d-483f-aaaa-09a77d7ded48_1600x635.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hyIE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3fca43a-177d-483f-aaaa-09a77d7ded48_1600x635.png" width="1456" height="578" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b3fca43a-177d-483f-aaaa-09a77d7ded48_1600x635.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:578,&quot;width&quot;:1456,&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_!hyIE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3fca43a-177d-483f-aaaa-09a77d7ded48_1600x635.png 424w, https://substackcdn.com/image/fetch/$s_!hyIE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3fca43a-177d-483f-aaaa-09a77d7ded48_1600x635.png 848w, https://substackcdn.com/image/fetch/$s_!hyIE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3fca43a-177d-483f-aaaa-09a77d7ded48_1600x635.png 1272w, https://substackcdn.com/image/fetch/$s_!hyIE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3fca43a-177d-483f-aaaa-09a77d7ded48_1600x635.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>Tensor Parallelism splits weights across GPUs, effectively sharing VRAM resources to run large models fast</em></figcaption></figure></div><p>TP works by splitting apart each layer of the model (as opposed to Pipeline Parallelism, which keeps layers intact) and distributing the layer fragments across the allocated GPUs. For each layer, the expense of reading from weights&#8217; memory and executing matrix multiplication is shared across the GPUs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!upQ4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ba6857f-6b2f-43a1-8bb7-d6bd5956cfba_1600x635.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!upQ4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ba6857f-6b2f-43a1-8bb7-d6bd5956cfba_1600x635.png 424w, https://substackcdn.com/image/fetch/$s_!upQ4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ba6857f-6b2f-43a1-8bb7-d6bd5956cfba_1600x635.png 848w, https://substackcdn.com/image/fetch/$s_!upQ4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ba6857f-6b2f-43a1-8bb7-d6bd5956cfba_1600x635.png 1272w, https://substackcdn.com/image/fetch/$s_!upQ4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ba6857f-6b2f-43a1-8bb7-d6bd5956cfba_1600x635.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!upQ4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ba6857f-6b2f-43a1-8bb7-d6bd5956cfba_1600x635.png" width="1456" height="578" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7ba6857f-6b2f-43a1-8bb7-d6bd5956cfba_1600x635.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:578,&quot;width&quot;:1456,&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_!upQ4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ba6857f-6b2f-43a1-8bb7-d6bd5956cfba_1600x635.png 424w, https://substackcdn.com/image/fetch/$s_!upQ4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ba6857f-6b2f-43a1-8bb7-d6bd5956cfba_1600x635.png 848w, https://substackcdn.com/image/fetch/$s_!upQ4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ba6857f-6b2f-43a1-8bb7-d6bd5956cfba_1600x635.png 1272w, https://substackcdn.com/image/fetch/$s_!upQ4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ba6857f-6b2f-43a1-8bb7-d6bd5956cfba_1600x635.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>For an MoE models, each expert runs across multiple GPUs with Tensor Parallelism</em></figcaption></figure></div><p>However, the results of each layer need to be communicated in an all-reduce fashion (across all eight GPUs) into a single output before the next layer can be computed. In nodes with high-bandwidth intra-node NVLink and NVSwitch, this communication overhead is minimized.</p><p>Increasing Tensor Parallelism improves TPS on a per-user basis, assuming the model is large enough and the sequences are long enough that the communication overhead doesn&#8217;t outweigh the faster forward pass &#8211; which is the case for most frontier models.</p><p>Expert Parallelism (EP) neatly divides experts across GPUs, so that in a model with 128 experts served in EP8 across eight GPUs, each GPU hosts 16 full experts.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ky6k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4985f5-2ca5-46d3-82e1-dcd6b5d79e11_1600x635.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ky6k!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4985f5-2ca5-46d3-82e1-dcd6b5d79e11_1600x635.png 424w, https://substackcdn.com/image/fetch/$s_!ky6k!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4985f5-2ca5-46d3-82e1-dcd6b5d79e11_1600x635.png 848w, https://substackcdn.com/image/fetch/$s_!ky6k!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4985f5-2ca5-46d3-82e1-dcd6b5d79e11_1600x635.png 1272w, https://substackcdn.com/image/fetch/$s_!ky6k!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4985f5-2ca5-46d3-82e1-dcd6b5d79e11_1600x635.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ky6k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4985f5-2ca5-46d3-82e1-dcd6b5d79e11_1600x635.png" width="1456" height="578" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f4985f5-2ca5-46d3-82e1-dcd6b5d79e11_1600x635.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:578,&quot;width&quot;:1456,&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_!ky6k!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4985f5-2ca5-46d3-82e1-dcd6b5d79e11_1600x635.png 424w, https://substackcdn.com/image/fetch/$s_!ky6k!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4985f5-2ca5-46d3-82e1-dcd6b5d79e11_1600x635.png 848w, https://substackcdn.com/image/fetch/$s_!ky6k!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4985f5-2ca5-46d3-82e1-dcd6b5d79e11_1600x635.png 1272w, https://substackcdn.com/image/fetch/$s_!ky6k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4985f5-2ca5-46d3-82e1-dcd6b5d79e11_1600x635.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>EP runs each expert within a single GPU, with each GPU hosting multiple experts</em></figcaption></figure></div><p>EP improves total system throughput, making inference more scalable and less expensive. With individual experts processing tokens separately, each token takes just as long, but the system as a whole can handle more simultaneous tokens.</p><p>Many deployments use a mix of TP and EP to achieve both benefits.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Lp5z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29868580-3456-4211-bad8-74d93a75ac3e_1600x859.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Lp5z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29868580-3456-4211-bad8-74d93a75ac3e_1600x859.png 424w, https://substackcdn.com/image/fetch/$s_!Lp5z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29868580-3456-4211-bad8-74d93a75ac3e_1600x859.png 848w, https://substackcdn.com/image/fetch/$s_!Lp5z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29868580-3456-4211-bad8-74d93a75ac3e_1600x859.png 1272w, https://substackcdn.com/image/fetch/$s_!Lp5z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29868580-3456-4211-bad8-74d93a75ac3e_1600x859.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Lp5z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29868580-3456-4211-bad8-74d93a75ac3e_1600x859.png" width="1456" height="782" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/29868580-3456-4211-bad8-74d93a75ac3e_1600x859.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:782,&quot;width&quot;:1456,&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_!Lp5z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29868580-3456-4211-bad8-74d93a75ac3e_1600x859.png 424w, https://substackcdn.com/image/fetch/$s_!Lp5z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29868580-3456-4211-bad8-74d93a75ac3e_1600x859.png 848w, https://substackcdn.com/image/fetch/$s_!Lp5z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29868580-3456-4211-bad8-74d93a75ac3e_1600x859.png 1272w, https://substackcdn.com/image/fetch/$s_!Lp5z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29868580-3456-4211-bad8-74d93a75ac3e_1600x859.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>This deployment uses TP for attention and EP for the sparse MoE layer</em></figcaption></figure></div><p>EP requires less inter-GPU communication than Tensor Parallelism. The Expert Router, which determines which experts each token activates, is replicated onto each GPU as it is a relatively small component of the model. Inter-GPU communication is necessary for passing tokens from expert to expert, but unlike TP, it is not required to collect the results of each layer.</p><p>Thanks to this lower communication overhead, EP scales well to multi-node deployments and systems with limited interconnect bandwidth.</p><h3>Approach #5: Disaggregation</h3><p>Disaggregation combines three important ideas in inference engineering:</p><ol><li><p>Prefill is a compute-bound process that determines the time to first token (TTFT), while decode is a memory-bound process that determines TPS.</p></li><li><p>Specialization improves performance in everything from kernel selection to inference engine parameter tuning.</p></li><li><p>You can effectively parallelize model serving over multiple GPUs, or even multiple nodes, if you can avoid bottlenecks from lower-bandwidth interconnects.</p></li></ol><p>When prefill and decode run on the same node under heavy traffic, they have a higher chance of interfering with one another. Ideally, prefill uses more compute resources, while decode uses more memory, and the two can co-exist efficiently. However, with larger batches and more compute-intensive optimizations, prefill and decode start competing for resources.</p><p>Disaggregation, or disaggregated serving, is the idea of separating prefill and decode into separate engines on separate GPUs or nodes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lh6b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90917382-7d84-4ddf-806f-a514cd61d581_1600x1014.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lh6b!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90917382-7d84-4ddf-806f-a514cd61d581_1600x1014.png 424w, https://substackcdn.com/image/fetch/$s_!lh6b!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90917382-7d84-4ddf-806f-a514cd61d581_1600x1014.png 848w, https://substackcdn.com/image/fetch/$s_!lh6b!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90917382-7d84-4ddf-806f-a514cd61d581_1600x1014.png 1272w, https://substackcdn.com/image/fetch/$s_!lh6b!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90917382-7d84-4ddf-806f-a514cd61d581_1600x1014.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lh6b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90917382-7d84-4ddf-806f-a514cd61d581_1600x1014.png" width="1456" height="923" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/90917382-7d84-4ddf-806f-a514cd61d581_1600x1014.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:923,&quot;width&quot;:1456,&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_!lh6b!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90917382-7d84-4ddf-806f-a514cd61d581_1600x1014.png 424w, https://substackcdn.com/image/fetch/$s_!lh6b!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90917382-7d84-4ddf-806f-a514cd61d581_1600x1014.png 848w, https://substackcdn.com/image/fetch/$s_!lh6b!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90917382-7d84-4ddf-806f-a514cd61d581_1600x1014.png 1272w, https://substackcdn.com/image/fetch/$s_!lh6b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90917382-7d84-4ddf-806f-a514cd61d581_1600x1014.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">Disaggregation assigns prefill workers to generate the first token and decode workers to generate subsequent tokens</figcaption></figure></div><p>Disaggregation turns LLM inference into a three-step process:</p><ol><li><p>The prefill engine takes the input sequence and generates a KV cache while computing the first token.</p></li><li><p>The prefill engine sends the KV cache over the hardware interconnect to the decode engine.</p></li><li><p>The decode engine computes all subsequent tokens.</p></li></ol><p>In conditional disaggregation, the request is first sent to the decode engine, which checks if the input sequence is already cached, or is short enough to handle locally:</p><ol><li><p>If so, the decode engine handles prefill locally, skipping disaggregation.</p></li><li><p>If not, the decode engine transfers the request to the prefill engine for disaggregated serving.</p></li></ol><p>Conditional disaggregation is better for real-world traffic.</p><p>Another benefit of disaggregation is that with separate prefill and decode engines, you can optimize each engine individually and the system as a whole. For example, the compute-bound prefill engine requires a lower TP than the memory-bound decode engine.</p><h2>Takeaways</h2><p><em>This is Gergely again. </em>Thanks to <a href="https://x.com/philipkiely">Philip</a> for this deepdive into inference engineering, which is around 10% of the contents of his new book, <em>&#8221;Inference Engineering.&#8221;</em> If you&#8217;d like to go deeper into this topic, you can download the full book for free:</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://baseten.com/inference-engineering&quot;,&quot;text&quot;:&quot;Get the full e-book, for free&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://baseten.com/inference-engineering"><span>Get the full e-book, for free</span></a></p><p>This title will also be available in physical, printed form: sign up to the <a href="https://www.baseten.co/inference-engineering/paper-waitlist/">waitlist</a> to be notified when it&#8217;s available.</p><p><strong>It&#8217;s encouraging that inference engineering is no longer a &#8220;monopoly&#8221; belonging to a few leading AI labs. </strong>Top AI model makers like OpenAI and Anthropic control all aspects of their AI models &#8211; from training to inference &#8211; so there&#8217;s no inference engineering to be done with them.</p><p>However, thanks to increasingly capable open models, engineering teams have the opportunity to tweak how they use models, and this is where the theory and practice of inference engineering becomes invaluable.</p><p><strong>Even so, the discipline of inference engineering still seems to only make sense for a subset of tech companies. </strong>To justify investment in inference engineering, you need to be spending big money on inference from vendors. This is the point at which it can make sense to invest time and money to see if you can set up your own inference stack on top of open models, and swap out some existing usage.</p><p><strong>I wonder if inference engineering is the AI version of the &#8220;build vs buy&#8221; dilemma. </strong>For software-as-a-service (SaaS), the question for every company is whether to build it in-house, or buy from a vendor. For example, should you build a project management software (it&#8217;s possible!), or just buy an existing one? And what about feature flagging, not to mention observability?</p><p>Experienced engineers all understand the pros and cons of building it yourself (time and maintenance, which is a constant drag.) Tuning and operating your own LLM stack is a much newer field, and inference engineering is at the heart of building better inference stacks than what comes &#8220;out of the box&#8221; with open models.</p><p><strong>Picking up the basics of inference engineering feels like a valuable skill &#8211; and it&#8217;s also new and interesting. </strong>If you become well-versed in inference engineering, you could create optionality for your own team and company in LLM usage<strong>. </strong>Running your own inference stack on top of an open model gives control of what you&#8217;re running and of pricing. Inference engineering helps create options for achieving better performance from an open model by using the approaches covered in the extract above from Philip&#8217;s book.</p>]]></content:encoded></item><item><title><![CDATA[“How to be a 10x engineer” – interview with a standout dev]]></title><description><![CDATA[An interview with an engineer with no public GitHub contributions, setting clear boundaries &#8211; and yet not having needed to apply for positions when searching for a job, because referrals found them]]></description><link>https://newsletter.pragmaticengineer.com/p/how-to-be-a-10x-engineer-interview</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/how-to-be-a-10x-engineer-interview</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 24 Mar 2026 18:26:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wORh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb83f9d2f-711f-4edd-bc8a-303b8de422e5_1600x1300.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It was at Uber that I met one of the single best engineers I&#8217;ve had the fortune to work with; let&#8217;s call them &#8220;Sam&#8221; for this article. As engineers, we briefly worked together, and when I became a manager, Sam&#8217;s name regularly came up during <a href="https://newsletter.pragmaticengineer.com/p/performance-calibrations">performance calibrations</a> as being among the company&#8217;s top 10% engineers. One year, he was in the &#8220;top, top&#8221; bucket reserved for the 3% best engineers.</p><p>After I left Uber, we stayed in touch, and a few months ago I heard he was exploring the next opportunity,<strong> </strong>and found out from him that<strong> Sam&#8217;s job search looked nothing like most people&#8217;s:</strong> he didn&#8217;t apply for a single role. Instead, there were reachouts from former colleagues desperate to hire them.</p><p>When we talked for this article, Sam had three warm leads which wanted to interview him ASAP. One startup was not even hiring, but the founder was ready to create a new position just for him.</p><p>I posted a message on LinkedIn about Sam:</p><blockquote><p>&#8220;I hate the term &#8220;10x engineer&#8221; but this engineer is a role model for what a standout engineer is - in fact, some of my writing of standout engineers reference my interactions with folks like them (e.g. my article on the product-minded engineer, this one: https://lnkd.in/et7nWBgW)</p><p>And still, from the outside, this engineer is nearly completely invisible.</p><p>No social media footprint. The LinkedIn profile lists his companies worked at, and nothing else: no technologies, no projects, nothing. Their GitHub is empty for the last 5 years, and has perhaps a dozen commits throughout the last 10 years.&#8221;</p></blockquote><p>This is Sam&#8217;s GitHub contributions for the last several years: absolutely nothing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wORh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb83f9d2f-711f-4edd-bc8a-303b8de422e5_1600x1300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wORh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb83f9d2f-711f-4edd-bc8a-303b8de422e5_1600x1300.png 424w, https://substackcdn.com/image/fetch/$s_!wORh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb83f9d2f-711f-4edd-bc8a-303b8de422e5_1600x1300.png 848w, https://substackcdn.com/image/fetch/$s_!wORh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb83f9d2f-711f-4edd-bc8a-303b8de422e5_1600x1300.png 1272w, https://substackcdn.com/image/fetch/$s_!wORh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb83f9d2f-711f-4edd-bc8a-303b8de422e5_1600x1300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wORh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb83f9d2f-711f-4edd-bc8a-303b8de422e5_1600x1300.png" width="1456" height="1183" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b83f9d2f-711f-4edd-bc8a-303b8de422e5_1600x1300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1183,&quot;width&quot;:1456,&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;: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_!wORh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb83f9d2f-711f-4edd-bc8a-303b8de422e5_1600x1300.png 424w, https://substackcdn.com/image/fetch/$s_!wORh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb83f9d2f-711f-4edd-bc8a-303b8de422e5_1600x1300.png 848w, https://substackcdn.com/image/fetch/$s_!wORh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb83f9d2f-711f-4edd-bc8a-303b8de422e5_1600x1300.png 1272w, https://substackcdn.com/image/fetch/$s_!wORh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb83f9d2f-711f-4edd-bc8a-303b8de422e5_1600x1300.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">Zero public contributions: Behind the profile, one of the best software engineers I&#8217;ve worked with</figcaption></figure></div><p>One of the most upvoted comments on my post was by cloud technologist <a href="https://www.linkedin.com/feed/update/urn:li:activity:7381615884282462209?commentUrn=urn%3Ali%3Acomment%3A%28activity%3A7381615884282462209%2C7381647792106270721%29&amp;dashCommentUrn=urn%3Ali%3Afsd_comment%3A%287381647792106270721%2Curn%3Ali%3Aactivity%3A7381615884282462209%29">Olivier Frolovs</a>, who requested an article on Sam for others to learn how he operates. Now, Sam has generously agreed to an interview and has asked to remain anonymous, hence the <em>nom de plume </em>(pseudonym)<em>.</em></p><p>He doesn&#8217;t seek public attention and has a strong professional reputation. During our chat, he offered pointers for engineers looking to excel, and also as proof that an empty GitHub profile and zero social media presence don&#8217;t mean you can&#8217;t be a truly standout developer.</p><p>I also interviewed one of his former managers from Uber for that perspective. Today, we cover:</p><ol><li><p><strong>Getting things done.</strong> High-level task breakdowns, combined with communicating delays as tradeoffs to stakeholders.</p></li><li><p><strong>Setting boundaries.</strong> Saying &#8220;no,&#8221; prioritizing family or work &#8211; and being clear about it, and treating prioritization as a daily practice.</p></li><li><p><strong>Office politics.</strong> Participate selectively and cautiously, build relationships with influential colleagues, pre-sell ideas, direct communication.</p></li><li><p><strong>Negotiation and conflict. </strong>Approach engineers before their managers, build bottom-up consensus, and start with relationship-building.</p></li><li><p><strong>Promotions, keeping up-to-date, and finding the next job. </strong>A personal take on The Big Tech promotion processes, keeping up with the industry, and relying on referrals more.</p></li><li><p><strong>Becoming a manager. </strong>Ownership and independence separate &#8220;good&#8221; engineers from &#8220;great&#8221; ones.</p></li><li><p><strong>Feedback from Sam&#8217;s ex-manager. </strong>A former manager reveals what made Sam stand out to them &#8211; and shares some potential growth opportunities.</p></li></ol><h2>Background</h2><p>In this article, my questions are in <em>italic</em> and Sam&#8217;s voice is in normal text.</p><p><em>Sam, how did you get into tech?</em></p><p>I was always intrigued by computers, software, and &#8211; as it came around &#8211; the internet. My dad had a black-and-white screen laptop for work with Windows 3.1 and some games. We got our first personal computer with Windows 95 and I remember it vividly.</p><p>I started developing websites for my primary school and the company my mom worked at when I was 12. I got paid a small sum, so that was my first-ever paid programming project! Around then, I taught myself Visual Basic 6 and started building 2D and 3D mini-games. I found the website <a href="http://directx4vb.vbgamer.com/">DirectXVB</a> (which is still live today), emailed the website&#8217;s owner with issues I ran into, and they helped me with pointers. Later, I taught myself PHP and built more dynamic websites.</p><p>From the age of 14, I stopped all coding &#8211; I just got tired of it! &#8211; and focused on my studies, and getting into college. I chose a non-computer science major for university, but picked up coding on the side, and I rediscovered that spark, so, in the first year of my Master&#8217;s, I decided to switch and do a Computer Science Bachelor&#8217;s. It was during college that I started to build apps and websites, and it&#8217;s when I got truly hooked on software development.</p><h3>From agency, to large company, then Uber</h3><p>I joined an agency as their first hire, building apps for local companies. It was a small team, we learned with trial-and-error, and getting done at 2-3 o&#8217;clock in the morning was common enough. I stayed 18 months and learned a lot about ownership, the importance of an eye for detail, and collaborating with others.</p><p><strong>My favorite part of the job was the few times I worked directly with a designer</strong>: our agency employed freelance designers who were not involved in most of the projects because the company was trying to save money by having them work less, and not be involved in planning and rollouts. But during the implementation phase, I&#8217;d find myself talking with the designer and bouncing implementation and design ideas around.</p><p>I then joined a small startup where we built our own product. A highlight was having two designers on the team fulltime, whom I could work with and learn from. Engineering also felt like a level up: everyone cared about software quality and UX details.</p><p>Our startup got acquired by a larger company and most of us moved to the Bay Area. We stayed together as a team and were told we would maintain a &#8220;startup culture.&#8221; The founders tried their best to stay true to their word, but they couldn&#8217;t shield us from the reality of working in a corporation.</p><p><strong>I learned a lot about corporate processes, and it was more interesting than I&#8217;d expected. </strong>As I was getting closer to the senior engineer level, I had to understand how internal politics worked, how to &#8220;massage&#8221; peer teams to help support our proposals, and how to talk with engineering leaders like senior managers and directors. Our company was also hugely focused on the annual company event: it was eye-opening for me to see just how much effort went into preparation. It consisted of several rehearsals and dedicated engineering work to showcase our stuff in a way that was near-flawless on the day.</p><p>After a few years, I felt ready for a change and joined Uber. I took a &#8220;title cut,&#8221; something akin to the &#8220;<a href="https://newsletter.pragmaticengineer.com/p/the-seniority-rollercoaster">seniority rollercoaster.</a>&#8221; At Uber, I worked in a new area and got promoted several times. After Uber, I worked at another Big Tech, and now &#8211; very recently &#8211; I&#8217;ve begun at a startup.</p><h2>1. Getting things done</h2><p><em>Feedback at Uber about you during performance calibrations was that you&#8217;re excellent at getting things done. What&#8217;s your process?</em></p><p>When I started out as a junior dev, I pulled long hours so I could deliver on time &#8211; regardless of how much effort it took. I don&#8217;t know what it was, but I always felt that failing to deliver on time was <em>never</em> an option.</p><p>I still vividly remember one project where I worked incredibly hard but still failed to deliver with the quality I expected from myself. As embarrassing as it is, I was so exhausted that I almost started crying on the spot. One of my coworkers comforted me and told me:</p><blockquote><p>&#8220;Man, you&#8217;re crying about the wrong thing. No one died, no one got hurt, and no one will even care that we&#8217;re a few days late, save for the project manager. But even he&#8217;s used to everything being late. Go home, have some sleep, come back tomorrow and take it easy.&#8221;</p></blockquote><p>They were right, of course. Still, I&#8217;m pretty sure this inner pressure to be unsatisfied with &#8220;good enough&#8221; explains a lot about how I work.</p><p><strong>Having a high-level breakdown of the work, and communicating to stakeholders has been my &#8220;secret&#8221;, later in my career</strong>. After a few years as a dev, my estimation skills got better and I had to pull fewer late nights. I also found a hack that greatly helped was doing a high-level breakdown as early as possible, in <em>all</em> cases. As soon as I understand what the work is, I break it all down, ideally on a whiteboard or paper.</p><h3>Importance of communication</h3><p><em>You were also seen as a strong communicator, whether it was with engineers, engineering managers, or product managers. How do you get your point across?</em></p><p>Communicating delays as &#8220;tradeoffs&#8221; works extremely well. As soon as I start a project which I&#8217;m the lead on, I establish communication channels with key stakeholders: product managers, my engineering leadership, and business stakeholders, via email or Slack, I keep them in the loop at least weekly, and about anything that could be a roadblock.</p><p><strong>In my experience, delays are not an issue as long as they are communicated upfront with an explanation and potential alternatives.</strong> When we hit a roadblock that slows down our work, I would never communicate that we&#8217;re &#8220;behind&#8221;. I would offer alternatives like:</p><ul><li><p>We can still ship on time, but we&#8217;d need to cut X and Y features for this release</p></li><li><p>If we are not comfortable cutting X and Y features, then we will need to push out the target date by 2 weeks. If we are comfortable, we can push it out by 1 week</p></li></ul><p>The trick, I&#8217;ve found, is to make it clear to stakeholders that we have a <em>choice</em>: choose more features to ship, or choose a lower-priority feature to drop.</p><p>I learned most of my hacks from people who are good at getting things done, and they have a few attributes:</p><ul><li><p><strong>Task breakdown:</strong> early in my career, there was a senior engineer who was methodical about breaking down tasks and making estimates, even for seemingly trivial projects &#8211; and it worked!</p></li><li><p><strong>Communication tools: </strong>I observed the few <em>really</em> organized product managers, engineering managers, and tech lead, and made their communication styles into a &#8220;package&#8221; that worked for me; things like email updates, facilitating kickoff meetings, launch announcements (including how to communicate a failed/sunset project as a successful launch), and more.</p></li></ul><p>Being good at communication means you have a solid foundation, and then develop a feel for how to best utilize the tools you have. There&#8217;s no &#8220;one-size-fits-all&#8221; approach: people react better or worse to different things. Try to get to know folks around you and put yourself in their shoes.</p><h3>Doing great work</h3><p><em>What does &#8220;standout&#8221; work look like to you?</em></p><p><strong>I think about the quality of my work similarly to the quality of work I do at home. </strong>I have moved houses and renovated them several times and I greatly care about the quality of that work. And I&#8217;ve seen plenty of contractors come to my place, perform their work, and then leave without actually caring about the quality. They just want to &#8220;get s*** done&#8221; and be out of there. I never understood how someone can keep doing their job without feeling a lot of love for it!</p><p><strong>I need to get energy from everything I do, not just in my job. </strong>Whether it&#8217;s playing games with my kids, helping my wife with her website, or building a new website feature for the company I work for: I approach it all with the same attitude.</p><p>Equally, if I no longer get energy from the work I do, then I basically stop enjoying it and this can be a nudge to start to look for something else. If it continues for a long time, this urge can become more persistent, and that&#8217;s the point when I have switched companies or teams. I can go on for some time without getting energy from my work, but it drains me. I try to catch myself before it gets too bad, and I&#8217;ve managed to do so, up to now. This is why I quit my last job without having anything lined up: I stopped getting energy from it for many months and talked with my management chain about it, but they were unable and unwilling to change anything. I needed a change, so it was me who made it.</p><h3>Stepping outside of domain expertise</h3><p><em>You frequently went outside of your domain, working with engineering teams on other platforms and contributing to codebases you&#8217;re not expert in. You seemed to have a great relationship with most engineers, in contrast to some devs. How did you do this?</em></p><p>I am pretty curious and prefer to talk directly with engineers.<strong> </strong>So, when I&#8217;d work on a project with engineers on a different stack, I would ask them to explain their high-level architecture approaches, and roll up my sleeves to make small code changes in a stack I was unfamiliar with.</p><p>Once you understand the high-level structure of a different codebase, and you also know how to make a few small changes, suddenly, it&#8217;s so much easier to figure things out on your own!</p><p><strong>An approach that consistently worked for me is approaching problems from the customer&#8217;s perspective, and being genuinely curious.</strong> For example, I might ping an engineer working on a different system and ask:</p><blockquote><p>&#8220;I noticed a customer has this problem, and to fix it, we probably need to touch the system you own. I don&#8217;t know much about this system: can you explain how it works, and what we could perhaps do to solve this issue that causes frustration for the customer?&#8221;</p></blockquote><p>By making it clear that my goal is to solve a customer problem, I&#8217;m not coming across as just digging around for nothing. And by making it clear that I&#8217;d like to learn from them, it avoids being seen as someone trying to confirm what they are doing, which could come across as arrogant &#8211; especially when the other engineer is the expert on their own system. I&#8217;ve found fellow engineers are happy to explain their understanding and decisions.</p><h2>2. Setting boundaries</h2><p><em>At Uber, I recall you were very good at setting boundaries and saying &#8220;no.&#8221; How do you do that?</em></p><p><strong>Honestly, I find it tough to say no &#8211; but I learned that it&#8217;s worse when I don&#8217;t. </strong>I found that saying &#8216;yes&#8217; to everything usually results in an unmanageable, unbalanced pile of work. Prioritizing is key: I always remind myself to focus on what matters most. For me, the &#8220;most important&#8221; thing for any given topic could be:</p><ul><li><p>A shipping deadline that needs to be hit and is non-negotiable</p></li><li><p>Family needs</p></li><li><p>An urgent task that needs to be done on the same day</p></li></ul><p><strong>Family is very important to me. </strong>When I worked at Uber, I had a reasonably long commute to the office. I blocked out my calendar so I could leave on time in order to be home for dinner with my family. This did not mean I stopped work immediately; I would sometimes work during my commute and, when necessary, I logged back on to continue working after my kids were in bed.</p><p>When we had important deadline agreements at work, I made an agreement with my partner that I stayed longer in the office because I knew it was important to put in extra effort and deliver standout work then.</p><p>It goes back to prioritizing and focusing on the most important thing. Looking back, I&#8217;d say most of the time, the most important thing for me was family, and that work overrode this every now and then.</p><p>My approach to prioritizing keeps changing, though. Demands at home keep changing and expectations at work also change; after Uber, other jobs increasingly focused on async and remote work. This meant more flexibility to accommodate family time &#8211; but work could spill over into evening hours if I did not finish everything.</p><p><strong>If I can give one piece of advice, it&#8217;s to understand what is important for </strong><em><strong>you</strong></em><strong>. </strong>Know your number one, number two, number three priorities: and arrange your workday so you do your top priorities. Don&#8217;t compromise on the most important one!</p><h2>3. Office politics</h2><p><em>At work, how plugged in were you to office politics?</em></p><p><strong>I was aware of politics and tried to build relationships with &#8220;influential&#8221; people. </strong>I try to stay away from &#8220;cocky&#8221; types, and to find what I want to achieve through different folks.</p><p>The importance of politics is something I really started to understand when working at Uber. Initially, I was ignorant, but the more experience I got in Big Tech, the more it became obvious. It took a while before I was able to participate in it. I never liked it; I tend to be direct and transparent, but that does not work in every situation.</p><p><em>Did you take part in it to get stuff done?</em></p><p>Yes, sometimes by being direct and transparent, and communicating the right amount of information, you can get a lot done. Occasionally, it required me to &#8220;massage&#8221; an idea on multiple people before going to the person who called the shots.</p><p><em>What is your view of engineers who are seen as&#8220;political&#8221;?</em></p><p>It&#8217;s part of the game and sometimes it&#8217;s useful to have a good relationship with those people, as you can use that for your own benefit, as well. I personally would never invest much time in understanding and practising politics, as I prefer to focus on building and product.</p><h2>4. Negotiation &amp; conflict</h2><h3>Negotiating with teams</h3><p><em>You were perceived as being good with other teams, and at removing roadblocks for your own. How did you approach this?</em></p>
      <p>
          <a href="https://newsletter.pragmaticengineer.com/p/how-to-be-a-10x-engineer-interview">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Are AI agents actually slowing us down?]]></title><description><![CDATA[As more software engineers use AI agents daily, there&#8217;s also more sloppy software, outages, quality issues, and even a slowdown in shipping velocity. What&#8217;s happening, and how do we solve it?]]></description><link>https://newsletter.pragmaticengineer.com/p/are-ai-agents-actually-slowing-us</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/are-ai-agents-actually-slowing-us</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 17 Mar 2026 16:59:32 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/35d38ae8-5fc7-4307-84d4-de2706908538_1674x1258.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When it comes to AI agents and AI tooling, most of the discussion focuses on their potential boosts for efficiency, faster iteration, and the pushing out of more code, faster.</p><p>Last week, we took an inside look into <a href="https://newsletter.pragmaticengineer.com/p/how-uber-uses-ai-for-development">how Uber is adopting AI</a>, internally. The rideshare giant has built close to a dozen internal systems to deal with code generated by AI agents. However, when quantifying the impact of AI, the focus was on how much output has increased, and how devs who use more AI also generate more pull requests; these are the &#8220;power user&#8221; devs who generate 52% more PRs than devs who use AI less. There was no mention of product quality &#8211; at all!</p><p>And there are signs that product quality is dropping overall. Today, we dig into this under-discussed topic, covering:</p><ol><li><p><strong>Anthropic: degraded flagship website.</strong> An annoying UX issue irritated paying Claude customers &#8211; and no one at Anthropic noticed. The company moves very fast, generates 80%+ of production code with Claude, but quality and user experience seem to be taking a backseat.</p></li><li><p><strong>Amazon: AI-agent reliance triggers SEVs. </strong>Amazon&#8217;s retail org has a leap in outages caused by its own AI agents. Now, senior sign off is needed for junior engineers&#8217; AI-assisted changes.</p></li><li><p><strong>Big Tech: &#8220;use AI or you&#8217;re unproductive.&#8221;</strong> Companies like Meta and Uber are tracking AI token usage in performance reviews, putting pressure on engineers to use it heavily &#8212; irrespective of the tools&#8217; quality impact.</p></li><li><p><strong>OpenCode: more time spent cleaning up.</strong> Dax Raad, OpenCode&#8217;s creator, warns that AI agents are lowering the bar for what ships, discouraging refactoring, and don&#8217;t speed teams up.</p></li><li><p><strong>5. Startups: founders see LLMs slowing down long-term velocity. </strong>Sentry&#8217;s CTO and others observe that while AI removes the barrier to getting started, it also produces bloated, hard-to-maintain code that slows long-term development.</p></li><li><p><strong>Research: AI agents underperform claims.</strong> Some studies show AI coding tools produce short-lived velocity gains followed by significant tech debt increases.</p></li><li><p><strong>How do we solve it?</strong> Engineers with strong architectural sense become more critical than ever, proposed solutions include formal validation methods, and perhaps reviving some old school QA ideas.</p></li></ol><h2>1. Anthropic: degraded flagship website</h2><p>This article&#8217;s genesis was last week, when I&#8217;d finally had enough of a persistent UX bug on Claude&#8217;s flagship website: the prompt I typed in regularly got lost. Below is a video of me typing &#8220;How can I&#8230;&#8221; &#8211; and &#8220;losing&#8221; the first two words when the page loaded:</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;5b3077ba-7213-44f8-a963-91fc8b9e47f5&quot;,&quot;duration&quot;:null}"></div><p>It&#8217;s pretty straightforward:</p><ol><li><p>The page starts to render and the textbox is displayed</p></li><li><p>The user starts to type their prompt, but the page has not finished loading subscription data</p></li><li><p>The subscription information loads around a second later</p></li><li><p>The textbox is reset and the typing is lost</p></li></ol><p>This is a pretty basic bug you might expect in a prototype, except that this is the landing page of Claude.ai, and it&#8217;s a bug that impacts every paying customer &#8211; easily millions &#8211; every day. Even worse, the bug happens <em>every time</em> you visit the site.</p><p><strong>Somehow, nobody at Anthropic tested the site to catch a plainly obvious bug</strong> which impacted 100% of paying customers. At the same time, no company uses AI coding tools more than Anthropic: around 80% of the company&#8217;s code is now generated by Claude Code, so we can assume a good part of the website is also created that way.</p><p>My complaint about Anthropic&#8217;s website being broken <a href="https://x.com/GergelyOrosz/status/2031986107903054179">went a bit viral</a> and got the attention of the developer team:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4Hl1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19905f01-a3c2-485f-bd1b-53769c587e53_1190x356.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4Hl1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19905f01-a3c2-485f-bd1b-53769c587e53_1190x356.png 424w, https://substackcdn.com/image/fetch/$s_!4Hl1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19905f01-a3c2-485f-bd1b-53769c587e53_1190x356.png 848w, https://substackcdn.com/image/fetch/$s_!4Hl1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19905f01-a3c2-485f-bd1b-53769c587e53_1190x356.png 1272w, https://substackcdn.com/image/fetch/$s_!4Hl1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19905f01-a3c2-485f-bd1b-53769c587e53_1190x356.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4Hl1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19905f01-a3c2-485f-bd1b-53769c587e53_1190x356.png" width="1190" height="356" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/19905f01-a3c2-485f-bd1b-53769c587e53_1190x356.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:356,&quot;width&quot;:1190,&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_!4Hl1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19905f01-a3c2-485f-bd1b-53769c587e53_1190x356.png 424w, https://substackcdn.com/image/fetch/$s_!4Hl1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19905f01-a3c2-485f-bd1b-53769c587e53_1190x356.png 848w, https://substackcdn.com/image/fetch/$s_!4Hl1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19905f01-a3c2-485f-bd1b-53769c587e53_1190x356.png 1272w, https://substackcdn.com/image/fetch/$s_!4Hl1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19905f01-a3c2-485f-bd1b-53769c587e53_1190x356.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>Product manager Robert Bye confirms the bug will be fixed. Source: <a href="https://x.com/RobertJBye/status/2032109640134066319?s=20">Robert Bye</a></em></figcaption></figure></div><p>To their credit, three days later the bug was gone. There&#8217;s no longer a &#8220;double load&#8221; of the textbox: it takes a bit longer to load but only does so once.</p><p>Still, it makes me wonder how much longer this issue would&#8217;ve continued had nobody complained. Also, how many more bugs are present on the Claude website that nobody highlighted on social media? How many more features could be shipped in a state that is subpar for production-grade software with millions of paying customers?</p><p><strong>Anthropic seems to be prioritizing moving </strong><em><strong>very</strong></em><strong> fast over doing so with high quality. </strong>There is no denying that the company is moving at incredible speed and running laps around competitors. A good example is how they built Claude Cowork in just 10 days. Claude Cowork handled work with Microsoft Word and Excel documents surprisingly well, to the point that it set off a &#8220;code red&#8221; inside Microsoft&#8217;s Office division, I understand.</p><p>Microsoft responded as fast as possible, but it still took 2-3 months to launch their (cloned) response, called Copilot Cowork earlier this month, with full access still to follow soon.</p><p><strong>In the case of Anthropic, moving fast with okay quality seems to make good business sense: </strong>they build a better product than what already exists, so no matter if it&#8217;s a bit rough around the edges; they can fix quality issues post-launch and still be months ahead of the competition.</p><h2>2. Amazon: reliance on AI agents causes SEVs</h2><p>Anthropic can afford to move fast while it&#8217;s growing at an extremely high rate and expanding its market share rapidly. At the same time, established players like Amazon have extreme focus on reliability: AWS has become the top cloud provider not least by being extremely reliable (as well as aggressive on pricing).</p><p>Well, reliability at the online retailer seems to be getting worse, too, and the company&#8217;s AI agent, Kiro, could be causing SEVs (Amazon&#8217;s phrase for &#8220;outage&#8221;), <a href="https://www.ft.com/content/7cab4ec7-4712-4137-b602-119a44f771de">according</a> to The Financial Times (emphasis mine):</p><blockquote><p>Amazon&#8217;s ecommerce business has summoned a large group of engineers to a meeting on Tuesday for a &#8220;deep dive&#8221; into a spate of outages, including incidents tied to the use of AI coding tools.</p><p><strong>The online retail giant said there had been a &#8220;trend of incidents&#8221; in recent months, characterised by a &#8220;high blast radius&#8221; and &#8220;Gen-AI assisted changes&#8221; among other factors,</strong> according to a briefing note for the meeting seen by the FT.</p><p>Under &#8220;contributing factors&#8221; the note included &#8220;novel GenAI usage for which best practices and safeguards are not yet fully established&#8221;.</p><p>&#8220;Folks, as you likely know, the availability of the site and related infrastructure has not been good recently,&#8221; Dave Treadwell, a senior vice-president at the group, told employees in an email, also seen by the FT. (...)</p><p>He asked staff to attend the meeting, which is normally optional.</p><p>Junior and mid-level engineers require more senior engineers to sign off any AI-assisted changes, Treadwell added in the briefing note.&#8221;</p></blockquote><p>This meeting was the regular <em>&#8220;This Week in Stores Tech&#8221;</em> operational one, but what was new was the note telling staff to attend this &#8220;optional&#8221; meeting, and the mandate for senior engineers to sign off code changes from juniors. The outages may have been caused by less experienced engineers over-trusting GenAI&#8217;s output. Also, there were incidents caused by AI changes, said the FT:</p><blockquote><p>&#8220;Separately, the company&#8217;s cloud computing arm &#8212; Amazon Web Services &#8212; has suffered at least two incidents linked to the use of AI coding assistants, which the company has been actively rolling out to its staff.</p><p>AWS suffered a 13-hour interruption to a cost calculator used by customers in mid-December after engineers allowed the group&#8217;s Kiro AI coding tool to make certain changes, and the AI tool opted to &#8220;delete and recreate the environment&#8221;, the <a href="https://www.ft.com/content/00c282de-ed14-4acd-a948-bc8d6bdb339d">FT previously reported</a>.&#8221;</p></blockquote><p>Again, a tool causing an outage is not its own fault: it&#8217;s on the engineer who lets the tool run wild. If I delete two lines of code, then push it to production, and the server crashes, the fault is not with the text editor or the Git client, but with me who made the change. Similarly, if you prompt an AI agent to do something, and the AI agent goes off and does its stuff which causes an outage, then responsibility lies with the engineer who didn&#8217;t set up guardrails for the agent.</p><p><strong>However, there is the issue that AI agents can wreak havoc in ways devs don&#8217;t quite understand or expect, until learning the hard way. </strong>This was what took down a lesser-used AWS service, according to the report:</p><blockquote><p>&#8220;Amazon Web Services experienced a 13-hour interruption to one system used by its customers in mid-December [2025] after engineers allowed its Kiro AI coding tool to make certain changes, according to four people familiar with the matter.</p><p>The people said the agentic tool, which can take autonomous actions on behalf of users, determined that the best course of action was to &#8220;delete and recreate the environment&#8221;.</p></blockquote><p>It sounds like an engineer gave overly broad permissions to the coding agent which then used its scope to delete a service. As mentioned, the engineer is responsible, but there is also a learning curve with these AI agents to consider: it&#8217;s not like this type of outage happened in the past. Plus, companies like Amazon are heavily incentivizing using AI agents for as much work as possible, which naturally leads to overuse.</p><h2>3. Big Tech: &#8220;use AI or you&#8217;re unproductive&#8221;</h2><p>Something happens at places that measure devs&#8217; AI usage: pressure builds for all devs to use more AI or else be seen unproductive and at risk of poor performance reviews, potentially leading to a PIP or worse.</p><p><strong>Meta is taking token usage into account during perf reviews.</strong> A current engineering manager at the social media giant told me that the token usage of each engineer is now a data point &#8212; one of many! &#8212; for performance calibrations. By itself, it is not a positive or negative signal, but someone perceived as having low impact <em>and</em> with low token usage is now seen as a blatant low performer. For high performers with outstanding impact, very high token usage is seen as a <em>good</em> thing as it conveys to the manager group that they&#8217;re personally invested in AI and are improving their workflow &#8211; as proved by results.</p><p><em>We previously covered <a href="https://newsletter.pragmaticengineer.com/p/performance-calibrations">how performance calibrations work at places like Meta.</a></em></p><p><strong>Big Tech CEOs are starting to see AI &#8220;power user devs&#8221; as superior to their coworkers.</strong> Uber is a good example: the Dev Platform team started to analyze the output of engineers by whether or not they&#8217;re in the &#8220;power user&#8221; category, meaning they use AI agents at least 20 days per month. They found more PR output by engineers who are power users. So far, that&#8217;s useful data, but it&#8217;s just one piece of information, and doesn&#8217;t reveal the quality of the PRs, the impact of the engineer, or any other business outcome.</p><p>By the time this data reaches CEO level, it has turned into something else. Here&#8217;s Uber CEO, Dara Khosrowshahi, interpreting the same data points on the Diary of a CEO podcast (emphasis mine:)</p><blockquote><p>&#8220;While 90% of our engineers are using AI tools of some sort, there&#8217;s about 30% of them that are using them at a completely accelerated pace. <strong>And it [using AI tools heavily] really is changing their productivity in a way that I&#8217;ve never ever seen before.</strong>&#8221;</p></blockquote><p>There&#8217;s a step from observing more PRs per engineer, to judging power users as being more productive for that reason. Dara continues:</p><blockquote><p>&#8220;I can imagine maybe 5 years from now, as the engineers get more and more productive, that I may not decide to add engineering headcount because at that point <strong>instead of adding an engineer, I should add agents and buy some more GPUs from Nvidia.</strong> That may be the investment in the future.&#8221;</p></blockquote><p>Unsaid in the above is that by that time, only engineers &#8220;using AI at a completely accelerated pace&#8221; would be employed. Would it also mean that engineers not on the bandwagon are on the way out? I appreciate Dara speaking his mind and shedding light on the thought process of a Big Tech CEO.</p><p><strong>Inside large tech companies, it&#8217;s becoming a career risk to not use AI at an accelerated pace, regardless of output quality. </strong>These large companies are the ones likely to be mulling layoffs, like Meta <a href="https://www.reuters.com/business/world-at-work/meta-planning-sweeping-layoffs-ai-costs-mount-2026-03-14/">reportedly preparing</a> to cut up to 20% of staff. And when it comes to identifying redundancies, it&#8217;s a fair assumption that things like &#8220;AI usage&#8221; and &#8220;pull requests per engineer&#8221; will be taken into account, especially as one theme of such layoffs will almost certainly be that the employer wants to focus more on AI.</p><p>So, it&#8217;s common sense (and self-preservation) to use more AI, if only not to be seen as unproductive. Their perceived output will rise and engineering leadership will share more reports about productivity being up, and interpreting more code generated and more pull requests as the proof.</p><h2>4. OpenCode: &#8220;more time spent cleaning up&#8221;</h2><p>Dax Raad is founder and CEO of <a href="https://opencode.ai/">OpenCode</a>, an open source AI coding agent, into which you can plug in models like Claude, ChatGPT, Gemini, and others. It&#8217;s an increasingly popular alternative to the likes of Claude Code and Codex. In our <a href="https://newsletter.pragmaticengineer.com/i/189777574/2-most-used-ai-tools">recent AI tooling survey</a>, it came up as a tool used nearly as much as Google&#8217;s Gemini CLI and Antigravity. A small team works on this increasingly influential tool, and is seeing problems with AI overuse. Dax wrote <a href="https://x.com/thdxr/status/2031377117007454421?s=20">this note</a> to the OpenCode team (emphasis mine):</p>
      <p>
          <a href="https://newsletter.pragmaticengineer.com/p/are-ai-agents-actually-slowing-us">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How Uber uses AI for development: inside look]]></title><description><![CDATA[How Uber built Minion, Shepherd, uReview, and other internal agentic AI tools. Also, new challenges in rolling out AI tools, like more platform investment and growing concern about token costs]]></description><link>https://newsletter.pragmaticengineer.com/p/how-uber-uses-ai-for-development</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/how-uber-uses-ai-for-development</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 10 Mar 2026 19:23:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!uBE4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596ad0d5-6c2e-41ad-8aa8-570641097308_2048x1366.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Before we start: all The Pragmatic Summit videos are now <a href="https://www.pragmaticsummit.com/">available to view</a>. Paid newsletter subscribers also have access <a href="https://newsletter.pragmaticengineer.com/p/the-pragmatic-summit-recordings">to each session with the Q&amp;A session, as well</a>.</em></p><p>Update on 11 March: the Uber team shared updated numbers as of March 2026:</p><ul><li><p><strong>84% of devs at Uber are agentic coding users</strong> (either using CLI-based agents or making more agentic requests than tab-completion in their IDE)</p></li><li><p><strong>65-72% of code is AI-generated </strong>inside IDE-based tools. <em>This number is, naturally, 100% for AI command line tools like Claude Code.</em></p></li><li><p><strong>Claude Code usage nearly doubled in 3 months</strong> &#8212; from 32% in Dec to 63% in Feb, while IDE-based tools (Cursor, IntelliJ) have plateaued.</p></li></ul><p>The article is updated with these new and correct numbers.</p><div><hr></div><p>I spent four years working at Uber until 2020 and experienced firsthand the company&#8217;s standout engineering culture. Uber is a company that did the speed run of going from a small startup, through hypergrowth, to being a large company facing major risk during the pandemic, when the rideshare business briefly collapsed. Today, it&#8217;s maturing as a publicly traded, profitable company, and employs almost 3,000 people in the tech function.</p><p>At the recent Pragmatic Summit in San Francisco, one of the most interesting behind-the-scenes sessions came from the ridesharing company&#8217;s principal engineer, <a href="https://www.linkedin.com/in/tyvsmith/">Ty Smith</a>, and director of engineering <a href="https://www.linkedin.com/in/anshuman-chadha-8ab58717/">Anshu Chada</a>, who <a href="https://youtu.be/i1tZN41VKcE">pulled back the curtain</a> on what Uber has been doing with AI tools, internally. They were candid about the amount of work it took to build up Uber&#8217;s internal &#8220;AI stack,&#8221; why all that work was necessary, and also discussed the drawbacks as well as benefits of this rapidly spreading technology. <em>You can watch their <a href="https://youtu.be/i1tZN41VKcE">presentation at The Pragmatic Summit here</a>.</em></p><p>In today&#8217;s issue, we cover:</p><ol><li><p><strong>Agentic layers &amp; systems. </strong>Four layers spanning an internal AI platform, context sources, industry tools, and specialized agents for testing and code review.</p></li><li><p><strong>Internal tooling: MCP Gateway, Uber Agent Builder, and the AIFX CLI</strong>. Uber built several internal tools to make it easier for devs to use AI tools, and to make internal AI agents more effective.</p></li><li><p><strong>How AI changes developer workflows</strong>. A move away from single-threaded coding in an IDE, to orchestrating multiple parallel agents. Engineers naturally gravitate toward kicking off new agents, which starts to create resource and cost challenges.</p></li><li><p><strong>Minion: running background agents at scale. </strong>Uber built Minion, an internal background agent platform with monorepo access and optimized defaults. It&#8217;s a clever abstraction layer that works well in practice.</p></li><li><p><strong>New internal dev tools.</strong> More AI-generated code means more code reviews and more noise, so Uber built Code Inbox for smart PR routing, uReview for high-signal AI code review comments, Autocover for generating 5,000+ unit tests per month, and Shepherd for managing large-scale migrations end to end.</p></li><li><p><strong>Challenges</strong>. AI adoption is slower than expected, even at a forward-thinking company like Uber. Top-down mandates are less efficient than engineers sharing their wins with peers.</p></li><li><p><strong>Impact in numbers.</strong> 92% of Uber devs use agents monthly, 65-72% of code is AI-generated inside IDEs, and 11% of pull requests opened by agents. At the same time, AI-related costs are up 6x since 2024, and token cost optimization is a growing priority.</p></li></ol><p>Longtime readers might recall we&#8217;ve covered Uber&#8217;s engineering culture over time:</p><ul><li><p><a href="https://newsletter.pragmaticengineer.com/p/uber-eng-productivity">Developer Experience at Uber</a> &#8211; with Uber&#8217;s founding engineer on Developer Platform, Gautam Korlam (2025)</p></li><li><p><a href="https://newsletter.pragmaticengineer.com/p/how-uber-built-its-observability-platform">How Uber built its observability platform</a> (2023)</p></li><li><p><a href="https://newsletter.pragmaticengineer.com/p/uber-move-to-cloud">Inside Uber&#8217;s move to the Cloud</a> (2023)</p></li><li><p><a href="https://newsletter.pragmaticengineer.com/p/uber-eng-productivity">How Uber is measuring engineering productivity</a> (2022)</p></li><li><p><a href="https://newsletter.pragmaticengineer.com/p/program-platform-split-uber">The Program and Platform split at Uber</a> (2021)</p></li></ul><p>Let&#8217;s get into it:</p><div><hr></div><p>AI is not new at Uber, but rolling it out companywide is. The company has used machine learning and AI technologies in many systems, including its Marketplace platform, which are responsible for routing and matching drivers with riders, forecasting demand, etc. What is relatively new at nearly all tech companies is the process of integrating AI across engineering and beyond.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uBE4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596ad0d5-6c2e-41ad-8aa8-570641097308_2048x1366.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uBE4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596ad0d5-6c2e-41ad-8aa8-570641097308_2048x1366.png 424w, https://substackcdn.com/image/fetch/$s_!uBE4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596ad0d5-6c2e-41ad-8aa8-570641097308_2048x1366.png 848w, https://substackcdn.com/image/fetch/$s_!uBE4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596ad0d5-6c2e-41ad-8aa8-570641097308_2048x1366.png 1272w, https://substackcdn.com/image/fetch/$s_!uBE4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596ad0d5-6c2e-41ad-8aa8-570641097308_2048x1366.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uBE4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596ad0d5-6c2e-41ad-8aa8-570641097308_2048x1366.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/596ad0d5-6c2e-41ad-8aa8-570641097308_2048x1366.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&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_!uBE4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596ad0d5-6c2e-41ad-8aa8-570641097308_2048x1366.png 424w, https://substackcdn.com/image/fetch/$s_!uBE4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596ad0d5-6c2e-41ad-8aa8-570641097308_2048x1366.png 848w, https://substackcdn.com/image/fetch/$s_!uBE4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596ad0d5-6c2e-41ad-8aa8-570641097308_2048x1366.png 1272w, https://substackcdn.com/image/fetch/$s_!uBE4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596ad0d5-6c2e-41ad-8aa8-570641097308_2048x1366.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">Anshu Chada at The Pragmatic Summit</figcaption></figure></div><p>The official strategy at the ridesharing giant is to become a &#8220;GenAI-powered&#8221; company:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5oGV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0dfcd-ec1a-4df5-a1f8-ed6807e00f8a_1600x887.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5oGV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0dfcd-ec1a-4df5-a1f8-ed6807e00f8a_1600x887.png 424w, https://substackcdn.com/image/fetch/$s_!5oGV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0dfcd-ec1a-4df5-a1f8-ed6807e00f8a_1600x887.png 848w, https://substackcdn.com/image/fetch/$s_!5oGV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0dfcd-ec1a-4df5-a1f8-ed6807e00f8a_1600x887.png 1272w, https://substackcdn.com/image/fetch/$s_!5oGV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0dfcd-ec1a-4df5-a1f8-ed6807e00f8a_1600x887.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5oGV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0dfcd-ec1a-4df5-a1f8-ed6807e00f8a_1600x887.png" width="1456" height="807" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41d0dfcd-ec1a-4df5-a1f8-ed6807e00f8a_1600x887.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:807,&quot;width&quot;:1456,&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_!5oGV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0dfcd-ec1a-4df5-a1f8-ed6807e00f8a_1600x887.png 424w, https://substackcdn.com/image/fetch/$s_!5oGV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0dfcd-ec1a-4df5-a1f8-ed6807e00f8a_1600x887.png 848w, https://substackcdn.com/image/fetch/$s_!5oGV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0dfcd-ec1a-4df5-a1f8-ed6807e00f8a_1600x887.png 1272w, https://substackcdn.com/image/fetch/$s_!5oGV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0dfcd-ec1a-4df5-a1f8-ed6807e00f8a_1600x887.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">Uber&#8217;s company strategy now explicitly includes AI</figcaption></figure></div><p>I appreciate Uber sharing this approach openly because while most companies say that they want to be &#8220;AI-powered&#8221; &#8211; however cliche that claim might be &#8211; not all provide as much transparency.</p><p><strong>It&#8217;s worthwhile engineers internalizing how leadership views AI</strong>. These folks, in general, see a tool that can bring efficiency everywhere.<strong> </strong>My take is that in some ways, AI is seen similarly to the cloud, which has been perceived as a means to reduce costs and improve the flexibility and elasticity of hardware resources. Today, AI is seen as the way to increase efficiency and lower costs, such as customer support, software development, the finance function &#8211; or any function.</p><p>Uber is focusing not on automating everything possible in engineering. Instead, it wants to:</p><ol><li><p>Eliminate toil: helping AI do &#8220;boring&#8221; work like upgrades, migrations, trivial bug fixes, etc.</p></li><li><p>Free up engineers to focus more on creative work.</p></li></ol><p>As Anshu Chada, Engineering Director on Uber&#8217;s Dev Platform, puts it:</p><blockquote><p>&#8220;What we found is when we push some of the boring stuff to AI &#8211; upgrades, migrations, bug fixes &#8211; not only does it result in much higher satisfaction from our engineers, but they&#8217;re able to push our product and create features for end users in ways that we didn&#8217;t even think were possible.&#8221;</p></blockquote><h2>1. Agentic layers &amp; systems</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hiin!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab25b639-5aac-479c-b130-851e6240d207_2048x1366.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hiin!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab25b639-5aac-479c-b130-851e6240d207_2048x1366.png 424w, https://substackcdn.com/image/fetch/$s_!hiin!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab25b639-5aac-479c-b130-851e6240d207_2048x1366.png 848w, https://substackcdn.com/image/fetch/$s_!hiin!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab25b639-5aac-479c-b130-851e6240d207_2048x1366.png 1272w, https://substackcdn.com/image/fetch/$s_!hiin!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab25b639-5aac-479c-b130-851e6240d207_2048x1366.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hiin!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab25b639-5aac-479c-b130-851e6240d207_2048x1366.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ab25b639-5aac-479c-b130-851e6240d207_2048x1366.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&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_!hiin!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab25b639-5aac-479c-b130-851e6240d207_2048x1366.png 424w, https://substackcdn.com/image/fetch/$s_!hiin!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab25b639-5aac-479c-b130-851e6240d207_2048x1366.png 848w, https://substackcdn.com/image/fetch/$s_!hiin!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab25b639-5aac-479c-b130-851e6240d207_2048x1366.png 1272w, https://substackcdn.com/image/fetch/$s_!hiin!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab25b639-5aac-479c-b130-851e6240d207_2048x1366.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">Ty Smith at The Pragmatic Summit</figcaption></figure></div><p>Uber&#8217;s &#8220;agentic system&#8221; for software engineering is actually made up of several systems:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!m3Bk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1368c8cd-fc82-4512-91ec-452948b6294a_1600x889.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!m3Bk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1368c8cd-fc82-4512-91ec-452948b6294a_1600x889.png 424w, https://substackcdn.com/image/fetch/$s_!m3Bk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1368c8cd-fc82-4512-91ec-452948b6294a_1600x889.png 848w, https://substackcdn.com/image/fetch/$s_!m3Bk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1368c8cd-fc82-4512-91ec-452948b6294a_1600x889.png 1272w, https://substackcdn.com/image/fetch/$s_!m3Bk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1368c8cd-fc82-4512-91ec-452948b6294a_1600x889.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!m3Bk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1368c8cd-fc82-4512-91ec-452948b6294a_1600x889.png" width="1456" height="809" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1368c8cd-fc82-4512-91ec-452948b6294a_1600x889.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:809,&quot;width&quot;:1456,&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_!m3Bk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1368c8cd-fc82-4512-91ec-452948b6294a_1600x889.png 424w, https://substackcdn.com/image/fetch/$s_!m3Bk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1368c8cd-fc82-4512-91ec-452948b6294a_1600x889.png 848w, https://substackcdn.com/image/fetch/$s_!m3Bk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1368c8cd-fc82-4512-91ec-452948b6294a_1600x889.png 1272w, https://substackcdn.com/image/fetch/$s_!m3Bk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1368c8cd-fc82-4512-91ec-452948b6294a_1600x889.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>Uber&#8217;s agentic systems, split across four layers</em></figcaption></figure></div><p>Categories of systems:</p><ul><li><p><strong>Internal AI platform. </strong>Built on top of <a href="https://www.uber.com/en-NL/blog/michelangelo-machine-learning-platform/">Michelangelo</a>, Uber&#8217;s ML/AI platform. This layer provides things like a model gateway to proxy to frontier models or internally hosted models.</p></li><li><p><strong>Internal Uber context: </strong>accessing Uber&#8217;s source code, engineering documentation, Slack information, JIRA tickets, etc. These all serve as &#8220;memory&#8221; for agents to use.</p></li><li><p><strong>Industry agents:</strong> Uber&#8217;s approach is to enable the &#8220;latest &amp; greatest&#8221; AI agents for engineers, so they support several tools like Claude Code, GitHub Copilot, Codex, and other clients.</p></li><li><p><strong>Specialized agents: </strong>Uber&#8217;s background agent platform, the test generation platform, code review agents, and more.</p></li><li><p><strong>Engineering enablement: </strong>measuring the efficiency of agents, controlling costs, and educating engineers about which tools to use.</p></li></ul><h2>2. Internal tooling: MCP Gateway, Uber Agent Builder, and the AIFX CLI</h2><p>MCP &#8211; the Model Context Protocol &#8211; has quickly become the standard way to connect agents and data sources with one another. A frequent analogy is that MCP is like the &#8220;USB-C interface for AI agents.&#8221; <em>We published a <a href="https://newsletter.pragmaticengineer.com/p/mcp">deepdive on the MCP protocol</a> and covered <a href="https://newsletter.pragmaticengineer.com/p/mcp-deepdive">real-world MCP server use cases</a>.</em></p><p>Uber put together a &#8220;tiger team&#8221; (a temporary unit that gets things done fast) to design the MCP strategy and build the central MCP gateway, which looks like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kRuX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccdf1000-5c80-46fa-ac8f-9b7ffe6e71c6_1342x1050.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kRuX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccdf1000-5c80-46fa-ac8f-9b7ffe6e71c6_1342x1050.png 424w, https://substackcdn.com/image/fetch/$s_!kRuX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccdf1000-5c80-46fa-ac8f-9b7ffe6e71c6_1342x1050.png 848w, https://substackcdn.com/image/fetch/$s_!kRuX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccdf1000-5c80-46fa-ac8f-9b7ffe6e71c6_1342x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!kRuX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccdf1000-5c80-46fa-ac8f-9b7ffe6e71c6_1342x1050.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kRuX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccdf1000-5c80-46fa-ac8f-9b7ffe6e71c6_1342x1050.png" width="1342" height="1050" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ccdf1000-5c80-46fa-ac8f-9b7ffe6e71c6_1342x1050.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1050,&quot;width&quot;:1342,&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_!kRuX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccdf1000-5c80-46fa-ac8f-9b7ffe6e71c6_1342x1050.png 424w, https://substackcdn.com/image/fetch/$s_!kRuX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccdf1000-5c80-46fa-ac8f-9b7ffe6e71c6_1342x1050.png 848w, https://substackcdn.com/image/fetch/$s_!kRuX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccdf1000-5c80-46fa-ac8f-9b7ffe6e71c6_1342x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!kRuX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccdf1000-5c80-46fa-ac8f-9b7ffe6e71c6_1342x1050.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">Uber&#8217;s MCP gateway</figcaption></figure></div><p>This MCP gateway allows:</p><ul><li><p><strong>Proxy internal endpoints to MCPs</strong>: any internal Thrift, Protobuffer, or HTTP endpoint can be exposed as an MCP server with a simple configuration change. <em>Uber uses the <a href="https://en.wikipedia.org/wiki/Apache_Thrift">Apache Thrift</a> protocol and <a href="https://protobuf.dev/">Protobuffer</a> protocols extensively for backend service communications</em></p></li><li><p><strong>First-party MCPs:</strong> these are exposed as a single, consistent interface</p></li><li><p><strong>Third-party MCPs:</strong> external MCP servers are also exposed via the gateway, which handles all authentication and authorization tasks.</p></li><li><p><strong>Platform concerns:</strong> the gateway takes care of authorization, telemetry, and logging in one central place. Plus, it conveniently offers a unified interface to interact with any MCP.</p></li></ul><p>The MCP gateway also provides:</p><ul><li><p><strong>A registry:</strong> to look up MCP servers, and for devs to be able to register their own.</p></li><li><p><strong>A sandbox:</strong> for devs to experiment with MCP servers without long-winded setups.</p></li></ul><h3>Uber Agent Builder</h3><p>Uber&#8217;s Agent Builder product is a no-code solution to build agents that can access Uber&#8217;s internal data sources (both MCP servers and Uber data sets), and hand off work to other agents:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rvWa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c56a10-d2a9-4a4d-ab42-6963199af187_1374x1400.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rvWa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c56a10-d2a9-4a4d-ab42-6963199af187_1374x1400.png 424w, https://substackcdn.com/image/fetch/$s_!rvWa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c56a10-d2a9-4a4d-ab42-6963199af187_1374x1400.png 848w, https://substackcdn.com/image/fetch/$s_!rvWa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c56a10-d2a9-4a4d-ab42-6963199af187_1374x1400.png 1272w, https://substackcdn.com/image/fetch/$s_!rvWa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c56a10-d2a9-4a4d-ab42-6963199af187_1374x1400.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rvWa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c56a10-d2a9-4a4d-ab42-6963199af187_1374x1400.png" width="1374" height="1400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e1c56a10-d2a9-4a4d-ab42-6963199af187_1374x1400.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1400,&quot;width&quot;:1374,&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_!rvWa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c56a10-d2a9-4a4d-ab42-6963199af187_1374x1400.png 424w, https://substackcdn.com/image/fetch/$s_!rvWa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c56a10-d2a9-4a4d-ab42-6963199af187_1374x1400.png 848w, https://substackcdn.com/image/fetch/$s_!rvWa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c56a10-d2a9-4a4d-ab42-6963199af187_1374x1400.png 1272w, https://substackcdn.com/image/fetch/$s_!rvWa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c56a10-d2a9-4a4d-ab42-6963199af187_1374x1400.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>Uber&#8217;s Agent Builder: a no-code experience to build agents</em></figcaption></figure></div><p>The platform includes a tool called Agent Studio, where multi-agent workflows can be visualized, debugged, traced, versioned, and evaluated. This is how it looks:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IfQh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfa141c4-411e-4b23-965a-cb4389588bb2_2048x1324.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IfQh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfa141c4-411e-4b23-965a-cb4389588bb2_2048x1324.jpeg 424w, https://substackcdn.com/image/fetch/$s_!IfQh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfa141c4-411e-4b23-965a-cb4389588bb2_2048x1324.jpeg 848w, https://substackcdn.com/image/fetch/$s_!IfQh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfa141c4-411e-4b23-965a-cb4389588bb2_2048x1324.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!IfQh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfa141c4-411e-4b23-965a-cb4389588bb2_2048x1324.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IfQh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfa141c4-411e-4b23-965a-cb4389588bb2_2048x1324.jpeg" width="1456" height="941" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dfa141c4-411e-4b23-965a-cb4389588bb2_2048x1324.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:941,&quot;width&quot;:1456,&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_!IfQh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfa141c4-411e-4b23-965a-cb4389588bb2_2048x1324.jpeg 424w, https://substackcdn.com/image/fetch/$s_!IfQh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfa141c4-411e-4b23-965a-cb4389588bb2_2048x1324.jpeg 848w, https://substackcdn.com/image/fetch/$s_!IfQh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfa141c4-411e-4b23-965a-cb4389588bb2_2048x1324.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!IfQh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfa141c4-411e-4b23-965a-cb4389588bb2_2048x1324.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">Uber&#8217;s Agent Studio: a no-code UI to create workflows using AI agents</figcaption></figure></div><p>The agents built in Agent Builder become discoverable through a registry:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7vu4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcad1a604-6dd9-47a4-bb40-34013138a9b0_1600x1010.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7vu4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcad1a604-6dd9-47a4-bb40-34013138a9b0_1600x1010.png 424w, https://substackcdn.com/image/fetch/$s_!7vu4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcad1a604-6dd9-47a4-bb40-34013138a9b0_1600x1010.png 848w, https://substackcdn.com/image/fetch/$s_!7vu4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcad1a604-6dd9-47a4-bb40-34013138a9b0_1600x1010.png 1272w, https://substackcdn.com/image/fetch/$s_!7vu4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcad1a604-6dd9-47a4-bb40-34013138a9b0_1600x1010.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7vu4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcad1a604-6dd9-47a4-bb40-34013138a9b0_1600x1010.png" width="1456" height="919" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cad1a604-6dd9-47a4-bb40-34013138a9b0_1600x1010.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:919,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:&quot;Screenshot 2025-09-22 at 9.42.44&#8239;PM.png&quot;,&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="" title="Screenshot 2025-09-22 at 9.42.44&#8239;PM.png" srcset="https://substackcdn.com/image/fetch/$s_!7vu4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcad1a604-6dd9-47a4-bb40-34013138a9b0_1600x1010.png 424w, https://substackcdn.com/image/fetch/$s_!7vu4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcad1a604-6dd9-47a4-bb40-34013138a9b0_1600x1010.png 848w, https://substackcdn.com/image/fetch/$s_!7vu4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcad1a604-6dd9-47a4-bb40-34013138a9b0_1600x1010.png 1272w, https://substackcdn.com/image/fetch/$s_!7vu4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcad1a604-6dd9-47a4-bb40-34013138a9b0_1600x1010.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">Uber&#8217;s Agent Builder registry, where existing agents can be discovered, used, and copied</figcaption></figure></div><h3>Accessing agents via the AIFX CLI</h3><p>Uber&#8217;s Developer Experience platform team had a few issues with deploying AI agent tooling at scale:</p><ul><li><p>How does the company update all clients when a new version comes out? For example, if a new version of Cursor is released, how can they ensure all devs use the latest one?</p></li><li><p>How can the clients be configured with helpful defaults? Uber&#8217;s Dev Platform team might have found better defaults for tools, like more helpful models. How are these rolled out to all devs?</p></li><li><p>How can devs easily discover MCP servers and configure them for agents?</p></li><li><p>How can agents connect to Uber&#8217;s background task infrastructure?</p></li></ul><p>The Dev Experience team built the AIFX CLI, which is the AI tooling command line used by all engineers there. Here&#8217;s what it looks like:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!doa7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701562a8-46ee-4615-b37b-394b4b9231d6_1046x672.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!doa7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701562a8-46ee-4615-b37b-394b4b9231d6_1046x672.png 424w, https://substackcdn.com/image/fetch/$s_!doa7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701562a8-46ee-4615-b37b-394b4b9231d6_1046x672.png 848w, https://substackcdn.com/image/fetch/$s_!doa7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701562a8-46ee-4615-b37b-394b4b9231d6_1046x672.png 1272w, https://substackcdn.com/image/fetch/$s_!doa7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701562a8-46ee-4615-b37b-394b4b9231d6_1046x672.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!doa7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701562a8-46ee-4615-b37b-394b4b9231d6_1046x672.png" width="1046" height="672" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/701562a8-46ee-4615-b37b-394b4b9231d6_1046x672.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:672,&quot;width&quot;:1046,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:&quot;Screenshot 2026-02-09 at 11.30.59&#8239;AM.png&quot;,&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="" title="Screenshot 2026-02-09 at 11.30.59&#8239;AM.png" srcset="https://substackcdn.com/image/fetch/$s_!doa7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701562a8-46ee-4615-b37b-394b4b9231d6_1046x672.png 424w, https://substackcdn.com/image/fetch/$s_!doa7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701562a8-46ee-4615-b37b-394b4b9231d6_1046x672.png 848w, https://substackcdn.com/image/fetch/$s_!doa7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701562a8-46ee-4615-b37b-394b4b9231d6_1046x672.png 1272w, https://substackcdn.com/image/fetch/$s_!doa7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701562a8-46ee-4615-b37b-394b4b9231d6_1046x672.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">Uber&#8217;s AIFX command line tool</figcaption></figure></div><p>This tool supports:</p><ul><li><p>Provisioning AI agents (client tools like Claude Code, Codex, Cursor, and others)</p></li><li><p>Finding and using MCP servers</p></li><li><p>Running background agent tasks</p></li><li><p>Updating AI agents and clients to the latest versions</p></li></ul><h2>3. How AI changes developer workflows</h2><p>The traditional way of building software:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!U_r3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4ca227-68fc-4866-b272-ef47d824fa03_1986x876.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!U_r3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4ca227-68fc-4866-b272-ef47d824fa03_1986x876.png 424w, https://substackcdn.com/image/fetch/$s_!U_r3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4ca227-68fc-4866-b272-ef47d824fa03_1986x876.png 848w, https://substackcdn.com/image/fetch/$s_!U_r3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4ca227-68fc-4866-b272-ef47d824fa03_1986x876.png 1272w, https://substackcdn.com/image/fetch/$s_!U_r3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4ca227-68fc-4866-b272-ef47d824fa03_1986x876.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!U_r3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4ca227-68fc-4866-b272-ef47d824fa03_1986x876.png" width="1456" height="642" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cb4ca227-68fc-4866-b272-ef47d824fa03_1986x876.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:642,&quot;width&quot;:1456,&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_!U_r3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4ca227-68fc-4866-b272-ef47d824fa03_1986x876.png 424w, https://substackcdn.com/image/fetch/$s_!U_r3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4ca227-68fc-4866-b272-ef47d824fa03_1986x876.png 848w, https://substackcdn.com/image/fetch/$s_!U_r3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4ca227-68fc-4866-b272-ef47d824fa03_1986x876.png 1272w, https://substackcdn.com/image/fetch/$s_!U_r3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4ca227-68fc-4866-b272-ef47d824fa03_1986x876.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>Pre-AI software development workflow. Most time is spent inside an IDE</em></figcaption></figure></div><p>Devs spent some time planning, most time writing code (code authorship), and then some time in code review.</p><p>The first AI agent-based workflows were single-threaded: devs worked with a single agent in the command line or inside their IDE:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZGpD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24000091-eda4-4b36-b26d-edddbf33b93c_1970x876.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZGpD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24000091-eda4-4b36-b26d-edddbf33b93c_1970x876.png 424w, https://substackcdn.com/image/fetch/$s_!ZGpD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24000091-eda4-4b36-b26d-edddbf33b93c_1970x876.png 848w, https://substackcdn.com/image/fetch/$s_!ZGpD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24000091-eda4-4b36-b26d-edddbf33b93c_1970x876.png 1272w, https://substackcdn.com/image/fetch/$s_!ZGpD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24000091-eda4-4b36-b26d-edddbf33b93c_1970x876.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZGpD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24000091-eda4-4b36-b26d-edddbf33b93c_1970x876.png" width="1456" height="647" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/24000091-eda4-4b36-b26d-edddbf33b93c_1970x876.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:647,&quot;width&quot;:1456,&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_!ZGpD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24000091-eda4-4b36-b26d-edddbf33b93c_1970x876.png 424w, https://substackcdn.com/image/fetch/$s_!ZGpD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24000091-eda4-4b36-b26d-edddbf33b93c_1970x876.png 848w, https://substackcdn.com/image/fetch/$s_!ZGpD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24000091-eda4-4b36-b26d-edddbf33b93c_1970x876.png 1272w, https://substackcdn.com/image/fetch/$s_!ZGpD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24000091-eda4-4b36-b26d-edddbf33b93c_1970x876.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>Early agentic workflows: working with an agent and approving plans, giving commands and corrections</em></figcaption></figure></div><p>At Uber, the latest workflows which many software engineers follow are pretty different, involving parallel agents, each kicked off with their own tasks:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BvlU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F898accd3-5c2d-4a6b-94bd-11843968d5ce_1996x766.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BvlU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F898accd3-5c2d-4a6b-94bd-11843968d5ce_1996x766.png 424w, https://substackcdn.com/image/fetch/$s_!BvlU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F898accd3-5c2d-4a6b-94bd-11843968d5ce_1996x766.png 848w, https://substackcdn.com/image/fetch/$s_!BvlU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F898accd3-5c2d-4a6b-94bd-11843968d5ce_1996x766.png 1272w, https://substackcdn.com/image/fetch/$s_!BvlU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F898accd3-5c2d-4a6b-94bd-11843968d5ce_1996x766.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BvlU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F898accd3-5c2d-4a6b-94bd-11843968d5ce_1996x766.png" width="1456" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/898accd3-5c2d-4a6b-94bd-11843968d5ce_1996x766.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:1456,&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_!BvlU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F898accd3-5c2d-4a6b-94bd-11843968d5ce_1996x766.png 424w, https://substackcdn.com/image/fetch/$s_!BvlU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F898accd3-5c2d-4a6b-94bd-11843968d5ce_1996x766.png 848w, https://substackcdn.com/image/fetch/$s_!BvlU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F898accd3-5c2d-4a6b-94bd-11843968d5ce_1996x766.png 1272w, https://substackcdn.com/image/fetch/$s_!BvlU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F898accd3-5c2d-4a6b-94bd-11843968d5ce_1996x766.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">Latest AI agent-based workflows look pretty different</figcaption></figure></div><p>As Ty explained, running multiple agents comes naturally to most devs:</p><blockquote><p>&#8220;[Once you start using agents]  as an engineer, you&#8217;re giving a prompt and waiting for something. While it&#8217;s running and you&#8217;re waiting you&#8217;re thinking: &#8216;What am I going to do? Have a coffee or browse Reddit? Might as well kick off another background agent.&#8217;</p><p>And so, engineers get into this mode of running several agents at once, right? Both us [at Uber] and a lot of the industry is trying to push towards this.&#8221;</p></blockquote><h2>4. Minion: running background agents at scale</h2>
      <p>
          <a href="https://newsletter.pragmaticengineer.com/p/how-uber-uses-ai-for-development">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[AI Tooling for Software Engineers in 2026]]></title><description><![CDATA[Claude Code dominates tool usage, leaders are more positive about AI than engineers, staff+ engineers are the biggest users of AI agents, and more. Exclusive data and analysis from 900+ respondents]]></description><link>https://newsletter.pragmaticengineer.com/p/ai-tooling-2026</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/ai-tooling-2026</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 03 Mar 2026 16:05:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ZjLB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53356907-6657-4146-894a-417095d3b665_1194x896.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Which AI tools are software engineers using, and what do they really think of them? We asked The Pragmatic Engineer subscribers, and nearly a thousand of you have shared your experiences of using AI tools for work. The survey ran for weeks, between 27 January and 17 February 2026.</p><p>This article provides a high-level overview of those findings from our latest AI tooling survey. <em>Thank you to everyone who participated!</em></p><p>There are plenty of interesting details, most notably, validation of <em>just</em> how much Anthropic and Claude Code have risen to dominate tooling usage. Claude Code is today nearly as widespread as GitHub Copilot was in <a href="https://newsletter.pragmaticengineer.com/p/ai-coding-tools">our survey three years ago</a> (in the spring of 2023) &#8211; which shows how fast the AI market moves.</p><p>In today&#8217;s issue, we cover:</p><ol><li><p><strong>Interesting findings:</strong> Claude Code has rocketed to #1 in just eight months, AI is fully mainstream with 95% weekly usage among respondents, and more.</p></li><li><p><strong>Most-used AI tools:</strong> Claude Code leads the pack, followed by chatbots and GitHub Copilot. Cursor&#8217;s rising fast, and newcomers like Codex and Antigravity are gaining traction. Most engineers juggle two to four tools at once.</p></li><li><p><strong>Popular models:</strong> Anthropic&#8217;s Opus and Sonnet models dominate coding tasks by a wide margin, with more mentions than all others combined.</p></li><li><p><strong>AI trends: mainstream adoption achieved.</strong> 95% of respondents report using AI tools at least weekly, 75% use AI for half or more of their work, and 56% report doing 70%+ of their engineering work with AI.</p></li><li><p><strong>AI agent usage rising</strong>: 55% of respondents now regularly use AI agents, with staff+ engineers leading adoption on 63.5% usage in the survey results. Agent users are twice as excited about AI as non-users are.</p></li><li><p><strong>Company size and tool usage:</strong> smaller places overwhelmingly favor Claude Code (75% at the tiniest businesses), while large enterprises default to GitHub Copilot. This popularity is probably down to enterprise procurement preferences &#8211; and Microsoft&#8217;s enterprise marketing efforts.</p></li><li><p><strong>Tools engineers love:</strong> Claude Code is the most loved tool at 46%, far ahead of Cursor on 19% and GitHub Copilot at 9%. Senior leaders are especially enthusiastic about Claude Code.</p></li><li><p><strong>Demographics</strong>: Overview of who took part in the survey.</p></li></ol><p><em>Full subscribers also have access to a longer, 35-page report with additional details - linked at the end of this article.</em></p><h2>1. Interesting findings</h2><p>Here are my ten personal, most-interesting findings from this survey:</p><ol><li><p><strong>Claude Code has gone from zero to be the #1 tool in only eight months. </strong>Released in May 2025, it&#8217;s already the most-used AI coding tool, overtaking GitHub Copilot and Cursor.</p></li><li><p><strong>AI is now mainstream.</strong> 95% of respondents use AI tools at least weekly, or more often, and 75% use AI for at least half their software engineering work. Among readers of The Pragmatic Engineer, it seems the question is no longer whether to use AI in day-to-day work, but <em>which</em> tools to use.</p></li><li><p><strong>Cursor is catching up fast on GitHub Copilot. </strong>As much as we hear about companies dropping Cursor for Claude Code, Cursor is doing more than fine, growing in mentions 35% since our previous survey nine months ago.</p></li><li><p><strong>Most engineers juggle multiple AI tools.</strong> 70% use between two and four tools simultaneously, while 15% use five or more.</p></li><li><p><strong>Staff+ engineers are the heaviest agent users.</strong> 63.5% use agents regularly; more than regular engineers (49.7%), engineering managers (46.1%), and directors/VPs (51.9%).</p></li><li><p><strong>Codex is seeing explosive early growth.</strong> Despite not existing during the last survey, OpenAI&#8217;s Codex already has 60% of Cursor&#8217;s usage (!!)</p></li><li><p><strong>Using agents correlates strongly with being positive about AI. </strong>People using agents are nearly twice as likely to feel excited about AI while non-users are twice as likely to be skeptical.</p></li><li><p><strong>Company size influences tool choice more than preference.</strong> Huge companies (10K+) more likely to use Copilot (56%), tiny startups mostly go with Claude Code (75%) and Cursor (42%). It seems like enterprise procurement, not individual preference, is behind this divergence.</p></li><li><p><strong>A tight chatbot race. </strong>ChatGPT, Gemini, and Claude as standalone chatbots have nearly equal numbers of mentions, suggesting there&#8217;s no clear winner outside of coding-specific tools among software engineers.</p></li><li><p><strong>Directors and senior leaders are especially into Claude Code</strong>. The survey finds this tool is twice as popular with these folks as it is at less senior levels, while Cursor gets less love as seniority increases.</p></li></ol><p>Let&#8217;s jump into some of the data:</p><h2>2. Most-used AI tools</h2><p>Just eight months after its release, Claude Code is already the most-used tool, overtaking both GitHub Copilot and Cursor:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZjLB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53356907-6657-4146-894a-417095d3b665_1194x896.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZjLB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53356907-6657-4146-894a-417095d3b665_1194x896.png 424w, https://substackcdn.com/image/fetch/$s_!ZjLB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53356907-6657-4146-894a-417095d3b665_1194x896.png 848w, https://substackcdn.com/image/fetch/$s_!ZjLB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53356907-6657-4146-894a-417095d3b665_1194x896.png 1272w, https://substackcdn.com/image/fetch/$s_!ZjLB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53356907-6657-4146-894a-417095d3b665_1194x896.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZjLB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53356907-6657-4146-894a-417095d3b665_1194x896.png" width="1194" height="896" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/53356907-6657-4146-894a-417095d3b665_1194x896.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:896,&quot;width&quot;:1194,&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_!ZjLB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53356907-6657-4146-894a-417095d3b665_1194x896.png 424w, https://substackcdn.com/image/fetch/$s_!ZjLB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53356907-6657-4146-894a-417095d3b665_1194x896.png 848w, https://substackcdn.com/image/fetch/$s_!ZjLB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53356907-6657-4146-894a-417095d3b665_1194x896.png 1272w, https://substackcdn.com/image/fetch/$s_!ZjLB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53356907-6657-4146-894a-417095d3b665_1194x896.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>Most-used AI tools by mentions. Respondents could select several tools</em></figcaption></figure></div><p>Tools mentioned, in order of popularity:</p><ol><li><p><a href="https://code.claude.com/docs/en/overview">Claude Code</a>: a terminal-first coding agent from Anthropic. <em>We cover its history in the deepdive, <a href="https://newsletter.pragmaticengineer.com/p/how-claude-code-is-built">How Claude Code is built</a></em></p></li><li><p>Chatbots: ChatGPT, Claude, Gemini, and others</p></li><li><p><a href="https://github.com/features/copilot">GitHub Copilot</a>: launched in 2021, it&#8217;s the &#8220;oldest&#8221; AI coding tool on this list</p></li><li><p><a href="https://cursor.com/">Cursor</a>: agent-powered coding IDE. Learn <em>more about it in our deepdive, <a href="https://newsletter.pragmaticengineer.com/p/cursor">Real-world engineering challenges: building Cursor</a>.</em></p></li><li><p><a href="https://openai.com/codex/">Codex</a>: OpenAI&#8217;s AI coding agent.<em> We recently covered <a href="https://newsletter.pragmaticengineer.com/p/how-codex-is-built">how Codex is built</a></em></p></li><li><p><a href="https://github.com/google-gemini/gemini-cli">Gemini CLI</a>: Google&#8217;s command line agent</p></li><li><p><a href="https://opencode.ai/">OpenCode</a>: the most popular open source coding agent, where you can swap out the model being used, sidestepping vendor lock-in</p></li><li><p><a href="https://antigravity.google/">Antigravity</a>: Google hired the original team behind Windsurf and launched its own agentic IDE</p></li><li><p><a href="https://www.jetbrains.com/junie/">JetBrains Junie</a>: the AI coding agent by JetBrains</p></li><li><p><a href="https://zed.dev/">Zed</a>: a fast editor with agentic workflows</p></li><li><p><a href="https://windsurf.com/">Windsurf</a>: when Google acquihired the team, it did not buy the product. An AI IDE, now owned and operated by Cognition</p></li><li><p><a href="https://ampcode.com/">Amp</a>: a model-agnostic coding agent. A free version is supported by ads</p></li><li><p><a href="https://www.augmentcode.com/">Augment Code</a>: an enterprise-focused coding agent</p></li><li><p><a href="https://factory.ai/">Factory</a>: agent-native software development, which calls agents &#8220;droids.&#8221;</p></li></ol><p>It&#8217;s interesting to compare how people answered the same question just nine months ago, last May:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2X9D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae0abef-cbc2-4a31-ba11-6a1ae1d9f443_1288x922.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2X9D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae0abef-cbc2-4a31-ba11-6a1ae1d9f443_1288x922.png 424w, https://substackcdn.com/image/fetch/$s_!2X9D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae0abef-cbc2-4a31-ba11-6a1ae1d9f443_1288x922.png 848w, https://substackcdn.com/image/fetch/$s_!2X9D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae0abef-cbc2-4a31-ba11-6a1ae1d9f443_1288x922.png 1272w, https://substackcdn.com/image/fetch/$s_!2X9D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae0abef-cbc2-4a31-ba11-6a1ae1d9f443_1288x922.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2X9D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae0abef-cbc2-4a31-ba11-6a1ae1d9f443_1288x922.png" width="1288" height="922" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ae0abef-cbc2-4a31-ba11-6a1ae1d9f443_1288x922.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:922,&quot;width&quot;:1288,&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_!2X9D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae0abef-cbc2-4a31-ba11-6a1ae1d9f443_1288x922.png 424w, https://substackcdn.com/image/fetch/$s_!2X9D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae0abef-cbc2-4a31-ba11-6a1ae1d9f443_1288x922.png 848w, https://substackcdn.com/image/fetch/$s_!2X9D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae0abef-cbc2-4a31-ba11-6a1ae1d9f443_1288x922.png 1272w, https://substackcdn.com/image/fetch/$s_!2X9D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae0abef-cbc2-4a31-ba11-6a1ae1d9f443_1288x922.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">Tool usage, 9 months apart: The rise of Claude Code is clear, jumping from nowhere to number one by this February</figcaption></figure></div><p>Notable trends:</p><ul><li><p><strong>Claude Code has massive momentum and is already the market leader. </strong>Since being released in May 2025, it has become the most-used AI coding tool among survey respondents. Anecdotally, I&#8217;ve heard several teams that have been Cursor power users are introducing Claude Code with great success (while still keeping Cursor in-place.)</p></li><li><p><strong>Cursor has grown circa 35% in nine months and now threatens GitHub&#8217;s popularity. </strong>In this survey, 35% more respondents mention using Cursor than in our previous research, last May. Such growth is impressive: at this rate, Cursor will have more users than GitHub in 6-9 months!</p></li><li><p><strong>Chatbot usage remains high. </strong>Combined mentions for ChatGPT, Claude, Gemini, Perplexity, and others used outside of coding apps are still higher than for any other tool except Claude Code. For context, the most-mentioned chatbot (ChatGPT, 107 times) only has as many as Gemini CLI (also 107).</p></li><li><p><strong>GitHub Copilot usage stable. </strong>Nine months ago, 46% of respondents said they used GitHub Copilot. Since then, it&#8217;s barely risen.</p></li><li><p><strong>Explosive growth for Codex. </strong>OpenAI&#8217;s Codex wasn&#8217;t available during our last survey. But it now already has 60% of Cursor&#8217;s usage(!), and could be <a href="https://newsletter.pragmaticengineer.com/p/how-codex-is-built">growing even faster</a> since this survey.</p></li><li><p><strong>Up-and-coming tools: OpenCode, Gemini CLI, Antigravity. </strong>None of these had launched nine months ago, but today they&#8217;re used by around 10% of respondents &#8211; no small feat!</p></li><li><p><strong>Tools growing more than before:</strong> The likes of Zed, Windsurf, Amp, Augment Code, and Factory appear less often in these results, but all are mentioned more by respondents than they were nine months ago.</p></li></ul><h3>Chatbot usage: ChatGPT leads &#8211; just about</h3><p>Here&#8217;s how mentions of chatbot usage line up in our survey:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xu9N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fa96e3-08dc-4b2e-8d23-6b410ab476ea_1162x956.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xu9N!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fa96e3-08dc-4b2e-8d23-6b410ab476ea_1162x956.png 424w, https://substackcdn.com/image/fetch/$s_!xu9N!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fa96e3-08dc-4b2e-8d23-6b410ab476ea_1162x956.png 848w, https://substackcdn.com/image/fetch/$s_!xu9N!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fa96e3-08dc-4b2e-8d23-6b410ab476ea_1162x956.png 1272w, https://substackcdn.com/image/fetch/$s_!xu9N!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fa96e3-08dc-4b2e-8d23-6b410ab476ea_1162x956.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xu9N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fa96e3-08dc-4b2e-8d23-6b410ab476ea_1162x956.png" width="1162" height="956" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/98fa96e3-08dc-4b2e-8d23-6b410ab476ea_1162x956.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:956,&quot;width&quot;:1162,&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_!xu9N!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fa96e3-08dc-4b2e-8d23-6b410ab476ea_1162x956.png 424w, https://substackcdn.com/image/fetch/$s_!xu9N!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fa96e3-08dc-4b2e-8d23-6b410ab476ea_1162x956.png 848w, https://substackcdn.com/image/fetch/$s_!xu9N!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fa96e3-08dc-4b2e-8d23-6b410ab476ea_1162x956.png 1272w, https://substackcdn.com/image/fetch/$s_!xu9N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fa96e3-08dc-4b2e-8d23-6b410ab476ea_1162x956.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">Chatbots: ChatGPT, Gemini, and Claude have almost equal numbers of mentions</figcaption></figure></div><h3>Tool usage: multi-tool</h3><p>Most tech professionals use between two and four AI tools.<strong> </strong>An interesting detail is how many different ones are mentioned by respondents:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PvBu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf19349d-1894-462e-8064-6edaa917bd90_1192x1046.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PvBu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf19349d-1894-462e-8064-6edaa917bd90_1192x1046.png 424w, https://substackcdn.com/image/fetch/$s_!PvBu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf19349d-1894-462e-8064-6edaa917bd90_1192x1046.png 848w, https://substackcdn.com/image/fetch/$s_!PvBu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf19349d-1894-462e-8064-6edaa917bd90_1192x1046.png 1272w, https://substackcdn.com/image/fetch/$s_!PvBu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf19349d-1894-462e-8064-6edaa917bd90_1192x1046.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PvBu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf19349d-1894-462e-8064-6edaa917bd90_1192x1046.png" width="1192" height="1046" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cf19349d-1894-462e-8064-6edaa917bd90_1192x1046.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1046,&quot;width&quot;:1192,&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_!PvBu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf19349d-1894-462e-8064-6edaa917bd90_1192x1046.png 424w, https://substackcdn.com/image/fetch/$s_!PvBu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf19349d-1894-462e-8064-6edaa917bd90_1192x1046.png 848w, https://substackcdn.com/image/fetch/$s_!PvBu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf19349d-1894-462e-8064-6edaa917bd90_1192x1046.png 1272w, https://substackcdn.com/image/fetch/$s_!PvBu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf19349d-1894-462e-8064-6edaa917bd90_1192x1046.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>Number of AI tools mentioned per respondent</em></figcaption></figure></div><p>Noteworthy details:</p><ul><li><p><strong>70%</strong> of survey participants mention using between two and four tools</p></li><li><p><strong>15%</strong> use a single tool</p></li><li><p><strong>15%</strong> are using 5 or more</p></li></ul><h2>3. Popular models</h2><p>Anthropic&#8217;s Opus and Sonnet dominate the ranking of models used for coding.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lQDW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9785df-af0b-4ea4-a2e0-451bc771e6fe_1044x946.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lQDW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9785df-af0b-4ea4-a2e0-451bc771e6fe_1044x946.png 424w, https://substackcdn.com/image/fetch/$s_!lQDW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9785df-af0b-4ea4-a2e0-451bc771e6fe_1044x946.png 848w, https://substackcdn.com/image/fetch/$s_!lQDW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9785df-af0b-4ea4-a2e0-451bc771e6fe_1044x946.png 1272w, https://substackcdn.com/image/fetch/$s_!lQDW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9785df-af0b-4ea4-a2e0-451bc771e6fe_1044x946.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lQDW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9785df-af0b-4ea4-a2e0-451bc771e6fe_1044x946.png" width="1044" height="946" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ae9785df-af0b-4ea4-a2e0-451bc771e6fe_1044x946.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:946,&quot;width&quot;:1044,&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_!lQDW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9785df-af0b-4ea4-a2e0-451bc771e6fe_1044x946.png 424w, https://substackcdn.com/image/fetch/$s_!lQDW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9785df-af0b-4ea4-a2e0-451bc771e6fe_1044x946.png 848w, https://substackcdn.com/image/fetch/$s_!lQDW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9785df-af0b-4ea4-a2e0-451bc771e6fe_1044x946.png 1272w, https://substackcdn.com/image/fetch/$s_!lQDW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9785df-af0b-4ea4-a2e0-451bc771e6fe_1044x946.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>Models used for coding tasks in our survey results</em></figcaption></figure></div><p>This is not even a contest: Opus 4.5 and Sonnet 4.5 (latest models at the start of our survey) come up more often than all other models, combined. Anthropic has become the go-to model developer for coding-related work &#8211; for now, that is. <em>When this survey launched, Opus 4.6, Sonnet 4.6, and GPT-5.3 were not yet out.</em></p><p><strong>Around 1 in 8 respondents say they just use whatever model is the default at their company. </strong>This is interesting to note: these are likely folks who might not bother changing default settings, and just go with whatever&#8217;s available. If the default model is powerful enough, that&#8217;s fine, but if the company&#8217;s default is a cheaper, less capable model, then these people could face a more frustrating experience than those who get to choose what they use.</p><p> In the &#8220;other&#8221; category of models, some other mentions include:</p><ul><li><p>Cursor&#8217;s custom Composer/Composer-1 model, and its &#8220;Cursor Auto&#8221; auto-select model</p></li><li><p>Kimi/Kimi K2.5 &#8212; Moonshot</p></li><li><p>DeepSeek model variants like R1, V3.2, Coder</p></li><li><p>Alibaba&#8217;s Qwen/Qwen3</p></li><li><p>xAI&#8217;s Grok</p></li><li><p>Various Mistral models</p></li></ul><h2>4. AI trends: Mainstream adoption achieved</h2><p>How often do people use AI tools? Very often, as it turns out; 95% of respondents are using them weekly, at a minimum:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3ZKE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa50f1d-b9cc-4bb8-aebc-9f1f64ba66cc_1248x1240.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3ZKE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa50f1d-b9cc-4bb8-aebc-9f1f64ba66cc_1248x1240.png 424w, https://substackcdn.com/image/fetch/$s_!3ZKE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa50f1d-b9cc-4bb8-aebc-9f1f64ba66cc_1248x1240.png 848w, https://substackcdn.com/image/fetch/$s_!3ZKE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa50f1d-b9cc-4bb8-aebc-9f1f64ba66cc_1248x1240.png 1272w, https://substackcdn.com/image/fetch/$s_!3ZKE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa50f1d-b9cc-4bb8-aebc-9f1f64ba66cc_1248x1240.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3ZKE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa50f1d-b9cc-4bb8-aebc-9f1f64ba66cc_1248x1240.png" width="1248" height="1240" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7fa50f1d-b9cc-4bb8-aebc-9f1f64ba66cc_1248x1240.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1240,&quot;width&quot;:1248,&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_!3ZKE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa50f1d-b9cc-4bb8-aebc-9f1f64ba66cc_1248x1240.png 424w, https://substackcdn.com/image/fetch/$s_!3ZKE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa50f1d-b9cc-4bb8-aebc-9f1f64ba66cc_1248x1240.png 848w, https://substackcdn.com/image/fetch/$s_!3ZKE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa50f1d-b9cc-4bb8-aebc-9f1f64ba66cc_1248x1240.png 1272w, https://substackcdn.com/image/fetch/$s_!3ZKE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa50f1d-b9cc-4bb8-aebc-9f1f64ba66cc_1248x1240.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>95% use AI tools weekly or more frequently; only 2.1% don&#8217;t use them at all</em></figcaption></figure></div><p>It&#8217;s worth reflecting on this data in relation to insights presented by Laura Tacho <a href="https://newsletter.pragmaticengineer.com/i/189035949/1-data-vs-hype-how-orgs-actually-win-with-ai">at the recent Pragmatic Summit in San Francisco:</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!foSN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd62304a1-218b-43fb-ab71-620f6824c517_1594x896.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!foSN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd62304a1-218b-43fb-ab71-620f6824c517_1594x896.png 424w, https://substackcdn.com/image/fetch/$s_!foSN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd62304a1-218b-43fb-ab71-620f6824c517_1594x896.png 848w, https://substackcdn.com/image/fetch/$s_!foSN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd62304a1-218b-43fb-ab71-620f6824c517_1594x896.png 1272w, https://substackcdn.com/image/fetch/$s_!foSN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd62304a1-218b-43fb-ab71-620f6824c517_1594x896.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!foSN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd62304a1-218b-43fb-ab71-620f6824c517_1594x896.png" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d62304a1-218b-43fb-ab71-620f6824c517_1594x896.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&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_!foSN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd62304a1-218b-43fb-ab71-620f6824c517_1594x896.png 424w, https://substackcdn.com/image/fetch/$s_!foSN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd62304a1-218b-43fb-ab71-620f6824c517_1594x896.png 848w, https://substackcdn.com/image/fetch/$s_!foSN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd62304a1-218b-43fb-ab71-620f6824c517_1594x896.png 1272w, https://substackcdn.com/image/fetch/$s_!foSN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd62304a1-218b-43fb-ab71-620f6824c517_1594x896.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The Pragmatic Engineer data is from 900 respondents. DX&#8217;s data is based on 121,000 respondents</figcaption></figure></div><p><strong>It seems that AI is now mainstream in software engineering. </strong>Anecdotally, this has been my sense since the beginning of the year: everyone whom I talk with is using AI tooling on a roughly daily basis. Now, there&#8217;s data to prove it.</p><h3>How much software engineering work gets done with AI?</h3><p>This year, we asked readers to estimate the percentage of their software engineering work that&#8217;s done using AI. The results:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IVYB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1978e2b6-e2bf-4c57-aedf-c3e803773ea5_1096x920.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IVYB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1978e2b6-e2bf-4c57-aedf-c3e803773ea5_1096x920.png 424w, https://substackcdn.com/image/fetch/$s_!IVYB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1978e2b6-e2bf-4c57-aedf-c3e803773ea5_1096x920.png 848w, https://substackcdn.com/image/fetch/$s_!IVYB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1978e2b6-e2bf-4c57-aedf-c3e803773ea5_1096x920.png 1272w, https://substackcdn.com/image/fetch/$s_!IVYB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1978e2b6-e2bf-4c57-aedf-c3e803773ea5_1096x920.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IVYB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1978e2b6-e2bf-4c57-aedf-c3e803773ea5_1096x920.png" width="1096" height="920" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1978e2b6-e2bf-4c57-aedf-c3e803773ea5_1096x920.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:920,&quot;width&quot;:1096,&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_!IVYB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1978e2b6-e2bf-4c57-aedf-c3e803773ea5_1096x920.png 424w, https://substackcdn.com/image/fetch/$s_!IVYB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1978e2b6-e2bf-4c57-aedf-c3e803773ea5_1096x920.png 848w, https://substackcdn.com/image/fetch/$s_!IVYB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1978e2b6-e2bf-4c57-aedf-c3e803773ea5_1096x920.png 1272w, https://substackcdn.com/image/fetch/$s_!IVYB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1978e2b6-e2bf-4c57-aedf-c3e803773ea5_1096x920.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>Percentage of work done using AI</em></figcaption></figure></div><p>The data show that AI is embedded in the workflows of participants in our survey:</p><ul><li><p><strong>Only 25% of respondents </strong>use AI for less than 40% of their work</p></li><li><p><strong>56% </strong>do 70% or more of their work using AI</p></li><li><p><strong>75% </strong>use AI for at least half of their software engineering work</p></li></ul><h2>5. AI agent usage rising</h2><p>Eighteen months ago, AI usage was mostly for code generation and tab completion. There were <a href="https://newsletter.pragmaticengineer.com/i/146678491/how-developers-use-ai-tools">one or two respondents</a> who experimented with early AI agents in March 2024, as something equivalent to a junior software engineer.</p><p><strong>This year, 55% say they regularly use AI agents</strong>. This is 507 people, a massive jump!</p><p>The most common use cases for agents:</p><ul><li><p>Code review and code validation</p></li><li><p>Automating manual / annoying tasks</p></li><li><p>Bug fixing / investigating bugs</p></li><li><p>Code investigation</p></li><li><p>Debugging</p></li><li><p>&#8220;Crafting&#8221; code, or &#8220;weaving&#8221; it together with the agent</p></li></ul><p>Below is a typical-enough comment from one software engineer who uses agents at a smaller company:</p><blockquote><p>&#8220;I use agents for pretty much all coding work, mostly prompting with Cursor Chat. I use it for code investigation, bug investigation, creating commits and pull requests. It&#8217;s my tool for reviewing code, I am always still in the loop. Almost all of my AI-written code is still reviewed and &#8216;crafted&#8217;. When using it for code review, I find it helpful to chat with and gain understanding, rather than letting it loose on code review. So, I use it for everything, but I am still very much in the loop.&#8221;</p></blockquote><p>A common arrangement in the survey is the split-screen setup: a terminal with Claude Code open to drive work, and an IDE also open to review changes made by the agent.</p><p>The tools mentioned by those who regularly use AI agents split almost identically to the broader survey results:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KCu-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfdcbfe-8256-4ea8-acec-1ab516fcc905_988x822.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KCu-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfdcbfe-8256-4ea8-acec-1ab516fcc905_988x822.png 424w, https://substackcdn.com/image/fetch/$s_!KCu-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfdcbfe-8256-4ea8-acec-1ab516fcc905_988x822.png 848w, https://substackcdn.com/image/fetch/$s_!KCu-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfdcbfe-8256-4ea8-acec-1ab516fcc905_988x822.png 1272w, https://substackcdn.com/image/fetch/$s_!KCu-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfdcbfe-8256-4ea8-acec-1ab516fcc905_988x822.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KCu-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfdcbfe-8256-4ea8-acec-1ab516fcc905_988x822.png" width="988" height="822" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5bfdcbfe-8256-4ea8-acec-1ab516fcc905_988x822.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:822,&quot;width&quot;:988,&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_!KCu-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfdcbfe-8256-4ea8-acec-1ab516fcc905_988x822.png 424w, https://substackcdn.com/image/fetch/$s_!KCu-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfdcbfe-8256-4ea8-acec-1ab516fcc905_988x822.png 848w, https://substackcdn.com/image/fetch/$s_!KCu-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfdcbfe-8256-4ea8-acec-1ab516fcc905_988x822.png 1272w, https://substackcdn.com/image/fetch/$s_!KCu-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bfdcbfe-8256-4ea8-acec-1ab516fcc905_988x822.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>Tool usage by regular users of AI agents. Claude Code is the clear leader (71% usage), followed by GitHub Copilot (46%) and Cursor (39%)</em></figcaption></figure></div><p><strong>Staff+ engineers are the heaviest users of agents. </strong>Here&#8217;s the data on agent usage by experience level:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qPN-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba02fd8f-7afc-4d19-a86f-a38462211c7a_858x982.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qPN-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba02fd8f-7afc-4d19-a86f-a38462211c7a_858x982.png 424w, https://substackcdn.com/image/fetch/$s_!qPN-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba02fd8f-7afc-4d19-a86f-a38462211c7a_858x982.png 848w, https://substackcdn.com/image/fetch/$s_!qPN-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba02fd8f-7afc-4d19-a86f-a38462211c7a_858x982.png 1272w, https://substackcdn.com/image/fetch/$s_!qPN-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba02fd8f-7afc-4d19-a86f-a38462211c7a_858x982.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qPN-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba02fd8f-7afc-4d19-a86f-a38462211c7a_858x982.png" width="858" height="982" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba02fd8f-7afc-4d19-a86f-a38462211c7a_858x982.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:982,&quot;width&quot;:858,&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_!qPN-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba02fd8f-7afc-4d19-a86f-a38462211c7a_858x982.png 424w, https://substackcdn.com/image/fetch/$s_!qPN-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba02fd8f-7afc-4d19-a86f-a38462211c7a_858x982.png 848w, https://substackcdn.com/image/fetch/$s_!qPN-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba02fd8f-7afc-4d19-a86f-a38462211c7a_858x982.png 1272w, https://substackcdn.com/image/fetch/$s_!qPN-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba02fd8f-7afc-4d19-a86f-a38462211c7a_858x982.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This data point is slightly amusing because it shows there&#8217;s not much difference between the lowest and highest levels: 46% of leads and engineering managers say they use AI agents regularly, while for Staff+ engineers it&#8217;s 63%. Does it suggest the most experienced engineers are also the most curious?</p><p><strong>The more someone uses AI, the more they also use AI agents. </strong>We segmented the data by the percentage of software engineering work that respondents do with AI:</p><ul><li><p>Heavy users have AI for 80% or more tasks, or use AI on an hourly basis</p></li><li><p>Moderate users have AI for 30-80% of tasks, or use AI on a daily basis</p></li><li><p>Light users employ AI for 30% of tasks or less, or use AI on a weekly or monthly basis</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6-AP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614f68b5-0588-4c8b-a3c2-27dbc9b86b18_1320x1040.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6-AP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614f68b5-0588-4c8b-a3c2-27dbc9b86b18_1320x1040.png 424w, https://substackcdn.com/image/fetch/$s_!6-AP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614f68b5-0588-4c8b-a3c2-27dbc9b86b18_1320x1040.png 848w, https://substackcdn.com/image/fetch/$s_!6-AP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614f68b5-0588-4c8b-a3c2-27dbc9b86b18_1320x1040.png 1272w, https://substackcdn.com/image/fetch/$s_!6-AP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614f68b5-0588-4c8b-a3c2-27dbc9b86b18_1320x1040.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6-AP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614f68b5-0588-4c8b-a3c2-27dbc9b86b18_1320x1040.png" width="1320" height="1040" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/614f68b5-0588-4c8b-a3c2-27dbc9b86b18_1320x1040.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1040,&quot;width&quot;:1320,&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_!6-AP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614f68b5-0588-4c8b-a3c2-27dbc9b86b18_1320x1040.png 424w, https://substackcdn.com/image/fetch/$s_!6-AP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614f68b5-0588-4c8b-a3c2-27dbc9b86b18_1320x1040.png 848w, https://substackcdn.com/image/fetch/$s_!6-AP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614f68b5-0588-4c8b-a3c2-27dbc9b86b18_1320x1040.png 1272w, https://substackcdn.com/image/fetch/$s_!6-AP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614f68b5-0588-4c8b-a3c2-27dbc9b86b18_1320x1040.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>The more positive someone is about AI, the more likely they are using agents on a regular basis.</strong> In contrast, those negative about AI barely use agents:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qyru!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F801f1e4b-b3a7-4dc5-a8fb-316f6039f303_1314x774.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qyru!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F801f1e4b-b3a7-4dc5-a8fb-316f6039f303_1314x774.png 424w, https://substackcdn.com/image/fetch/$s_!qyru!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F801f1e4b-b3a7-4dc5-a8fb-316f6039f303_1314x774.png 848w, https://substackcdn.com/image/fetch/$s_!qyru!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F801f1e4b-b3a7-4dc5-a8fb-316f6039f303_1314x774.png 1272w, https://substackcdn.com/image/fetch/$s_!qyru!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F801f1e4b-b3a7-4dc5-a8fb-316f6039f303_1314x774.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qyru!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F801f1e4b-b3a7-4dc5-a8fb-316f6039f303_1314x774.png" width="1314" height="774" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/801f1e4b-b3a7-4dc5-a8fb-316f6039f303_1314x774.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:774,&quot;width&quot;:1314,&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_!qyru!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F801f1e4b-b3a7-4dc5-a8fb-316f6039f303_1314x774.png 424w, https://substackcdn.com/image/fetch/$s_!qyru!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F801f1e4b-b3a7-4dc5-a8fb-316f6039f303_1314x774.png 848w, https://substackcdn.com/image/fetch/$s_!qyru!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F801f1e4b-b3a7-4dc5-a8fb-316f6039f303_1314x774.png 1272w, https://substackcdn.com/image/fetch/$s_!qyru!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F801f1e4b-b3a7-4dc5-a8fb-316f6039f303_1314x774.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">How do people feel about AI, based on usage of agents</figcaption></figure></div><p>One question is whether this finding indicates correlation or causation: that is, does starting to use AI agents more, actually <em>cause </em>people to feel more positive about AI?</p><p>A couple of details:</p><ul><li><p>Using agents seems to make people nearly twice as enthusiastic about AI (61%) as those who do not use them (36%)</p></li><li><p>Respondents who don&#8217;t use agents are twice as likely to be skeptical (22%) about AI than those using agents regularly (11%)</p></li></ul><p>It looks like that if you don&#8217;t use AI agents on a regular basis, you may have a negative opinion about the tools, in general, which could come at the cost of not experiencing what the technology has to offer.</p><h2>6. Company size and tool usage</h2><p>In our results, company size and tooling choice correlate for some tools; for example, the smaller a team or company is, the more likely it is to use Claude Code or Codex:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1VyX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35006b6-809d-4e14-bfc5-b0bfa2eceb43_1034x790.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1VyX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35006b6-809d-4e14-bfc5-b0bfa2eceb43_1034x790.png 424w, https://substackcdn.com/image/fetch/$s_!1VyX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35006b6-809d-4e14-bfc5-b0bfa2eceb43_1034x790.png 848w, https://substackcdn.com/image/fetch/$s_!1VyX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35006b6-809d-4e14-bfc5-b0bfa2eceb43_1034x790.png 1272w, https://substackcdn.com/image/fetch/$s_!1VyX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35006b6-809d-4e14-bfc5-b0bfa2eceb43_1034x790.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1VyX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35006b6-809d-4e14-bfc5-b0bfa2eceb43_1034x790.png" width="1034" height="790" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d35006b6-809d-4e14-bfc5-b0bfa2eceb43_1034x790.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:790,&quot;width&quot;:1034,&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_!1VyX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35006b6-809d-4e14-bfc5-b0bfa2eceb43_1034x790.png 424w, https://substackcdn.com/image/fetch/$s_!1VyX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35006b6-809d-4e14-bfc5-b0bfa2eceb43_1034x790.png 848w, https://substackcdn.com/image/fetch/$s_!1VyX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35006b6-809d-4e14-bfc5-b0bfa2eceb43_1034x790.png 1272w, https://substackcdn.com/image/fetch/$s_!1VyX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35006b6-809d-4e14-bfc5-b0bfa2eceb43_1034x790.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Claude Code and Codex usage vs company size</figcaption></figure></div><p><strong>Claude Code is used by a whopping 75% of the smallest companies and teams. </strong>This is a big number, far ahead of any other tools. At the smallest places, the most-used tools are, in order:</p><ol><li><p>Claude Code: 75%</p></li><li><p>Chatbots: 55%</p></li><li><p>Cursor: 42%</p></li><li><p>GitHub Copilot: 35%</p></li><li><p>Codex: 26%</p></li><li><p>Gemini CLI: 14%</p></li><li><p>OpenCode: 13%</p></li></ol><p><strong>GitHub Copilot overtakes Claude Code at large companies.</strong> This confirms what was known: Microsoft is very good at enterprise sales, and at bundling GitHub Copilot in its suite of products:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!b06F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc52f907b-aadc-458f-be21-b00220ee6ab4_1298x950.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b06F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc52f907b-aadc-458f-be21-b00220ee6ab4_1298x950.png 424w, https://substackcdn.com/image/fetch/$s_!b06F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc52f907b-aadc-458f-be21-b00220ee6ab4_1298x950.png 848w, https://substackcdn.com/image/fetch/$s_!b06F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc52f907b-aadc-458f-be21-b00220ee6ab4_1298x950.png 1272w, https://substackcdn.com/image/fetch/$s_!b06F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc52f907b-aadc-458f-be21-b00220ee6ab4_1298x950.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b06F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc52f907b-aadc-458f-be21-b00220ee6ab4_1298x950.png" width="1298" height="950" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c52f907b-aadc-458f-be21-b00220ee6ab4_1298x950.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:950,&quot;width&quot;:1298,&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_!b06F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc52f907b-aadc-458f-be21-b00220ee6ab4_1298x950.png 424w, https://substackcdn.com/image/fetch/$s_!b06F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc52f907b-aadc-458f-be21-b00220ee6ab4_1298x950.png 848w, https://substackcdn.com/image/fetch/$s_!b06F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc52f907b-aadc-458f-be21-b00220ee6ab4_1298x950.png 1272w, https://substackcdn.com/image/fetch/$s_!b06F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc52f907b-aadc-458f-be21-b00220ee6ab4_1298x950.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>GitHub Copilot usage increases with company size, overtaking Claude Code at the largest companies</em></figcaption></figure></div><p><strong>Cursor and OpenCode usage drops at massive companies with similar usage patterns.</strong> Across the board, usage is roughly the same, regardless of company size. We only see a drop at the very largest of companies with 10,000+ employees:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!h1Rj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4a721ed-7336-4461-8c5c-30f3485f8adf_1002x818.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h1Rj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4a721ed-7336-4461-8c5c-30f3485f8adf_1002x818.png 424w, https://substackcdn.com/image/fetch/$s_!h1Rj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4a721ed-7336-4461-8c5c-30f3485f8adf_1002x818.png 848w, https://substackcdn.com/image/fetch/$s_!h1Rj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4a721ed-7336-4461-8c5c-30f3485f8adf_1002x818.png 1272w, https://substackcdn.com/image/fetch/$s_!h1Rj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4a721ed-7336-4461-8c5c-30f3485f8adf_1002x818.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!h1Rj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4a721ed-7336-4461-8c5c-30f3485f8adf_1002x818.png" width="1002" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d4a721ed-7336-4461-8c5c-30f3485f8adf_1002x818.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1002,&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_!h1Rj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4a721ed-7336-4461-8c5c-30f3485f8adf_1002x818.png 424w, https://substackcdn.com/image/fetch/$s_!h1Rj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4a721ed-7336-4461-8c5c-30f3485f8adf_1002x818.png 848w, https://substackcdn.com/image/fetch/$s_!h1Rj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4a721ed-7336-4461-8c5c-30f3485f8adf_1002x818.png 1272w, https://substackcdn.com/image/fetch/$s_!h1Rj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4a721ed-7336-4461-8c5c-30f3485f8adf_1002x818.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>Cursor and OpenCode usage vs company size</em></figcaption></figure></div><p>One theory for such a drop at massive companies could be that large companies often build their own internal coding agents that engineers use; e.g., at fintech, Block, the agent is called <a href="https://github.com/block/goose">Goose</a>, Meta has its own agent, as does Google with <a href="https://newsletter.pragmaticengineer.com/i/179478823/google-devs-to-use-jetski-a-custom-antigravity">Jetski</a> (its version of Antigravity) and <a href="https://newsletter.pragmaticengineer.com/i/174937901/ide">Cider</a>.</p><p><strong>Google&#8217;s tools are evenly used across the spectrum of company size. </strong>Google&#8217;s Gemini CLI and Antigravity are the only tools in this survey whose usage is notably stable, regardless of company size. Both tools hover at around 10% from the smallest to largest workplaces:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xnl5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b07c05b-a8f2-45e3-b438-3c8c27077bfc_974x710.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xnl5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b07c05b-a8f2-45e3-b438-3c8c27077bfc_974x710.png 424w, https://substackcdn.com/image/fetch/$s_!xnl5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b07c05b-a8f2-45e3-b438-3c8c27077bfc_974x710.png 848w, https://substackcdn.com/image/fetch/$s_!xnl5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b07c05b-a8f2-45e3-b438-3c8c27077bfc_974x710.png 1272w, https://substackcdn.com/image/fetch/$s_!xnl5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b07c05b-a8f2-45e3-b438-3c8c27077bfc_974x710.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xnl5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b07c05b-a8f2-45e3-b438-3c8c27077bfc_974x710.png" width="974" height="710" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b07c05b-a8f2-45e3-b438-3c8c27077bfc_974x710.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:710,&quot;width&quot;:974,&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_!xnl5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b07c05b-a8f2-45e3-b438-3c8c27077bfc_974x710.png 424w, https://substackcdn.com/image/fetch/$s_!xnl5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b07c05b-a8f2-45e3-b438-3c8c27077bfc_974x710.png 848w, https://substackcdn.com/image/fetch/$s_!xnl5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b07c05b-a8f2-45e3-b438-3c8c27077bfc_974x710.png 1272w, https://substackcdn.com/image/fetch/$s_!xnl5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b07c05b-a8f2-45e3-b438-3c8c27077bfc_974x710.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>Gemini CLI and Antigravity usage vs company size</em></figcaption></figure></div><p><strong>The feeling among survey respondents that they can experiment at work, correlates with Claude Code being available.</strong> We asked if readers experiment frequently with tools. Below are the &#8220;yes&#8221; responses by company size:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Fb6W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3236c521-5d15-4cf8-87d9-cb266482525b_746x658.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Fb6W!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3236c521-5d15-4cf8-87d9-cb266482525b_746x658.png 424w, https://substackcdn.com/image/fetch/$s_!Fb6W!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3236c521-5d15-4cf8-87d9-cb266482525b_746x658.png 848w, https://substackcdn.com/image/fetch/$s_!Fb6W!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3236c521-5d15-4cf8-87d9-cb266482525b_746x658.png 1272w, https://substackcdn.com/image/fetch/$s_!Fb6W!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3236c521-5d15-4cf8-87d9-cb266482525b_746x658.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Fb6W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3236c521-5d15-4cf8-87d9-cb266482525b_746x658.png" width="746" height="658" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3236c521-5d15-4cf8-87d9-cb266482525b_746x658.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:658,&quot;width&quot;:746,&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_!Fb6W!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3236c521-5d15-4cf8-87d9-cb266482525b_746x658.png 424w, https://substackcdn.com/image/fetch/$s_!Fb6W!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3236c521-5d15-4cf8-87d9-cb266482525b_746x658.png 848w, https://substackcdn.com/image/fetch/$s_!Fb6W!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3236c521-5d15-4cf8-87d9-cb266482525b_746x658.png 1272w, https://substackcdn.com/image/fetch/$s_!Fb6W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3236c521-5d15-4cf8-87d9-cb266482525b_746x658.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When these responses are mapped to the percentage of people using Claude Code, there&#8217;s a very similar distribution. My theory is that Claude Code is new enough at 9 months old to have not yet been approved at companies with bureaucratic processes for approving new tools, and this is partly why some respondents feel their chance to experiment with the range of tooling is being thwarted.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GzSD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00010dd4-df20-4e29-8d7a-070a990ae00d_906x668.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GzSD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00010dd4-df20-4e29-8d7a-070a990ae00d_906x668.png 424w, https://substackcdn.com/image/fetch/$s_!GzSD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00010dd4-df20-4e29-8d7a-070a990ae00d_906x668.png 848w, https://substackcdn.com/image/fetch/$s_!GzSD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00010dd4-df20-4e29-8d7a-070a990ae00d_906x668.png 1272w, https://substackcdn.com/image/fetch/$s_!GzSD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00010dd4-df20-4e29-8d7a-070a990ae00d_906x668.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GzSD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00010dd4-df20-4e29-8d7a-070a990ae00d_906x668.png" width="906" height="668" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/00010dd4-df20-4e29-8d7a-070a990ae00d_906x668.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:668,&quot;width&quot;:906,&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_!GzSD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00010dd4-df20-4e29-8d7a-070a990ae00d_906x668.png 424w, https://substackcdn.com/image/fetch/$s_!GzSD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00010dd4-df20-4e29-8d7a-070a990ae00d_906x668.png 848w, https://substackcdn.com/image/fetch/$s_!GzSD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00010dd4-df20-4e29-8d7a-070a990ae00d_906x668.png 1272w, https://substackcdn.com/image/fetch/$s_!GzSD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00010dd4-df20-4e29-8d7a-070a990ae00d_906x668.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>Percentage of respondents using Claude Code &amp; those who experiment often with AI tools, by company size</em></figcaption></figure></div><p>Engineers at places with lots of red tape for tooling are less empowered to experiment with new AI tools; not just Claude Code, but any new, interesting tool.</p><h2>7. Tools engineers love</h2><p>We asked respondents: &#8220;Which AI tools do you love using the most, and why?&#8221; Below are the tools which respondents enjoy most, in descending order of number of mentions:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1tJJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8becc664-01aa-4136-b86e-5b09702bb56c_990x752.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1tJJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8becc664-01aa-4136-b86e-5b09702bb56c_990x752.png 424w, https://substackcdn.com/image/fetch/$s_!1tJJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8becc664-01aa-4136-b86e-5b09702bb56c_990x752.png 848w, https://substackcdn.com/image/fetch/$s_!1tJJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8becc664-01aa-4136-b86e-5b09702bb56c_990x752.png 1272w, https://substackcdn.com/image/fetch/$s_!1tJJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8becc664-01aa-4136-b86e-5b09702bb56c_990x752.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1tJJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8becc664-01aa-4136-b86e-5b09702bb56c_990x752.png" width="990" height="752" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8becc664-01aa-4136-b86e-5b09702bb56c_990x752.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:752,&quot;width&quot;:990,&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_!1tJJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8becc664-01aa-4136-b86e-5b09702bb56c_990x752.png 424w, https://substackcdn.com/image/fetch/$s_!1tJJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8becc664-01aa-4136-b86e-5b09702bb56c_990x752.png 848w, https://substackcdn.com/image/fetch/$s_!1tJJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8becc664-01aa-4136-b86e-5b09702bb56c_990x752.png 1272w, https://substackcdn.com/image/fetch/$s_!1tJJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8becc664-01aa-4136-b86e-5b09702bb56c_990x752.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>Claude and Cursor stand out in terms of how much they are loved. </strong>A whopping 57% of respondents mention either Claude Code (46%) or Claude models (11%) as the tools they are attached to. Cursor was at a respectable 19% &#8211; double GitHub on 9%.</p><p>Other notable tools with two or more mentions:</p><ul><li><p><a href="https://www.warp.dev/">Warp</a>: a terminal for building agents</p></li><li><p><a href="https://zed.dev/">Zed</a>: a fast editor with agentic workflows</p></li><li><p><a href="https://ampcode.com/">Amp</a>: a model-agnostic coding agent. A free version is supported by ads</p></li><li><p><a href="https://cline.bot/">Cline</a>: an open source coding agent</p></li><li><p><a href="https://roocode.com/">RooCode</a>: an open source, AI-powered coding assistant running in VS Code</p></li><li><p><a href="https://www.continue.dev/">Continue.dev</a>: AI checks on every pull request</p></li></ul><p><strong>Claude Code is especially loved by Director-and-above folks. </strong>Segmenting the &#8220;most loved&#8221; responses by level (engineers up to the senior levels of staff+ engineers, leads/eng managers, and Director+ folks):</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0nw-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0842b345-d7df-441e-9666-2e9070c8ba95_1028x728.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0nw-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0842b345-d7df-441e-9666-2e9070c8ba95_1028x728.png 424w, https://substackcdn.com/image/fetch/$s_!0nw-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0842b345-d7df-441e-9666-2e9070c8ba95_1028x728.png 848w, https://substackcdn.com/image/fetch/$s_!0nw-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0842b345-d7df-441e-9666-2e9070c8ba95_1028x728.png 1272w, https://substackcdn.com/image/fetch/$s_!0nw-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0842b345-d7df-441e-9666-2e9070c8ba95_1028x728.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0nw-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0842b345-d7df-441e-9666-2e9070c8ba95_1028x728.png" width="1028" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0842b345-d7df-441e-9666-2e9070c8ba95_1028x728.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1028,&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_!0nw-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0842b345-d7df-441e-9666-2e9070c8ba95_1028x728.png 424w, https://substackcdn.com/image/fetch/$s_!0nw-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0842b345-d7df-441e-9666-2e9070c8ba95_1028x728.png 848w, https://substackcdn.com/image/fetch/$s_!0nw-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0842b345-d7df-441e-9666-2e9070c8ba95_1028x728.png 1272w, https://substackcdn.com/image/fetch/$s_!0nw-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0842b345-d7df-441e-9666-2e9070c8ba95_1028x728.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>Claude Code is loved far more by Director folks than others; Cursor gets less love as seniority goes up</em></figcaption></figure></div><p>Both Claude Code and Cursor become less loved &#8211; or used! &#8211; as seniority goes up, but it&#8217;s notable that folks in senior engineering leadership positions are obsessed with Claude Code, but not Cursor.</p><p><strong>GitHub Copilot is equally loved by engineering managers as Cursor is</strong> &#8212; and this is surprising:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WsqN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d7548b-ddd5-439e-bacb-003a3c1a66f7_1068x742.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WsqN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d7548b-ddd5-439e-bacb-003a3c1a66f7_1068x742.png 424w, https://substackcdn.com/image/fetch/$s_!WsqN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d7548b-ddd5-439e-bacb-003a3c1a66f7_1068x742.png 848w, https://substackcdn.com/image/fetch/$s_!WsqN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d7548b-ddd5-439e-bacb-003a3c1a66f7_1068x742.png 1272w, https://substackcdn.com/image/fetch/$s_!WsqN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d7548b-ddd5-439e-bacb-003a3c1a66f7_1068x742.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WsqN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d7548b-ddd5-439e-bacb-003a3c1a66f7_1068x742.png" width="1068" height="742" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/72d7548b-ddd5-439e-bacb-003a3c1a66f7_1068x742.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:742,&quot;width&quot;:1068,&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_!WsqN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d7548b-ddd5-439e-bacb-003a3c1a66f7_1068x742.png 424w, https://substackcdn.com/image/fetch/$s_!WsqN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d7548b-ddd5-439e-bacb-003a3c1a66f7_1068x742.png 848w, https://substackcdn.com/image/fetch/$s_!WsqN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d7548b-ddd5-439e-bacb-003a3c1a66f7_1068x742.png 1272w, https://substackcdn.com/image/fetch/$s_!WsqN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d7548b-ddd5-439e-bacb-003a3c1a66f7_1068x742.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>Percentage of people naming GitHub Copilot or Cursor as a tool they love</em></figcaption></figure></div><p><strong>Both OpenCode and GitHub Copilot are surprisingly loved by Staff+ engineers. </strong>Another unexpected detail is that, despite OpenCode being used about a quarter as much as GitHub Copilot, it rivals the &#8220;loved&#8221; mentions. For Staff+ engineers, it matches GitHub on those terms:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LjeY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749ca291-8a53-4689-8d8a-4d8a481cd02e_1016x748.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LjeY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749ca291-8a53-4689-8d8a-4d8a481cd02e_1016x748.png 424w, https://substackcdn.com/image/fetch/$s_!LjeY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749ca291-8a53-4689-8d8a-4d8a481cd02e_1016x748.png 848w, https://substackcdn.com/image/fetch/$s_!LjeY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749ca291-8a53-4689-8d8a-4d8a481cd02e_1016x748.png 1272w, https://substackcdn.com/image/fetch/$s_!LjeY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749ca291-8a53-4689-8d8a-4d8a481cd02e_1016x748.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LjeY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749ca291-8a53-4689-8d8a-4d8a481cd02e_1016x748.png" width="1016" height="748" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/749ca291-8a53-4689-8d8a-4d8a481cd02e_1016x748.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:748,&quot;width&quot;:1016,&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_!LjeY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749ca291-8a53-4689-8d8a-4d8a481cd02e_1016x748.png 424w, https://substackcdn.com/image/fetch/$s_!LjeY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749ca291-8a53-4689-8d8a-4d8a481cd02e_1016x748.png 848w, https://substackcdn.com/image/fetch/$s_!LjeY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749ca291-8a53-4689-8d8a-4d8a481cd02e_1016x748.png 1272w, https://substackcdn.com/image/fetch/$s_!LjeY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749ca291-8a53-4689-8d8a-4d8a481cd02e_1016x748.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">Percentage of people naming GitHub Copilot or OpenCode as a tool they love</figcaption></figure></div><p>Finally, when segmenting based on company size, we see the familiar pattern of Claude Code vs GitHub Copilot. Claude Code is less frequently mentioned as a &#8220;loved&#8221; tool as company size increases.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!S3fs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F592fbbe0-5784-4647-885b-542ff90da7aa_1106x820.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S3fs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F592fbbe0-5784-4647-885b-542ff90da7aa_1106x820.png 424w, https://substackcdn.com/image/fetch/$s_!S3fs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F592fbbe0-5784-4647-885b-542ff90da7aa_1106x820.png 848w, https://substackcdn.com/image/fetch/$s_!S3fs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F592fbbe0-5784-4647-885b-542ff90da7aa_1106x820.png 1272w, https://substackcdn.com/image/fetch/$s_!S3fs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F592fbbe0-5784-4647-885b-542ff90da7aa_1106x820.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S3fs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F592fbbe0-5784-4647-885b-542ff90da7aa_1106x820.png" width="1106" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/592fbbe0-5784-4647-885b-542ff90da7aa_1106x820.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1106,&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_!S3fs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F592fbbe0-5784-4647-885b-542ff90da7aa_1106x820.png 424w, https://substackcdn.com/image/fetch/$s_!S3fs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F592fbbe0-5784-4647-885b-542ff90da7aa_1106x820.png 848w, https://substackcdn.com/image/fetch/$s_!S3fs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F592fbbe0-5784-4647-885b-542ff90da7aa_1106x820.png 1272w, https://substackcdn.com/image/fetch/$s_!S3fs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F592fbbe0-5784-4647-885b-542ff90da7aa_1106x820.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>How &#8220;loved&#8221; Claude Code is, versus GitHub Copilot, based on company size</em></figcaption></figure></div><p>GitHub Copilot sees the opposite trajectory: it&#8217;s more loved within larger companies where it&#8217;s likely to be harder to experiment with alternatives.</p><h2>8. Demographics</h2><p>In closing, below are details about who took the survey, and how the 906 responses came together.</p><p>Engineers comprise 55% of respondents, and engineering leadership another 34%:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!u7dF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff93c1e68-36ae-45a2-8445-31289a7fa9f2_928x834.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!u7dF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff93c1e68-36ae-45a2-8445-31289a7fa9f2_928x834.png 424w, https://substackcdn.com/image/fetch/$s_!u7dF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff93c1e68-36ae-45a2-8445-31289a7fa9f2_928x834.png 848w, https://substackcdn.com/image/fetch/$s_!u7dF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff93c1e68-36ae-45a2-8445-31289a7fa9f2_928x834.png 1272w, https://substackcdn.com/image/fetch/$s_!u7dF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff93c1e68-36ae-45a2-8445-31289a7fa9f2_928x834.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!u7dF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff93c1e68-36ae-45a2-8445-31289a7fa9f2_928x834.png" width="928" height="834" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f93c1e68-36ae-45a2-8445-31289a7fa9f2_928x834.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:834,&quot;width&quot;:928,&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_!u7dF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff93c1e68-36ae-45a2-8445-31289a7fa9f2_928x834.png 424w, https://substackcdn.com/image/fetch/$s_!u7dF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff93c1e68-36ae-45a2-8445-31289a7fa9f2_928x834.png 848w, https://substackcdn.com/image/fetch/$s_!u7dF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff93c1e68-36ae-45a2-8445-31289a7fa9f2_928x834.png 1272w, https://substackcdn.com/image/fetch/$s_!u7dF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff93c1e68-36ae-45a2-8445-31289a7fa9f2_928x834.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>Respondents by their role</em></figcaption></figure></div><p>Respondents are experienced professionals. The median respondent has 11-15 years of experience:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nQ7b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe359547a-7130-4f5b-893f-b619d4ec18ca_1012x876.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nQ7b!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe359547a-7130-4f5b-893f-b619d4ec18ca_1012x876.png 424w, https://substackcdn.com/image/fetch/$s_!nQ7b!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe359547a-7130-4f5b-893f-b619d4ec18ca_1012x876.png 848w, https://substackcdn.com/image/fetch/$s_!nQ7b!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe359547a-7130-4f5b-893f-b619d4ec18ca_1012x876.png 1272w, https://substackcdn.com/image/fetch/$s_!nQ7b!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe359547a-7130-4f5b-893f-b619d4ec18ca_1012x876.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nQ7b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe359547a-7130-4f5b-893f-b619d4ec18ca_1012x876.png" width="1012" height="876" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e359547a-7130-4f5b-893f-b619d4ec18ca_1012x876.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:876,&quot;width&quot;:1012,&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_!nQ7b!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe359547a-7130-4f5b-893f-b619d4ec18ca_1012x876.png 424w, https://substackcdn.com/image/fetch/$s_!nQ7b!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe359547a-7130-4f5b-893f-b619d4ec18ca_1012x876.png 848w, https://substackcdn.com/image/fetch/$s_!nQ7b!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe359547a-7130-4f5b-893f-b619d4ec18ca_1012x876.png 1272w, https://substackcdn.com/image/fetch/$s_!nQ7b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe359547a-7130-4f5b-893f-b619d4ec18ca_1012x876.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>Years of experience, split across the 906 respondents</em></figcaption></figure></div><p>Company size is also a fairly even split across this group:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-1lV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02487aa9-d574-40ae-9c9d-1314bfffd489_972x812.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-1lV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02487aa9-d574-40ae-9c9d-1314bfffd489_972x812.png 424w, https://substackcdn.com/image/fetch/$s_!-1lV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02487aa9-d574-40ae-9c9d-1314bfffd489_972x812.png 848w, https://substackcdn.com/image/fetch/$s_!-1lV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02487aa9-d574-40ae-9c9d-1314bfffd489_972x812.png 1272w, https://substackcdn.com/image/fetch/$s_!-1lV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02487aa9-d574-40ae-9c9d-1314bfffd489_972x812.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-1lV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02487aa9-d574-40ae-9c9d-1314bfffd489_972x812.png" width="972" height="812" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02487aa9-d574-40ae-9c9d-1314bfffd489_972x812.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:812,&quot;width&quot;:972,&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_!-1lV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02487aa9-d574-40ae-9c9d-1314bfffd489_972x812.png 424w, https://substackcdn.com/image/fetch/$s_!-1lV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02487aa9-d574-40ae-9c9d-1314bfffd489_972x812.png 848w, https://substackcdn.com/image/fetch/$s_!-1lV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02487aa9-d574-40ae-9c9d-1314bfffd489_972x812.png 1272w, https://substackcdn.com/image/fetch/$s_!-1lV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02487aa9-d574-40ae-9c9d-1314bfffd489_972x812.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">Respondent split, based on company size</figcaption></figure></div><p>Region-wise, most respondents are in Europe or the US:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Cc3F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ecd90-ae13-499e-9599-afd6591c3731_892x772.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Cc3F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ecd90-ae13-499e-9599-afd6591c3731_892x772.png 424w, https://substackcdn.com/image/fetch/$s_!Cc3F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ecd90-ae13-499e-9599-afd6591c3731_892x772.png 848w, https://substackcdn.com/image/fetch/$s_!Cc3F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ecd90-ae13-499e-9599-afd6591c3731_892x772.png 1272w, https://substackcdn.com/image/fetch/$s_!Cc3F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ecd90-ae13-499e-9599-afd6591c3731_892x772.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Cc3F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ecd90-ae13-499e-9599-afd6591c3731_892x772.png" width="892" height="772" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/334ecd90-ae13-499e-9599-afd6591c3731_892x772.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:772,&quot;width&quot;:892,&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_!Cc3F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ecd90-ae13-499e-9599-afd6591c3731_892x772.png 424w, https://substackcdn.com/image/fetch/$s_!Cc3F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ecd90-ae13-499e-9599-afd6591c3731_892x772.png 848w, https://substackcdn.com/image/fetch/$s_!Cc3F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ecd90-ae13-499e-9599-afd6591c3731_892x772.png 1272w, https://substackcdn.com/image/fetch/$s_!Cc3F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F334ecd90-ae13-499e-9599-afd6591c3731_892x772.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>Respondents, based on location</em></figcaption></figure></div><h2>Takeaways and the full report</h2><p>We have compiled additional findings from this survey which did not fit in this article: it&#8217;s a 35-page article:</p>
      <p>
          <a href="https://newsletter.pragmaticengineer.com/p/ai-tooling-2026">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[The Future of Software Engineering with AI: Six Predictions]]></title><description><![CDATA[Notes from The Pragmatic Summit and &#8216;The Future of Software Development&#8217; workshop]]></description><link>https://newsletter.pragmaticengineer.com/p/the-future-of-software-engineering-with-ai</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/the-future-of-software-engineering-with-ai</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 24 Feb 2026 16:54:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2KWV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c6b4839-c2ca-4f98-a65e-a0729ca085a9_1600x1066.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Two weeks ago, I hosted<em> <a href="https://www.pragmaticsummit.com/">The Pragmatic Summit</a></em> in San Francisco, a few days after attending a 50-person workshop entitled <em>The Future of Software Development </em>in Deer Valley, Utah. Each event attracted experienced software engineers, leaders, and deep thinkers to share thoughts about the state of the software engineering industry today and in the future.</p><p><strong>It was well-timed, considering that right now seems like a period of change for tech that&#8217;s unfolding faster than before.</strong> That was a consensus opinion at both events, also held by veterans like Martin Fowler and Kent Beck, who said things haven&#8217;t shifted so rapidly during their 50+ years in the industry.</p><p>At the very start of this year, I predicted <a href="https://newsletter.pragmaticengineer.com/p/when-ai-writes-almost-all-code-what">AI will write almost all code, going forward</a>, and several others have <a href="https://newsletter.pragmaticengineer.com/i/183694080/1-latest-models-create-a-ha-moments">said</a> the same. But at the Pragmatic Summit, I met an embedded engineer writing Assembly and C code who is still writing more of his code by hand than with AI agents &#8211; and was the only person I spoke with in San Fran who was not yet &#8220;giving in&#8221; to AI agents.</p><p>Even so, today, this engineer has between a third and a half of their own low-level code being generated by AI agents since the launch of Opus 4.5, and this share keeps on rising. Their view was an interesting counterpoint to the prevailing trend.</p><p>This article shares some thought-provoking ideas and conversations from both events, covering:</p><ol><li><p><strong>Data vs hype: how orgs actually win with AI. </strong>Laura Tacho&#8217;s keynote at The Pragmatic Summit. Exclusive data reveals 92% of devs use AI coding tools monthly (!!), &#8220;unhealthy&#8221; orgs see 2x more incidents, healthy ones have 50% fewer, and other new data.</p></li><li><p><strong>Building world-class engineering orgs in the AI era.</strong> The closing session of the summit dug into what AI-native teams look like, in a fireside chat with GitHub&#8217;s former CEO and the CTO of Atlassian.</p></li><li><p><em><strong>The Future of Software Development</strong></em><strong> with Martin Fowler. </strong>Laura Tacho, distinguished engineer Annie Vella, Martin Fowler, and myself, look back on the event in Utah. Nobody has the AI shift all worked out, which is reassuring!</p></li><li><p><strong>Mid-level engineers&#8217; quiet crisis. </strong>Something I heard that engineering leaders talk about behind closed doors a lot is that mid-career engineers are being left behind by the AI wave. New grads are more productive with the tools, while seniors have more of that all-important experience. Advice on how to catch up fast.</p></li><li><p><strong>Future of refactoring in an AI-native world</strong>. Refactoring legacy code has long been an important tool for keeping software maintainable. With AI generating most code now, is there any point? One answer is &#8220;hell, yeah!&#8221;</p></li><li><p><strong>Future of Agile</strong>. It was only fitting to consider the future of Agile on its 25th anniversary, in the company of two of the writers of the Agile Manifesto. Amusingly, one major trend is the return of Extreme Programming (XP) practices which predate Agile.</p></li></ol><h2>1. Data vs hype: how orgs actually win with AI</h2><p>At the debut Pragmatic Summit in SF, <a href="https://newsletter.pragmaticengineer.com/p/measuring-the-impact-of-ai-on-software">Laura Tacho</a> delivered the keynote as a well-known expert on developer productivity, and former CTO of DX. She presented new and exclusive data on AI usage, and what currently works with AI adoption. Her session was one of the most popular at the conference &#8211; and you can <a href="https://youtu.be/LOHgRw43fFk">watch the whole thing here</a>. Full subscribers also get <a href="https://newsletter.pragmaticengineer.com/i/188235220/2-data-vs-hype-how-orgs-actually-win-with-ai">access to Laura&#8217;s slides</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WXZO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78299212-adf4-4a2a-bf82-f37b52640f77_1600x1066.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WXZO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78299212-adf4-4a2a-bf82-f37b52640f77_1600x1066.png 424w, https://substackcdn.com/image/fetch/$s_!WXZO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78299212-adf4-4a2a-bf82-f37b52640f77_1600x1066.png 848w, https://substackcdn.com/image/fetch/$s_!WXZO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78299212-adf4-4a2a-bf82-f37b52640f77_1600x1066.png 1272w, https://substackcdn.com/image/fetch/$s_!WXZO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78299212-adf4-4a2a-bf82-f37b52640f77_1600x1066.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WXZO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78299212-adf4-4a2a-bf82-f37b52640f77_1600x1066.png" width="1456" height="970" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/78299212-adf4-4a2a-bf82-f37b52640f77_1600x1066.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:970,&quot;width&quot;:1456,&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;: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_!WXZO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78299212-adf4-4a2a-bf82-f37b52640f77_1600x1066.png 424w, https://substackcdn.com/image/fetch/$s_!WXZO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78299212-adf4-4a2a-bf82-f37b52640f77_1600x1066.png 848w, https://substackcdn.com/image/fetch/$s_!WXZO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78299212-adf4-4a2a-bf82-f37b52640f77_1600x1066.png 1272w, https://substackcdn.com/image/fetch/$s_!WXZO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78299212-adf4-4a2a-bf82-f37b52640f77_1600x1066.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>Laura Tacho delivers the keynote at The Pragmatic Summit to a full house of 500. <a href="https://youtu.be/LOHgRw43fFk">Watch the full session</a></em></figcaption></figure></div><p>New data points on AI adoption shared at The Pragmatic Summit, provided by DX:</p><p>Usage:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2KWV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c6b4839-c2ca-4f98-a65e-a0729ca085a9_1600x1066.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2KWV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c6b4839-c2ca-4f98-a65e-a0729ca085a9_1600x1066.png 424w, https://substackcdn.com/image/fetch/$s_!2KWV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c6b4839-c2ca-4f98-a65e-a0729ca085a9_1600x1066.png 848w, https://substackcdn.com/image/fetch/$s_!2KWV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c6b4839-c2ca-4f98-a65e-a0729ca085a9_1600x1066.png 1272w, https://substackcdn.com/image/fetch/$s_!2KWV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c6b4839-c2ca-4f98-a65e-a0729ca085a9_1600x1066.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2KWV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c6b4839-c2ca-4f98-a65e-a0729ca085a9_1600x1066.png" width="1456" height="970" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6c6b4839-c2ca-4f98-a65e-a0729ca085a9_1600x1066.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:970,&quot;width&quot;:1456,&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_!2KWV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c6b4839-c2ca-4f98-a65e-a0729ca085a9_1600x1066.png 424w, https://substackcdn.com/image/fetch/$s_!2KWV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c6b4839-c2ca-4f98-a65e-a0729ca085a9_1600x1066.png 848w, https://substackcdn.com/image/fetch/$s_!2KWV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c6b4839-c2ca-4f98-a65e-a0729ca085a9_1600x1066.png 1272w, https://substackcdn.com/image/fetch/$s_!2KWV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c6b4839-c2ca-4f98-a65e-a0729ca085a9_1600x1066.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">92% of devs use AI coding assistants at least once per month. Source: DX</figcaption></figure></div><p>Time management:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EGQJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc7b745-1565-4c99-ae11-6ffdd0372403_1600x899.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EGQJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc7b745-1565-4c99-ae11-6ffdd0372403_1600x899.png 424w, https://substackcdn.com/image/fetch/$s_!EGQJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc7b745-1565-4c99-ae11-6ffdd0372403_1600x899.png 848w, https://substackcdn.com/image/fetch/$s_!EGQJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc7b745-1565-4c99-ae11-6ffdd0372403_1600x899.png 1272w, https://substackcdn.com/image/fetch/$s_!EGQJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc7b745-1565-4c99-ae11-6ffdd0372403_1600x899.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EGQJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc7b745-1565-4c99-ae11-6ffdd0372403_1600x899.png" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bfc7b745-1565-4c99-ae11-6ffdd0372403_1600x899.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&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_!EGQJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc7b745-1565-4c99-ae11-6ffdd0372403_1600x899.png 424w, https://substackcdn.com/image/fetch/$s_!EGQJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc7b745-1565-4c99-ae11-6ffdd0372403_1600x899.png 848w, https://substackcdn.com/image/fetch/$s_!EGQJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc7b745-1565-4c99-ae11-6ffdd0372403_1600x899.png 1272w, https://substackcdn.com/image/fetch/$s_!EGQJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc7b745-1565-4c99-ae11-6ffdd0372403_1600x899.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">Average of ~4 hours saved per week, based on self-reported data. Source: DX</figcaption></figure></div><p>Onboarding impact:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fnbT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61c27e15-209c-415b-b9ea-840fdf3f30d9_1600x899.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fnbT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61c27e15-209c-415b-b9ea-840fdf3f30d9_1600x899.png 424w, https://substackcdn.com/image/fetch/$s_!fnbT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61c27e15-209c-415b-b9ea-840fdf3f30d9_1600x899.png 848w, https://substackcdn.com/image/fetch/$s_!fnbT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61c27e15-209c-415b-b9ea-840fdf3f30d9_1600x899.png 1272w, https://substackcdn.com/image/fetch/$s_!fnbT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61c27e15-209c-415b-b9ea-840fdf3f30d9_1600x899.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fnbT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61c27e15-209c-415b-b9ea-840fdf3f30d9_1600x899.png" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61c27e15-209c-415b-b9ea-840fdf3f30d9_1600x899.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&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_!fnbT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61c27e15-209c-415b-b9ea-840fdf3f30d9_1600x899.png 424w, https://substackcdn.com/image/fetch/$s_!fnbT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61c27e15-209c-415b-b9ea-840fdf3f30d9_1600x899.png 848w, https://substackcdn.com/image/fetch/$s_!fnbT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61c27e15-209c-415b-b9ea-840fdf3f30d9_1600x899.png 1272w, https://substackcdn.com/image/fetch/$s_!fnbT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61c27e15-209c-415b-b9ea-840fdf3f30d9_1600x899.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">AI tools have slashed onboarding time over the past year</figcaption></figure></div><p><strong>There&#8217;s no </strong><em><strong>typical</strong></em><strong> experience with AI, </strong>said Laura:</p><blockquote><p>&#8220;AI is extremely different in every company because each place has its own problems and its own culture.</p><p>Organizational performance is multidimensional and these organizations are just going off to different extremes, based on what they were doing before. AI is an accelerator, it&#8217;s a multiplier, and it is moving organizations in different directions.</p><p>Some organizations are facing twice as many customer-facing incidents. At the same time, some companies are also experiencing 50% fewer incidents. So, for some companies that have used AI and have a really healthy system, it has amplified that system. They are seeing fewer incidents, moving faster, accelerating with higher quality, higher code maintainability, and higher change competence.</p><p>On the other side, we have organizations which were dysfunctional already and are now more dysfunctional: they&#8217;re dysfunctional faster. Similarly, organizations are seeing really uneven results economically from using AI.</p><p>There are a lot of steep drop-offs when it comes to using AI in a pilot context with production, and then trying to tie it to profit. This is from an MIT study in July 2025, <a href="https://mlq.ai/media/quarterly_decks/v0.1_State_of_AI_in_Business_2025_Report.pdf">The Gen AI Divide</a>&#8221;.</p></blockquote><p><strong>Good analogies for the age of AI might be the space race of the previous century</strong> and the age of exploration in the 15th-17th centuries, said Laura.</p><ul><li><p><strong>Wonder of space</strong>: space exploration includes immense hope and grounded scepticism.</p></li><li><p><strong>Defining moments</strong>: even though the space race was incredibly expensive &#8211; or utterly wasteful &#8211; landing on the moon was a big moment for humanity.</p></li><li><p><strong>Delivering but not on the grandest ambitions</strong>: in the 1960s, going to the moon carried the expectation of human habitation on the lunar surface. As yet, that hasn&#8217;t happened but landing on the moon created progress back on Earth:</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!T8Bl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b3ddbb-e5ef-4bd5-b263-78b0d9a0bdd4_1156x1346.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!T8Bl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b3ddbb-e5ef-4bd5-b263-78b0d9a0bdd4_1156x1346.png 424w, https://substackcdn.com/image/fetch/$s_!T8Bl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b3ddbb-e5ef-4bd5-b263-78b0d9a0bdd4_1156x1346.png 848w, https://substackcdn.com/image/fetch/$s_!T8Bl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b3ddbb-e5ef-4bd5-b263-78b0d9a0bdd4_1156x1346.png 1272w, https://substackcdn.com/image/fetch/$s_!T8Bl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b3ddbb-e5ef-4bd5-b263-78b0d9a0bdd4_1156x1346.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!T8Bl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b3ddbb-e5ef-4bd5-b263-78b0d9a0bdd4_1156x1346.png" width="1156" height="1346" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74b3ddbb-e5ef-4bd5-b263-78b0d9a0bdd4_1156x1346.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1346,&quot;width&quot;:1156,&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_!T8Bl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b3ddbb-e5ef-4bd5-b263-78b0d9a0bdd4_1156x1346.png 424w, https://substackcdn.com/image/fetch/$s_!T8Bl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b3ddbb-e5ef-4bd5-b263-78b0d9a0bdd4_1156x1346.png 848w, https://substackcdn.com/image/fetch/$s_!T8Bl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b3ddbb-e5ef-4bd5-b263-78b0d9a0bdd4_1156x1346.png 1272w, https://substackcdn.com/image/fetch/$s_!T8Bl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b3ddbb-e5ef-4bd5-b263-78b0d9a0bdd4_1156x1346.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">Parallels: Could AI fail on its loftiest promise but still deliver plentiful innovation?</figcaption></figure></div><p><strong>There&#8217;s a rare opportunity to channel the energy around AI into practical improvements,</strong> said Laura in closing remarks:</p><blockquote><p>&#8220;I want to urge you to find that balance between a sense of wonder, aiming for Mars, and a moon colony, but also understanding we need to solve problems here on Earth and we have to live in this reality.</p><p>So, please stay grounded, stay skeptical, stay human. Most of all, stay pragmatic&#8221;.</p></blockquote><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://youtu.be/LOHgRw43fFk&quot;,&quot;text&quot;:&quot;Watch Laura's keynote&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://youtu.be/LOHgRw43fFk"><span>Watch Laura's keynote</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.pragmaticengineer.com/i/188235220/2-data-vs-hype-how-orgs-actually-win-with-ai&quot;,&quot;text&quot;:&quot;Access Laura's slides&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.pragmaticengineer.com/i/188235220/2-data-vs-hype-how-orgs-actually-win-with-ai"><span>Access Laura's slides</span></a></p><h2>2. Building world-class engineering orgs in the age of AI</h2><p>Also at the Pragmatic Summit, Thomas Dohmke (founder &amp; CEO of Entire, and former CEO of GitHub) and Rajeev Rajan (CTO of Atlassian) took part in a fireside chat to explore what a modern, world-class engineering team looks like today. Thomas is building a new, AI-native startup with Entire &#8211; an &#8220;AI-native GitHub&#8221; &#8211; while Atlassian has more data than anywhere else on developer productivity after acquiring DX.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hrHL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203fe1e7-7d2e-4c5c-98d5-2b2c60e3314d_1600x1066.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hrHL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203fe1e7-7d2e-4c5c-98d5-2b2c60e3314d_1600x1066.png 424w, https://substackcdn.com/image/fetch/$s_!hrHL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203fe1e7-7d2e-4c5c-98d5-2b2c60e3314d_1600x1066.png 848w, https://substackcdn.com/image/fetch/$s_!hrHL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203fe1e7-7d2e-4c5c-98d5-2b2c60e3314d_1600x1066.png 1272w, https://substackcdn.com/image/fetch/$s_!hrHL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203fe1e7-7d2e-4c5c-98d5-2b2c60e3314d_1600x1066.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hrHL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203fe1e7-7d2e-4c5c-98d5-2b2c60e3314d_1600x1066.png" width="1456" height="970" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/203fe1e7-7d2e-4c5c-98d5-2b2c60e3314d_1600x1066.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:970,&quot;width&quot;:1456,&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_!hrHL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203fe1e7-7d2e-4c5c-98d5-2b2c60e3314d_1600x1066.png 424w, https://substackcdn.com/image/fetch/$s_!hrHL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203fe1e7-7d2e-4c5c-98d5-2b2c60e3314d_1600x1066.png 848w, https://substackcdn.com/image/fetch/$s_!hrHL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203fe1e7-7d2e-4c5c-98d5-2b2c60e3314d_1600x1066.png 1272w, https://substackcdn.com/image/fetch/$s_!hrHL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203fe1e7-7d2e-4c5c-98d5-2b2c60e3314d_1600x1066.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">Full house for the closing session at The Pragmatic Summit, featuring Thomas Dohmke and Rajeev Rajan</figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://youtu.be/fYh1CWadxDM&quot;,&quot;text&quot;:&quot;Watch the closing session&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://youtu.be/fYh1CWadxDM"><span>Watch the closing session</span></a></p><p>A number of timely, thought-provoking topics were covered by the pair on stage:</p><h4>Topic #1: What does an AI-native team look like?</h4><p>Rajeev (Atlassian):</p><blockquote><p>&#8220;It starts with the mindset. You have to really believe in doing AI-native work. Some teams at Atlassian have engineers basically writing zero lines of code: it&#8217;s all agents, or orchestration of agents. As a result, teams are not necessarily getting smaller, but they&#8217;re producing a lot more, sometimes 2-5x more, and creativity is up.</p><p>Efficiency framing is missing the point, it&#8217;s more about what you can create now with AI which you could not before&#8221;.</p></blockquote><p>Thomas (<a href="http://entire.io">Entire.io</a>):</p><blockquote><p>&#8220;AI native is the new &#8216;cloud native&#8217; and what we are calling <em>AI native</em> now is going to be very different from AI native in a few years&#8217; time.</p><p>There&#8217;s a lot of BS out there about how all day-to-day tasks are now &#8216;AI native&#8217;, and using agents for everything. I&#8217;m a startup founder: most of the time, I&#8217;m still dealing with things like old school HR school systems&#8221;.</p></blockquote><h4>Topic #2: AI makes being distributed an advantage again</h4><p>Thomas:</p><blockquote><p>&#8220;A remote team is kind of lonely, right? But agents basically gave us these sparring partners, these experts that I can just ask &#8220;bring some help in for this topic, I need to write an ADR or solve a problem.</p><p>This help has taken it to a new level for remote work. I now have my code review agent, my coding agent, my brainstorming agent, my research agents. In some ways, agents have given an advantage again for being remote-first.&#8221;</p></blockquote><p>Rajeev:</p><blockquote><p>&#8220;Agents have changed things a lot. I remember the days when I was in the office at 2:00AM writing code and would get stuck. All you can do is read the code, then read the code some more until you figure it out.</p><p>Well, now you can ask an agent to explain it, or even better, do the code for you. So, with agents it&#8217;s gotten even better and easier for us to be able to be distributed.&#8221;</p></blockquote><h4>Topic #3: Why restrictive corporate IT gives startups a massive advantage</h4><p>One hilarious exchange between Rajeev and Thomas was about how large companies are slow with AI due to restrictive IT:</p><blockquote><p>Rajeev: &#8220;Over the holidays, I bought a laptop because sometimes you can&#8217;t install things because of IT. So, I bought my own personal laptop at the Apple store, installed Claude Code, built an app, a bunch of Python scripts, and things like that. As someone who has grown up writing code to my personal bar, it&#8217;s super high &#8211; as it is for all my engineers. Now, I can write code much faster with agents and things like that.&#8221;</p><p>Thomas: &#8220;To all startup founders: when an investor asks how you&#8217;re preventing the incumbent from doing the same thing you&#8217;re doing: just tell them the CTO of Atlassian had to buy a laptop on his own money to start coding!</p><p>That&#8217;s the best answer I can give because it shows you how even relatively agile companies [like Atlassian, a <a href="https://www.atlassian.com/agile">promoter</a> of Agile] that actually develop agile tools, can&#8217;t really do what you can do in five minutes!&#8221;</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YynR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Face5b52b-717b-4cca-b4a6-3fdc4056fded_1600x1066.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YynR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Face5b52b-717b-4cca-b4a6-3fdc4056fded_1600x1066.png 424w, https://substackcdn.com/image/fetch/$s_!YynR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Face5b52b-717b-4cca-b4a6-3fdc4056fded_1600x1066.png 848w, https://substackcdn.com/image/fetch/$s_!YynR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Face5b52b-717b-4cca-b4a6-3fdc4056fded_1600x1066.png 1272w, https://substackcdn.com/image/fetch/$s_!YynR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Face5b52b-717b-4cca-b4a6-3fdc4056fded_1600x1066.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YynR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Face5b52b-717b-4cca-b4a6-3fdc4056fded_1600x1066.png" width="1456" height="970" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ace5b52b-717b-4cca-b4a6-3fdc4056fded_1600x1066.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:970,&quot;width&quot;:1456,&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_!YynR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Face5b52b-717b-4cca-b4a6-3fdc4056fded_1600x1066.png 424w, https://substackcdn.com/image/fetch/$s_!YynR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Face5b52b-717b-4cca-b4a6-3fdc4056fded_1600x1066.png 848w, https://substackcdn.com/image/fetch/$s_!YynR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Face5b52b-717b-4cca-b4a6-3fdc4056fded_1600x1066.png 1272w, https://substackcdn.com/image/fetch/$s_!YynR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Face5b52b-717b-4cca-b4a6-3fdc4056fded_1600x1066.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>Enjoyable chat about how IT departments can block modern tools, even at &#8220;agile&#8221; companies. <a href="https://youtu.be/fYh1CWadxDM">Watch the full session</a></em></figcaption></figure></div><h4>Topic #4: Why CTOs are rolling out agents with top-down mandates</h4><p>Thomas discussed how engineering leaders introduce agentic tools after playing with them as side projects.</p><blockquote><p> &#8220;What happened in the last two years through coding agents like Copilot, Cursor, and Devin, is that many CTOs and CIOs, even in the largest banks, realized they can go back to coding. It no longer takes hours to install all the packages and figure out all the problems.</p><p>I actually have friends in these spaces who tell me stories of how every night they&#8217;d give the agent a task and say: &#8220;build me this.&#8221; Then, in the morning they would check in with the agent and instruct it to keep going. And then they have their normal day-to-day as CTO of a big bank.</p><p>You do that for two weeks and you realize everything is going to change &#8211; and that it <em>has</em> to change in my organization. And in contrast to the Twilio founders &#8211; in their case, they had developers decide, bottom up, what tools to use &#8211; these CTOs and CIOs say: &#8220;I don&#8217;t want to hear any excuses. We&#8217;re going to roll out agents.&#8221;</p><p>Still, many banks are on very archaic systems and have developers log into Citrix, and jump through all sorts of hoops to use agents.&#8221;</p></blockquote><p><em>Claude Code was introduced in a similar way at Canadian fintech, Wealthsimple, <a href="https://newsletter.pragmaticengineer.com/i/186760687/4-how-wealthsimple-measured-and-decided">as we covered</a> two weeks ago.</em></p><p>The fireside chat touched on more subjects, including the changing role of software engineers and engineering leaders, and the biggest changes Thomas and Rajeev expect this year.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://youtu.be/fYh1CWadxDM&quot;,&quot;text&quot;:&quot;Watch the closing session&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://youtu.be/fYh1CWadxDM"><span>Watch the closing session</span></a></p><p>You can now also watch the other keynote session: <strong><a href="https://youtu.be/Bo6Gtq3nMXc">How AI is reshaping the craft of building software</a></strong> with OpenAI and the Codex team. Full subscribers can already <strong><a href="https://newsletter.pragmaticengineer.com/p/the-pragmatic-summit-recordings">check out all sessions at The Pragmatic Summit</a></strong>, Q&amp;A included. <em>The other sessions without Q&amp;As will be released next week for everyone.</em></p><p>The remainder of this article covers an event hosted by Martin Fowler.</p><h2>3. &#8216;Future of Software Development Summit&#8217; with Martin Fowler</h2><p>Back in February of 2001, a group of 17 software developers gathered at a ski resort in Snowbird, Utah, where they drafted and signed the famous Agile Manifesto.</p><p>Almost exactly 25 years later, Martin Fowler and Thoughtworks organized a retreat at almost the same place in Deer Valley, Utah. He invited around 50 tech leaders from large enterprises and nimble startups, researchers, authors, and experienced, hands-on software engineers. Held earlier this month, it was <em>&#8220;The Future of Software Development,&#8221; </em>and I was delighted to attend the two-day gathering featuring <a href="https://annievella.com/">Annie Vella</a>, <a href="https://newsletter.pragmaticengineer.com/p/tdd-ai-agents-and-coding-with-kent">Kent Beck</a>, <a href="https://newsletter.pragmaticengineer.com/p/steve-yegge-on-ai-agents-and-the">Steve Yegge</a>, <a href="https://itrevolution.com/author/gene-kim/">Gene Kim</a>, <a href="https://newsletter.pragmaticengineer.com/p/measuring-the-impact-of-ai-on-software">Laura Tacho</a>, &#8211; and of course, <a href="https://newsletter.pragmaticengineer.com/p/martin-fowler">Martin</a> himself.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KUwA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959158ac-d787-448e-9889-0d7ec9299ea4_1600x1451.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KUwA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959158ac-d787-448e-9889-0d7ec9299ea4_1600x1451.png 424w, https://substackcdn.com/image/fetch/$s_!KUwA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959158ac-d787-448e-9889-0d7ec9299ea4_1600x1451.png 848w, https://substackcdn.com/image/fetch/$s_!KUwA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959158ac-d787-448e-9889-0d7ec9299ea4_1600x1451.png 1272w, https://substackcdn.com/image/fetch/$s_!KUwA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959158ac-d787-448e-9889-0d7ec9299ea4_1600x1451.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KUwA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959158ac-d787-448e-9889-0d7ec9299ea4_1600x1451.png" width="1456" height="1320" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/959158ac-d787-448e-9889-0d7ec9299ea4_1600x1451.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1320,&quot;width&quot;:1456,&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_!KUwA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959158ac-d787-448e-9889-0d7ec9299ea4_1600x1451.png 424w, https://substackcdn.com/image/fetch/$s_!KUwA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959158ac-d787-448e-9889-0d7ec9299ea4_1600x1451.png 848w, https://substackcdn.com/image/fetch/$s_!KUwA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959158ac-d787-448e-9889-0d7ec9299ea4_1600x1451.png 1272w, https://substackcdn.com/image/fetch/$s_!KUwA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959158ac-d787-448e-9889-0d7ec9299ea4_1600x1451.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">Top row: Martin Fowler, Kent Beck. Next row: With Annie Vella, Gene Kim, and Steve Yegge signing his book, &#8216;Vibe Coding&#8217;</figcaption></figure></div><p>This was no attempt to draft a second landmark manifesto; rather, it was an opportunity to share notes and consider where the tech industry might be headed. It was an intense day of back-and-forth about what we&#8217;re seeing and what to make of it.</p><p><strong>One declaration was drafted. </strong>Kent Beck, Laura Tacho, and Steve Yegge, came up with an apposite statement on inflated expectations upon AI to magically improve everything in workplaces:</p><blockquote><p>&#8220;Organizations are constrained by human and systems-level problems. We remain skeptical of the promise of any technology to improve organizational performance without first addressing human and systems-level constraints.</p><p>We remain skeptical and we remain human&#8221;. &#8211; Kent Beck, Laura Tacho, and Steve Yegge.</p></blockquote><h3>Personal notes</h3><p>I have my own thoughts on the topics covered:</p><p><strong>Everyone, everywhere is adopting AI rapidly, which in some ways is very surprising. </strong>Looking back on tech innovation over the last 20 years, such as mobile, cloud, or even crypto &#8211; adoption was gradual. For example, native mobile progressed like this:</p><ol><li><p><strong>Indie devs</strong>: in the first few years, startups, experimental individuals, and teams onboarded to the new technology. For native mobile apps, 2008 was when iOS and Android launched their app stores. Between 2008 and 2010, it was mostly indie developers, small teams, and companies that built their apps.</p></li><li><p><strong>Startups and forward-thinking companies</strong>: a few years later, more startups saw the opportunity to jump in. For example, Uber was founded in 2010 and Snap in 2011. Some forward-thinking places also launched in this period, like Starbucks with an iOS app in 2009.</p></li><li><p><strong>Larger tech companies</strong>: Years on, some forward-looking, larger tech companies adopted the technology. For example, Bank of America launched an app in 2011 (3 years into native mobile), Yahoo started to go all-in on native mobile apps from late 2012.</p></li><li><p><strong>&#8220;Traditional&#8221; tech companies finally catch up:</strong> Eventually, slow-moving companies also move over when it becomes a baseline expectation to use a new technology. For example, Ryanair launched its native iOS app in 2014, six years after native mobile apps emerged.</p></li></ol><p>Contrast that to today, when it seems like everyone is moving all at once. I talked with folks from companies like John Deere (agriculture), 3M (industrial products), Cisco (networking hardware), Wealthsimple (finance), AWS (cloud), and startups, and none could be called &#8220;behind.&#8221; Every company is rolling out agentic AI tools; for example, Wealthsimple did <a href="https://newsletter.pragmaticengineer.com/i/186760687/4-how-wealthsimple-measured-and-decided">a global Claude Code rollout</a> just a week earlier.</p><p>Based on past experience, you might expect at least<em> some </em>traditional companies with no exposure to AI to wait and see what happens. But I found none doing so.</p><p><strong>Traditional, &#8220;old school&#8221; companies don&#8217;t seem to be lagging behind the pace. </strong>A traditional company with 10,000+ developers has more than 50% of software development outsourced. This place founded an AI platform team with a mission to eliminate outsourcing activity via a mix of efficiencies from AI tools and targeted hiring.</p><p>They have already built an AI debugging agent popular across the whole business that&#8217;s connected to all internal systems like monitoring, logging, and internal data stores. It helps a dev pinpoint any and all errors and bugs. This platform team is building more internal tools and hiring aggressively.</p><p>It&#8217;s a similar story at other trad places: most are already using AI agents, some are experimenting with AI used for large-scale refactors, and others are seeking use cases for agent swarms.</p><p><strong>Smaller engineering teams are a certainty. </strong>Around 20 engineering leaders &#8211; many at large enterprises, some at tiny startups &#8211; said that engineering teams are shrinking. One Head of Engineering at a 200-year-old company in the agriculture sector put it like this:</p><blockquote><p>&#8220;We are already seeing the end of two-pizza teams (6-10 people) thanks to AI. Our teams are slowly but surely becoming one-pizza teams (3-4 people) across the business&#8221;.</p></blockquote><p>To emphasize, this is one of the most traditional companies which sells physical goods and hardware, and whose business has no disruption to fear from AI. But they&#8217;ve also adapted!</p><h3>Observations from Laura Tacho</h3><p>Laura was kind enough to share her notes on this event for this article:</p>
      <p>
          <a href="https://newsletter.pragmaticengineer.com/p/the-future-of-software-engineering-with-ai">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How Codex is built]]></title><description><![CDATA[A deepdive into how OpenAI's Codex team builds its coding agent, how engineers use it, and what it could mean for the future of software engineering. Exclusive]]></description><link>https://newsletter.pragmaticengineer.com/p/how-codex-is-built</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/how-codex-is-built</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 17 Feb 2026 17:42:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4VEI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203166c0-3345-4162-9176-4f9a1cac804f_1600x1067.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>More than a million developers <a href="https://x.com/sama/status/2019219967250669741?s=20">use</a> OpenAI&#8217;s multi-agent coding assistant every week. Named Codex, usage has increased 5x since the start of January, the team tells me. In the first week of February, OpenAI <a href="https://openai.com/index/introducing-the-codex-app/">launched</a> the Codex desktop app, a macOS application that CEO Sam Altman calls &#8220;the most loved internal product we&#8217;ve ever had&#8221;. A few days later, OpenAI <a href="https://openai.com/index/introducing-gpt-5-3-codex/">shipped</a> GPT-5.3-Codex, which they describe as the first model that helped create itself.</p><p>Personally, I&#8217;ve been warming up to Codex since doing an interview for The Pragmatic Engineer podcast <a href="https://newsletter.pragmaticengineer.com/p/the-creator-of-clawd-i-ship-code">with Peter Steinberger</a>, the creator of OpenClaw, in which he <a href="https://newsletter.pragmaticengineer.com/i/185922983/interesting-learnings-from-thow-peter-builds-software">revealed</a> that he writes all of OpenClaw with Codex, preferring longer-running agentic loops.<em> Update: on Monday, Peter <a href="https://steipete.me/posts/2026/openclaw">announced</a> he is joining OpenAI to work on building next-generation agents. It&#8217;s a major win for OpenAI and the Codex team, while OpenClaw remains independent and open source. Check out <a href="https://newsletter.pragmaticengineer.com/p/the-creator-of-clawd-i-ship-code">my podcast with Peter</a> in his first in-depth interview, around when OpenClaw (back then: Clawd) was getting massive momentum.</em></p><p>To find out how Codex was built, how teams at OpenAI use it, and what effect it&#8217;s having on software engineering practices at the ChatGPT maker, I spoke with three people at OpenAI:</p><ul><li><p><a href="https://www.linkedin.com/in/thibault-sottiaux-27195366/">Thibault Sottiaux</a> (Tibo), head of Codex.</p></li><li><p><a href="https://www.linkedin.com/in/sqmah/">Shao-Qian (SQ) Mah</a>, researcher on the Codex team who trains the models that power it.</p></li><li><p><a href="https://www.linkedin.com/in/emmaytang/">Emma Tang</a>, head of data infrastructure, who isn&#8217;t on the Codex team but whose team uses Codex heavily.</p></li></ul><p>This deep dive covers:</p><ol><li><p><strong>How it started.</strong> From an internal experiment in late 2024, to a product used by more than a million devs.</p></li><li><p><strong>Technology and architecture choices.</strong> Why Rust and open source? In-depth on how the agent loop works.</p></li><li><p><strong>How Codex builds itself.</strong> Codex itself writes more than 90% of the app&#8217;s code, the team estimates. Also: interesting engineering practices like tiered code review, Codex self-testing itself, and onboarding new engineers to the team via pairing.</p></li><li><p><strong>Research. </strong>Training the next Codex model with the current one has parallels with software engineering. Running evals, A/B testing and internal dogfooding.</p></li><li><p><strong>Codex usage at OpenAI.</strong> Emma&#8217;s data team built an internal &#8220;data agent&#8221; in two months &#8212; that would have  probably taken over a year, before. The number of PRs is so large that the traditional PR flow is starting to crack, though.</p></li><li><p><strong>How software engineering is changing at OpenAI.</strong> The &#8220;30/70 rule:,&#8221; some engineers returning to tab-complete, and the importance of &#8220;taste.&#8221;</p></li><li><p><strong>Next steps.</strong> GPT-5.2 step change, the capability overhang, and where Codex goes next.</p></li></ol><p>Last week&#8217;s debut Pragmatic Summit, in San Francisco, featured a fireside chat with Tibo, myself, and the audience, and featured new details about how Codex is built. Paid subscribers <a href="https://newsletter.pragmaticengineer.com/p/the-pragmatic-summit-recordings">can watch this recording now</a>. <em>Free subscribers will get access to all videos from the Pragmatic Summit in a couple of weeks.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4VEI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203166c0-3345-4162-9176-4f9a1cac804f_1600x1067.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4VEI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203166c0-3345-4162-9176-4f9a1cac804f_1600x1067.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4VEI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203166c0-3345-4162-9176-4f9a1cac804f_1600x1067.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4VEI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203166c0-3345-4162-9176-4f9a1cac804f_1600x1067.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4VEI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203166c0-3345-4162-9176-4f9a1cac804f_1600x1067.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4VEI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203166c0-3345-4162-9176-4f9a1cac804f_1600x1067.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/203166c0-3345-4162-9176-4f9a1cac804f_1600x1067.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&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;: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_!4VEI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203166c0-3345-4162-9176-4f9a1cac804f_1600x1067.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4VEI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203166c0-3345-4162-9176-4f9a1cac804f_1600x1067.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4VEI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203166c0-3345-4162-9176-4f9a1cac804f_1600x1067.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4VEI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F203166c0-3345-4162-9176-4f9a1cac804f_1600x1067.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Tibo, Head of Codex at OpenAI (left), and Vijaye Raji, CTO of Applications at OpenAI (center), on stage at the maiden Pragmatic Summit, in SF. <a href="https://newsletter.pragmaticengineer.com/p/the-pragmatic-summit-recordings">See the full conversation here</a></em></figcaption></figure></div><p>Longtime readers might recall a deepdive entitled <a href="https://newsletter.pragmaticengineer.com/p/how-claude-code-is-built">How Claude Code is built</a>, based on interviews with the founding engineers at Claude Code. Some comparisons with today&#8217;s topic are obvious: Codex and Claude Code have each made bets that seem to be paying off. I was initially skeptical when I talked with the Codex team last October because the cloud-first, long-running task approach didn&#8217;t click with me. But I&#8217;ve now changed my mind.</p><h2>1. How it started</h2><p>In 2024, OpenAI was experimenting with various approaches for building a software agent. That fall, the company declared that building an <strong>aSWE</strong> (Autonomous Software Engineer) was to be a top-line goal for 2025. This vision came from the top: Greg Brockman and Sam Altman believed they should have an autonomous software engineer working alongside teams. Tibo describes the thinking:</p><blockquote><p>&#8220;Greg and Sam had the strong conviction: &#8216;eventually, we should have an autonomous software engineer working alongside us and with the capabilities seen from <a href="https://openai.com/o1/">o1</a>-preview, the time is now to have a group absolutely dedicated to making this a reality&#8217;&#8221;.</p></blockquote><p>A number of folks who&#8217;d worked on earlier prototypes were pulled into the effort, which featured:</p><ul><li><p><a href="https://www.linkedin.com/in/michael-bolin-7632712/">Michael Bolin</a>: tech lead for the Codex <a href="https://github.com/openai/codex">open source repository</a>.</p></li><li><p><a href="https://www.linkedin.com/in/gpeal/">Gabriel Peal</a>: who subsequently built the VS Code extension, mostly solo, and built the foundations of the Codex desktop app.</p></li><li><p><a href="https://www.linkedin.com/in/fouadmatin/">Fouad Matin</a>: who led the initial release of the Codex CLI, and is responsible for Codex&#8217;s safety and security approach.</p></li></ul><p>OpenAI had two teams tackle different segments of the problem space: Codex Web would focus on an async, cloud-based solution, while Codex CLI targeted iterative, local development. Both products would launch in the spring, with Codex CLI being <a href="https://openai.com/index/introducing-o3-and-o4-mini/?utm_source=chatgpt.com">announced</a> in April 2025, and Codex in ChatGPT <a href="https://openai.com/index/introducing-codex/">introduced</a> in May.</p><h2>2. Technology and architecture choices</h2><p>An obvious difference between Codex and Claude Code is the programming language. Claude Code is written in TypeScript, &#8220;<a href="https://newsletter.pragmaticengineer.com/i/174356873/2-tech-stack-and-architecture">on distribution</a>&#8221;, which plays to the underlying model&#8217;s strengths. Meanwhile, the Codex CLI is written in Rust. Tibo explains why:</p><blockquote><p>&#8220;We debated TypeScript, Go, and Rust. All three seemed like solid contenders for different time horizons. In the end, our reasoning came down to a few layers:</p></blockquote><ul><li><p><strong>Performance</strong>: We want to eventually run this agent at a massive scale where every millisecond matters. Performance is also important when running locally in a sandboxed environment.</p></li><li><p><strong>Correctness</strong>: We wanted to choose a language that helps eliminate a class of errors with things like strong typing and memory management.</p></li><li><p><strong>Engineering culture and engineering quality: </strong>There&#8217;s this interesting thing that language choice does: it gets you to think about the engineering bar you set. We decided to pick Rust because it&#8217;s extremely important for our core agent implementation to be extremely high quality&#8221;.</p></li></ul><p>There was also a practical concern about dependencies. Choosing TypeScript means using the npm package manager. Using npm often means building on top of packages that may not be fully understood &#8211; which could clearly be problematic. By going with Rust, the team has very few dependencies and can thoroughly look through the few dependencies there are.</p><p>They also want to eventually run the Codex agent in all sorts of environments &#8211; not just laptops and data centers &#8211; and even places like embedded systems. Rust makes this more achievable from a performance perspective than TypeScript or Go.</p><p>Tibo tells me that while Codex&#8217;s early performance was less standout with Rust than with TypeScript, they expected the model to catch up. Plus, choosing Rust gave them one more engineering challenge to work with. The Codex team also hired the maintainer of<a href="https://github.com/ratatui/ratatui"> </a><a href="https://ratatui.rs/">Ratatui</a> &#8211; the Rust library for building terminal user interfaces (TUIs). He&#8217;s now full-time on the Codex team, doing open source work.</p><p>The core agent and CLI are<a href="https://github.com/openai/codex"> fully open source</a> on GitHub.</p><h3>How Codex works</h3><p>The core loop is a state machine, and the agent loop is the core logic in the Codex CLI. This loop orchestrates the interaction between the user, the model, and the tools the model uses. This &#8220;agent loop&#8221; is something every AI agent uses, not just Codex, and below is how Codex implements it, at a high level:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tS11!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87295a7-0941-47ed-928d-cb17d1567fe1_1640x1216.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tS11!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87295a7-0941-47ed-928d-cb17d1567fe1_1640x1216.png 424w, https://substackcdn.com/image/fetch/$s_!tS11!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87295a7-0941-47ed-928d-cb17d1567fe1_1640x1216.png 848w, https://substackcdn.com/image/fetch/$s_!tS11!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87295a7-0941-47ed-928d-cb17d1567fe1_1640x1216.png 1272w, https://substackcdn.com/image/fetch/$s_!tS11!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87295a7-0941-47ed-928d-cb17d1567fe1_1640x1216.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tS11!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87295a7-0941-47ed-928d-cb17d1567fe1_1640x1216.png" width="1456" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f87295a7-0941-47ed-928d-cb17d1567fe1_1640x1216.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:127939,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.pragmaticengineer.com/i/188285137?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87295a7-0941-47ed-928d-cb17d1567fe1_1640x1216.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tS11!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87295a7-0941-47ed-928d-cb17d1567fe1_1640x1216.png 424w, https://substackcdn.com/image/fetch/$s_!tS11!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87295a7-0941-47ed-928d-cb17d1567fe1_1640x1216.png 848w, https://substackcdn.com/image/fetch/$s_!tS11!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87295a7-0941-47ed-928d-cb17d1567fe1_1640x1216.png 1272w, https://substackcdn.com/image/fetch/$s_!tS11!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87295a7-0941-47ed-928d-cb17d1567fe1_1640x1216.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">How Codex works, at a high level</figcaption></figure></div><ol><li><p><strong>Prompt assembly</strong>: the agent takes user input and prepares the prompt to pass to the model. On top of user input, the prompt includes system instructions (coding standards, rules), a list of available tools (including MCP servers), and the actual input: text, images, files, AGENTS.md contents, and local environment info.</p></li><li><p><strong>Inference</strong>: the prompt is converted to tokens and fed to the model, which streams back output events: reasoning steps, tool calls, or a response.</p></li><li><p><strong>Response</strong>:</p><ol><li><p>Stream the response to the user by showing it on the terminal.</p></li><li><p>If the model decides to use a tool, make this tool call: e.g. read a file, run a bash command, write code. If a command fails, the error message goes back to the model, the model attempts to diagnose the issue, and may decide to retry.</p></li></ol></li><li><p><strong>Tool response</strong> (optional): if a tool was invoked, return the response to the model. Repeat steps 3 and 4 for as long as more tool calls are needed.</p></li><li><p><strong>Assistant message</strong>: the &#8220;final message&#8221; intended for the user which closes one step in the loop. The loop then starts again with a new user message.</p></li></ol><p><strong>Compaction</strong> is an important technique for efficiently running agents. As conversations grow lengthy, the context window fills up. Codex uses a compaction strategy: once the conversation exceeds a certain token count, it calls a special Responses API endpoint, which generates a <em>smaller</em> representation of the conversation history. This smaller version replaces the old input and avoids quadratic inference costs. <em>We covered how self-attention scales quadratically <a href="https://newsletter.pragmaticengineer.com/i/141865286/scalability-challenge-from-self-attention">in our 2024 ChatGPT deepdive</a>.</em></p><p><strong>Safety</strong> is an important consideration because LLMs are nondeterministic. Codex runs in a sandbox environment that restricts network access and filesystem access by default. Tibo reflects on this choice:</p><blockquote><p>&#8220;We take a stance with the sandboxing that hurts us in terms of general adoption. However, we do not want to promote something that could be unsafe by default. As a dev, you can always go into your configuration and disable these settings if you want.</p><p>We made this default setting because many of our users are not that technical. We don&#8217;t want to give them something that could have unintended consequences&#8221;.</p></blockquote><p><strong>There are several releases per week. </strong>Internally, the team ships a new version of Codex up to three or four times a day. Externally, new releases are cut every few days and are distributed via package managers, Homebrew, and npm.</p><p>Michael Bolin&#8217;s recent blog post, &#8220;<a href="https://openai.com/index/unrolling-the-codex-agent-loop/">Unrolling the Codex Agent Loop</a>,&#8221; lays out the internals of how the agent loop works.</p><h2>3. How Codex builds itself</h2><p><strong>More than ninety percent of the Codex app&#8217;s code was generated by Codex itself,</strong> the team estimates, which happens to be roughly in line with what Anthropic has reported for Claude Code, according to what its creator Boris Cherny <a href="https://newsletter.pragmaticengineer.com/i/174356873/2-tech-stack-and-architecture">told me</a>. Both AI labs share the meta-circularity of using the coding tools to write their own code.</p><p>Tibo tells me that a typical engineer on the Codex team runs between four and eight parallel agents, which do any one of a number of tasks:</p><ul><li><p>Feature implementation</p></li><li><p>Code review</p></li><li><p>Security review</p></li><li><p>Codebase understanding</p></li><li><p>Going through plans and summarizing</p></li><li><p>Going through what team members have done and summarizing changes</p></li><li><p>Bugfixes</p></li><li><p>&#8230; and more.</p></li></ul><p><strong>Codex engineers are now &#8220;agent managers&#8221;</strong> and no longer just write code. Tibo says it&#8217;s common for an engineer to walk into the office with several tabs open on their laptop: a code review running in one, a feature being implemented in another, a security audit in a third, and a codebase summary being generated in a different tab. He says:</p><blockquote><p>&#8220;Codex is really built for multitasking. There&#8217;s this understanding that most tasks will just get done to completion.</p><p>People on our team have figured out what Codex is and isn&#8217;t capable of. There is a tricky thing in all of this, though: we have to relearn these capabilities with every model&#8221;.</p></blockquote><h3>Frequently-used &#8220;skills&#8221;</h3><p>&#8220;<a href="https://developers.openai.com/codex/skills/">Agent Skills</a>&#8221; are ways to extend Codex with task-specific capabilities, which is pretty much the same concept as <a href="https://code.claude.com/docs/en/skills">Claude Code&#8217;s skills</a>. Internally, the Codex team built 100+ Skills to share and choose from. Three interesting examples:</p><ul><li><p><strong>Security best-practices skill</strong>: a comprehensive write-up of all security practices adopted by the team. When invoked, Codex goes through each practice, checks the code, and generates patches for anything missing.</p></li><li><p><strong>&#8220;Yeet&#8221; skill:</strong> takes any code change, writes up the PR title and description based on the original plan, and creates a draft PR in one step.</p></li><li><p><strong>Datadog integration skill</strong>: Codex connects to Datadog, reviews alerts and issues, finds problems, and tries to generate a fix for them.</p></li></ul><p>The way Tibo thinks about skills is that they help steer the model to more specific behaviors, and they can also be combined. Skills are continuously published internally and team members copy from each other.</p><h3>Tiered code review</h3><p>The team set up AI code review and it always runs. The team trained a bespoke model for code review, optimizing it for signal over noise. Around nine out of 10 comments point out valid issues, says Tibo, which is equal to or slightly better than human reviewers. AI reviews are run automatically whenever a pull request moves from &#8220;draft&#8221; state to &#8220;in-review&#8221; state, and are automated via a GitHub webhook.</p><p>Following an AI review, there are two possible next steps:</p><ul><li><p><strong>Non-critical code: can be merged with no further human review.</strong> For non-critical parts of the code where speed matters more than perfection, the engineer running the agent can decide to merge the code following an AI review, when they decide it&#8217;s ready.</p></li><li><p><strong>Key parts of the codebase: mandatory human review.</strong> For key code parts such as the core agent and open source components, the team insists on careful human code reviews.</p></li></ul><h3>Other engineering practices on the team</h3><p>Here are more practices that Tibo rates as helpful for the Codex team:</p><ul><li><p><strong>AGENTS.md.</strong> Instructions stored inside a repository. On the Codex team, these files tell the agent how to navigate the codebase, which commands to run for testing, and how to follow the project&#8217;s standards. These are a bit like README files, but written for AI agents instead of humans. Agents.md has become a de facto standard across agents, and the only major agent not to use it is Claude Code. See <a href="https://agents.md/">agents.md</a> for more details.</p></li><li><p><strong>Structure code for agents: have tests!</strong> The team has deliberately structured their codebase &#8220;to make it inevitable for the model to succeed&#8221;. Structuring means having tests in-place, clear module boundaries, and instructions on how the model should run validation (eg: tests, linting, etc). When the model implements something incorrectly, a test fails, the agent notices, and it tries to figure out what went wrong. Since the model is trained to be persistent, it keeps trying until it gets it right. Tasks can run for 20 to 30 minutes, or sometimes an hour.</p></li><li><p><strong>Codex running the test suite to test itself. </strong>In what is an interesting meta-testing capability, Codex can fully test itself, using a specific skill. This skill runs tests for all of Codex&#8217;s own features. Amusingly, Codex seems to invoke this skill more often than expected.</p></li><li><p><strong>Overnight, Codex runs to generate suggested fixes.</strong> The team set up nightly runs of Codex, instructed to look for issues across Codex. Every morning, engineers review issues that Codex identified with the codebase, with fixes waiting for review.</p></li><li><p><strong>Onboarding to the Codex team via pairing. </strong>New joiners are asked to keep an open mind about how the Codex team does development, and are warned that the &#8220;how&#8221; of building software is different than at most places. A new joiner is paired with an engineer on the team and shadows them for the first part of the day, observing how they develop with Codex. They are then assigned a task in the second half of the day, and are expected to ship it to production on the same day.</p></li><li><p><strong>Unlimited Codex usage. </strong>To put everything in this deepdive in context, OpenAI employees &#8211; just like at Anthropic &#8211; have no usage cap on LLMs. This makes sense given they are building a tool they want customers to use as much as possible. However, it&#8217;s in contrast to non-AI labs. <em>Keep this in mind as we go through how the team operates.</em></p></li></ul><h3>Using Codex to debug Codex</h3><p>The Codex team holds meetings to discuss Codex, during which it&#8217;s common for engineers to fire off a thread within Codex to see if it can come back with some information. This January, something interesting began happening, Tibo told me:</p><blockquote><p>&#8220;When we asked questions related to why Codex runs in a certain way, Codex decided to debug its own systems. It connected to logs, SSH&#8217;d into research dev boxes, and analyzed ML instabilities.</p><p>It figured out a lot of useful information, and wrote a little report we could present on the screen. So, we ended up going through this doc in the meeting&#8221;.</p></blockquote><p>This feels like another meta-circularity of Codex debugging itself &#8211; or at least systems that power it!</p><h2>4. Research</h2><p>Codex is built by researchers as well as software engineers, of whom one is <a href="https://www.linkedin.com/in/sqmah/">SQ Mah</a>. He managed to move into research from software engineering by competing in the <a href="https://scrollprize.org/">Vesuvius Challenge</a>, of reading millennia-old carbonized scrolls from the ancient Roman town of Pompeii which were buried by a cataclysmic volcanic eruption of Mount Vesuvius in AD 79. SQ finished second in the contest by renting GPUs on Google Cloud, training models, taking research ideas and turning them into useful algorithms.</p><p>So, what is &#8220;research&#8221; like at OpenAI? SQ&#8217;s take:</p>
      <p>
          <a href="https://newsletter.pragmaticengineer.com/p/how-codex-is-built">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Steve Yegge on AI Agents and the Future of Software Engineering]]></title><description><![CDATA[Steve Yegge on the 8 levels of AI adoption, why big companies may be doomed, and why he and many AI-adopters feel drained from using agents non-stop]]></description><link>https://newsletter.pragmaticengineer.com/p/steve-yegge-on-ai-agents-and-the</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/steve-yegge-on-ai-agents-and-the</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 10 Feb 2026 22:14:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!y0gL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb258ddb9-4482-44d1-a597-d8503cf89232_2048x1148.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Note: I&#8217;m currently in San Francisco. Last night, I attended AI Night with WorkOS, and tomorrow I&#8217;ll be hosting <a href="https://www.pragmaticsummit.com/">The Pragmatic Summit</a>.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6gca!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1479a6-12f4-4060-b5d7-caefa6656db0_1600x506.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6gca!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1479a6-12f4-4060-b5d7-caefa6656db0_1600x506.png 424w, https://substackcdn.com/image/fetch/$s_!6gca!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1479a6-12f4-4060-b5d7-caefa6656db0_1600x506.png 848w, https://substackcdn.com/image/fetch/$s_!6gca!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1479a6-12f4-4060-b5d7-caefa6656db0_1600x506.png 1272w, https://substackcdn.com/image/fetch/$s_!6gca!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1479a6-12f4-4060-b5d7-caefa6656db0_1600x506.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6gca!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1479a6-12f4-4060-b5d7-caefa6656db0_1600x506.png" width="1456" height="460" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bf1479a6-12f4-4060-b5d7-caefa6656db0_1600x506.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:460,&quot;width&quot;:1456,&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;: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_!6gca!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1479a6-12f4-4060-b5d7-caefa6656db0_1600x506.png 424w, https://substackcdn.com/image/fetch/$s_!6gca!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1479a6-12f4-4060-b5d7-caefa6656db0_1600x506.png 848w, https://substackcdn.com/image/fetch/$s_!6gca!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1479a6-12f4-4060-b5d7-caefa6656db0_1600x506.png 1272w, https://substackcdn.com/image/fetch/$s_!6gca!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1479a6-12f4-4060-b5d7-caefa6656db0_1600x506.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>More than 200 people attended a packed <a href="https://luma.com/workos-pragmatic">AI Night event</a>, featuring hands-on demos and a fireside chat between WorkOS founder <a href="https://x.com/grinich">Michael Grinich</a> (in the middle, to the left of me) and myself</em></figcaption></figure></div><p><em>The next podcast episode <a href="https://newsletter.pragmaticengineer.com/p/the-programming-language-after-kotlin">with Kotlin&#8217;s creator, Andrey Breslav,</a> will be out on Thursday instead of tomorrow (Wednesday). Regular scheduling, including <a href="https://newsletter.pragmaticengineer.com/s/the-pulse">The Pulse</a>, resumes next week. We&#8217;ll release session recordings from the Pragmatic Summit to paid subscribers first, and later to everyone.</em></p><p><em>Please wish me luck with this event tomorrow, it&#8217;s the first ever in-person event by The Pragmatic Engineer, and there&#8217;s a full house of 500 attendees. If you&#8217;re there, come and say hi!</em></p><div><hr></div><p>Steve Yegge has been a software engineer for over 40 years, with stints at GeoWorks, Amazon, Google, and Grab. He&#8217;s known for provocative, entertaining blog posts, of which the most famous might be <a href="https://gist.github.com/chitchcock/1281611">Stevey&#8217;s Google platform rant</a>.</p><p>Steve recently published the book <em>&#8220;Vibe Coding&#8221;,</em> has also built <a href="https://github.com/steveyegge/gastown">Gas Town</a>, an open-source AI agent orchestrator, and created documentation site and community hub <a href="https://gastownhall.ai/">Gas Townhall</a> around the project. A year ago, we did <a href="https://newsletter.pragmaticengineer.com/p/amazon-google-and-vibe-coding-with">a podcast</a> focusing on his career, including how he used AI for coding. Last week, Steve and I sat down again in Salt Lake City and explored what&#8217;s changed in terms of using LLMs for coding, and also the wider tech industry.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!u5UR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db99a33-23b5-4f42-9fff-0036150bab74_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!u5UR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db99a33-23b5-4f42-9fff-0036150bab74_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!u5UR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db99a33-23b5-4f42-9fff-0036150bab74_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!u5UR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db99a33-23b5-4f42-9fff-0036150bab74_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!u5UR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db99a33-23b5-4f42-9fff-0036150bab74_1600x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!u5UR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db99a33-23b5-4f42-9fff-0036150bab74_1600x1200.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7db99a33-23b5-4f42-9fff-0036150bab74_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!u5UR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db99a33-23b5-4f42-9fff-0036150bab74_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!u5UR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db99a33-23b5-4f42-9fff-0036150bab74_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!u5UR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db99a33-23b5-4f42-9fff-0036150bab74_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!u5UR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db99a33-23b5-4f42-9fff-0036150bab74_1600x1200.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Steve (right) and I in Salt Lake City</em></figcaption></figure></div><p>In this article, we cover:</p><ol><li><p><strong>LLMs, the end of coding by hand, and the S-curve. </strong>Initially skeptical of LLMs, Steve became a convert after trying out Claude Code. He now argues the industry is headed into a steep exponential curve that shows no signs of stopping.</p></li><li><p><strong>&#8220;50% dial&#8221; and deep cuts</strong>. Could big companies cut up to 50% of their staff in order to make way for AI tools? Such a trend might dwarf pandemic-era layoffs.</p></li><li><p><strong>Eight levels of AI adoption.</strong> A spectrum of AI adoption, from &#8220;no AI&#8221;, to &#8220;building your own orchestrator&#8221;. Steve fears engineers stuck at the lower levels will be left behind.</p></li><li><p><strong>The Dracula effect: the drain of using AI. </strong>Vibe coding at full speed can be physically draining, and Steve argues that employers shouldn&#8217;t reasonably expect more than three hours of AI-augmented work from engineers, per day.</p></li><li><p><strong>Big companies are doomed &#8211; but don&#8217;t know it. </strong>Innovation at large companies is effectively dead, and the real action will come from small, AI-augmented teams &#8211; like when cloud computing shifted the balance of power.</p></li><li><p><strong>Redundant values in the AI era. </strong>Knowing how to code doesn&#8217;t make engineers special any more, but demand for software will keep growing.</p></li><li><p><strong>Debugging and programming languages. </strong>Agents may not need good debugging tools, and language choices have never mattered less.</p></li><li><p><strong>Grieving the demise of coding by hand. </strong>Steve endured a grieving process when he realized many skills are obsolete, BUT building software is now more fun than ever.</p></li><li><p><strong>Predictions.</strong> Steve&#8217;s non-coder wife could be the top contributor to their video game, <a href="https://store.steampowered.com/app/1541710/Wyvern/">Wyvern</a>.</p></li></ol><p>Related The Pragmatic Engineer articles featuring Steve:</p><ul><li><p><a href="https://newsletter.pragmaticengineer.com/p/amazon-google-and-vibe-coding-with">Amazon, Google, and Vibe Coding with Steve Yegge</a> (podcast episode in 2025)</p></li><li><p><a href="https://newsletter.pragmaticengineer.com/p/steve-yegge">The full circle of developer productivity with Steve Yegge</a> (deepdive in 2022)</p></li></ul><p>Originally, I had audio quality issues with this recording. Fortunately, I managed to improve the audio and remove echos, and the episode is also available as a podcast now:</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.pragmaticengineer.com/p/from-ides-to-ai-agents-with-steve&quot;,&quot;text&quot;:&quot;Listen to the podcast version&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.pragmaticengineer.com/p/from-ides-to-ai-agents-with-steve"><span>Listen to the podcast version</span></a></p><h2>1. LLMs, the end of coding by hand, and the S-curve</h2><p><strong>One thing about you is that you&#8217;re pretty pragmatic. You were always into compilers, debugger tools, and worked on hard problems at Amazon and Google. When AI came out, I don&#8217;t remember you saying, &#8220;this is amazing!&#8221; What was your initial reaction to LLMs?</strong></p><p><strong>Steve: </strong>&#8220;I was pretty blown away that they could write fairly coherent Emacs and Lisp functions. The original ChatGPT in December 2022 could already write code in a weird language, right? Not very much of it, and it was janky; but for me, that was the beginning. I&#8217;ve had friends who were saying for 20 years, &#8220;any minute now, any day now&#8221; about AI. But 2022 was the first time that it was like, &#8220;okay, I see now.</p><p>I was still skeptical when the rumors emerged about Claude Code at the start of last year, that Anthropic had a tool internally that was writing code for them and it was a command line tool. Like many others, my reaction was &#8220;no, it&#8217;s not!&#8221; Then I used it and was like, &#8220;oh, I get it. We&#8217;re all doomed.&#8221;  It was then that I wrote <a href="https://sourcegraph.com/blog/the-death-of-the-junior-developer">The Death of the Junior Developer</a>.</p><p>So, was I a skeptic? Yes. But did I pay attention to the curves from the very beginning? Also yes. It was at that point that I thought we&#8217;re on a curve, this is a ride, and it&#8217;s not stopping, so let&#8217;s get on board and see where it goes.&#8221;</p><p>I dived in. I was feeling behind because I didn&#8217;t know AI, I didn&#8217;t know its fundamentals, or the lingo. I spent a year doing nothing but reading papers and catching up&#8221;.</p><p><strong>Your book,</strong><em><strong> &#8216;Vibe Coding&#8217;,</strong></em><strong> says on its rear cover: &#8220;the days of coding by hand are over&#8221;. When did you decide this?</strong></p><p><strong>Steve: </strong>&#8220;It was a year ago [early 2025] and that wasn&#8217;t even my quote. It&#8217;s <a href="https://en.wikipedia.org/wiki/Erik_Meijer_(computer_scientist)">Dr. Erik Meijer</a>, the inventor of many things in the programming world, and one of the most important compiler people in the world. He spent his life building technology for developers to be able to write code, and he&#8217;s saying developers aren&#8217;t going to write code anymore. That&#8217;s what caused <a href="http://www.realgenekim.me/">Gene Kim</a> (author of The Phoenix Project and former CTO of Tripwire) and I to both say that if someone this prolific in the tech world says &#8216;we&#8217;re done writing code&#8217;, then what does he see that we don&#8217;t?</p><p>He sees the curves; it&#8217;s that simple. It&#8217;s like exponential curves, they get real steep, real fast, and we&#8217;re heading into the steep part this year&#8221;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NJf5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c1fd5c-d230-41f2-af26-6af3b72dc3f2_1524x946.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NJf5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c1fd5c-d230-41f2-af26-6af3b72dc3f2_1524x946.png 424w, https://substackcdn.com/image/fetch/$s_!NJf5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c1fd5c-d230-41f2-af26-6af3b72dc3f2_1524x946.png 848w, https://substackcdn.com/image/fetch/$s_!NJf5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c1fd5c-d230-41f2-af26-6af3b72dc3f2_1524x946.png 1272w, https://substackcdn.com/image/fetch/$s_!NJf5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c1fd5c-d230-41f2-af26-6af3b72dc3f2_1524x946.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NJf5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c1fd5c-d230-41f2-af26-6af3b72dc3f2_1524x946.png" width="1456" height="904" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/84c1fd5c-d230-41f2-af26-6af3b72dc3f2_1524x946.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:904,&quot;width&quot;:1456,&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_!NJf5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c1fd5c-d230-41f2-af26-6af3b72dc3f2_1524x946.png 424w, https://substackcdn.com/image/fetch/$s_!NJf5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c1fd5c-d230-41f2-af26-6af3b72dc3f2_1524x946.png 848w, https://substackcdn.com/image/fetch/$s_!NJf5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c1fd5c-d230-41f2-af26-6af3b72dc3f2_1524x946.png 1272w, https://substackcdn.com/image/fetch/$s_!NJf5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c1fd5c-d230-41f2-af26-6af3b72dc3f2_1524x946.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>My copy of <a href="https://itrevolution.com/product/vibe-coding-book/">Vibe Coding</a> written by Gene Kim and Steve. Published mid-2025, it predicts &#8220;the days of coding by hand are over&#8221; on the rear cover</em></figcaption></figure></div><p><strong>One thing about being an engineer is that you can draw curves, but you never know when they end, or if they flatten. What makes you believe that this curve will continue? There&#8217;s also the question of how long they will scale for.</strong></p><p><strong>Steve: </strong>&#8220;The world is filled with unbelievers; people who think the S curve goes up and then flattens, and that we&#8217;re at the hump stage right now. They have thought that ever since GPT-3.5 came out. They&#8217;re like, &#8216;it&#8217;s not going to get any better&#8217;, but then GPT-4 comes out and they think that&#8217;s as good as it gets. Now Opus 4.5 is out and most people haven&#8217;t played with it, and don&#8217;t realize what&#8217;s there. But that thing is already two months old.</p><p>The half-life between models has gone from about four months at the beginning of last year to two months from Anthropic at the beginning of this year, and we&#8217;re going to see another model from them soon, which will be so much further up the curve that people will really freak out. All the bugs, all the mistakes they&#8217;re complaining about get fed right back in as training, so it doesn&#8217;t make them next time. This is what people aren&#8217;t understanding.</p><p>Also, time continues, and there&#8217;s this inevitable collision of curves: there will be societal upheaval. It&#8217;s already started and people are justifiably mad. And I&#8217;m mad too. I&#8217;m mad at Amazon for laying off 16,000 people and blaming AI without an AI strategy. Many of those people are not going to be able to find jobs, by and large, and they&#8217;re the first of many to come. Nobody has a plan for this&#8221;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DaLa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fe07b1-c0cf-4991-bef3-00281d26f6fb_2048x1207.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DaLa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fe07b1-c0cf-4991-bef3-00281d26f6fb_2048x1207.png 424w, https://substackcdn.com/image/fetch/$s_!DaLa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fe07b1-c0cf-4991-bef3-00281d26f6fb_2048x1207.png 848w, https://substackcdn.com/image/fetch/$s_!DaLa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fe07b1-c0cf-4991-bef3-00281d26f6fb_2048x1207.png 1272w, https://substackcdn.com/image/fetch/$s_!DaLa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fe07b1-c0cf-4991-bef3-00281d26f6fb_2048x1207.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DaLa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fe07b1-c0cf-4991-bef3-00281d26f6fb_2048x1207.png" width="1456" height="858" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02fe07b1-c0cf-4991-bef3-00281d26f6fb_2048x1207.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:858,&quot;width&quot;:1456,&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_!DaLa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fe07b1-c0cf-4991-bef3-00281d26f6fb_2048x1207.png 424w, https://substackcdn.com/image/fetch/$s_!DaLa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fe07b1-c0cf-4991-bef3-00281d26f6fb_2048x1207.png 848w, https://substackcdn.com/image/fetch/$s_!DaLa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fe07b1-c0cf-4991-bef3-00281d26f6fb_2048x1207.png 1272w, https://substackcdn.com/image/fetch/$s_!DaLa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fe07b1-c0cf-4991-bef3-00281d26f6fb_2048x1207.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>Steve talking how many people will be worried when they see how capable the next model is, compared to the current one</em></figcaption></figure></div><h2>2. The &#8220;50% dial&#8221; and large cuts</h2><p><strong>Why do you think Amazon did those layoffs if they don&#8217;t have an AI strategy?</strong></p><p><strong>Steve:</strong> &#8220;People will hate me for saying this, and me saying it doesn&#8217;t make it true: it was true already.  Every company has a dial [of the percentage of staff they can lay off] that they turn from zero to a hundred. It just has a default setting of what percentage of your engineers you need to get rid of in order to pay for the rest of them to have AI &#8211; because they&#8217;re all starting to spend their own salaries on tokens.</p><p>And so, at least for a while, if you want engineers to be as productive as possible, you&#8217;re going to have to get rid of half of them to make the other half maximally productive. And as it happens, half your engineers don&#8217;t want to prompt anyway and are ready to quit.</p><p>So what&#8217;s happening is that everybody on average is setting that dial to about 50%, and we&#8217;re going to lose around half the engineers from big companies, which is scary&#8221;.</p><p><strong>That would be more than during the Covid-19 pandemic and afterwards.</strong></p><p><strong>Steve:</strong> &#8220;It&#8217;s going to be way bigger. It&#8217;s going to be awful. But at the same time, something else is happening, which is that AI is enabling non-programmers to write code. It&#8217;s also enabling engineers who have seen the light and believe the curves are going to continue to go up to actually get together in groups and start to do things that rival the output of big companies that are tripping over themselves.</p><p>So, we&#8217;ve got this mad rush of innovation coming up, bottom up. And we&#8217;ve got knowledge workers being laid off by big companies because clearly big businesses are not the right size anymore.</p><p>Even Andy Jassy [Amazon&#8217;s CEO] is saying they&#8217;re going to do the same thing with fewer people. So, does this mean we&#8217;re going to have a million times more companies? Is there going to be a massive explosion of software, or are people going to get out of software altogether and do other stuff? I&#8217;m very curious about where all this goes&#8221;.</p><h2>3. Eight levels of AI adoption</h2><p><strong>Elsewhere, you&#8217;ve said something that might trigger many people, that if you use an IDE today, then you&#8217;re a bad engineer.</strong></p><p><strong>Steve: </strong>&#8220;Well, you&#8217;ve got to be a little provocative! I&#8217;m not going to say you&#8217;re a <em>bad </em>engineer because I know some very good engineers &#8211; better than me &#8211; who are still at level one or two in my chart. But I feel sorry for people who are good engineers &#8211; or who used to be &#8211; and they use Cursor, ask it questions sometimes, review its code really carefully, and then check it in. And I&#8217;m like: &#8216;dude, you&#8217;re going to get fired [because you are not keeping up with modern tools] and you&#8217;re one of the best engineers I know!&#8217;&#8221;</p><p><strong>Tell us about your chart and these eight levels.</strong></p><p><strong>Steve: </strong>&#8220;I drew it on a board in Australia for a big group of people to show what happens, as I saw them all as being at different phases. Some had their IDEs open, some had a big, wide coding agent, and others had a really narrow coding agent. I put them all on a spectrum just to show what&#8217;s going on. Here&#8217;s the levels:</p><ul><li><p><strong>Level 1:</strong> no AI</p></li><li><p><strong>Level 2: </strong>Coding agent in your IDE, permissions turned on</p></li><li><p><strong>Level 3: </strong>Coding agent in IDE, &#8220;YOLO mode.&#8221; Your trust is going up.</p></li><li><p><strong>Level 4:</strong> you&#8217;re starting to not look at the diffs anymore, but at what the agent is doing. You&#8217;re not reviewing as much, you&#8217;re letting more of it through, and you&#8217;re really focused on the conversation with the agent.</p></li><li><p><strong>Level 5:</strong> your approach is: &#8220;I just want the agent and I&#8217;ll look at the code in my IDE later, but I&#8217;m not coding with my IDE&#8221;.</p></li><li><p><strong>Level 6:</strong> several agents. You&#8217;re bored because your agent&#8217;s busy and you want to do something, so you fire up another agent, then another. And you find yourself just multiplexing between them, and you can&#8217;t &#8220;leave&#8221; [you start to get addicted to using more agents.]</p></li><li><p><strong>Level 7: </strong>10+ agents, managed by hand. This is where you typically say &#8220;oh gosh, I&#8217;ve made a mess! I accidentally texted the wrong agent and didn&#8217;t realize. How do I coordinate all these agents? What if Claude Code could run Claude Code?&#8221;</p></li><li><p><strong>Level 8:</strong> you build your own orchestrator to coordinate more agents&#8221;.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UdJX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3322b1f1-3617-46e1-b210-dc220d55fe05_1600x890.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UdJX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3322b1f1-3617-46e1-b210-dc220d55fe05_1600x890.png 424w, https://substackcdn.com/image/fetch/$s_!UdJX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3322b1f1-3617-46e1-b210-dc220d55fe05_1600x890.png 848w, https://substackcdn.com/image/fetch/$s_!UdJX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3322b1f1-3617-46e1-b210-dc220d55fe05_1600x890.png 1272w, https://substackcdn.com/image/fetch/$s_!UdJX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3322b1f1-3617-46e1-b210-dc220d55fe05_1600x890.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UdJX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3322b1f1-3617-46e1-b210-dc220d55fe05_1600x890.png" width="1456" height="810" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3322b1f1-3617-46e1-b210-dc220d55fe05_1600x890.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:810,&quot;width&quot;:1456,&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_!UdJX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3322b1f1-3617-46e1-b210-dc220d55fe05_1600x890.png 424w, https://substackcdn.com/image/fetch/$s_!UdJX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3322b1f1-3617-46e1-b210-dc220d55fe05_1600x890.png 848w, https://substackcdn.com/image/fetch/$s_!UdJX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3322b1f1-3617-46e1-b210-dc220d55fe05_1600x890.png 1272w, https://substackcdn.com/image/fetch/$s_!UdJX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3322b1f1-3617-46e1-b210-dc220d55fe05_1600x890.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">Steve explaining his eight levels of AI usage mental model</figcaption></figure></div><h2>4. The Dracula effect: the drain of using AI</h2><p><strong>One thing you&#8217;ve mentioned is that AI can really &#8220;drain&#8221; people.</strong></p><p><strong>Steve: </strong>&#8220;There is something happening that we need to start talking about as a community. There&#8217;s a vampiric effect with AI, where it gets you excited and you work really hard, and you&#8217;re capturing a ton of value.</p><p>I find myself napping during the day, and I&#8217;m talking to friends at startups and they&#8217;re finding themselves napping during the day. We&#8217;re starting to get tired and cranky.</p><p>Companies are set up to extract value from you, and then pay you for it. The way all companies have always been set up is that they will give you more work until you break. People have to learn the art of pushing back. Let&#8217;s say an engineer can be a hundred times more productive, who gets to capture all that value? Well, if the engineer goes to work and works eight hours a day and produces a hundred times as much, the company captures all that value, and that is not a fair exchange.</p><p>There&#8217;s another group of people who are capturing all the value for themselves. They go in and work for 10 minutes a day and get a hundred times as much done, they don&#8217;t tell anyone, and they&#8217;ve captured all the value. And that&#8217;s not really ideal either, right?</p><p>I think that the answer is that each and every one of us has to learn how to say &#8220;no&#8221; real fast, and get real good at it.</p><p>I seriously think founders and company leaders and engineering leaders at all levels, all the way down to line managers, have to be aware of this and realize that you might only get three productive hours out of a person who&#8217;s vibe coding at max speed. But they&#8217;re still a hundred times as productive as they would be without AI. So, do you let them work for three hours a day? The answer is yes, or your company&#8217;s going to break [because people get burnt out]&#8221;.</p><h2>5. Big companies are doomed &#8211; but don&#8217;t know it</h2><p><strong>With non-technical people getting into building software, could there be jobs for engineers to take over maintenance? For example, with websites you don&#8217;t need an engineer to build one because there&#8217;s Wix, WordPress, etc. But there are frontend engineers at big businesses where the website actually matters, and you want all these advanced bells and whistles. Could this be a thing with AI?</strong></p><p><strong>Steve:</strong> &#8220;There are going to be a lot of engineers doing software engineering, and I just think we&#8217;re all going to be doing it with AI. I think it&#8217;ll be quite some time before companies are comfortable trusting their code to be written and deployed by AI without any human involvement at all. The important point that the naysayers and the skeptics are missing is that AI is <em>not</em> coming to replace your job. It&#8217;s not a replacement function. It&#8217;s an augmentation function. It&#8217;s here to make you better at your job. And that&#8217;s not a bad thing, actually&#8221;.</p><p><strong>Assuming AI makes engineers and teams more efficient, why don&#8217;t we see more and better software being produced? Could it be that engineering teams are focusing on building internal tools around AI, not products?</strong></p><p><strong>Steve: </strong>&#8220;I&#8217;ll turn it around and ask whether what we&#8217;re seeing is innovation dying at large companies? What if we are only going to see innovation in small places? This is kind of what happened when the cloud came out.</p><p>Also, look at Meta. It feels like the biggest company in the world right now, but back in the day it was one dude. When a new enabling platform technology substrate appears, you&#8217;re going to see innovation at the fringes because of the innovator&#8217;s dilemma [when successful companies fail by ignoring innovation elsewhere]. Big companies can&#8217;t innovate. They&#8217;re all running into this problem.</p><p>Big companies may have hyper-productive engineers who are producing at a very, very high rate, but the company itself can&#8217;t absorb that work. Downstream, they&#8217;re just hitting bottlenecks and these engineers are getting shut down and they&#8217;re quitting. So, I think what&#8217;s happening is that we&#8217;re all looking at big companies going, &#8220;When are you going to give us something?&#8221; And the answer is we&#8217;re looking at big, dead companies. We just don&#8217;t know they&#8217;re dead yet&#8221;.</p><h2>6. Redundant values in the AI era</h2><p><strong>What are some beliefs from your earlier career which no longer apply because of AI?</strong></p><p><strong>Steve: </strong>&#8220;&#8216;Engineers are special&#8217;. There&#8217;s one. Sure, we learned how to do something by hand that computers can do now. Kind of cool, I guess&#8221;.</p><p><strong>But what about the &#8220;engineer mindset&#8221;? It&#8217;s not just coding that we do, right?</strong></p>
      <p>
          <a href="https://newsletter.pragmaticengineer.com/p/steve-yegge-on-ai-agents-and-the">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Deepdive: How 10 tech companies choose the next generation of dev tools]]></title><description><![CDATA[Tech businesses from seed-stage startups to publicly-listed companies reveal how they select and roll out next-generation IDEs, CLIs and code review tools. And how they learn which ones work&#8230; and whic]]></description><link>https://newsletter.pragmaticengineer.com/p/measuring-ai-dev-tools</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/measuring-ai-dev-tools</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 03 Feb 2026 17:25:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!djLn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F980b797a-3d2d-43f2-9a0d-2c20069a9f94_1504x530.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Right now, it seems like almost every tech company is changing its developer tooling stack, which is a big shift from eighteen months ago when the answer to &#8220;what to use for AI-assisted coding?&#8221; was simple: buy a GitHub Copilot license and boot up ChatGPT. In our AI tooling <a href="https://newsletter.pragmaticengineer.com/p/ai-tooling-2024">survey in 2024</a>, those two tools racked up more mentions than all the others combined.</p><p>But no more. Today, a plethora of tools outpace Copilot in various ways, like Cursor, Claude Code, Codex, and Gemini CLI, and there&#8217;s also AI code review tools like CodeRabbit, Graphite, and Greptile, not to mention all the MCP integrations which plug into agentic tools.</p><p>So, for this deepdive I asked 10 tech companies which tools their engineers use and, crucially, how they made their choices from among all the options. These businesses range from a 5-person seed-stage startup, to one that employs 1,500 people and is publicly listed. All are anonymous, except for Wealthsimple and WeTravel. WeTravel has also kindly shared the most detailed measurement framework I&#8217;ve yet seen.</p><p>We cover:</p><ol><li><p><strong>Speed, trust, &amp; show-and-tell: how small teams select tools: </strong>At places with fewer than ~60 engineers, tooling decisions are fast and informal: developers try them for a couple of weeks and those which &#8220;stick&#8221; win.</p></li><li><p><strong>How mid-to-large companies choose: </strong>bureaucracy, security, and vendor lock-ins. At companies with ~150 engineers, adoption is considerably slowed down by security reviews, compliance requirements, and executive-level budgetary considerations.</p></li><li><p><strong>Measurement problem: metrics are needed but none work. </strong>Every workplace struggles to prove its AI tools work, and common metrics like lines-of-code-generated are distrusted by engineers.</p></li><li><p><strong>How Wealthsimple measured and decided. </strong>The flagship Canadian consumer fintech ran a 2-month selection process to choose an AI code review tool. Rolling out Claude Code to all engineers was a decision made by the CTO, backed with a mix of personal conviction, validated by usage data from Jellyfish.</p></li><li><p><strong>How one company accurately measures code review usefulness.</strong> WeTravel built a structured -3 to +3 scoring system across five dimensions, with five engineers evaluating ~100 comments. They found no AI code reviewer suitable for their codebase.</p></li><li><p><strong>Comparative measurements at a large fintech.</strong> A team ran Copilot, Claude, and Cursor simultaneously across ~50 PRs, scoring ~450 comments. They found Cursor reviews the most precise, Claude the most balanced, and Copilot the most quality-focused.</p></li><li><p><strong>Common patterns.</strong> Developer trust drives adoption more than mandates, the Copilot &#8594; Cursor &#8594; Claude Code migration path is well trodden, and nobody has cracked productivity measurement yet.</p></li></ol><p>The goal of this article is to showcase what tech companies of different sizes are doing, and to offer a few pointers on measuring and comparing the tools. It&#8217;s hard to do, but not impossible, as two in-depth case studies illustrate, below.</p><p><strong>Don&#8217;t forget, what matters is to find tools that work for </strong><em><strong>your</strong></em><strong> team. </strong>During this research, I found vendors which are beloved by one company and loathed in other workplaces. There&#8217;s no single vendor that&#8217;s universally rated by every team in all contexts.</p><p><em>As always, I have no affiliation with any vendor mentioned in this article, and was not paid to mention any of them. I <a href="https://blog.pragmaticengineer.com/investing/">used to be an investor</a> in Graphite, but no longer am. For more details, <a href="https://pragmatic-engineer.ghost.io/ghost/#/analytics">see my ethics statement.</a></em></p><h2>1. Speed, trust, &amp; show-and-tell: how small teams select tools</h2><p>Decisions are informal and made quickly at the smallest businesses in our survey, with the decisive factor being how people feel about the tools. Trial periods are short, at around two weeks, and individual developers have outsized influence on whether a tool is adopted or binned, with the decisions spreading organically. Below are two examples:</p><h3>Seed-stage logistics startup (20 people, 5 engineers)</h3><p>The head of engineering at this startup describes their approach as high-trust and developer-led:</p><blockquote><p>&#8220;We agreed to try new tools for 2 weeks and see how everyone felt. We didn&#8217;t use any hard-and-fast measurement. TLDR: I trust our devs and their opinion is a big part of this&#8221;.</p></blockquote><p>Developers there suggest which tools to try and decide whether to keep using them or to seek alternatives. For AI code reviews, the team first tried <strong>Korbit</strong> for around a week but the tool felt &#8220;off&#8221;, so they roadtested CodeRabbit which &#8220;stuck&#8221; within a few days:</p><blockquote><p>&#8220;Within a few days of using CodeRabbit I could tell the devs just liked it and were embracing the suggestions, unlike with Korbit which they ignored when they&#8217;d lost trust [in it].&#8221;</p></blockquote><p>And that was that: decision made. <em>As a small team, it&#8217;s easy to switch to something better and it only takes a single engineer to suggest it.</em></p><p>The broader tooling stack of this startup has evolved quickly over the last year:</p><ul><li><p><strong>Figma</strong> for designs, which works nicely with Linear. The company has 5 devs and one UX designer.</p></li><li><p><strong>Linear</strong> for ticketing and collaborating across UX and development. The UX person creates Linear tickets alongside her Figma designs.</p></li><li><p><strong>Claude Code</strong> and <strong>Cursor</strong> for development, connected to Linear via <strong>MCP.</strong></p></li><li><p><strong>Claude Code writes tickets: </strong>a recent change which is working nicely with <strong>CodeRabbit</strong>, as more context is passed downstream for AI code review.</p></li></ul><p>&#8220;Show and tells&#8221; &#8211; where team members show colleagues their tooling setups during weekly team meetings and demos &#8211; are used by this startup to identify which tools do or don&#8217;t work:</p><blockquote><p>&#8220;Our show-and-tell process greatly helps. There are so many new tools, skills, IDEs, etc, that it can be overwhelming. We all learn from seeing what others in our team are doing.&#8221;</p></blockquote><p>The team makes a clear distinction between company-wide tools like Claude and CodeRabbit that everyone is expected to use, and devs&#8217; personal environments (IDE choice, terminal setup), over which individuals have full autonomy.</p><p><strong>By now, almost everyone has migrated to Claude Code, </strong>but six months ago the team was evenly split between Cursor and Claude Code.<strong> </strong>The head of engineering said:</p><blockquote><p>&#8220;We had a dev for a while who wouldn&#8217;t use Cursor or Claude. We didn&#8217;t force him to, but it became clear that everyone else seemed to ship more code, whereas his quality wasn&#8217;t there&#8221;.</p></blockquote><h3>Series A startup (30 people, 15 engineers)</h3><p>A staff engineer at this company says the team is split on <strong>Cursor</strong> versus <strong>Claude Code</strong>, with the latter gaining momentum. He also says code reviews cause headaches:</p><blockquote><p>&#8220;One of our main challenges has been code reviews, as the quantity of code produced goes up, and quality used to go down, pre-Opus 4.5.&#8221;</p></blockquote><p>They evaluated three code review tools: <strong>Cursor&#8217;s Bugbot</strong> (okay but not great), <strong>Graphite</strong> (not good), and <strong>Greptile </strong>(good). They&#8217;re now trialing Greptile for PR approvals, taking advantage of its confidence-scoring feature.</p><p>What works really well for this team is maintaining extensive <strong>Agents.md</strong> and <strong>Claude.md </strong>files, which are very handy because they&#8217;re used by:</p><ul><li><p>Claude Code and Cursor for coding</p></li><li><p>Greptile for code reviews</p></li></ul><p>These two files help maintain a single source of truth for coding-style guidance across the toolchain.</p><p>There&#8217;s praise for Cursor&#8217;s integration with Linear and Slack from a staff engineer:</p><blockquote><p>&#8220;An alternative flow I personally like a lot is Cursor cloud agents, as their integration with Linear/Slack is very good. For smaller changes, this means code is not even checked out, but goes directly from the Cursor agents, to GitHub, to being deployed.&#8221;</p></blockquote><h3>Series D observability company (150 people, 60 engineers)</h3><p>The director of open source at this place summarizes what&#8217;s stuck there:</p><blockquote><p>&#8220;We&#8217;ve tried a bunch of things (Graphite, et al.) but the one thing that&#8217;s really stuck has been the company&#8217;s <strong>Claude Code</strong> subscription &#8212; it&#8217;s the most definite value-add. We pretty regularly bump people up a tier as their usage increases vs other tools that mostly sit idle&#8221;.</p></blockquote><p>An interesting signal at this company is that non-engineers have jumped onto Claude Code. Product managers, solutions engineers, and technical account managers alike are using it more than the median engineer, and they&#8217;re handling customer bug reports by opening Claude Code PRs directly:</p><blockquote><p>&#8220;They probably use Claude Code more than the median engineer! They&#8217;ve been able to handle customer papercuts [pain points] with Claude Code PRs&#8221;.</p></blockquote><h2>2: How mid-to-large companies choose</h2><p>At companies with 150+ engineers, it&#8217;s not about how a tool &#8220;feels&#8221;. Instead, existing vendor relationships may be decisive, and there&#8217;s often pressure from the C-level (leadership team), as well as security and compliance matters to address.</p><p>There&#8217;s also the new challenge of how to coordinate tooling rollouts across several departments and potentially hundreds of engineers. This is where a decisive CTO can cut through red tape to achieve faster adoption. Our first case study covers how one fintech business did precisely that.</p><h3>EU-based software company (500 people, 150 engineers)</h3><p>This place&#8217;s experience is a cautionary tale of what can happen when a leadership moves on AI tooling without a plan for what comes next. A senior engineer there says:</p><blockquote><p>&#8220;In the summer of 2025, our leadership team came back from an offsite and declared we were now AI-first, which translated to everyone receiving a Copilot Business subscription if they happened to ask for one. Problem solved, right?&#8221;</p></blockquote><p>But it wasn&#8217;t, as the Copilot rollout was immediately met with questions about alternatives:</p><blockquote><p>&#8220;Our company&#8217;s pre-existing relationship with Microsoft was probably key: we already had M365, and then they rolled out Copilot to all devs.</p><p>People immediately had questions about other tools. A few of us had used Claude Code that summer, while others had used Cursor or Gemini CLI.</p><p><strong>The pace of new models and tools in the second half of 2025 left the leadership team completely unprepared.</strong> They had also not budgeted for anything other than $19/mo Copilot subscriptions&#8221;.</p></blockquote><p>They got &#8220;stuck&#8221; and unable to approve any new tools for six months. The attempt to create a formal approval process is stalled, thanks to legal and IT being gridlocked, with the European Union&#8217;s AI Act causing concerns and governance questions:</p><blockquote><p>&#8220;We are facing adoption challenges thanks to bureaucracy and EU regulation. I&#8217;m positive this process has led to developers using unsanctioned tools at their own expense.&#8221;</p></blockquote><p>Meanwhile, their default Copilot setup uses GPT 4.1, a 10-month-old model. Many developers there don&#8217;t know if they can change the model or use coding agents. This creates a vicious cycle where the tool feels underwhelming, which suppresses adoption and makes it harder to justify further investment in better options.</p><h3>Cloud infrastructure company (900 people, 300 engineers)</h3><p>A principal engineer responsible for AI tooling at this company describes the constant push-pull between developer enthusiasm and executive scrutiny:</p><blockquote><p>&#8220;We started with Copilot because it was easy to procure, since we were a Microsoft customer for M365. Then switching to Cursor took forever. Pricing keeps shifting. Meanwhile, execs read a doc and keep asking &#8220;why aren&#8217;t we on Claude Code?&#8221;</p></blockquote><p>The answer to this also came from the exec team: pricing. Execs simply did not want to invest in the tools, and pricing remains a persistent headache. Claude&#8217;s team plan is ~$150/month, Cursor&#8217;s is ~$65, and this company&#8217;s C-level was not comfortable with going from Copilot&#8217;s $40/month to Cursor&#8217;s $65/month. The principal engineer also worries that costs will keep mounting, even with approval to move to Claude Code&#8217;s $150/month:</p><blockquote><p>&#8220;Claude Code and Codex are definitely eating the costs right now&#8230; we all know that won&#8217;t last. If my execs push me on this, I will need to say &#8212; &#8216;okay, our developers got much slower in 6 months, but now we need to pay $250/month, per developer, to get higher limits&#8217;&#8221;.</p></blockquote><h3>Public travel company (1,500 people, 800 engineers)</h3><p>A staff engineer at this business highlighted vendor lock-in as a primary concern:</p><blockquote><p>&#8220;Our main concern is avoiding vendor lock-in with a single solution. With this in mind, I expect to continue evaluating AI tooling this year as things keep evolving rapidly&#8221;.</p></blockquote><p>They rolled out <strong>GitHub Copilot</strong> last year and are now evaluating <strong>Claude Code</strong> as a replacement. They remain cautious, given that the per-engineer cost is steep with Claude.</p><h3>Public tech company (2,000 people, 700 engineers, productivity space)</h3><p>The engineering leader in charge of dev productivity at this business calls security the biggest challenge:</p><blockquote><p>&#8220;The biggest hurdle for us is security. We are looking for some amount of compliance, and I&#8217;ve found dev tools startups aren&#8217;t prioritizing that until they are late Series A/Series B. This helps focus us and ensure that what we are evaluating has passed some muster in the industry, without us feeling like we&#8217;re late to the game&#8221;.</p></blockquote><p>Unsurprisingly, the tooling selection process is more in-depth at companies of this size, with many vendors as options. Here&#8217;s how they go about things:</p><blockquote><p>&#8220;There&#8217;s an amount of instinct involved in knowing how to prioritize vendors. Our process is this:</p></blockquote><ul><li><p>What we&#8217;ve heard from friends and colleagues at other places</p></li><li><p>Chatter on Twitter/Reddit/Hacker News</p></li><li><p>Knowing how to cut through hype</p></li></ul><p><strong>Evaluation is more organized and beta trials are common,</strong> he says:</p><blockquote><p>&#8220;Every tool has to move a metric. Those that directly impact a metric which we already care about get approved faster. The tools that could theoretically impact metrics, but don&#8217;t have directly-measurable impact, take more work. The weaker the metric story, the stronger the narrative has to be.</p><p>We like to capture at least two weeks of beta usage on a tool before making a call on expanding or ending it.&#8221;</p></blockquote><h2>3. Measurement problem: metrics are needed but none work</h2><p>If there&#8217;s one theme that unites every company in this deepdive regardless of size, it&#8217;s the struggle to measure whether AI tools actually work.</p><p>Execs want data, but engineers distrust the data that exists. Meanwhile, vendors&#8217; own metrics are mostly useless.</p><p>Among our research sample, the EU-based software company debated options and only found bad or worse ones:</p><ul><li><p>Using the &#8216;lines of code written by AI&#8217; metric creates bad incentives, a sentiment shared by AI enthusiasts and skeptics alike at the company.</p></li><li><p>Even if they were dead-set on lines of code, is there a way to isolate those lines of code which create business value?</p></li></ul><p><strong>There&#8217;s also the point that some of the most valuable uses of AI don&#8217;t lie in the writing of code, </strong>but in research, generation of ideas, debugging, etc, which makes measuring code generated by AI tools a dead end. Meanwhile, vibe-coded scripts and tools that never hit production can feel like real productivity breakthroughs.</p><p>In the end, this company chose lines of code generated by Copilot as the &#8220;official&#8221; metric, which met a predictable response:</p><blockquote><p>&#8220;You can imagine how poorly this was received by devs! It doesn&#8217;t even account for the fact that this metric from Copilot is purely based on telemetry from specific IDEs. So, even if you&#8217;re using Copilot CLI to write code and maxing-out your premium requests, it will not be counted.&#8221;</p></blockquote><p>The principal engineer at the 900-person cloud infrastructure company was more blunt:</p><blockquote><p>&#8220;My engineering org is getting hooked on AI, but execs want metrics on value-add. I don&#8217;t want to push vanity usage metrics just to justify spend, but outside of vanity metrics, I have nothing of value to show!&#8221;</p></blockquote><p>This principal engineer dismissed developer-productivity vendors&#8217; own measurement approaches:</p><blockquote><p>&#8220;I talked with DX and one of the other vendors, they are just DORA+Velocity metrics combined with anything they can get from APIs of Cursor, Claude etc. Sure, this all looks good on paper: Team A is faster and they use AI. But is AI usage and speed a real correlation?&#8221;</p></blockquote><p>A fundamental question remains unanswered, says the principal engineer:</p><blockquote><p>&#8220;How can we make effective use of our AI agent subscriptions? So far, in my experience, there is no answer to this &#8212; not even the hint of one&#8221;.</p></blockquote><h2>4. How Wealthsimple measured and decided</h2><p>Wealthsimple is a Canadian fintech company, employing about 1,500 people, around 600 of whom are engineers. I talked with CTO <a href="https://www.linkedin.com/in/diederikvanliere/">Diederik van Liere</a> about how they choose AI code review and AI coding tools. For AI code review tools they run a thorough measurement process, and for AI coding tools it was more of a push from Diederik. He shared exclusive details on their exact measurement process, and how they landed on Graphite for code review and Claude Code for coding:</p><h3>Choosing an AI code review tool via a &#8220;shootout&#8221; process</h3>
      <p>
          <a href="https://newsletter.pragmaticengineer.com/p/measuring-ai-dev-tools">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Inside a five-year-old startup’s rapid AI makeover]]></title><description><![CDATA[Craft Docs resisted AI hype as a nimble, well-run startup &#8211; but has just made a sharp pivot to AI, building a universal agentic tool everyone there now uses. The results are phenomenal. Exclusive.]]></description><link>https://newsletter.pragmaticengineer.com/p/ai-first-makeover-craft</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/ai-first-makeover-craft</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 27 Jan 2026 17:03:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!EVwx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ab3637-7b93-4faf-8912-19698fe1f451_1600x914.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The Christmas break is one of the rare times when my brother, <a href="https://x.com/balintorosz">Balint Orosz</a>, founder of Craft Docs &#8211; a popular text editor known for its sleek UX &#8211; takes a proper break from work. But that didn&#8217;t happen last month: instead, he spent the holidays building AI tools and using AI agents. I assumed this flurry of activity was caused by the same &#8220;bug&#8221; that&#8217;s bitten many techies who&#8217;ve seen the recent leap in AI agents&#8217; performance.</p><p>On the first Monday of this year, Balint returned to Craft with a new AI tool they&#8217;re calling &#8220;Craft Agents&#8221;. It&#8217;s his take on a more opinionated Claude Code, built on top of the Claude SDK. The company has mandated every engineer and non-engineer to try adding the new tool to their workflows &#8211; and they say the results have been jaw-dropping.</p><p>During January, the Craft team has completely changed how they work, and now feel more productive than ever. Also, non-engineers are hooked on using AI with Craft Agents.</p><p><strong>Is it a sign of how mature startups in tech are changing how they build software, using AI tools? </strong>That&#8217;s one topic tackled in this deepdive.</p><p>First, some background. Craft has more than 1 million active users, over 50,000 paying customers, and an engineering team of 20 with a median tenure of nearly four years. They care deeply about engineering excellence and product quality: the startup won Apple&#8217;s Mac App of the Year award in 2021, and built their own, custom rendering stack to boost user experience above the competition.</p><p>Craft&#8217;s AI-first makeover is not a &#8220;YOLO&#8221; (you only live once) approach like a young startup might try as a way to create some hype. It&#8217;s an experienced engineering operation deciding that AI tools have reached an inflection point which means the company <em>needs</em> to change how it works, or be left behind.</p><p>My family ties to Craft mean I&#8217;m &#8220;in the loop&#8221; on things at the business, and it&#8217;s this insight that makes me confident this is worth looking at. Balint shares details below that are relevant for anyone in tech currently wondering how &#8220;AI-native&#8221; startups work in the age of AI, which aren&#8217;t AI labs or AI vendors.</p><p>Today, we cover:</p><ol><li><p><strong>Three years of AI experimentation with no &#8220;stickiness.&#8221;</strong> The engineering team was an early adopter of AI, but consciously avoided the &#8220;Copilot temptation&#8221; of shipping substandard AI features which lack true purpose.</p></li><li><p><strong>Unexpected breakthrough: a &#8220;visual Claude Code&#8221; experience. </strong>Nontechnical users of Craft were struggling with a terminal experience, so Balint imagined what Claude Code with a UI and strong opinions&#8221; would look like. He then built this vision in two weeks using Claude Code.</p></li><li><p><strong>How non-engineers use &#8220;visual Claude Code.&#8221; </strong>Customer support: the heaviest user of Craft Agents and Craft could soon ditch Zendesk, as a result. Marketing: building webpages with zero engineering input. HR: building new Bamboo HR integrations on their own.</p></li><li><p><strong>New way to build software? </strong>Fast iteration without code reviews, rejecting pull requests but &#8220;weaving in&#8221; their ideas, and not using SDKs much in development.</p></li><li><p><strong>Dramatic change in dev teams. </strong>Difficult migrations take a week instead of months, one-person responsibility squads, while some devs struggle with fast change, and even quit.</p></li><li><p><strong>AI changes software that&#8217;s worth paying for. </strong>Enterprise-only capabilities could become standard consumer-grade offerings, and AI makes it easier to switch vendors. For example, Craft may soon pick an API-first vendor, instead of using Zendesk.</p></li><li><p><strong>Predictions for the tech industry: </strong>the death of pull requests for open source, the rise of &#8220;remixing&#8221;, devs who value impact the most will thrive, and perhaps hiring freezes while companies figure things out.</p></li></ol><p><em>Note: I have no financial affiliation with Craft Docs, own no shares in the company, and have not been paid to write this article. Obviously, there are family ties, which in this case enabled me to convince him to share more details than he originally intended! More in <a href="https://blog.pragmaticengineer.com/ethics-statement/">my ethics statement.</a></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EVwx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ab3637-7b93-4faf-8912-19698fe1f451_1600x914.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EVwx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ab3637-7b93-4faf-8912-19698fe1f451_1600x914.png 424w, https://substackcdn.com/image/fetch/$s_!EVwx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ab3637-7b93-4faf-8912-19698fe1f451_1600x914.png 848w, https://substackcdn.com/image/fetch/$s_!EVwx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ab3637-7b93-4faf-8912-19698fe1f451_1600x914.png 1272w, https://substackcdn.com/image/fetch/$s_!EVwx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ab3637-7b93-4faf-8912-19698fe1f451_1600x914.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EVwx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ab3637-7b93-4faf-8912-19698fe1f451_1600x914.png" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95ab3637-7b93-4faf-8912-19698fe1f451_1600x914.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;: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_!EVwx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ab3637-7b93-4faf-8912-19698fe1f451_1600x914.png 424w, https://substackcdn.com/image/fetch/$s_!EVwx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ab3637-7b93-4faf-8912-19698fe1f451_1600x914.png 848w, https://substackcdn.com/image/fetch/$s_!EVwx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ab3637-7b93-4faf-8912-19698fe1f451_1600x914.png 1272w, https://substackcdn.com/image/fetch/$s_!EVwx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ab3637-7b93-4faf-8912-19698fe1f451_1600x914.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>The visual agentic tool (Craft Agents) that changed how Craft&#8217;s non-engineering teams work, and how software is built there. It&#8217;s <a href="https://agents.craft.do/">free and open source</a></em></figcaption></figure></div><p><em>If Balint&#8217;s name is familiar, it&#8217;s because we did a podcast episode covering his unconventional, <a href="https://newsletter.pragmaticengineer.com/p/design-first-software-engineering">design-first engineering approach at Craft</a>. You can meet Balint and myself at <a href="https://www.pragmaticsummit.com/">The Pragmatic Summit</a>, coming up on 11 February, in San Francisco.</em></p><h2>1. Three years of AI experimentation with no &#8220;stickiness&#8221;</h2><p>Craft is a tool for docs, notes, tasks, and anything else to do with capturing ideas. Launched in 2020, its signature characteristics are low latency, high performance, seamless movement between devices (iPhone, Android, iPad, Mac, web, and Windows), and a delightful user experience.</p><p>The team has long experimented with AI while avoiding the hype by refusing to ship AI features that would be gimmicks at best. Below is a timeline of their AI-related activity:</p><h3>2022: basic AI assistant</h3><p>They launched an AI assistant, &#8220;Craft AI Assistant&#8221;, two days before ChatGPT launched in 2022, and weeks before Notion&#8217;s own AI assistant became available. That early assistant was pretty simple:</p><ul><li><p>Used OpenAI&#8217;s GPT-3.5 API</p></li><li><p>Ran on an AWS gateway acting as an authentication proxy</p></li><li><p>Used HTTP streaming resources</p></li></ul><p>It was also limited: the context window was only 4,096 tokens and prompts needed to be squeezed into that limit. The assistant was also &#8220;one-shot&#8221;: users asked a question, it replied, and that was that! There was no more dialogue.</p><p><strong>The AI assistant drove substantial user growth. </strong>Many users downloaded Craft just to play with it, but it quickly became obvious that the assistant was not &#8220;sticky&#8221;, which means it was simply not <em>genuinely</em> useful for enough users. After an initial engagement spike, people didn&#8217;t use the AI assistant repeatedly.</p><h3>2023-2024: resisting &#8220;Copilot everywhere&#8221; slop temptation</h3><p>The team kept experimenting with ways to add AI features that were useful for Craft, and ran experiments such as knowledge-based search using RAG, summarization, and other retrieval features. But nothing really stuck with users.</p><p><strong>Balint was keen to avoid the &#8220;Copilot fail&#8221; moment he observed at Microsoft, </strong>where the tech giant rolled out the not-particularly-useful Copilot across its entire product suite, only for customers to quickly come to associate the shiny new Copilot with uselessness. Balint said:</p><blockquote><p>&#8220;We knew we had one shot at showing users that AI is useful for them. And until we had a &#8216;wow&#8217; moment ourselves, we would not go all-in on AI. We didn&#8217;t want Craft to have the same negative associations with AI as Copilot has&#8221;.</p></blockquote><p>During this time, the company did a lot of experiments. In September 2023, they held <a href="https://newsletter.pragmaticengineer.com/p/hackathons">an in-house hackathon focused on AI</a>, for which I was a judge. As I recalled from the experience:</p><blockquote><p>&#8220;This [hackathon] was one of the best I&#8217;ve seen, with around 80% of staff taking part, including designers, product managers, and customer support representatives within engineering teams. The winning team consisted of some customer support folks and engineers, who built tooling which improved the customer support team&#8217;s workflow by solving some persistent pain points.&#8221;</p></blockquote><p>There was no shortage of enthusiasm, but that by itself doesn&#8217;t create a great user experience.</p><h3>December 2024: reasoning models mark turning point</h3><p>Little over a year ago, Balint rolled his sleeves up and spent two weeks experimenting with the latest reasoning models at the time, like OpenAI&#8217;s GPT-4o.</p><p><strong>This led to his first &#8220;wow!&#8221; moment as a software engineer with the 4o model.</strong> A highly requested user feature was for Craft to recognize shapes which users draw by hand. This was a problem Balint estimated would take a few weeks to properly implement. So, he gave it a go with the 4o model and to his amazement was able to implement it within a day by learning on the 4o model. The feature was shipped, users approved, and it marked the first time Balint had to admit they couldn&#8217;t have shipped a feature without AI.</p><p>After that, Craft&#8217;s approach with AI became more ambitious. He assigned five senior folks from among the 20 engineers to experiment fulltime with how AI could be added to the product. They spent six months building a mobile-first agent called <a href="https://documents.craft.me/announcing-chaps">Chaps</a>, similar to Peter Steinberger&#8217;s very popular <a href="https://clawd.bot/">Clawd bot</a>, which ultimately was never released to the public.</p><p>By October of 2025, Balint concluded that agents had started to work pretty well, but they still weren&#8217;t ready to be a standalone product. Meanwhile, the five-strong team had built up knowledge about tool calling and orchestration, which they ported back into the Craft AI assistant.</p><p>In December 2025, Craft&#8217;s AI assistant got large updates which took it from being a &#8220;meh&#8221; experience for most users, to one which was helpful and popular. This new, improved AI was a lot more &#8220;sticky&#8221;, but still wasn&#8217;t the &#8220;wow!&#8221; experience Balint wanted.</p><h2>2. Unexpected breakthrough: a &#8220;visual Claude Code&#8221;</h2><p>That month, Balint wanted to use more top-tier models like Opus 4.5, via Claude Code, so he built a prototype terminal UI (TUI) on top of the <a href="https://platform.claude.com/docs/en/agent-sdk/overview">Claude Agent SDK</a>: a framework for building production-ready agents with Claude Code as a library.</p><p>This tool, named Craft Terminal, connected Craft Docs as a data source to Claude Code via the Claude Agent SDK, and worked surprisingly well.<strong> </strong>Balint used it to organize his own messy Craft Docs workspace, search in it, and ask for insights. It worked <em>really</em> well; much better than any previous knowledge base lookups the team had built.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SpGn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69db1c14-6cf7-4593-84e9-5684738907be_1600x754.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SpGn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69db1c14-6cf7-4593-84e9-5684738907be_1600x754.png 424w, https://substackcdn.com/image/fetch/$s_!SpGn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69db1c14-6cf7-4593-84e9-5684738907be_1600x754.png 848w, https://substackcdn.com/image/fetch/$s_!SpGn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69db1c14-6cf7-4593-84e9-5684738907be_1600x754.png 1272w, https://substackcdn.com/image/fetch/$s_!SpGn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69db1c14-6cf7-4593-84e9-5684738907be_1600x754.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SpGn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69db1c14-6cf7-4593-84e9-5684738907be_1600x754.png" width="1456" height="686" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69db1c14-6cf7-4593-84e9-5684738907be_1600x754.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:686,&quot;width&quot;:1456,&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_!SpGn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69db1c14-6cf7-4593-84e9-5684738907be_1600x754.png 424w, https://substackcdn.com/image/fetch/$s_!SpGn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69db1c14-6cf7-4593-84e9-5684738907be_1600x754.png 848w, https://substackcdn.com/image/fetch/$s_!SpGn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69db1c14-6cf7-4593-84e9-5684738907be_1600x754.png 1272w, https://substackcdn.com/image/fetch/$s_!SpGn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69db1c14-6cf7-4593-84e9-5684738907be_1600x754.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>Craft Terminal: a wrapper to connect Craft Docs as a data source to Claude Code</em></figcaption></figure></div><p><strong>The customer service team started using the Craft Terminal, but needed more sources than just Craft Docs for their work. </strong>A typical Customer Service flow resembles this:</p><ul><li><p>Look at an incoming Zendesk ticket</p></li><li><p>Check if there is a runbook for this type of ticket in Craft</p></li><li><p>Run the runbook, and often access other databases</p></li></ul><p>Balint added the concept of &#8220;Sources&#8221; to the Craft Terminal: the ability to add other data sources &#8211; APIs, databases, MCP servers &#8211; on top of Craft Docs. The customer service team then started creating automations for common support tasks like sending discounts to emails on academic domains. <em>The implementation of using APIs for sources is pretty clever: an API source acts like an MCP server to the agent, but Craft Agents hijacks the request and adds the credentials needed without the agent having access to those sensitive credentials.</em></p><p><strong>However, the terminal interface was not beloved by Craft&#8217;s users. </strong>On December 18, he shared the Craft Terminal Agent with 15-20 external beta users. Feedback was positive and they liked it, but there were complaints about the terminal environment:</p><ul><li><p>Multitasking was painful</p></li><li><p>Reviewing complex plans was awkward</p></li><li><p>The whole experience felt &#8220;locked away&#8221; to most users who are non-technical and not developers</p></li></ul><p>As a designer and UX lover at heart, Balint felt the terminal was holding the tool back. He asked:</p><blockquote><p>&#8220;Can we turn the terminal into something that&#8217;s more like an email client or a Slack client? Something that is more natural to use for anyone.&#8221;</p></blockquote><p><strong>So, last Christmas during the holidays, Balint decided to build a UI on top of Claude Code &#8211; and gave himself two weeks. </strong>Previously,<strong> </strong>it took him up to four months when he started Craft to build a v1 of Craft Docs that felt good. But this time, he did it all with AI, using Claude Code. As an additional challenge, he used Electron to build it, a tech stack he&#8217;d not used before.</p><p>Embarking upon this project, Balint decided that if he could build a polished application in an unfamiliar tech stack within two weeks, it would be proof AI was capable of delivering a step change for Craft. If so, he would push everyone at work to start using AI coding tools. If the project failed, at least he would still learn about these models&#8217; progress.</p><p>In the end, Balint hit his self-imposed milestone: by January 5 of this year, he had completed a polished Craft Agents app that ran on Mac, Windows, and Linux, thanks to it being built on top of Electron. The result is a far more friendly experience of using Craft Docs. Below is how it looked with the terminal interface reimagined as a more &#8220;email-like&#8221; UX:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!m062!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5728e8-694d-4d14-b907-a016e618e4b0_1200x713.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!m062!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5728e8-694d-4d14-b907-a016e618e4b0_1200x713.png 424w, https://substackcdn.com/image/fetch/$s_!m062!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5728e8-694d-4d14-b907-a016e618e4b0_1200x713.png 848w, https://substackcdn.com/image/fetch/$s_!m062!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5728e8-694d-4d14-b907-a016e618e4b0_1200x713.png 1272w, https://substackcdn.com/image/fetch/$s_!m062!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5728e8-694d-4d14-b907-a016e618e4b0_1200x713.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!m062!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5728e8-694d-4d14-b907-a016e618e4b0_1200x713.png" width="1200" height="713" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc5728e8-694d-4d14-b907-a016e618e4b0_1200x713.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:713,&quot;width&quot;:1200,&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_!m062!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5728e8-694d-4d14-b907-a016e618e4b0_1200x713.png 424w, https://substackcdn.com/image/fetch/$s_!m062!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5728e8-694d-4d14-b907-a016e618e4b0_1200x713.png 848w, https://substackcdn.com/image/fetch/$s_!m062!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5728e8-694d-4d14-b907-a016e618e4b0_1200x713.png 1272w, https://substackcdn.com/image/fetch/$s_!m062!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5728e8-694d-4d14-b907-a016e618e4b0_1200x713.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>Craft Agents. <a href="https://agents.craft.do/">Download</a> as a pre-built app, install <a href="https://github.com/lukilabs/craft-agents-oss">via command line</a>, or <a href="https://github.com/lukilabs/craft-agents-oss">get the source from GitHub</a></em></figcaption></figure></div><p>This tool was more than just a nice UI on top of Claude Code. Balint also included:</p><ul><li><p>A concept of &#8220;sources:&#8221; data sources to connect to the agent; anything from databases, through to APIs and MCPs.</p></li><li><p>Support for running parallel agents, visualization, and switching between them.</p></li><li><p>Support for workflows via a label system.</p></li><li><p>A permissions system defining whether data sources can only be read, or if they can also be written to. A readonly agent run mode, &#8220;ask to edit&#8221; mode, and a mode for making edits without asking.</p></li><li><p>Expanding Claude Code&#8217;s &#8220;skills&#8221; concept.</p></li><li><p>Theming options for the tool (added because there was time to spare at the end).</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!H967!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82d7f713-ef11-4948-9e21-9ce0c6888aa8_1446x870.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!H967!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82d7f713-ef11-4948-9e21-9ce0c6888aa8_1446x870.png 424w, https://substackcdn.com/image/fetch/$s_!H967!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82d7f713-ef11-4948-9e21-9ce0c6888aa8_1446x870.png 848w, https://substackcdn.com/image/fetch/$s_!H967!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82d7f713-ef11-4948-9e21-9ce0c6888aa8_1446x870.png 1272w, https://substackcdn.com/image/fetch/$s_!H967!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82d7f713-ef11-4948-9e21-9ce0c6888aa8_1446x870.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!H967!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82d7f713-ef11-4948-9e21-9ce0c6888aa8_1446x870.png" width="1446" height="870" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/82d7f713-ef11-4948-9e21-9ce0c6888aa8_1446x870.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:870,&quot;width&quot;:1446,&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_!H967!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82d7f713-ef11-4948-9e21-9ce0c6888aa8_1446x870.png 424w, https://substackcdn.com/image/fetch/$s_!H967!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82d7f713-ef11-4948-9e21-9ce0c6888aa8_1446x870.png 848w, https://substackcdn.com/image/fetch/$s_!H967!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82d7f713-ef11-4948-9e21-9ce0c6888aa8_1446x870.png 1272w, https://substackcdn.com/image/fetch/$s_!H967!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82d7f713-ef11-4948-9e21-9ce0c6888aa8_1446x870.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">Permissions inside Craft Agents: defining tools the agent can use inside &#8220;Explore&#8221; (readonly) mode</figcaption></figure></div><p><strong>Internally, Craft Agents was an instant hit. </strong>During release week customer support, marketing, and HR all jumped on the tool, and people started automating previously manual tasks. In an unexpected development, non-technical folks started using Craft Agents more than devs!</p><p>Most devs were satisfied with Claude Code&#8217;s interface, and a few started to use Craft Agents because of the nicer multitasking (with parallel chats), and the interface being much easier to scroll, read, and view for things like long code changes.</p><p>On 19 January &#8211; almost exactly a month after the first line of code was written &#8211; Balint <a href="https://github.com/lukilabs/craft-agents-oss/">open sourced Craft Agents</a> under the Apache License 2.0.</p><h2>3. How non-engineers use &#8220;visual Claude Code&#8221;</h2><p>I wanted to understand why Craft&#8217;s non-engineering teams have been so enthusiastic about using Craft Agents, and what&#8217;s changed as a result. As mentioned, the biggest adopters have been in customer support, so I sat down with Tamas Fazekas, head of customer support at Craft, who explained:</p><p><strong>Custom workflows </strong>are the core of the team&#8217;s usage. They&#8217;ve built workflows for:</p><ul><li><p>Bug triaging.</p></li><li><p>Bug processing: incoming user reports are run through the Craft source code for validation, for efforts to identify root causes, and to add context for the engineering team.</p></li><li><p>Daily updates which summarize the work done by a user.</p></li><li><p>Education: institutions can use Craft Docs for free. This workflow checks if a domain is an academic one. It approves legit domains and flags up fishy ones or request patterns.</p></li></ul><p>Let&#8217;s take a look at a few workflows using this tool:</p><h3>Triaging workflow with agents</h3><p><strong>Parallel agents</strong> are helpful for processing triage tasks in bulk. When there&#8217;s a large number of customer tickets, the tool automatically kicks off parallel agents to go through triage:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2Gem!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50885b15-5f54-418f-bcb7-a3b1cf08d5b8_1200x713.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2Gem!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50885b15-5f54-418f-bcb7-a3b1cf08d5b8_1200x713.png 424w, https://substackcdn.com/image/fetch/$s_!2Gem!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50885b15-5f54-418f-bcb7-a3b1cf08d5b8_1200x713.png 848w, https://substackcdn.com/image/fetch/$s_!2Gem!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50885b15-5f54-418f-bcb7-a3b1cf08d5b8_1200x713.png 1272w, https://substackcdn.com/image/fetch/$s_!2Gem!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50885b15-5f54-418f-bcb7-a3b1cf08d5b8_1200x713.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2Gem!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50885b15-5f54-418f-bcb7-a3b1cf08d5b8_1200x713.png" width="1200" height="713" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/50885b15-5f54-418f-bcb7-a3b1cf08d5b8_1200x713.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:713,&quot;width&quot;:1200,&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_!2Gem!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50885b15-5f54-418f-bcb7-a3b1cf08d5b8_1200x713.png 424w, https://substackcdn.com/image/fetch/$s_!2Gem!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50885b15-5f54-418f-bcb7-a3b1cf08d5b8_1200x713.png 848w, https://substackcdn.com/image/fetch/$s_!2Gem!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50885b15-5f54-418f-bcb7-a3b1cf08d5b8_1200x713.png 1272w, https://substackcdn.com/image/fetch/$s_!2Gem!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50885b15-5f54-418f-bcb7-a3b1cf08d5b8_1200x713.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>Kicking off parallel agents helps complete parallelizable tasks faster, like triaging inbound tickets. See the text &#8220;Let me spawn worker agents to process them in batches of 3.&#8221;</em></figcaption></figure></div><p>When triage is complete, the agent provides a report to the customer support person who kicked off the work.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bh7M!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ac8bda4-7f9b-4161-b5ad-8deda5ca7e1e_1200x713.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bh7M!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ac8bda4-7f9b-4161-b5ad-8deda5ca7e1e_1200x713.png 424w, https://substackcdn.com/image/fetch/$s_!bh7M!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ac8bda4-7f9b-4161-b5ad-8deda5ca7e1e_1200x713.png 848w, https://substackcdn.com/image/fetch/$s_!bh7M!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ac8bda4-7f9b-4161-b5ad-8deda5ca7e1e_1200x713.png 1272w, https://substackcdn.com/image/fetch/$s_!bh7M!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ac8bda4-7f9b-4161-b5ad-8deda5ca7e1e_1200x713.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bh7M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ac8bda4-7f9b-4161-b5ad-8deda5ca7e1e_1200x713.png" width="1200" height="713" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9ac8bda4-7f9b-4161-b5ad-8deda5ca7e1e_1200x713.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:713,&quot;width&quot;:1200,&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_!bh7M!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ac8bda4-7f9b-4161-b5ad-8deda5ca7e1e_1200x713.png 424w, https://substackcdn.com/image/fetch/$s_!bh7M!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ac8bda4-7f9b-4161-b5ad-8deda5ca7e1e_1200x713.png 848w, https://substackcdn.com/image/fetch/$s_!bh7M!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ac8bda4-7f9b-4161-b5ad-8deda5ca7e1e_1200x713.png 1272w, https://substackcdn.com/image/fetch/$s_!bh7M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ac8bda4-7f9b-4161-b5ad-8deda5ca7e1e_1200x713.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>Report generated by the agent when triage is complete</em></figcaption></figure></div><p><strong>Data enrichments are used in almost every workflow. </strong>The customer support team defined a skill called &#8220;Get User Data&#8221;. It uses a Craft backend API to look up the user profile based on the user&#8217;s email in the Zendesk field, and adds the user&#8217;s plan type, billing status, feature flags (feature access), and usage metrics to the ticket.</p><p>The support agent no longer needs to open a separate tool to get all these details.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DpB_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cdb43c-96d7-4605-b558-2957e7316207_1200x713.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DpB_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cdb43c-96d7-4605-b558-2957e7316207_1200x713.png 424w, https://substackcdn.com/image/fetch/$s_!DpB_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cdb43c-96d7-4605-b558-2957e7316207_1200x713.png 848w, https://substackcdn.com/image/fetch/$s_!DpB_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cdb43c-96d7-4605-b558-2957e7316207_1200x713.png 1272w, https://substackcdn.com/image/fetch/$s_!DpB_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cdb43c-96d7-4605-b558-2957e7316207_1200x713.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DpB_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cdb43c-96d7-4605-b558-2957e7316207_1200x713.png" width="1200" height="713" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/19cdb43c-96d7-4605-b558-2957e7316207_1200x713.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:713,&quot;width&quot;:1200,&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_!DpB_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cdb43c-96d7-4605-b558-2957e7316207_1200x713.png 424w, https://substackcdn.com/image/fetch/$s_!DpB_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cdb43c-96d7-4605-b558-2957e7316207_1200x713.png 848w, https://substackcdn.com/image/fetch/$s_!DpB_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cdb43c-96d7-4605-b558-2957e7316207_1200x713.png 1272w, https://substackcdn.com/image/fetch/$s_!DpB_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cdb43c-96d7-4605-b558-2957e7316207_1200x713.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">Data enrichment happens as part of a specific skill being invoked during a workflow</figcaption></figure></div><h3>Bug processing workflow: issues reported faster, automatically to engineering</h3><p>The &#8220;bug report processor skill&#8221; has greatly sped up dealing with bug reports.<strong> </strong>It&#8217;s similar to Claude Code&#8217;s skills feature. The skill defines data sources (Zendesk and Linear) and defines the required output (a structured analysis with tags and categories). It instructs the agent to:</p><ul><li><p>Identify the platform and area which the bug belongs to, and tag it.</p></li><li><p>Crosscheck with Linear (Craft&#8217;s issue tracking system). If there are similar issues, link to that issue. If no similar issues are found, create a new issue and assign it to the relevant developer team.</p></li><li><p>Do a technical root cause analysis.</p></li><li><p>Draft a ready-to-send response for the customer.</p></li><li><p>Create engineering tickets for developers, including pointing to code references, where applicable.</p></li></ul><p>Here&#8217;s how this skill is defined:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qeFx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59ce5aa-e2dc-4370-b38d-12dcc860209d_1600x1079.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qeFx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59ce5aa-e2dc-4370-b38d-12dcc860209d_1600x1079.png 424w, https://substackcdn.com/image/fetch/$s_!qeFx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59ce5aa-e2dc-4370-b38d-12dcc860209d_1600x1079.png 848w, https://substackcdn.com/image/fetch/$s_!qeFx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59ce5aa-e2dc-4370-b38d-12dcc860209d_1600x1079.png 1272w, https://substackcdn.com/image/fetch/$s_!qeFx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59ce5aa-e2dc-4370-b38d-12dcc860209d_1600x1079.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qeFx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59ce5aa-e2dc-4370-b38d-12dcc860209d_1600x1079.png" width="1456" height="982" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a59ce5aa-e2dc-4370-b38d-12dcc860209d_1600x1079.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:982,&quot;width&quot;:1456,&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_!qeFx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59ce5aa-e2dc-4370-b38d-12dcc860209d_1600x1079.png 424w, https://substackcdn.com/image/fetch/$s_!qeFx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59ce5aa-e2dc-4370-b38d-12dcc860209d_1600x1079.png 848w, https://substackcdn.com/image/fetch/$s_!qeFx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59ce5aa-e2dc-4370-b38d-12dcc860209d_1600x1079.png 1272w, https://substackcdn.com/image/fetch/$s_!qeFx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59ce5aa-e2dc-4370-b38d-12dcc860209d_1600x1079.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>Defining a skill in Craft Agents. Note other skills defined by the Craft team in the left column</em></figcaption></figure></div><p>Below is an example of how it updates the Zendesk ticket with a suggestion on how the customer support agent should respond:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_ypv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13884c4e-c9a7-47a3-bff6-4605c5ea09ac_1134x872.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_ypv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13884c4e-c9a7-47a3-bff6-4605c5ea09ac_1134x872.png 424w, https://substackcdn.com/image/fetch/$s_!_ypv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13884c4e-c9a7-47a3-bff6-4605c5ea09ac_1134x872.png 848w, https://substackcdn.com/image/fetch/$s_!_ypv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13884c4e-c9a7-47a3-bff6-4605c5ea09ac_1134x872.png 1272w, https://substackcdn.com/image/fetch/$s_!_ypv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13884c4e-c9a7-47a3-bff6-4605c5ea09ac_1134x872.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_ypv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13884c4e-c9a7-47a3-bff6-4605c5ea09ac_1134x872.png" width="1134" height="872" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/13884c4e-c9a7-47a3-bff6-4605c5ea09ac_1134x872.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:872,&quot;width&quot;:1134,&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_!_ypv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13884c4e-c9a7-47a3-bff6-4605c5ea09ac_1134x872.png 424w, https://substackcdn.com/image/fetch/$s_!_ypv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13884c4e-c9a7-47a3-bff6-4605c5ea09ac_1134x872.png 848w, https://substackcdn.com/image/fetch/$s_!_ypv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13884c4e-c9a7-47a3-bff6-4605c5ea09ac_1134x872.png 1272w, https://substackcdn.com/image/fetch/$s_!_ypv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13884c4e-c9a7-47a3-bff6-4605c5ea09ac_1134x872.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">In Zendesk, the support agent gets a suggestion on how to respond to the customer. The bug is automatically reported to the engineering team, if necessary</figcaption></figure></div><p>The customer support team have been pretty delighted about how their workflows have gotten better. Here&#8217;s Cusomer Experience (CX) lead, <a href="https://www.linkedin.com/in/peter-sajevics/">Peter Sajevics</a>, on what&#8217;s changed:</p><blockquote><p>&#8220;A massive win is we have to escalate so much less often than before! In the past, we would often have to ping engineers to check if a bug was a possible code issue. We no longer have to do this: the agent does it and automatically escalates when needed.</p><p>We no longer need to try to reproduce a bug on the latest version of the app which was reported on the old version because the code review lookup can tell us if anything relevant changed in the code paths.</p><p>We no longer need to look up subscription details in a separate tool because the agent fills in this detail.</p><p>I feel that tickets which used to take 20-30 minutes to process are down to 2-3 minutes.</p><p>My sense is that the biggest win is not even that we spend less time on each ticket, but that we can now process a much larger volume of tickets than before. Parallel processing of tickets is now much easier&#8221;.</p></blockquote><h3>Skills built by customer support</h3><p>During just two weeks of using Craft Agents, the customer support team have built these skills:</p><ul><li><p><strong>/triage:</strong> categorize tickets with parallel workers</p></li><li><p><strong>/bug-report</strong>: process bugs and create Linear issues</p></li><li><p><strong>/education</strong>: handle education license requests</p></li><li><p><strong>/daily-report</strong>: generate an overview of the current ticket queue with Zendesk as a source</p></li><li><p><strong>/get-user-data</strong>: enrich the context with user details from Craft&#8217;s database</p></li><li><p><strong>/feature-request</strong>: process feature requests, gather more info when needed, store requests in Craft for processing later</p></li></ul><h3>Use cases in other non-engineering teams</h3><p>Today, all non-engineering teams at Craft are heavy users of the tool:</p><ul><li><p><strong>Marketing: building websites without devs. </strong>The marketing team builds lots of websites: pages to share details about launches, feature descriptions, comparison pages, and more. Previously, a web engineer would pair with the marketing team on rotation, and engineers dreaded this as unchallenging work, while marketing felt they had less support. But a marketing intern started to use Craft Agents to build new web pages and tweak existing ones, and now the whole team does.</p></li><li><p><strong>HR: automating tedious work. </strong>An HR person built a Bamboo HR plugin to handle aged-based holiday allocations necessary for Hungary. Other automations include generating files compatible with the payroll system, which used to be done manually.</p></li><li><p><strong>Finance: automating personal workflows. </strong>One person in finance built a tool that exports Revolut&#8217;s business account into CSV, then cross-references it with the employee Slack channel where employees post invoices, and matches these to create a format to submit to the accounting tool.</p></li></ul><h3>Additional permissions system to avoid accidents</h3><p>The Craft team uses this tool for real, customer-facing work. But of course, LLMs are nondeterministic and can make mistakes which go on to cause problems in production. To deal with this, Craft Agents has an additional permissions system. Sessions can run in one of three modes:</p><ul><li><p><strong>Explore: </strong>readonly. The default mode for agents. They can read all sources but not write to them.</p></li><li><p><strong>Auto</strong>: the agent can write to data sources without user input.</p></li><li><p><strong>Ask to Edit: </strong>needs prior user confirmation. <em>This mode is typically only used for onboarding &#8211; users often use Explore to discuss, and Auto to get work done.</em></p></li></ul><p>When starting a new session, the default mode is &#8220;Explore&#8221;.</p><h3>Engineers use Craft Agents &#8211; but less than non-devs</h3><p>Some engineers have onboarded to Craft Agents, but most prefer Claude Code for the majority of product development work. The reasons that a few engineers prefer Craft Agents is its easier overview of parallel agent execution, and a more pleasant interface for reviewing lengthy code changes since scrolling is more convenient than reviewing on a terminal.</p><h3>Creating custom themes</h3><p>Craft Agents comes with several pre-built themes, like Ghostty, GitHub, Tokyo Night, Ros&#233; Pine, and a dozen more:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cStT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff26d33d-9dc5-491d-a943-bacd526cd808_1588x1238.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cStT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff26d33d-9dc5-491d-a943-bacd526cd808_1588x1238.png 424w, https://substackcdn.com/image/fetch/$s_!cStT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff26d33d-9dc5-491d-a943-bacd526cd808_1588x1238.png 848w, https://substackcdn.com/image/fetch/$s_!cStT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff26d33d-9dc5-491d-a943-bacd526cd808_1588x1238.png 1272w, https://substackcdn.com/image/fetch/$s_!cStT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff26d33d-9dc5-491d-a943-bacd526cd808_1588x1238.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cStT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff26d33d-9dc5-491d-a943-bacd526cd808_1588x1238.png" width="1456" height="1135" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ff26d33d-9dc5-491d-a943-bacd526cd808_1588x1238.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1135,&quot;width&quot;:1456,&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_!cStT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff26d33d-9dc5-491d-a943-bacd526cd808_1588x1238.png 424w, https://substackcdn.com/image/fetch/$s_!cStT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff26d33d-9dc5-491d-a943-bacd526cd808_1588x1238.png 848w, https://substackcdn.com/image/fetch/$s_!cStT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff26d33d-9dc5-491d-a943-bacd526cd808_1588x1238.png 1272w, https://substackcdn.com/image/fetch/$s_!cStT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff26d33d-9dc5-491d-a943-bacd526cd808_1588x1238.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">Craft Agents&#8217; built-in themes</figcaption></figure></div><p>You might think this is enough choice, but it&#8217;s not! One customer support person instructed Craft Agents to design a new theme imitating the Matrix. The agent obliged, and custom themes started spreading in the office. Here are some popular ones:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PLpY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22914c3b-f9bd-4da7-9052-add72436504f_1600x587.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PLpY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22914c3b-f9bd-4da7-9052-add72436504f_1600x587.png 424w, https://substackcdn.com/image/fetch/$s_!PLpY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22914c3b-f9bd-4da7-9052-add72436504f_1600x587.png 848w, https://substackcdn.com/image/fetch/$s_!PLpY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22914c3b-f9bd-4da7-9052-add72436504f_1600x587.png 1272w, https://substackcdn.com/image/fetch/$s_!PLpY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22914c3b-f9bd-4da7-9052-add72436504f_1600x587.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PLpY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22914c3b-f9bd-4da7-9052-add72436504f_1600x587.png" width="1456" height="534" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/22914c3b-f9bd-4da7-9052-add72436504f_1600x587.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:534,&quot;width&quot;:1456,&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_!PLpY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22914c3b-f9bd-4da7-9052-add72436504f_1600x587.png 424w, https://substackcdn.com/image/fetch/$s_!PLpY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22914c3b-f9bd-4da7-9052-add72436504f_1600x587.png 848w, https://substackcdn.com/image/fetch/$s_!PLpY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22914c3b-f9bd-4da7-9052-add72436504f_1600x587.png 1272w, https://substackcdn.com/image/fetch/$s_!PLpY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22914c3b-f9bd-4da7-9052-add72436504f_1600x587.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">Unofficial themes created with prompts: The Matrix and Half-Life</figcaption></figure></div><h3>&#8220;Remixing&#8221; Craft Agents is already a thing</h3><p>Craft Agents is open source which means anyone can fork the code and make changes. The Apache 2.0 license is permissive: you can fork, modify, and distribute your fork however you want. The only constraint is that you must include a copy of the Apache 2.0 license text itself with the distributed work.</p><p>Forking and modifying for personal needs is already happening. Here&#8217;s an example from researcher, Lisa Skorobogatova, who remixed Craft Agents by instructing the agent to make changes to its own code to support projects, and allow drag-and-drop to move chats into projects:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0ioV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce5d9cf3-c839-4b7e-b3cf-1a979521f6e5_1360x1040.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0ioV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce5d9cf3-c839-4b7e-b3cf-1a979521f6e5_1360x1040.png 424w, https://substackcdn.com/image/fetch/$s_!0ioV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce5d9cf3-c839-4b7e-b3cf-1a979521f6e5_1360x1040.png 848w, https://substackcdn.com/image/fetch/$s_!0ioV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce5d9cf3-c839-4b7e-b3cf-1a979521f6e5_1360x1040.png 1272w, https://substackcdn.com/image/fetch/$s_!0ioV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce5d9cf3-c839-4b7e-b3cf-1a979521f6e5_1360x1040.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0ioV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce5d9cf3-c839-4b7e-b3cf-1a979521f6e5_1360x1040.png" width="1360" height="1040" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ce5d9cf3-c839-4b7e-b3cf-1a979521f6e5_1360x1040.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1040,&quot;width&quot;:1360,&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_!0ioV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce5d9cf3-c839-4b7e-b3cf-1a979521f6e5_1360x1040.png 424w, https://substackcdn.com/image/fetch/$s_!0ioV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce5d9cf3-c839-4b7e-b3cf-1a979521f6e5_1360x1040.png 848w, https://substackcdn.com/image/fetch/$s_!0ioV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce5d9cf3-c839-4b7e-b3cf-1a979521f6e5_1360x1040.png 1272w, https://substackcdn.com/image/fetch/$s_!0ioV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce5d9cf3-c839-4b7e-b3cf-1a979521f6e5_1360x1040.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">M<em>odifying Craft Agents to use Projects via prompts. New open source &#8220;remixing&#8221; with AI? Source:<a href="https://x.com/lisascorexx/status/2014376300559864256"> Lisa Skorobogatova</a></em></figcaption></figure></div><h2>4. New way to build software?</h2><p>Until now, software at Craft was built the usual way:</p><ul><li><p>Plan changes ahead of time when it makes sense to.</p></li><li><p>Write the code.</p></li><li><p>Code review.</p></li><li><p>Deploy to production.</p></li></ul><p>But with Craft Agents, engineering is also done differently:</p>
      <p>
          <a href="https://newsletter.pragmaticengineer.com/p/ai-first-makeover-craft">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[The Product-Minded Engineer: The importance of good errors and warnings]]></title><description><![CDATA[Product engineers are more in demand than ever, but how do you become one? New book, &#8220;The Product-Minded Engineer&#8221;, offers a guide. An interview with its author and an exclusive excerpt]]></description><link>https://newsletter.pragmaticengineer.com/p/the-product-minded-engineer</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/the-product-minded-engineer</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 20 Jan 2026 17:31:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!LMPN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6e271a6-0139-47fd-83ba-88e56338affe_1600x1200.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Before we start: I&#8217;m hiring!</em></p><p><em>The Pragmatic Engineer is not a typical publication, and so this is also not a typical role. I&#8217;m looking for someone to help research and compile Tuesday deepdives like the one on <a href="https://newsletter.pragmaticengineer.com/p/cursor">Cursor</a>, on <a href="https://newsletter.pragmaticengineer.com/p/how-claude-code-is-built">Claude Code</a>, on <a href="https://newsletter.pragmaticengineer.com/p/stripe">Stripe</a>, and <a href="https://newsletter.pragmaticengineer.com/t/engineering-culture-deepdive">many others</a>. This position will include directly talking with engineers at interesting companies, researching both public details and details made exclusively available to us, and compiling what we learned into detailed reports. </em></p><p><em>If you&#8217;ve worked at startups or Big Tech for a while, would enjoy working full-remote, keeping up with the cutting edge of the industry sounds interesting, and you&#8217;d enjoy doing something that can start as part-time: <strong><a href="https://blog.pragmaticengineer.com/tech-industry-analyst-2026/">read more and apply here.</a> </strong>Applications close Monday, 26 Jan.</em></p><div><hr></div><p>One trend in tech is that more startups are hiring for &#8220;product engineers&#8221; or &#8220;product-minded engineers&#8221;, who can implement products <em>and also </em>come up with strong product and feature ideas, then build them. This trend of engineers&#8217; involvement from the ideas stage through to shipping looks set to accelerate with AI tools generating ever more code.</p><p>My recent analysis of <a href="https://newsletter.pragmaticengineer.com/p/when-ai-writes-almost-all-code-what">what happens when AI writes almost all the code</a> mentioned that nimble startups were already recruiting &#8220;product engineers&#8221; who can create their own work, and act as blends of mini-product manager and software engineer. I said this indicates that being more product-minded could become a baseline at startups because it&#8217;s increasingly important to specify what an AI tool should build.</p><p>But how do you get better at being a product engineer?</p><p>Obviously, pairing with a product manager, staying close to the business, and finding a mentor who&#8217;s a great product engineer are strong options. But if these aren&#8217;t all available in your workplace, there&#8217;s now a book dedicated to the topic.</p><p>Entitled <em>&#8220;The Product-Minded Engineer&#8221;,</em> it&#8217;s written by former software engineer and current product manager, <a href="https://www.linkedin.com/in/drewhoskins2/">Drew Hoskins</a>, and published by O&#8217;Reilly:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LMPN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6e271a6-0139-47fd-83ba-88e56338affe_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LMPN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6e271a6-0139-47fd-83ba-88e56338affe_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!LMPN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6e271a6-0139-47fd-83ba-88e56338affe_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!LMPN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6e271a6-0139-47fd-83ba-88e56338affe_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!LMPN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6e271a6-0139-47fd-83ba-88e56338affe_1600x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LMPN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6e271a6-0139-47fd-83ba-88e56338affe_1600x1200.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b6e271a6-0139-47fd-83ba-88e56338affe_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;: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_!LMPN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6e271a6-0139-47fd-83ba-88e56338affe_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!LMPN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6e271a6-0139-47fd-83ba-88e56338affe_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!LMPN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6e271a6-0139-47fd-83ba-88e56338affe_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!LMPN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6e271a6-0139-47fd-83ba-88e56338affe_1600x1200.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"><em>My copy of <a href="https://www.oreilly.com/library/view/the-product-minded-engineer/9781098173722/">The Product-Minded Engineer</a>, by Drew Hoskins</em></figcaption></figure></div><p>A few years ago, I published an article named &#8220;<a href="https://blog.pragmaticengineer.com/the-product-minded-engineer/">The Product-Minded Software Engineer</a>&#8221; which offers tips for software engineers to grow their &#8220;product muscle&#8221;, and it&#8217;s timely that a fellow engineer has invested in writing a guide about this increasingly pertinent subject.</p><p>After hearing Drew was working on his book, I got in touch, reviewed a draft version, and asked if he&#8217;d consider sharing an excerpt in this newsletter. Graciously, both Drew and O&#8217;Reilly agreed. Drew will also be a speaker at <a href="https://www.pragmaticsummit.com/">The Pragmatic Summit</a> in San Francisco next month, on 11 February, discussing tactics for leading product engineering teams in an AI-native environment.</p><p>In today&#8217;s issue, we cover:</p><ol><li><p><strong>Author&#8217;s background. </strong>Twenty years as a software engineer at Microsoft, Facebook, and Stripe &#8211; and today as a product manager at Temporal.</p></li><li><p><strong>Writing the book. </strong>Why create this guide now?</p></li><li><p><strong>Importance of good errors and warnings at product-level. </strong>Excerpt from Chapter 3: <em>&#8220;Errors and Warnings&#8221;,</em> about why designing the right approach to errors has a massive impact upon products used by developers and nontechnical users, too.</p></li></ol><p><em>My usual disclaimer: as with all my recommendations, I was not paid for this article, and none of the links are affiliates. See <a href="https://blog.pragmaticengineer.com/ethics-statement/">my ethics statement</a> for more.</em></p><h2>1. Author&#8217;s background</h2><p>With experienced tech professionals who cross over into being published writers, I find it&#8217;s always useful to understand something about their background, and Drew has an impressive one spanning more than two decades:</p><ul><li><p><strong>Microsoft: Software Development Engineer</strong> (2002&#8211;2009). Worked on the C++ compiler backend, static analysis tools, and the Windows UI developer framework.</p></li><li><p><strong>Facebook: platform/product infra engineer</strong> (2009&#8211;2015). Worked on the Facebook API and the initial version of the Facebook App Center. Then founded and led a product infrastructure team building the core data APIs for internal engineers. Still used pervasively today, EntSchema turbocharged Facebook&#8217;s Ent framework with codegen, reflection, and a sandbox experience. This later led to the popular open-source <a href="https://github.com/ent/ent">Ent framework in Go</a>.</p></li><li><p><strong>Oculus: Software engineer, E7: Senior Staff-level engineer</strong>, (2015-2017)<strong> </strong>Led the effort to rebuild Oculus&#8217;s web platform to Facebook&#8217;s infrastructure, after the social media giant acquired Oculus. Tech lead for Oculus&#8217; Platform SDK.</p></li><li><p><strong>Stripe: Staff+ software engineer</strong> (2018&#8211;2023). Tech Lead on the Stripe Connect product, then founded and led the Workflow Engine, a framework built on Temporal.</p></li><li><p><strong>Temporal: Staff Product Manager</strong> (2024&#8211;present). Product manager at <a href="https://temporal.io/">Temporal</a>, an open source durable execution workflow service, working on developer experience and agentic orchestration.</p></li></ul><p>Drew went from working on APIs and platform teams, to leading large engineering efforts, and starting new teams and initiatives in his workplaces &#8211; before heading over to the &#8220;dark side&#8221; of product management at a developer tools company. To me, Drew seems the ideal professional to write such a book because he has plentiful experience of working as a software engineer when it was required to understand the business, and he&#8217;s now a product manager working with fellow engineers on Temporal.</p><h2>2. Writing the book</h2><p>Drew told me more context about this project:</p><p><em>What was the trigger to start writing this book?</em></p><blockquote><p>&#8220;I had written a book outline on usable API design for O&#8217;Reilly, and the main themes were product-thinking and user empathy; topics I&#8217;ve long wished more engineers engaged with. But Louise Corrigan at O&#8217;Reilly liked those themes more than the API topic, and suggested I make product-thinking itself the subject of the book.</p><p>I liked how this pivot mirrors my personal career journey; of my interest in API design blossoming into a broader interest in products and users&#8221;.</p></blockquote><p><em>How long did it take to write?</em></p><blockquote><p>&#8220;It was an 18-month process end-to-end, starting the day after I joined Temporal &#8211; so that was an intense period! I upgraded a lot of three-day weekends to four-day weekends, and also did some writing on cruise ships. I wrote the whole thing myself, but used friends, and especially Claude, for research. I also sought lots of Alpha and Beta feedback because I believe &#8220;it takes a village&#8221;. The two biggest inputs were my own career experience and concepts from the design and product communities. It&#8217;s well-known stuff, but nobody bothered to inform engineers about it&#8221;.</p></blockquote><p><em>Who&#8217;s the best product-minded engineer you worked with?</em></p><blockquote><p>&#8220;<strong>John Carmack, with whom I overlapped at Oculus.</strong> He&#8217;s amazing because he&#8217;s super-deep technically in areas like graphics, yet doggedly pursues the most important product goals.</p><p>One year, he decided the community needed to level up in building performant VR apps for a mobile compute envelope, so he mentored the entire community in marathon sessions. Another time, he decided the Oculus platform needed more great apps, so went to Netflix and Mojang, worked with those teams, and heroically brought the Netflix and Minecraft VR apps into existence&#8221;.</p></blockquote><p><em>What&#8217;s your advice for mid and senior-level software engineers who want to be more product-minded?</em></p><blockquote><p>&#8220;My suggestions:</p><ul><li><p><strong>Ask &#8220;why&#8221; a lot.</strong> Don&#8217;t expect to always get clear answers, not even from EMs and PMs.</p></li><li><p><strong>Switch your viewpoint.</strong> Go from the system level, to the user lens, and then back again.</p></li><li><p><strong>Use scenarios.</strong> Simulate and sequence user interactions until this becomes routine. Writing scenario tests is often a good start.</p></li><li><p><strong>Customer support. </strong>Spend time on user support and think about more permanent fixes while you engage and unblock users&#8221;.</p></li></ul></blockquote><p><em>As a product manager, what can devs do to be seen as product-minded and be invited to do more product work?</em></p><blockquote><p>&#8220;I try to have devs help me author use cases/scenarios. I also invite them to come along on customer calls if they want. If they have an idea, I ask them to justify it with scenarios. If they start throwing use cases back at me without prompting after a couple of months, I know they&#8217;re on the journey&#8221;.</p></blockquote><p>What is one technique for using AI tools that you&#8217;d recommend devs try, in order to be more product-minded?</p><p><strong>&#8220;It&#8217;s easier than ever to gather user signal with AI tools. </strong>My team at Temporal has a Claude Code skill for gathering customer signal: the tool searches our internal Slack, community Slack, Miro Insights, GitHub issues, and Gong, and aggregates it all into a report with lots of links to chase down customers and requests. Many of those tools in turn have AI assistants that make all this much easier to do!&#8221;</p><h2>3. Excerpt: &#8220;The importance of good errors and warnings at product-level&#8221;</h2><p><em>The excerpt below is from &#8220;<a href="https://www.oreilly.com/library/view/the-product-minded-engineer/9781098173722/">The Product-Minded Engineer</a>&#8221;, by Drew Hoskins. Copyright &#169; 2025 Drew Hoskins. Published by O&#8217;Reilly Media, Inc. Used with permission.</em></p><div><hr></div><p><em>From Chapter 3: &#8220;Errors and Warnings&#8221;</em></p><h2>The Value of Diagnostics</h2><p>Crafting well-structured diagnostics with useful messages is an incredibly valuable and high-leverage way to spend your time. For many applications and platforms with complex and open-ended inputs, diagnostics are the primary interface&#8212;the vast majority of the user&#8217;s time will be spent dealing with errors and progressing to the next one.</p><p>Filling out electronic forms is all about being told about your missing or malformed input. My coding time is at least half dealing with errors and lint rules. Even writing in a word processor has become a constant process of looking at underlined text and being asked to proofread or rephrase.</p><p>And yet, as we design software, because errors often don&#8217;t appear in screenshots, marketing materials, or API method listings, they can be out of sight and out of mind.</p><p>Autonomous agents shine a bright light on this problem. They are now regularly presented with error messages resulting from their actions and instructed to correct their mistakes based on them. If the message isn&#8217;t sufficiently helpful, they fail at their task. The process of trying different things is slow and costly. Because agents are billed based on usage, the costs are directly measured.</p><p><em>Tip: Diagnostics may be the most important interface of your product.</em></p><h2>Scenarios for Diagnostics</h2><p>When considering errors, warnings, and their associated messages, it is essential to think about a broad range of scenarios, starting with identifying edge cases, to understanding how developers can automate reactions, and how end users will understand and act upon them. Improve your ability to understand your users&#8217; knowledge, generate user stories, and simulate user interactions, and you&#8217;ll improve your diagnostics. For users, we provide contextual and actionable errors. For developers, we carefully select our error types, codes, and metadata so that those who receive them can recover gracefully.</p><p>In the rest of this chapter, you&#8217;ll learn how to craft refreshingly useful warnings and errors. We&#8217;ll explore how to:</p><ul><li><p>Understand the scenario&#8212;the persona who will benefit from the error and their situation</p></li><li><p>Provide enough context to our users for them to understand the error</p></li><li><p>Provide actionable error messages that suggest what to do about the problem</p></li><li><p>Choose error codes and types carefully to allow upstream developers to serve <em>their </em>users</p></li><li><p>Raise errors at the API or UI layer so that messages can be written with full context about what the user&#8217;s trying to do</p></li><li><p><em>Shift left</em>; that is, fire errors as early as possible to speed up your users, and before bad things happen&#9;&#9;&#9;&#9;&#9;&#9;</p></li></ul><p>In Chapter 8, I&#8217;ll address how to list out edge cases to figure out what errors to check for in the first place. For now, I&#8217;ll focus on crafting errors once you already know what they are.</p><h2>Categorizing Error Scenarios</h2><p>When writing errors, you need to make a few main choices. First, a user-facing choice:</p><ul><li><p>What is the error message?</p></li></ul><p>There are also choices of concern to developers so that they can catch errors and automate responses:</p><ul><li><p>What is the error&#8217;s class or code?</p></li><li><p>What metadata is needed to pinpoint the problem?</p></li></ul><p>Thus, when you craft errors in virtually any application or platform, you must think of two categories of user scenarios: the human one and the programmer one.<br> &#9;&#9;&#9;&#9;&#9;&#9;&#9;<br>There are further divisions in the developer scenarios: are you communicating with members of your team who work on your codebase, or those from other teams or companies? This is especially important if you are building an API or service where upstream developers can catch your error and act upon it.<br> &#9;&#9;&#9;&#9;&#9;&#9;&#9;<br>So, the first step is to pitch your message to the right person in the right circumstance. We&#8217;ve all seen errors that didn&#8217;t seem to be meant for us, such as when websites show code listings to end users. To determine your audience, start by deciding your error&#8217;s category. For our purposes, the five shown in Table 3-1 cover most cases.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YOXS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f644aa8-f468-4536-b988-4fab47796c3e_1266x390.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YOXS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f644aa8-f468-4536-b988-4fab47796c3e_1266x390.png 424w, https://substackcdn.com/image/fetch/$s_!YOXS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f644aa8-f468-4536-b988-4fab47796c3e_1266x390.png 848w, https://substackcdn.com/image/fetch/$s_!YOXS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f644aa8-f468-4536-b988-4fab47796c3e_1266x390.png 1272w, https://substackcdn.com/image/fetch/$s_!YOXS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f644aa8-f468-4536-b988-4fab47796c3e_1266x390.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YOXS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f644aa8-f468-4536-b988-4fab47796c3e_1266x390.png" width="1266" height="390" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f644aa8-f468-4536-b988-4fab47796c3e_1266x390.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:390,&quot;width&quot;:1266,&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_!YOXS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f644aa8-f468-4536-b988-4fab47796c3e_1266x390.png 424w, https://substackcdn.com/image/fetch/$s_!YOXS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f644aa8-f468-4536-b988-4fab47796c3e_1266x390.png 848w, https://substackcdn.com/image/fetch/$s_!YOXS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f644aa8-f468-4536-b988-4fab47796c3e_1266x390.png 1272w, https://substackcdn.com/image/fetch/$s_!YOXS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f644aa8-f468-4536-b988-4fab47796c3e_1266x390.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>Table 3-1. Categories of errors</em></figcaption></figure></div><p>Start by mentally categorizing any error you write. This gives a huge clue as to who you&#8217;re talking to&#8212;your own team, other developers, or users&#8212;and when the errors can be fixed&#8212;at runtime or during development. This will help you write with the right vocabulary and suggest helpful actions (see Table 3-2).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fc1q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6861967-bc07-43e8-9d5e-3356430cf299_1314x392.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fc1q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6861967-bc07-43e8-9d5e-3356430cf299_1314x392.png 424w, https://substackcdn.com/image/fetch/$s_!fc1q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6861967-bc07-43e8-9d5e-3356430cf299_1314x392.png 848w, https://substackcdn.com/image/fetch/$s_!fc1q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6861967-bc07-43e8-9d5e-3356430cf299_1314x392.png 1272w, https://substackcdn.com/image/fetch/$s_!fc1q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6861967-bc07-43e8-9d5e-3356430cf299_1314x392.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fc1q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6861967-bc07-43e8-9d5e-3356430cf299_1314x392.png" width="1314" height="392" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d6861967-bc07-43e8-9d5e-3356430cf299_1314x392.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:392,&quot;width&quot;:1314,&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_!fc1q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6861967-bc07-43e8-9d5e-3356430cf299_1314x392.png 424w, https://substackcdn.com/image/fetch/$s_!fc1q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6861967-bc07-43e8-9d5e-3356430cf299_1314x392.png 848w, https://substackcdn.com/image/fetch/$s_!fc1q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6861967-bc07-43e8-9d5e-3356430cf299_1314x392.png 1272w, https://substackcdn.com/image/fetch/$s_!fc1q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6861967-bc07-43e8-9d5e-3356430cf299_1314x392.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>Table 3-2. The when and who of error scenario categories</em></figcaption></figure></div><p>These five types of scenarios reveal drastically different strategies. For example, if an assertion triggers in production, it&#8217;s usually catastrophic. If the code is in a state the authors didn&#8217;t foresee, it will lead to unpredictable behavior&#8212;most likely in the form of a crash or a poor error message. Occasionally there are worse consequences, like data corruption. In some programming languages, assertions are stripped out in production to optimize their execution, meaning that you shouldn&#8217;t rely on them for anything load bearing. In no case is the end user persona expected to interact with them successfully.</p><p>For some applications, all end users are not the same; in which case, messages should be tailored to each persona. A classic example is a Preconditions Not Met error caused by the user not having the necessary access. Is the user an administrator or an end user? This determines whether we will provide them with direct instructions or instruct them to contact an administrator.</p><p>Knowing your personas will help you speak to the user&#8217;s ontology. (Ontology was defined in Chapter 2 as a structured graph of known concepts.) Consider &#8220;PC Load Letter,&#8221; [a reference to a segment before this excerpt] which tried to ask users to reload the printer&#8217;s paper tray. It was actionable&#8212;it told the user to load the paper&#8212;but it failed because it was speaking to the wrong persona. &#8220;PC&#8221; stood for &#8220;paper cassette&#8221; and &#8220;Letter&#8221; referred to a size of paper&#8212; 8.5&#8221;x11&#8221;. Perhaps instead, they should have labeled the paper trays A, B, and C and said, &#8220;Reload tray B.&#8221;</p><h3>Categorizing Errors in Practice</h3><p>Let&#8217;s work an example to show how to use product thinking to categorize errors.</p><p>Which of the five categories does a divide-by-zero&#8212;in Python, a ZeroDivisionError &#8212;fall into?</p><p>Imagine you are writing a method to compute the average value of an online metric over a time window.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!M9m9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a369526-8b19-4b9d-b0c2-80adec602d0a_1354x206.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!M9m9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a369526-8b19-4b9d-b0c2-80adec602d0a_1354x206.png 424w, https://substackcdn.com/image/fetch/$s_!M9m9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a369526-8b19-4b9d-b0c2-80adec602d0a_1354x206.png 848w, https://substackcdn.com/image/fetch/$s_!M9m9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a369526-8b19-4b9d-b0c2-80adec602d0a_1354x206.png 1272w, https://substackcdn.com/image/fetch/$s_!M9m9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a369526-8b19-4b9d-b0c2-80adec602d0a_1354x206.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!M9m9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a369526-8b19-4b9d-b0c2-80adec602d0a_1354x206.png" width="1354" height="206" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5a369526-8b19-4b9d-b0c2-80adec602d0a_1354x206.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:206,&quot;width&quot;:1354,&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_!M9m9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a369526-8b19-4b9d-b0c2-80adec602d0a_1354x206.png 424w, https://substackcdn.com/image/fetch/$s_!M9m9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a369526-8b19-4b9d-b0c2-80adec602d0a_1354x206.png 848w, https://substackcdn.com/image/fetch/$s_!M9m9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a369526-8b19-4b9d-b0c2-80adec602d0a_1354x206.png 1272w, https://substackcdn.com/image/fetch/$s_!M9m9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a369526-8b19-4b9d-b0c2-80adec602d0a_1354x206.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Look at the return statement. If this method threw a ZeroDivisionError when the metrics array was empty, callers would be quite confused&#8212;they&#8217;d need to know the innards of your function to understand.</p><p><em>Tip: Users and developers should never have to understand your implementation to understand an error.</em></p><p>Thus, unless your code is literally a calculator, a divide-by-zero error is an Assertion, designed to be found at test time and telling your team that the code needs improvement. Avoid it&#8212;do some upfront validation before attempting the division.</p><p>So, we&#8217;re going to validate, but what scenario category would <em>that </em>validation fall under? The circumstance that led to the len(metrics)==0 condition could have been any of those listed in Table 3-3.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bvji!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F972c4c1f-887d-4358-b420-cefffdf13bff_906x346.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bvji!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F972c4c1f-887d-4358-b420-cefffdf13bff_906x346.png 424w, https://substackcdn.com/image/fetch/$s_!bvji!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F972c4c1f-887d-4358-b420-cefffdf13bff_906x346.png 848w, https://substackcdn.com/image/fetch/$s_!bvji!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F972c4c1f-887d-4358-b420-cefffdf13bff_906x346.png 1272w, https://substackcdn.com/image/fetch/$s_!bvji!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F972c4c1f-887d-4358-b420-cefffdf13bff_906x346.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bvji!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F972c4c1f-887d-4358-b420-cefffdf13bff_906x346.png" width="906" height="346" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/972c4c1f-887d-4358-b420-cefffdf13bff_906x346.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:346,&quot;width&quot;:906,&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_!bvji!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F972c4c1f-887d-4358-b420-cefffdf13bff_906x346.png 424w, https://substackcdn.com/image/fetch/$s_!bvji!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F972c4c1f-887d-4358-b420-cefffdf13bff_906x346.png 848w, https://substackcdn.com/image/fetch/$s_!bvji!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F972c4c1f-887d-4358-b420-cefffdf13bff_906x346.png 1272w, https://substackcdn.com/image/fetch/$s_!bvji!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F972c4c1f-887d-4358-b420-cefffdf13bff_906x346.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>Table 3-3. Divide-by-zero error categories</em></figcaption></figure></div><p>As I&#8217;ll discuss in the next section on messages, you&#8217;ll want to suggest different actions in each of these cases and therefore will need distinguishing checks in the code. Further, you will need to perform these validations at a moment when you have the necessary context.</p><p>In this section, we categorized diagnostics as either interacting with developers or end users and distinguished between scenarios that were actionable at runtime and those that were actionable only during development. Next, we&#8217;ll build on this to author awesome messages.</p><h2>Warning and Error Messages</h2><p>Writing diagnostic messages combines system thinking with user thinking. Know precisely what happened, but shift to your user&#8217;s perspective. Explain what they need to know in terms they understand. Otherwise, obscure warnings like LaTeX&#8217;s &#8220;underfull hbox (badness 10000)&#8221; will result.</p><p>Users seeing a diagnostic will want to know two things:</p><ul><li><p>What precisely happened to cause the error, in terms from the product&#8217;s ontology? This should help them know the impact of the failure and provide clues as to how to remediate it.</p></li><li><p>What can they do about it, if anything? Actionable diagnostics will directly help them accomplish their task.</p></li></ul><p>Let&#8217;s tackle those two goals one at a time. But first, let me introduce an example that will thread through the next few sections.</p><h2>Case Study Introduction</h2><p>Channelz is a fictional software as a service (SaaS) company building a workplace communication tool like Slack, Microsoft Teams, or Discord.<br> &#9;&#9;&#9;&#9;&#9;&#9;&#9;<br>Elise works on the API team, and her teammate Deng is the tech lead.<br> &#9;&#9;&#9;&#9;&#9;&#9;&#9;<br>In Channelz, one can write direct messages to coworkers or send them to &#8220;channels,&#8221; which are groups of employees organized around a specific topic; the API engineering team might have a channel called #team-api-eng. Elise&#8217;s user handle is @elisek and Deng&#8217;s is @deng.<br> &#9;&#9;&#9;&#9;&#9;&#9;&#9;<br>Channelz is building out an API that can be used to send messages from bots, either directly to users or to channels. Their customers want to use it to send various notifications.<br> &#9;&#9;&#9;&#9;&#9;&#9;&#9;<br>Before coding, Elise sketches a quick developer interface design and shows it to Deng. Channelz messages can go to a set of individuals or to a channel to alert employees when something has gone wrong or a job has been completed.<br> &#9;&#9;&#9;&#9;&#9;&#9;&#9;<br>The method in the Python SDK they ship to customers will look like this:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GsoX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78457f8-02d9-460f-9cb9-d09841471354_1424x354.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GsoX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78457f8-02d9-460f-9cb9-d09841471354_1424x354.png 424w, https://substackcdn.com/image/fetch/$s_!GsoX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78457f8-02d9-460f-9cb9-d09841471354_1424x354.png 848w, https://substackcdn.com/image/fetch/$s_!GsoX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78457f8-02d9-460f-9cb9-d09841471354_1424x354.png 1272w, https://substackcdn.com/image/fetch/$s_!GsoX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78457f8-02d9-460f-9cb9-d09841471354_1424x354.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GsoX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78457f8-02d9-460f-9cb9-d09841471354_1424x354.png" width="1424" height="354" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a78457f8-02d9-460f-9cb9-d09841471354_1424x354.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:354,&quot;width&quot;:1424,&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_!GsoX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78457f8-02d9-460f-9cb9-d09841471354_1424x354.png 424w, https://substackcdn.com/image/fetch/$s_!GsoX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78457f8-02d9-460f-9cb9-d09841471354_1424x354.png 848w, https://substackcdn.com/image/fetch/$s_!GsoX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78457f8-02d9-460f-9cb9-d09841471354_1424x354.png 1272w, https://substackcdn.com/image/fetch/$s_!GsoX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78457f8-02d9-460f-9cb9-d09841471354_1424x354.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>She sketches some use cases for Deng:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8_7N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c87cd43-94cc-4897-ab3b-44c92699f50f_1424x246.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8_7N!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c87cd43-94cc-4897-ab3b-44c92699f50f_1424x246.png 424w, https://substackcdn.com/image/fetch/$s_!8_7N!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c87cd43-94cc-4897-ab3b-44c92699f50f_1424x246.png 848w, https://substackcdn.com/image/fetch/$s_!8_7N!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c87cd43-94cc-4897-ab3b-44c92699f50f_1424x246.png 1272w, https://substackcdn.com/image/fetch/$s_!8_7N!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c87cd43-94cc-4897-ab3b-44c92699f50f_1424x246.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8_7N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c87cd43-94cc-4897-ab3b-44c92699f50f_1424x246.png" width="1424" height="246" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4c87cd43-94cc-4897-ab3b-44c92699f50f_1424x246.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:246,&quot;width&quot;:1424,&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_!8_7N!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c87cd43-94cc-4897-ab3b-44c92699f50f_1424x246.png 424w, https://substackcdn.com/image/fetch/$s_!8_7N!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c87cd43-94cc-4897-ab3b-44c92699f50f_1424x246.png 848w, https://substackcdn.com/image/fetch/$s_!8_7N!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c87cd43-94cc-4897-ab3b-44c92699f50f_1424x246.png 1272w, https://substackcdn.com/image/fetch/$s_!8_7N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c87cd43-94cc-4897-ab3b-44c92699f50f_1424x246.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Deng looks at Elise&#8217;s design and asks her to list failure scenarios as well. Elise has shown successful usages of the API, when callers already know what to do, but what about before then? If their users&#8217; coding session is a journey, Elise has shown only the end. It&#8217;s as if somebody asked for directions with an online maps search, and she responded with only a pin on the destination.</p><p>Elise comes up with a few scenarios. (I will teach probing for edge cases in Chapter 7. For this chapter, I&#8217;ll skip that step.) She raises one important scenario that we&#8217;ll obsess over here: what if the user or channel passed into the API is invalid?&#9;&#9;</p><p><em>[We now skip ahead to the middle of the chapter, skipping through the section titled Provide Context.]</em></p><h2>Make Error and Warning Messages Actionable</h2><p>In many circumstances knowing what happened is only half the battle. Users often need to be given suggestions or told what to do. And for read operations&#8212;and increasingly with AI&#8212;you can even correct the mistake for them, as with Google&#8217;s &#8220;Showing results for: [correction]&#8221; feature, as well as coding or writing assistants automatically fixing your code or language.</p><p>We&#8217;ve all spent countless hours of our lives dealing with error messages, figuring out what to do, sometimes discovering after much investigation that the fix is simple.</p><p>In this section, you&#8217;ll see how to routinely improve your diagnostics. To achieve this, you&#8217;ll need to empathize with your audience, starting with the scenario categorization we did previously.</p><p>Returning to our Channelz example, suppose you called the API:</p><blockquote><p>bot.send_message(message=&#8221;The sky is falling!&#8221;, channel=&#8221;@barnyard- friends&#8221;)</p></blockquote><p>and got this error message:</p><blockquote><p>Cannot deliver a Channelz message to channel &#8216;@barnyard-friends&#8217;: channel does not exist.</p></blockquote><p>Can you tell what went wrong? It may take a bit to figure out, and if you&#8217;re not super familiar with Channelz nomenclature, you may not realize that channels are prefixed with #, not @.</p><p>It would be better to give our users a couple of options for what to do:</p><blockquote><p>Cannot deliver a Channelz message to channel &#8216;@barnyard-friends&#8217;: it is prefixed with @. Did you mean to pass it into &#8216;users&#8217;? Or did you mean &#8216;#barnyard-friends&#8217;?</p></blockquote><p>Channelz could even query accounts to see if #barnyard-friends exists&#8212;and is public to the user&#8212;and show:</p><blockquote><p>Channel @barnyard-friends is prefixed with @, but we found a channel, #barnyard-friends. Is that what you meant?</p></blockquote><p>By eliminating chunks of &#8220;search space&#8221; for your users, suggesting actions can save hours or prevent them from giving up and churning out of your product. Even a simple &#8220;try again in a minute&#8221; after a System error can increase completions of workflows.</p><p>Sometimes, the advice gets complicated. You may need to introduce users to some concepts, like the concept of channels, or guide them through a number of decisions. Where appropriate, link out to documentation dedicated to resolving that error. For example, if this case were more complex, you might do:</p><blockquote><p>See https://channelz.io/docs/errors/invalid_channel to learn how to resolve this error.</p></blockquote><h2>Raise Errors at the Interface</h2><p>If it were straightforward to write good error messages, engineers would do it more often. One of the main reasons they don&#8217;t is because it often takes diligent code organization to pull it off.</p><p>To write the best error messages, you need two pieces of information: What happened in the system? And, what was the user trying to do? The trouble is, in real life a different piece of code has each piece of information.</p><p>One place, near the API or UI boundary, knows who the user was and what they were trying to do. It is best placed to tell the user what to do without mentioning implementation details the user won&#8217;t be aware of.</p><p>The other, deep in the bowels of your processing code, is where the problem happens.</p><p>This came up when we were categorizing errors. When we divided by zero, Python&#8217;s division operation knew the exact law of mathematics being violated, but had no idea how the division was being used and therefore no hope of giving a good error.</p><p>The best place to raise errors is usually at the interface between the system and the user, where we can combine the bottom-up and top-down knowledge. (An alternative is to pass all the user context down, which I&#8217;ll explore in a later section.)</p><p>Generally, people raise at the interface in two ways:</p><ul><li><p>They raise errors proactively, using upfront validations at the API boundary.</p></li><li><p>They use error handlers to intercept a lower-level error and repackage it into an appropriate form.</p></li></ul><p>To illustrate each, let&#8217;s return to Channelz.</p><h2>Upfront Validations&#9;&#9;&#9;</h2><p>The Observability team at ChickenLittle has another problem. The function powering their on call messages is alert_team:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1OfC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18a3bffc-2056-4d75-99bf-81ad51a29f79_1552x180.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1OfC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18a3bffc-2056-4d75-99bf-81ad51a29f79_1552x180.png 424w, https://substackcdn.com/image/fetch/$s_!1OfC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18a3bffc-2056-4d75-99bf-81ad51a29f79_1552x180.png 848w, https://substackcdn.com/image/fetch/$s_!1OfC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18a3bffc-2056-4d75-99bf-81ad51a29f79_1552x180.png 1272w, https://substackcdn.com/image/fetch/$s_!1OfC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18a3bffc-2056-4d75-99bf-81ad51a29f79_1552x180.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1OfC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18a3bffc-2056-4d75-99bf-81ad51a29f79_1552x180.png" width="1456" height="169" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/18a3bffc-2056-4d75-99bf-81ad51a29f79_1552x180.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:169,&quot;width&quot;:1456,&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_!1OfC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18a3bffc-2056-4d75-99bf-81ad51a29f79_1552x180.png 424w, https://substackcdn.com/image/fetch/$s_!1OfC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18a3bffc-2056-4d75-99bf-81ad51a29f79_1552x180.png 848w, https://substackcdn.com/image/fetch/$s_!1OfC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18a3bffc-2056-4d75-99bf-81ad51a29f79_1552x180.png 1272w, https://substackcdn.com/image/fetch/$s_!1OfC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18a3bffc-2056-4d75-99bf-81ad51a29f79_1552x180.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>get_team_metadata reads a database of on call rotations that people at ChickenLittle set in a user interface at <em>https://corp.chickenlittle.io/oncalls/</em>.</p><p>What happens if team_metadata[<em>oncall_user</em>] is invalid? Recall that send_message will raise this error:</p><blockquote><p>Error: Cannot deliver a Channelz message to &#8216;[@gooseyloosey]&#8217; because &#8216;@gooseyloosey&#8217; has been deactivated.</p></blockquote><p>This is accurate, but when Goosey Loosey left the company, users couldn&#8217;t figure out how to fix the problem. So the Observability team added a validation upfront to tell folks what to do:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Xw_8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc4cb20-1023-47a3-bd43-4788ee985546_1600x407.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Xw_8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc4cb20-1023-47a3-bd43-4788ee985546_1600x407.png 424w, https://substackcdn.com/image/fetch/$s_!Xw_8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc4cb20-1023-47a3-bd43-4788ee985546_1600x407.png 848w, https://substackcdn.com/image/fetch/$s_!Xw_8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc4cb20-1023-47a3-bd43-4788ee985546_1600x407.png 1272w, https://substackcdn.com/image/fetch/$s_!Xw_8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc4cb20-1023-47a3-bd43-4788ee985546_1600x407.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Xw_8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc4cb20-1023-47a3-bd43-4788ee985546_1600x407.png" width="1456" height="370" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bdc4cb20-1023-47a3-bd43-4788ee985546_1600x407.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:370,&quot;width&quot;:1456,&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_!Xw_8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc4cb20-1023-47a3-bd43-4788ee985546_1600x407.png 424w, https://substackcdn.com/image/fetch/$s_!Xw_8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc4cb20-1023-47a3-bd43-4788ee985546_1600x407.png 848w, https://substackcdn.com/image/fetch/$s_!Xw_8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc4cb20-1023-47a3-bd43-4788ee985546_1600x407.png 1272w, https://substackcdn.com/image/fetch/$s_!Xw_8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc4cb20-1023-47a3-bd43-4788ee985546_1600x407.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When a user is missing, this method is here to help:</p><blockquote><p>Cannot send a Channelz alert to team &#8216;barnyard-friends&#8217;. On-call user &#8216;@gooseyloosey&#8217; does not exist. Update your oncall rotation at https://corp.chickenlittle.io/oncalls/barnyard-friends.</p></blockquote><p>This higher-level API alert_team captures the intent of the caller much more completely than send_message, which is a powerful basis for providing great errors.</p><p><em>Tip: Throw errors from the outermost layer of your API or application code where you can capture the user&#8217;s scenario.</em></p><p>The approach of upfront validation did the trick here, but it wasn&#8217;t perfect. Can you spot any issues?</p><p>Let&#8217;s look at an alternate technique of repackaging errors that your dependencies raise and see if it works any better.&#9;&#9;</p><h2>Repackage Errors</h2><p>There were two problems with the upfront validation. It&#8217;s expensive&#8212;it uses an extra roundtrip with the Channelz API. More important for our purposes in this chapter, the validation would need to duplicate edge-case-checking code already being done inside the Channelz API, such as checking whether @gooseyloosey&#8217;s account was deactivated. That info is still actionable&#8212;suppose the employee changed their Channelz handle because they changed their name. That would warrant a separate fix.</p><p>Since she&#8217;s given such good support before, the Observability team complains to Elise. They would rather write something like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KcB_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7c74d7c-de31-4d2d-b8c6-ed70f1d1dfbb_1584x460.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KcB_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7c74d7c-de31-4d2d-b8c6-ed70f1d1dfbb_1584x460.png 424w, https://substackcdn.com/image/fetch/$s_!KcB_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7c74d7c-de31-4d2d-b8c6-ed70f1d1dfbb_1584x460.png 848w, https://substackcdn.com/image/fetch/$s_!KcB_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7c74d7c-de31-4d2d-b8c6-ed70f1d1dfbb_1584x460.png 1272w, https://substackcdn.com/image/fetch/$s_!KcB_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7c74d7c-de31-4d2d-b8c6-ed70f1d1dfbb_1584x460.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KcB_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7c74d7c-de31-4d2d-b8c6-ed70f1d1dfbb_1584x460.png" width="1456" height="423" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7c74d7c-de31-4d2d-b8c6-ed70f1d1dfbb_1584x460.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:423,&quot;width&quot;:1456,&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_!KcB_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7c74d7c-de31-4d2d-b8c6-ed70f1d1dfbb_1584x460.png 424w, https://substackcdn.com/image/fetch/$s_!KcB_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7c74d7c-de31-4d2d-b8c6-ed70f1d1dfbb_1584x460.png 848w, https://substackcdn.com/image/fetch/$s_!KcB_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7c74d7c-de31-4d2d-b8c6-ed70f1d1dfbb_1584x460.png 1272w, https://substackcdn.com/image/fetch/$s_!KcB_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7c74d7c-de31-4d2d-b8c6-ed70f1d1dfbb_1584x460.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>Notice the from error clause in the last line. This is Python&#8217;s way of expressing &#8220;chained exceptions,&#8221; which preserves the inner error. Many programming languages have similar mechanisms. This would be the output:&#9;&#9;&#9;</p><blockquote><p>ChannelzUserNotFoundError: User @looseygoosey&#8217;s account has been deactivated.</p><p>The above exception was the direct cause of the following exception:</p><p>ValueError: Cannot send a Channelz alert to team &#8216;barnyard-friends&#8217;.</p><p>On-call employee &#8216;@looseygoosey&#8217; does not exist.</p><p>Update your oncall rotation at https://corp.chickenlittle.io/oncalls/barnyard-friends.</p></blockquote><p>This is a longer message, but it contains everything the user might want to know. Observability asks Elise for specific errors in Channelz&#8217;s SDK so that they can do this.</p><p>With all these employees leaving ChickenLittle, Elise hopes the sky is not falling over there for her favorite design partner. Then, she and Deng investigate making their exceptions more <em>programmable</em>.</p><p>Since we&#8217;re diving into programmability, I&#8217;ll end our discussion of actionability and raising diagnostics from the interface layer here, turning my attention to making errors actionable for developers and their users.</p><p><em>[We now jump to the end of the chapter, skipping sections Raise Programmable Errors, Raise Specific Errors, Group Errors According to Scenario Category and Keep Information Around for Diagnostics]</em></p><h2>Diagnose Early</h2><p>Giving early diagnostics is often called <em>shifting left </em>and has numerous benefits for the system and for users.</p><p><em>Tip: Shift left. Give diagnostics to your users as early as you can.</em></p><p>For the system, it reduces resource usage by cutting off useless code paths. This can be critical, for example to fend off denial-of-service attacks. It also protects that same code from processing unpredicted inputs, preventing bugs like data loss.</p><p>Users benefit even more. Erroring early saves them time&#8212;think about how much time you save getting an error in your IDE rather than when deploying to production. Also, users are more likely to remember what they did when they get quick feedback, and to be more certain of the right action.</p><p>Here are four common techniques for shifting left:</p><ul><li><p>Do static validations</p></li><li><p>Validate upfront</p></li><li><p>Let them test</p></li><li><p>Request user confirmations</p></li></ul><p>Engineers widely practice the first two, but unfortunately not the last two. I came here to evangelize them all.</p><h3>Do Static Validations</h3><p>When validating any input, static validations can be performed cheaply and without deep inspection or network calls, while dynamic validations require more work or context.</p><p><em>Tip: Separate your cheap checks from your expensive ones and do the cheap ones early and often.</em></p><p>Many programmers are familiar with the pleasures of static typechecks and linters, but this comes up in products, too.</p><p>For example, when taking user input in application forms, look for cheap ways to tackle the users&#8217; most common mistakes early, and provide inline advice telling them what needs to be corrected. Postal codes can be verified to be of the right length for their countries. Credit card numbers, UPC codes, and ISBN numbers have built-in checksum digits that help protect against common errors like typos and transpositions. These techniques shift left and also provide more certainty to diagnoses. If the checksum fails on a number, we know it&#8217;s not just missing from our database&#8212;it&#8217;s just flat wrong.</p><h3>Validate Upfront</h3><p>When I talked about crafting errors at the surface of an application or API, upfront validations provided a tool for more actionable and understandable error messages. But validations are also a tool for shifting left.</p><p>Imagine you went to the laundromat to wash your clothes, and you washed them, only to discover that only one dryer was online and it was booked for hours. A sign on the door would have saved you from a lot of wet, moldy clothes!</p><p>Similarly, when moving money, it&#8217;s essential to validate that the destination account is valid before withdrawing it from the source account.</p><p>Multistep workflows like laundry, money movement, and money laundering often benefit from upfront validation.</p><h3>Let Them Test</h3><p>If there&#8217;s one set of user scenarios I see most often neglected by platform engineers, it&#8217;s testing. They think of customers successfully using their production product without considering the trials their customers go through to get there.</p><p>If you&#8217;re building a developer service, your customers will adore you&#8212;and you&#8217;ll get adopted faster&#8212;if you build a <em>fake</em>. Fakes are high-fidelity versions of production systems that share as much code with the production path as possible, while taking certain shortcuts to avoid flaky runtime dependencies such as databases and online services that would make tests slower and less reliable.</p><p>Channelz should build a fake service for their messaging API. It would ideally:</p><ul><li><p>Run in-memory or in a lightweight local process so that it can be tested by its users in their test environments and locally on their development machines</p></li><li><p>Allow users to input a bunch of users and channels so that they can then test various pieces of code that use the API</p></li><li><p>Act just like the production service for as many scenarios as possible</p></li></ul><p>For a real-world example, Stripe, a provider of payment and billing APIs and UIs, provides a popular &#8220;test mode&#8221; in which one can do realistic transactions without actually moving money around. For example, customers can pass in special credit card numbers to induce various Invalid User Argument and Precondition errors. The card number 4000 0000 0000 9995, for example, simulates a card_declined error with an insufficient_funds subcode.</p><p>Stripe users spend far more time with test mode than with production, leveraging it when writing integration tests and testing user interfaces. For example, if a merchant wants to test their credit card input form, they can plug those magic numbers in manually and see how the site behaves.</p><p>Fakes are great ways to shift errors <em>far </em>to the left&#8212;to before developers even get properly authenticated or submit a production request.</p><h2>Request User Confirmations</h2><p>Confirmations are roadblocks in your app or platform that help users verify whether they have done the right thing. They are louder than warnings but not as intrusive as errors.</p><p>They frequently appear in user interfaces and developer tools when heuristics detect something odd about the user&#8217;s input. They explain why it might be unexpected or dangerous, and provide the opportunity to correct it or confirm it.</p><p>Google&#8217;s &#8220;Did you mean&#8221; is a fine example. When a user searched for &#8220;compture,&#8221; maybe they really were referring to Compture, the band. So, Google can&#8217;t just return an error, but they can report their suspicion to the user upfront rather than relying on them to figure it out after digging through search results.</p><p>Or instead, when you have just asked a user to fill out several pages of forms, show them a summary of what they&#8217;re about to submit so they can check for errors.</p><p>Confirmations allow you to shift left at times when you can&#8217;t be certain that the user is wrong without running the input through the whole system, but you can take your best guess.</p><p>One common method to allow upfront testing is with a &#8220;dry run&#8221; followed by a confirmation. In a stock-trading app, this is as simple as multiplying the number of shares someone plans to purchase by the current share price to show users how much they will spend.</p><p>Here&#8217;s a more complex dry run at Channelz. Suppose Elise wants to add retry policies to her API, designed to be used like so:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!z4Tx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ae471-b1fe-43e3-b25a-86cbf99049f1_1534x272.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!z4Tx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ae471-b1fe-43e3-b25a-86cbf99049f1_1534x272.png 424w, https://substackcdn.com/image/fetch/$s_!z4Tx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ae471-b1fe-43e3-b25a-86cbf99049f1_1534x272.png 848w, https://substackcdn.com/image/fetch/$s_!z4Tx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ae471-b1fe-43e3-b25a-86cbf99049f1_1534x272.png 1272w, https://substackcdn.com/image/fetch/$s_!z4Tx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ae471-b1fe-43e3-b25a-86cbf99049f1_1534x272.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!z4Tx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ae471-b1fe-43e3-b25a-86cbf99049f1_1534x272.png" width="1456" height="258" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b92ae471-b1fe-43e3-b25a-86cbf99049f1_1534x272.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:258,&quot;width&quot;:1456,&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_!z4Tx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ae471-b1fe-43e3-b25a-86cbf99049f1_1534x272.png 424w, https://substackcdn.com/image/fetch/$s_!z4Tx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ae471-b1fe-43e3-b25a-86cbf99049f1_1534x272.png 848w, https://substackcdn.com/image/fetch/$s_!z4Tx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ae471-b1fe-43e3-b25a-86cbf99049f1_1534x272.png 1272w, https://substackcdn.com/image/fetch/$s_!z4Tx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ae471-b1fe-43e3-b25a-86cbf99049f1_1534x272.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>What happens if ChickenLittle authors a really spammy retry policy that retries once a second, forever? This could cause an accidental Denial-of-Service (DoS) style attack on Channelz, which would surely result in ChickenLittle&#8217;s traffic being throttled.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4kie!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf48a11f-202f-40f6-8068-c06f53281485_1554x110.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4kie!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf48a11f-202f-40f6-8068-c06f53281485_1554x110.png 424w, https://substackcdn.com/image/fetch/$s_!4kie!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf48a11f-202f-40f6-8068-c06f53281485_1554x110.png 848w, https://substackcdn.com/image/fetch/$s_!4kie!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf48a11f-202f-40f6-8068-c06f53281485_1554x110.png 1272w, https://substackcdn.com/image/fetch/$s_!4kie!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf48a11f-202f-40f6-8068-c06f53281485_1554x110.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4kie!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf48a11f-202f-40f6-8068-c06f53281485_1554x110.png" width="1456" height="103" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cf48a11f-202f-40f6-8068-c06f53281485_1554x110.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:103,&quot;width&quot;:1456,&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_!4kie!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf48a11f-202f-40f6-8068-c06f53281485_1554x110.png 424w, https://substackcdn.com/image/fetch/$s_!4kie!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf48a11f-202f-40f6-8068-c06f53281485_1554x110.png 848w, https://substackcdn.com/image/fetch/$s_!4kie!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf48a11f-202f-40f6-8068-c06f53281485_1554x110.png 1272w, https://substackcdn.com/image/fetch/$s_!4kie!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf48a11f-202f-40f6-8068-c06f53281485_1554x110.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Elise could shift left with a heuristic-driven warning by simulating the retry policy and flagging bad behavior:</p><blockquote><p>Your retry_policy (currently initial_interval_seconds=1, backoff_coeffi cient=1.0, max_attempts=Infinite) will result in 601 attempts in 600 seconds. This exceeds our limit of 50. You may ignore this by adding .ignore(Errors::RetryPolicySpamminess) to your policy.</p></blockquote><p>Elise is not perfectly confident in her exact heuristic, but she can move fast and help her users out by providing this sort of confirmation that stops development temporarily. If her heuristic is off, users will complain, and she can adjust it upward.</p><p>In developer tools, --force flags override confirmations.</p><p>Confirmations aren&#8217;t foolproof&#8212;users might blithely confirm or copy/paste a -- force flag. So don&#8217;t use them for inputs you really can&#8217;t accept. That said, most developers I know are accustomed to absolutes&#8212;either the input is allowable, or it&#8217;s not. You&#8217;ll find that thinking about a middle case&#8212;the input is <em>probably </em>wrong&#8212;unlocks an incredible amount of richness and expressiveness in your interfaces.</p><p>In this section, we discussed the merits of shifting left and captured some of the many user scenarios that would benefit from the practice.</p><p>Since shifting left sometimes means we can&#8217;t perform a full, perfect validation, I explored techniques such as service fakes, heuristic-based confirmations, and static validations like checksums to address the most common user mistakes as early as possible.</p><p>Chapter Summary&#9;&#9;&#9;&#9;</p><p>As you think about writing your next few diagnostics, start by shifting your focus to your users&#8217; experience and consider what they know, what they need to know, and what they should do. If you&#8217;re writing an error, bucket it into its scenario category&#8212; System, User&#8217;s Invalid Argument, Precondition, Developer&#8217;s Invalid Argument, or Assertion. This will help you to reason about constructing the metadata and message.</p><p>In your messages:</p><ul><li><p>Give context. In most cases, echo back the operation being done and the bad data that was passed in.</p></li><li><p>Use concepts from the product&#8217;s user-facing ontology.</p></li><li><p>Suggest actions, and be willing to suggest alternatives if there&#8217;s not just one.</p></li></ul><p>You&#8217;ll be more likely to do a good job of all of this if you raise the error to show the user from the interface boundary. For developers, include enough context and structure with your error so that other developers can do their jobs. Organize your errors into hierarchies to provide developers with both generic and specific ways to serve their users.<br> &#9;&#9;&#9;&#9;&#9;&#9;&#9;<br>Finally, find creative ways to shift left for common or important scenarios, such as via techniques like confirmations, static checks, and fakes.</p><h2>Exercises</h2><ol><li><p>Search the web for &#8220;Windows Blue Screen of Death Evolution&#8221; and watch as a few decades of Windows teams struggle to improve their error messages. (a) Decide which personas its messages are tackling. (b) Later in the video, you&#8217;ll see the Windows 11 screen. Analyze its message for the personas you picked.</p></li><li><p>For the next questions, pretend that you work on an e-commerce app. Users can fill their shopping cart and check out. The app finalizes orders via a submit_order API with the following fields: user ID, shopping cart ID, and credit card CVV code&#8212;the three- or four-digit code to verify a credit card. Your mobile client has the ability to do static verifications before sending up data to your API.<br><br>What error scenario category are invalid user ID and invalid shopping cart ID?</p></li><li><p>What error scenario category is an invalid CVV code?</p></li><li><p>What about an empty CVV code?</p></li><li><p>Write an actionable end-user-facing error message for a missing CVV code.</p></li><li><p>Shopping carts can expire and are automatically deleted from the system after 24 hours. What scenario category of error is raised when the user tries to resume their session by adding to a deleted cart?</p></li><li><p>Can you think of a way to shift this expired shopping cart error left so that the user doesn&#8217;t need to re-find each item?</p></li></ol><h2>Takeaways</h2><p><em>That concludes the excerpt</em></p><p>Many thanks to Drew and O&#8217;Reilly for sharing this extract from the new book. I very much recommend it if you&#8217;re interested in strengthening your &#8220;product muscle&#8221; as a software engineer, and it comes with lots of actionable examples. You can <a href="http://drewhoskins.substack.com">subscribe to Drew&#8217;s Substack</a>, follow him <a href="https://www.linkedin.com/in/drewhoskins2/">on LinkedIn</a>, and read more about <a href="https://drewhoskins.substack.com/p/my-software-engineering-cheat-code">his personal journey to becoming a product-minded engineer</a>. Drew is also a speaker at the upcoming <a href="https://www.pragmaticsummit.com/">The Pragmatic Summit</a>.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.oreilly.com/library/view/the-product-minded-engineer/9781098173722/&quot;,&quot;text&quot;:&quot;Buy The Product-Minded Engineer&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.oreilly.com/library/view/the-product-minded-engineer/9781098173722/"><span>Buy The Product-Minded Engineer</span></a></p><p>(or get it <a href="https://www.amazon.com/Product-Minded-Engineer-Building-Impactful-Software/dp/1098173732">on Amazon</a>)</p><p>What I really appreciate about the excerpt is that Drew goes into detail about the significance of those parts of a product which devs rarely think of, such as simple things like error messages. With well-crafted errors/warnings, you can reduce confusion, improve a product&#8217;s usability, and improve &#8220;stickiness&#8221; (i.e., when users &#8220;stick around&#8221; with a product despite it having issues).</p><p>My sense is that being a product-minded engineer is more than a simple checklist of skills, but I appreciate that Drew breaks down the important areas to focus on, like using your own product, collecting customer feedback, understanding users, understanding the product better, its architecture, and more.</p><p>I&#8217;m unsure to what extent 20+ years of lived experience can be captured in a single volume, but Drew makes a superb effort at doing so. In your own workplace, if there are standout product-minded engineers &#8211; or developer-minded product managers &#8211; from whom you can learn tips and tricks, then this book may seem familiar. For the rest of us, <em>&#8220;The Product-Minded Engineer&#8221;</em> is a great introduction to becoming a product-minded software engineer at a time when demand for this role is rising alongside the rapid growth of AI in our dev workflows. <br> &#9;&#9;&#9;&#9;&#9;</p>]]></content:encoded></item><item><title><![CDATA[Design Systems for Software Engineers]]></title><description><![CDATA[A comprehensive guide to design system engineering (DSE): when it&#8217;s relevant, how AI changes things, and pointers for getting started. From Michael Abernethy, Principal Frontend Engineer at Rubrik]]></description><link>https://newsletter.pragmaticengineer.com/p/design-systems-for-software-engineers</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/design-systems-for-software-engineers</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 13 Jan 2026 17:46:25 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7c18204f-9aa1-4c08-aa3b-89f94b0c4826_1240x790.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Before we start: the agenda of <strong><a href="https://www.pragmaticsummit.com/">The Pragmatic Summit</a></strong> is final. Here&#8217;s what to expect on 11 February, in San Francisco:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W9Vd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3389b4-8d80-45b4-9835-41fc8c89b8c0_1334x1666.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W9Vd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3389b4-8d80-45b4-9835-41fc8c89b8c0_1334x1666.png 424w, https://substackcdn.com/image/fetch/$s_!W9Vd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3389b4-8d80-45b4-9835-41fc8c89b8c0_1334x1666.png 848w, https://substackcdn.com/image/fetch/$s_!W9Vd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3389b4-8d80-45b4-9835-41fc8c89b8c0_1334x1666.png 1272w, https://substackcdn.com/image/fetch/$s_!W9Vd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3389b4-8d80-45b4-9835-41fc8c89b8c0_1334x1666.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W9Vd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3389b4-8d80-45b4-9835-41fc8c89b8c0_1334x1666.png" width="1334" height="1666" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef3389b4-8d80-45b4-9835-41fc8c89b8c0_1334x1666.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1666,&quot;width&quot;:1334,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:331278,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.pragmaticengineer.com/i/184309277?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3389b4-8d80-45b4-9835-41fc8c89b8c0_1334x1666.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!W9Vd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3389b4-8d80-45b4-9835-41fc8c89b8c0_1334x1666.png 424w, https://substackcdn.com/image/fetch/$s_!W9Vd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3389b4-8d80-45b4-9835-41fc8c89b8c0_1334x1666.png 848w, https://substackcdn.com/image/fetch/$s_!W9Vd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3389b4-8d80-45b4-9835-41fc8c89b8c0_1334x1666.png 1272w, https://substackcdn.com/image/fetch/$s_!W9Vd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3389b4-8d80-45b4-9835-41fc8c89b8c0_1334x1666.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>Speakers might be familiar from the podcast &#8212; and this is a rare opportunity to meet them in-person. We&#8217;ll have <a href="https://newsletter.pragmaticengineer.com/p/measuring-the-impact-of-ai-on-software">Laura Tacho</a>, <a href="https://newsletter.pragmaticengineer.com/p/ai-tools-for-software-engineers-simon-willison">Simon Willison,</a> <a href="https://newsletter.pragmaticengineer.com/p/ai-engineering-with-chip-huyen">Chip Huyen</a>, <a href="https://newsletter.pragmaticengineer.com/p/tdd-ai-agents-and-coding-with-kent">Kent Beck</a>, <a href="https://newsletter.pragmaticengineer.com/p/martin-fowler">Martin Fowler</a>, <a href="https://newsletter.pragmaticengineer.com/p/developer-productivity-with-dr-nicole">Nicole Forsgren</a>, <a href="https://newsletter.pragmaticengineer.com/p/github">Thomas Dohmke</a> and others join. Engineering leaders from the top AI companies and startups will talk about how exactly they build &#8212; folks from Cursor, Codex, Linear, Ramp, Vercel and Uber, and more. And in a fun crossover, <a href="https://www.linkedin.com/in/alexxubyte/">Alex</a> and <a href="https://www.linkedin.com/in/sahnlam/">Sahn</a> from ByteByteGo will also take the stage.</p><p>The exact agenda:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TH_m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb4a9124-4095-4daa-a631-ec1b9d2ac3a2_1280x936.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TH_m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb4a9124-4095-4daa-a631-ec1b9d2ac3a2_1280x936.jpeg 424w, https://substackcdn.com/image/fetch/$s_!TH_m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb4a9124-4095-4daa-a631-ec1b9d2ac3a2_1280x936.jpeg 848w, https://substackcdn.com/image/fetch/$s_!TH_m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb4a9124-4095-4daa-a631-ec1b9d2ac3a2_1280x936.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!TH_m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb4a9124-4095-4daa-a631-ec1b9d2ac3a2_1280x936.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TH_m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb4a9124-4095-4daa-a631-ec1b9d2ac3a2_1280x936.jpeg" width="1280" height="936" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eb4a9124-4095-4daa-a631-ec1b9d2ac3a2_1280x936.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:936,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:843514,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.pragmaticengineer.com/i/184309277?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb4a9124-4095-4daa-a631-ec1b9d2ac3a2_1280x936.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_!TH_m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb4a9124-4095-4daa-a631-ec1b9d2ac3a2_1280x936.jpeg 424w, https://substackcdn.com/image/fetch/$s_!TH_m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb4a9124-4095-4daa-a631-ec1b9d2ac3a2_1280x936.jpeg 848w, https://substackcdn.com/image/fetch/$s_!TH_m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb4a9124-4095-4daa-a631-ec1b9d2ac3a2_1280x936.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!TH_m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb4a9124-4095-4daa-a631-ec1b9d2ac3a2_1280x936.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We already have 250 confirmed attendees &#8212; experienced engineering leaders and experienced engineers &#8212; and just 150 seats left. We also have more delightful surprises planned for the event, and on the day &#8212; those who attend will learn of these. If you are thinking of joining, <strong><a href="https://www.pragmaticsummit.com/">apply now</a></strong>, while there is still space.</p><p>If you want to meet in-person, meet folks who have been on the podcast or in the deepdives, and connect with an incredible group at the event: this is the event to do it at.</p><p><em>Talks will be recorded and shared with paid newsletter subscribers in a timely matter &#8212; and they will be published in batches for all newsletter subscribers later on as well.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pragmaticsummit.com/&quot;,&quot;text&quot;:&quot;Apply to join the Summit&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pragmaticsummit.com/"><span>Apply to join the Summit</span></a></p><div><hr></div><p>At some point in the lifespan of a successful product, a member of the team decides it has become too messy, and that what it needs is some kind of system/UX library/UI organization, since what used to be creative, clever UI approaches have become chaotic. At this point, the idea of a reusable components library often starts being seen as a solution.</p><p>This usually happens long after the product has found its product-market-fit and while it&#8217;s growing in usage, with 10+ designers and frontend engineers working on it. I&#8217;ve seen this scenario play out several times: at Skype, Skyscanner, and at Uber, where the outcome was the <a href="https://base.uber.com/6d2425e9f/p/294ab4-base-design-system">Base Design System</a>, which was shared externally.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xa9j!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17699490-6f7c-49fb-82c0-df176581d8cb_1600x982.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xa9j!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17699490-6f7c-49fb-82c0-df176581d8cb_1600x982.png 424w, https://substackcdn.com/image/fetch/$s_!xa9j!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17699490-6f7c-49fb-82c0-df176581d8cb_1600x982.png 848w, https://substackcdn.com/image/fetch/$s_!xa9j!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17699490-6f7c-49fb-82c0-df176581d8cb_1600x982.png 1272w, https://substackcdn.com/image/fetch/$s_!xa9j!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17699490-6f7c-49fb-82c0-df176581d8cb_1600x982.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xa9j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17699490-6f7c-49fb-82c0-df176581d8cb_1600x982.png" width="1456" height="894" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/17699490-6f7c-49fb-82c0-df176581d8cb_1600x982.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:894,&quot;width&quot;:1456,&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_!xa9j!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17699490-6f7c-49fb-82c0-df176581d8cb_1600x982.png 424w, https://substackcdn.com/image/fetch/$s_!xa9j!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17699490-6f7c-49fb-82c0-df176581d8cb_1600x982.png 848w, https://substackcdn.com/image/fetch/$s_!xa9j!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17699490-6f7c-49fb-82c0-df176581d8cb_1600x982.png 1272w, https://substackcdn.com/image/fetch/$s_!xa9j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17699490-6f7c-49fb-82c0-df176581d8cb_1600x982.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>Uber&#8217;s <a href="https://base.uber.com/6d2425e9f/p/758d25-faqs">Base Design System</a></em></figcaption></figure></div><p><strong>But how is a design system like this created, and what are practical tips for doing so? </strong>To find out, I turned to an expert on the topic, <a href="https://www.linkedin.com/in/m-abernethy/">Michael Abernethy</a>, who&#8217;s principal frontend engineer at the data security company, Rubrik. He&#8217;s worked on user interfaces and design systems for 25+ years, and has led Rubrik&#8217;s design system engineering team for the past four.</p><p>Today, we cover:</p><ol><li><p><strong>Wake-up call. </strong>Feedback from the CTO kicked off efforts to make the UI look more professional at Rubrik.</p></li><li><p><strong>What&#8217;s a design system? </strong>More than a style guide, it includes standardized building blocks, and becomes a unified source of truth for the design and engineering team.</p></li><li><p><strong>Building a design system. </strong>UX researchers, designers, and design system engineers collaborate. A step-by-step guide on how the team at Rubrik did so.</p></li><li><p><strong>Design system libraries in the AI era. </strong>The new technology can be helpful for many tasks, but generating a consistent design system isn&#8217;t one of them. A look into areas where AI has helped Rubrik&#8217;s design system, plus emerging use cases like using Figma&#8217;s MCP, or running design system subagents.</p></li><li><p><strong>When not to build a design system library. </strong>For startups and smaller teams, using a pre-built design system library like Material UI, Chakra UI, or Base UI can be a great alternative.</p></li><li><p><strong>Investing in a custom design system library. </strong>Advice about good engineering skills and traits for when building a design system, the timelines &#8211; and Big Tech&#8217;s different approach.</p></li><li><p><strong>Getting started and inspiration. </strong>A five-step, practical approach for building your own design system.</p></li></ol><p>At growing tech companies, a design system is almost always put in place, eventually. I hope this is a useful guide about how to contribute to it &#8211; or take the lead &#8211; as an engineer.</p><p><em>With that, it&#8217;s over to Michael:</em></p><h2>1. Wake-up call</h2><p>At Rubrik, our &#8220;design wake-up call&#8221; is still talked about. It was six years ago, when the CTO, Arvind Nithrakashyap, casually remarked during a team meeting that the product looked &#8220;like a college project&#8221;.</p><p>The UI he was talking about was this early version:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3L4f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facac2d74-a3cb-41aa-98bb-f8e29310e8f2_689x376.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3L4f!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facac2d74-a3cb-41aa-98bb-f8e29310e8f2_689x376.png 424w, https://substackcdn.com/image/fetch/$s_!3L4f!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facac2d74-a3cb-41aa-98bb-f8e29310e8f2_689x376.png 848w, https://substackcdn.com/image/fetch/$s_!3L4f!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facac2d74-a3cb-41aa-98bb-f8e29310e8f2_689x376.png 1272w, https://substackcdn.com/image/fetch/$s_!3L4f!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facac2d74-a3cb-41aa-98bb-f8e29310e8f2_689x376.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3L4f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facac2d74-a3cb-41aa-98bb-f8e29310e8f2_689x376.png" width="689" height="376" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/acac2d74-a3cb-41aa-98bb-f8e29310e8f2_689x376.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:376,&quot;width&quot;:689,&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_!3L4f!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facac2d74-a3cb-41aa-98bb-f8e29310e8f2_689x376.png 424w, https://substackcdn.com/image/fetch/$s_!3L4f!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facac2d74-a3cb-41aa-98bb-f8e29310e8f2_689x376.png 848w, https://substackcdn.com/image/fetch/$s_!3L4f!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facac2d74-a3cb-41aa-98bb-f8e29310e8f2_689x376.png 1272w, https://substackcdn.com/image/fetch/$s_!3L4f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facac2d74-a3cb-41aa-98bb-f8e29310e8f2_689x376.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">Rubrik&#8217;s UI in the early days</figcaption></figure></div><p>His observation hit home because it was right! The product&#8217;s user interface did indeed look like it had been thrown together by engineers trying to build features as fast as possible &#8211; because that&#8217;s exactly what happened. This feedback was enough to prompt a UI overhaul that would see us revamp the whole product&#8217;s UI/UX for the better.</p><p>Most engineers will understand the urge to <em>build</em> quickly and ship lots of features in order to hit seemingly-impossible deadlines. Questions about how a product <em>looks</em> often take a back seat behind getting people to <em>use</em> the product. And let&#8217;s be honest, few of us engineers are famous for our artistic sensibilities, so a user interface we deem &#8220;good enough&#8221; during the early MVP stage may not cut it when pitching to potential enterprise customers.</p><p>When we eventually completed this project at Rubrik, we were able to put a &#8220;Version 1.0&#8221; stamp on what we called the &#8220;Aura Design System Library&#8221;. It consists of 90+ React-based components, ranging from simple components (buttons, checkboxes, tabs) to complex components (page layouts or tables connected to GraphQL endpoints). Our work visibly improved the product, which went on to <a href="https://www.red-dot.org/project/rubrik-security-cloud-66740">win awards</a> and <a href="https://ux-design-awards.com/winners/2023-2-rubrik-security-cloud">achieve industry-wide recognition</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RM2s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79ee2d2f-aeb2-49f9-9e22-60356520a0e6_1084x1212.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RM2s!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79ee2d2f-aeb2-49f9-9e22-60356520a0e6_1084x1212.png 424w, https://substackcdn.com/image/fetch/$s_!RM2s!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79ee2d2f-aeb2-49f9-9e22-60356520a0e6_1084x1212.png 848w, https://substackcdn.com/image/fetch/$s_!RM2s!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79ee2d2f-aeb2-49f9-9e22-60356520a0e6_1084x1212.png 1272w, https://substackcdn.com/image/fetch/$s_!RM2s!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79ee2d2f-aeb2-49f9-9e22-60356520a0e6_1084x1212.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RM2s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79ee2d2f-aeb2-49f9-9e22-60356520a0e6_1084x1212.png" width="1084" height="1212" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/79ee2d2f-aeb2-49f9-9e22-60356520a0e6_1084x1212.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1212,&quot;width&quot;:1084,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:555309,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.pragmaticengineer.com/i/184309277?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79ee2d2f-aeb2-49f9-9e22-60356520a0e6_1084x1212.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RM2s!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79ee2d2f-aeb2-49f9-9e22-60356520a0e6_1084x1212.png 424w, https://substackcdn.com/image/fetch/$s_!RM2s!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79ee2d2f-aeb2-49f9-9e22-60356520a0e6_1084x1212.png 848w, https://substackcdn.com/image/fetch/$s_!RM2s!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79ee2d2f-aeb2-49f9-9e22-60356520a0e6_1084x1212.png 1272w, https://substackcdn.com/image/fetch/$s_!RM2s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79ee2d2f-aeb2-49f9-9e22-60356520a0e6_1084x1212.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">Rubrik&#8217;s current interface</figcaption></figure></div><h2>2. What&#8217;s a design system?</h2><p>The best, easiest way to think of a design system is as a brand for your software. It&#8217;s the unifying source of truth for a company&#8217;s or product&#8217;s entire identity across the suite of digital assets. But it&#8217;s also much more than just a logo. It includes:</p><ul><li><p>Rules and guidelines</p></li><li><p>Patterns and visual language</p></li><li><p>Colors, fonts, spacing, and image styles</p></li><li><p>Reusable code components</p></li><li><p>Style guides and documentation that define the design system&#8217;s rules</p></li></ul><p>Basically, it&#8217;s all the small things that go into making a website unique, so that customers instantly recognize the software. Like any strong brand image, a great design system is an incredible asset for a business because it creates an identity for software that&#8217;s as distinctive as Nike&#8217;s swoosh, or an apple with a bite taken out. Take a look at these two screenshots from popular websites:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!de7T!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb003a9c-dc02-4377-9c35-65b12b5ac887_1600x1121.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!de7T!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb003a9c-dc02-4377-9c35-65b12b5ac887_1600x1121.png 424w, https://substackcdn.com/image/fetch/$s_!de7T!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb003a9c-dc02-4377-9c35-65b12b5ac887_1600x1121.png 848w, https://substackcdn.com/image/fetch/$s_!de7T!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb003a9c-dc02-4377-9c35-65b12b5ac887_1600x1121.png 1272w, https://substackcdn.com/image/fetch/$s_!de7T!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb003a9c-dc02-4377-9c35-65b12b5ac887_1600x1121.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!de7T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb003a9c-dc02-4377-9c35-65b12b5ac887_1600x1121.png" width="1456" height="1020" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bb003a9c-dc02-4377-9c35-65b12b5ac887_1600x1121.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1020,&quot;width&quot;:1456,&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_!de7T!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb003a9c-dc02-4377-9c35-65b12b5ac887_1600x1121.png 424w, https://substackcdn.com/image/fetch/$s_!de7T!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb003a9c-dc02-4377-9c35-65b12b5ac887_1600x1121.png 848w, https://substackcdn.com/image/fetch/$s_!de7T!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb003a9c-dc02-4377-9c35-65b12b5ac887_1600x1121.png 1272w, https://substackcdn.com/image/fetch/$s_!de7T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb003a9c-dc02-4377-9c35-65b12b5ac887_1600x1121.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>Can you tell which products these screenshots are from?</em></figcaption></figure></div><p>Without my help, you can probably identify the products in the screenshots above as Airbnb and Spotify. Chances are, you also have opinions about companies when you see their websites. That&#8217;s the power of branding &#8211; and of a great design system.</p><p>A design system is important for users, too. If they become accustomed to what a button or menu looks like in one part of the software, they know what a button or menu looks like in the rest of the application. A UX researcher might say this reduces the cognitive load of using the software.</p><h3>Design system engineering</h3><p>A design system engineering (DSE) team takes the concept of a design system, the branding, and the user benefits, and converts all this into code by building a design system library of reusable components that adhere to the strict standards of the design system. At Rubrik and at most Big Tech companies it works like this:</p><ol><li><p>The design team creates the look and feel of the software in Figma.</p></li><li><p>The DSE team converts that into working React code (or Angular, or iOS, or Android, or the framework they use).</p></li></ol><p><strong>The design system library</strong> is the suite of reusable Frontend components that the DSE team creates. These are then bundled up into a stand-alone, JS/iOS/Android library and used across the entire product line. Using the library ensures a visually cohesive brand identity.</p><h3>Smallest design system: a button</h3><p>Imagine you&#8217;re a member of a Series B startup that&#8217;s just raised $20M in funding, and has found a product-market fit. Business is growing fast, but your UI is inconsistent, so you decide to standardize the design with a library and to improve the UI and UX.</p><p>Soon, you&#8217;re in the kickoff meeting of this effort with a few designers and design system engineers (with their DSE hats on) who are ready to crank out the new components. You start with the most common component of any design system library: the button. Below are some decisions to be made about this seemingly simple component:</p><p><strong>Color. </strong>Which shade of teal is best for users, balancing readability with other colors on the page, and considering every possible background color on which the button could appear?</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5ATl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa66d4209-19cc-4972-8dd4-b9b415c46ac9_540x100.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5ATl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa66d4209-19cc-4972-8dd4-b9b415c46ac9_540x100.png 424w, https://substackcdn.com/image/fetch/$s_!5ATl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa66d4209-19cc-4972-8dd4-b9b415c46ac9_540x100.png 848w, https://substackcdn.com/image/fetch/$s_!5ATl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa66d4209-19cc-4972-8dd4-b9b415c46ac9_540x100.png 1272w, https://substackcdn.com/image/fetch/$s_!5ATl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa66d4209-19cc-4972-8dd4-b9b415c46ac9_540x100.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5ATl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa66d4209-19cc-4972-8dd4-b9b415c46ac9_540x100.png" width="540" height="100" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a66d4209-19cc-4972-8dd4-b9b415c46ac9_540x100.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:100,&quot;width&quot;:540,&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_!5ATl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa66d4209-19cc-4972-8dd4-b9b415c46ac9_540x100.png 424w, https://substackcdn.com/image/fetch/$s_!5ATl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa66d4209-19cc-4972-8dd4-b9b415c46ac9_540x100.png 848w, https://substackcdn.com/image/fetch/$s_!5ATl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa66d4209-19cc-4972-8dd4-b9b415c46ac9_540x100.png 1272w, https://substackcdn.com/image/fetch/$s_!5ATl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa66d4209-19cc-4972-8dd4-b9b415c46ac9_540x100.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"><em>Decision #1: background color</em></figcaption></figure></div><p><strong>Text color. </strong>Which text color makes the button most readable to users on all devices, keeping in mind that not every user visits your software on a $6,000, 6k Pro Display XDR Monitor.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JQRL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b319846-d7aa-4b88-b1a6-1292c3f6864c_540x100.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JQRL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b319846-d7aa-4b88-b1a6-1292c3f6864c_540x100.png 424w, https://substackcdn.com/image/fetch/$s_!JQRL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b319846-d7aa-4b88-b1a6-1292c3f6864c_540x100.png 848w, https://substackcdn.com/image/fetch/$s_!JQRL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b319846-d7aa-4b88-b1a6-1292c3f6864c_540x100.png 1272w, https://substackcdn.com/image/fetch/$s_!JQRL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b319846-d7aa-4b88-b1a6-1292c3f6864c_540x100.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JQRL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b319846-d7aa-4b88-b1a6-1292c3f6864c_540x100.png" width="540" height="100" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7b319846-d7aa-4b88-b1a6-1292c3f6864c_540x100.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:100,&quot;width&quot;:540,&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_!JQRL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b319846-d7aa-4b88-b1a6-1292c3f6864c_540x100.png 424w, https://substackcdn.com/image/fetch/$s_!JQRL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b319846-d7aa-4b88-b1a6-1292c3f6864c_540x100.png 848w, https://substackcdn.com/image/fetch/$s_!JQRL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b319846-d7aa-4b88-b1a6-1292c3f6864c_540x100.png 1272w, https://substackcdn.com/image/fetch/$s_!JQRL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b319846-d7aa-4b88-b1a6-1292c3f6864c_540x100.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Decision #2: text color</figcaption></figure></div><p><strong>Height. </strong>How many pixels tall should the buttons be in order to draw attention without wasting vertical space and messing with page layout?</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mJBD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28801897-1697-423e-815a-a3a465878a77_540x100.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mJBD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28801897-1697-423e-815a-a3a465878a77_540x100.png 424w, https://substackcdn.com/image/fetch/$s_!mJBD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28801897-1697-423e-815a-a3a465878a77_540x100.png 848w, https://substackcdn.com/image/fetch/$s_!mJBD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28801897-1697-423e-815a-a3a465878a77_540x100.png 1272w, https://substackcdn.com/image/fetch/$s_!mJBD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28801897-1697-423e-815a-a3a465878a77_540x100.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mJBD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28801897-1697-423e-815a-a3a465878a77_540x100.png" width="540" height="100" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/28801897-1697-423e-815a-a3a465878a77_540x100.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:100,&quot;width&quot;:540,&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_!mJBD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28801897-1697-423e-815a-a3a465878a77_540x100.png 424w, https://substackcdn.com/image/fetch/$s_!mJBD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28801897-1697-423e-815a-a3a465878a77_540x100.png 848w, https://substackcdn.com/image/fetch/$s_!mJBD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28801897-1697-423e-815a-a3a465878a77_540x100.png 1272w, https://substackcdn.com/image/fetch/$s_!mJBD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28801897-1697-423e-815a-a3a465878a77_540x100.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Decision #3: height</figcaption></figure></div><p><strong>Border radius. </strong>What kind of curves fit best with the design aesthetic of the application?</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!U_4k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F032fd423-dd7e-4e77-ae3e-c0edb29e147f_540x100.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!U_4k!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F032fd423-dd7e-4e77-ae3e-c0edb29e147f_540x100.png 424w, https://substackcdn.com/image/fetch/$s_!U_4k!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F032fd423-dd7e-4e77-ae3e-c0edb29e147f_540x100.png 848w, https://substackcdn.com/image/fetch/$s_!U_4k!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F032fd423-dd7e-4e77-ae3e-c0edb29e147f_540x100.png 1272w, https://substackcdn.com/image/fetch/$s_!U_4k!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F032fd423-dd7e-4e77-ae3e-c0edb29e147f_540x100.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!U_4k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F032fd423-dd7e-4e77-ae3e-c0edb29e147f_540x100.png" width="540" height="100" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/032fd423-dd7e-4e77-ae3e-c0edb29e147f_540x100.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:100,&quot;width&quot;:540,&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_!U_4k!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F032fd423-dd7e-4e77-ae3e-c0edb29e147f_540x100.png 424w, https://substackcdn.com/image/fetch/$s_!U_4k!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F032fd423-dd7e-4e77-ae3e-c0edb29e147f_540x100.png 848w, https://substackcdn.com/image/fetch/$s_!U_4k!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F032fd423-dd7e-4e77-ae3e-c0edb29e147f_540x100.png 1272w, https://substackcdn.com/image/fetch/$s_!U_4k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F032fd423-dd7e-4e77-ae3e-c0edb29e147f_540x100.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Decision #4: border radius</figcaption></figure></div><p><strong>Shadows. </strong>Do you want the design to be flat, or for the buttons to appear to rise off the page to grab attention, implying they can be pressed?</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HjDz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb020efed-7840-463f-99db-53de02f50148_540x100.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HjDz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb020efed-7840-463f-99db-53de02f50148_540x100.png 424w, https://substackcdn.com/image/fetch/$s_!HjDz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb020efed-7840-463f-99db-53de02f50148_540x100.png 848w, https://substackcdn.com/image/fetch/$s_!HjDz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb020efed-7840-463f-99db-53de02f50148_540x100.png 1272w, https://substackcdn.com/image/fetch/$s_!HjDz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb020efed-7840-463f-99db-53de02f50148_540x100.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HjDz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb020efed-7840-463f-99db-53de02f50148_540x100.png" width="540" height="100" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b020efed-7840-463f-99db-53de02f50148_540x100.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:100,&quot;width&quot;:540,&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_!HjDz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb020efed-7840-463f-99db-53de02f50148_540x100.png 424w, https://substackcdn.com/image/fetch/$s_!HjDz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb020efed-7840-463f-99db-53de02f50148_540x100.png 848w, https://substackcdn.com/image/fetch/$s_!HjDz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb020efed-7840-463f-99db-53de02f50148_540x100.png 1272w, https://substackcdn.com/image/fetch/$s_!HjDz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb020efed-7840-463f-99db-53de02f50148_540x100.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Decision #5: shadows</figcaption></figure></div><p><strong>Font. </strong>Which font gives the button a modern, readable look? Should it match the rest of the site, or be slightly different to draw attention?</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ia0d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73018db7-22b4-4b51-b085-9d699099d0f6_540x100.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ia0d!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73018db7-22b4-4b51-b085-9d699099d0f6_540x100.png 424w, https://substackcdn.com/image/fetch/$s_!Ia0d!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73018db7-22b4-4b51-b085-9d699099d0f6_540x100.png 848w, https://substackcdn.com/image/fetch/$s_!Ia0d!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73018db7-22b4-4b51-b085-9d699099d0f6_540x100.png 1272w, https://substackcdn.com/image/fetch/$s_!Ia0d!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73018db7-22b4-4b51-b085-9d699099d0f6_540x100.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ia0d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73018db7-22b4-4b51-b085-9d699099d0f6_540x100.png" width="540" height="100" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/73018db7-22b4-4b51-b085-9d699099d0f6_540x100.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:100,&quot;width&quot;:540,&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_!Ia0d!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73018db7-22b4-4b51-b085-9d699099d0f6_540x100.png 424w, https://substackcdn.com/image/fetch/$s_!Ia0d!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73018db7-22b4-4b51-b085-9d699099d0f6_540x100.png 848w, https://substackcdn.com/image/fetch/$s_!Ia0d!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73018db7-22b4-4b51-b085-9d699099d0f6_540x100.png 1272w, https://substackcdn.com/image/fetch/$s_!Ia0d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73018db7-22b4-4b51-b085-9d699099d0f6_540x100.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Decision #6: font</figcaption></figure></div><p>Answering just these six questions can take considerable time, including multiple back-and-forth discussions. The meeting may typically take an hour, and the bad news is that it will barely scratch the surface of everything that must be agreed. A proper discussion about <em>a button </em>will also include:</p><ul><li><p><strong>Color</strong>: Should there be extra background color options for less important actions?</p></li><li><p><strong>Border</strong>: Should there be a color border, and if so, how thick?</p></li><li><p><strong>Icon</strong>: Should icons in the button be allowed? If so, should they go before or after the text? What spacing should be used between icon and button?</p></li><li><p><strong>Events</strong>: What should the button look like when the keyboard navigates to it? What about when hovering and clicking?</p></li><li><p><strong>Animation</strong>: Should there be an animation when the button&#8217;s hovered over, should there be one when it&#8217;s clicked, and what about when something is loading?</p></li><li><p><strong>States</strong>: What should the button look like when disabled? What about the cursor in the disabled state?</p></li><li><p><strong>Mobile</strong>: Do you need to adjust any design decisions for iOS, Android, or both?</p></li><li><p><strong>Accessibility</strong>: Do you need to adjust any decisions for color blind users?</p></li><li><p><strong>Localization</strong>: Do you need to rethink decisions for different languages, or right-to-left writing systems?</p></li></ul><p>All of these calls need to be made about a button &#8211; which is just one component! A simple design system usually has 15-20 components, and a complex one can have 50-100. Designing a full-fledged design system involves a lot more time and effort than many people realize because all these details add up.</p><h3>Benefits of a design system</h3><p>As mentioned, it&#8217;s a lot of effort to create a design system &#8211; but it brings several wins when complete. From the engineering viewpoint, common benefits are:</p><p><strong>Faster delivery times</strong>. By creating an entire suite of reusable components, engineers eliminate the time and burden of creating the same component over and over on their own. Having a library also removes the need to &#8220;reinvent the wheel&#8221; by recreating new components. With a mature design system library, creating a page in the UI is almost as easy as dragging and dropping components onto the screen and wiring them up.</p><p><strong>Higher quality. </strong>By utilizing skilled frontend/UI engineers to create the design system library, the quality of the entire product suite can be instantly visually upgraded. The UI&#8217;s quality can go from amateur to professional with the work of a few engineers.</p><p><strong>More devs can contribute to the frontend. </strong>In my observation, most full-stack engineers lack expert-level skills in CSS and React. However, a well-written design system library encapsulates the difficult React/CSS/HTML code within the library, and allows full-stack engineers to contribute across the frontend without needing expertise in more niche areas like CSS.</p><p><strong>&#8220;Premium feel&#8221; software.</strong> I have a saying that if you want to charge enterprise prices, your software needs to look like an enterprise product.</p><p>I feel many engineers don&#8217;t internalize the significance of premium interfaces. If your product charges a high price, customers expect a superior UI that goes beyond a simple and basic style. For example, it would be hard to entice an enterprise to pay $1M/year for software that looks like the image below. This site uses a standard, free, off-the-shelf Bootstrap theme with default colors and a font that doesn&#8217;t look good on the page.  It looks the same as thousands of other free websites out there, making it hard for your customers to think &#8220;premium&#8221; when they see it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OHEj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda397ae7-f6e3-4017-a87c-295dc46ce1a2_763x488.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OHEj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda397ae7-f6e3-4017-a87c-295dc46ce1a2_763x488.png 424w, https://substackcdn.com/image/fetch/$s_!OHEj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda397ae7-f6e3-4017-a87c-295dc46ce1a2_763x488.png 848w, https://substackcdn.com/image/fetch/$s_!OHEj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda397ae7-f6e3-4017-a87c-295dc46ce1a2_763x488.png 1272w, https://substackcdn.com/image/fetch/$s_!OHEj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda397ae7-f6e3-4017-a87c-295dc46ce1a2_763x488.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OHEj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda397ae7-f6e3-4017-a87c-295dc46ce1a2_763x488.png" width="763" height="488" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/da397ae7-f6e3-4017-a87c-295dc46ce1a2_763x488.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:488,&quot;width&quot;:763,&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_!OHEj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda397ae7-f6e3-4017-a87c-295dc46ce1a2_763x488.png 424w, https://substackcdn.com/image/fetch/$s_!OHEj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda397ae7-f6e3-4017-a87c-295dc46ce1a2_763x488.png 848w, https://substackcdn.com/image/fetch/$s_!OHEj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda397ae7-f6e3-4017-a87c-295dc46ce1a2_763x488.png 1272w, https://substackcdn.com/image/fetch/$s_!OHEj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda397ae7-f6e3-4017-a87c-295dc46ce1a2_763x488.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">Hard sell: A UI that doesn&#8217;t look like a premium product</figcaption></figure></div><p><strong>Better collaboration across teams. </strong>With a shared library and design, engineering and product management can &#8220;speak the same language&#8221;, so that when a designer references a component called a &#8220;StatBox,&#8221; everyone understands what it means, for example. Even better, a tool like Figma allows design and engineering to virtually share code between teams.<br><br><strong>Cost savings. </strong>Time is money, and a system like this makes engineers more productive because they deliver features faster, and the company can increase revenue quicker. That&#8217;s the theory, at least!</p><h2>3. Building a design system</h2><p>We&#8217;ll use an actual component to go through the steps of building a design system: the Range Bar component in Rubrik.</p><h3>UX research</h3><p>User experience (UX) folks are usually members of the design team who meet customers and talk through problems in simple terms, seeking feedback about usability, ease-of-use, and desired functionality.</p><p>During this research, one theme might be that users dislike having to type numbers to specify a minimum and maximum storage capacity. They&#8217;d prefer an easier way to use the component in the UI.</p><p>The UX team gathers this feedback and puts together the component requirements:</p><ul><li><p>A visual way to see min/max without typing</p></li><li><p>A way to remove the burden of calculating standard storage sizes (i.e: powers of 2)</p></li><li><p>A simple way to navigate with a few clicks.</p></li></ul><p>Here&#8217;s a rough sketch of the component they create:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Gj9T!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dad2f7d-017d-4664-82e7-d2828cd2dffd_609x267.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Gj9T!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dad2f7d-017d-4664-82e7-d2828cd2dffd_609x267.png 424w, https://substackcdn.com/image/fetch/$s_!Gj9T!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dad2f7d-017d-4664-82e7-d2828cd2dffd_609x267.png 848w, https://substackcdn.com/image/fetch/$s_!Gj9T!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dad2f7d-017d-4664-82e7-d2828cd2dffd_609x267.png 1272w, https://substackcdn.com/image/fetch/$s_!Gj9T!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dad2f7d-017d-4664-82e7-d2828cd2dffd_609x267.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Gj9T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dad2f7d-017d-4664-82e7-d2828cd2dffd_609x267.png" width="609" height="267" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3dad2f7d-017d-4664-82e7-d2828cd2dffd_609x267.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:267,&quot;width&quot;:609,&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_!Gj9T!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dad2f7d-017d-4664-82e7-d2828cd2dffd_609x267.png 424w, https://substackcdn.com/image/fetch/$s_!Gj9T!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dad2f7d-017d-4664-82e7-d2828cd2dffd_609x267.png 848w, https://substackcdn.com/image/fetch/$s_!Gj9T!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dad2f7d-017d-4664-82e7-d2828cd2dffd_609x267.png 1272w, https://substackcdn.com/image/fetch/$s_!Gj9T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dad2f7d-017d-4664-82e7-d2828cd2dffd_609x267.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">Rough sketch of a new component: the range bar</figcaption></figure></div><h3>The designer</h3><p>The design system team takes it from here. They receive the written details and rough sketch from UX and then create a visual guide for how it should look and behave across the application.</p><p><strong>Figma</strong> is the tool of choice for almost every design team, and it&#8217;s the same at Rubrik. A designer creates the component, and realizes the best solution would be to expand the functionality of the existing Slider component by adding a &#8220;start&#8221; and &#8220;stop&#8221; thumb to the component, and automatically snapping it to a power of 2:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Qh8j!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc426f55-5b45-4f33-8652-325a1b525ee3_363x140.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Qh8j!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc426f55-5b45-4f33-8652-325a1b525ee3_363x140.png 424w, https://substackcdn.com/image/fetch/$s_!Qh8j!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc426f55-5b45-4f33-8652-325a1b525ee3_363x140.png 848w, https://substackcdn.com/image/fetch/$s_!Qh8j!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc426f55-5b45-4f33-8652-325a1b525ee3_363x140.png 1272w, https://substackcdn.com/image/fetch/$s_!Qh8j!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc426f55-5b45-4f33-8652-325a1b525ee3_363x140.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Qh8j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc426f55-5b45-4f33-8652-325a1b525ee3_363x140.png" width="363" height="140" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bc426f55-5b45-4f33-8652-325a1b525ee3_363x140.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:140,&quot;width&quot;:363,&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_!Qh8j!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc426f55-5b45-4f33-8652-325a1b525ee3_363x140.png 424w, https://substackcdn.com/image/fetch/$s_!Qh8j!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc426f55-5b45-4f33-8652-325a1b525ee3_363x140.png 848w, https://substackcdn.com/image/fetch/$s_!Qh8j!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc426f55-5b45-4f33-8652-325a1b525ee3_363x140.png 1272w, https://substackcdn.com/image/fetch/$s_!Qh8j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc426f55-5b45-4f33-8652-325a1b525ee3_363x140.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Expanding the existing Slider component with &#8220;start&#8221; and &#8220;stop&#8221; thumbs</figcaption></figure></div><p>The designer also decides to include the ability to type in the minimum and maximum numbers, and to round up the numbers when the field is blurred. When the Figma design is complete, they pass it to the DSE team to turn into code.</p><h3>Design system engineer</h3><p>The design system engineer receives the Figma file and examines it from an engineering perspective, asking questions like:</p><ul><li><p><strong>Implementation constraints. </strong>Has the designer used designs that are impossible to implement in CSS, such as alpha-blended non-rectangular shapes, or gradients in places that aren&#8217;t supported?</p></li><li><p><strong>Scalability.</strong> Has the designer used interactions that don&#8217;t scale well, like interactions or animations that trigger too many re-renders?</p></li><li><p><strong>Performance</strong>. Has the designer created the potential for performance degradation; e.g., dozens of shadows in a moving element?</p></li><li><p><strong>Edge cases.</strong> Has the designer considered edge cases like whether the user can set the min and max to be the same value, and considered error states such as how an invalid input should be displayed to users? Have they considered responsiveness (i.e: does it look good on both small and ultra-wide screens)?</p></li></ul><ul><li><p><strong>Accessibility</strong>. How does it display keyboard focus, and how does a customer use the component without a mouse?</p></li><li><p><strong>Localization. </strong>Does the design work in languages with many long words, and what about right-to-left writing systems?</p></li></ul><p>Design system engineers and designers work closely to iron out these details, and once they&#8217;re sorted, the engineer starts coding.</p><p><strong>Coding typically starts in Figma&#8217;s Dev Mode.</strong> This is a simplified view tailored for cases where engineers want to implement Figma designs. They can see key information about the design in one place, like the sizing of the component, spacing, etc. There&#8217;s even the option to copy/paste the CSS from Figma and insert it directly into the code.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QY72!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94ce38a-dbb6-46ca-bacf-6564fb2e9ebf_998x1268.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QY72!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94ce38a-dbb6-46ca-bacf-6564fb2e9ebf_998x1268.png 424w, https://substackcdn.com/image/fetch/$s_!QY72!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94ce38a-dbb6-46ca-bacf-6564fb2e9ebf_998x1268.png 848w, https://substackcdn.com/image/fetch/$s_!QY72!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94ce38a-dbb6-46ca-bacf-6564fb2e9ebf_998x1268.png 1272w, https://substackcdn.com/image/fetch/$s_!QY72!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94ce38a-dbb6-46ca-bacf-6564fb2e9ebf_998x1268.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QY72!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94ce38a-dbb6-46ca-bacf-6564fb2e9ebf_998x1268.png" width="998" height="1268" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a94ce38a-dbb6-46ca-bacf-6564fb2e9ebf_998x1268.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1268,&quot;width&quot;:998,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:209250,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.pragmaticengineer.com/i/184309277?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94ce38a-dbb6-46ca-bacf-6564fb2e9ebf_998x1268.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QY72!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94ce38a-dbb6-46ca-bacf-6564fb2e9ebf_998x1268.png 424w, https://substackcdn.com/image/fetch/$s_!QY72!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94ce38a-dbb6-46ca-bacf-6564fb2e9ebf_998x1268.png 848w, https://substackcdn.com/image/fetch/$s_!QY72!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94ce38a-dbb6-46ca-bacf-6564fb2e9ebf_998x1268.png 1272w, https://substackcdn.com/image/fetch/$s_!QY72!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94ce38a-dbb6-46ca-bacf-6564fb2e9ebf_998x1268.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">Figma&#8217;s Dev Mode shows key details needed to turn a component into HTML and CSS</figcaption></figure></div><h3>Coding</h3><p>Below are key things to consider when beginning to put together the code of the component:</p><ul><li><p><strong>Naming.</strong> A good name is one that&#8217;s agreed by design and engineering, so that both use the same terms. Good naming also helps the Figma MCP (Model Context Protocol) work better. For example, for this component, &#8220;RangeSlider&#8221; feels more suitable than MinMaxStorageSlider. It&#8217;s more expressive and doesn&#8217;t expose implementation details that might change later.</p></li><li><p><strong>API. </strong>For React components, the API means setting the <a href="https://react.dev/learn/passing-props-to-a-component">prop names</a> to be descriptive and consistent with prop names in the rest of the design system library.</p></li><li><p><strong>Future usage. </strong>The engineer should think about how this component will be used in the future, and support likely use cases. For example, should the RangeSlider allow the option to make the min or max ranges unchangeable? That decision could change how the component is coded in React.</p></li></ul><p>Coding a high-quality component comes with plenty of nuance, which is why it helps to have experienced engineers build them. Below are some small details that are important to get right:</p><ul><li><p><strong>Performance</strong>: Will the component stay performant if the user slides the RangeSlider&#8217;s thumb up and down quickly? Do the events need to be <a href="https://www.developerway.com/posts/debouncing-in-react">debounced</a>?</p></li><li><p><strong>Theming</strong>: How will the component look in a different theme? Rubrik has three themes for its product, and components need to look good in them all.</p></li><li><p><strong>Accessibility</strong>: For example, how is the component used without a mouse? For a component like a RangeSlider, accessibility can be quite complex. In Rubrik&#8217;s case, we decided to add support to control the component with the four arrow keys (left/right control the minimum, up/down control the maximum).</p></li></ul><p>There are three less-discussed areas which become increasingly important to a well-built modern design system library.</p><p><strong>Analytics</strong>: Often an afterthought, but perhaps shouldn&#8217;t be! At Rubrik, we recently faced a dilemma where we wanted to massively increase our analytics usage, and started to log pretty much everything. The challenge was that there were already 1,200 different pages in the application! Adding analytics to each didn&#8217;t make sense.</p><p>Instead, we added analytic tracking code into our design system library&#8217;s components. For example, when a button is pressed, it (abstractly) sends a tracking event to our analytics platform. As design system engineers, we went through each component and added analytics depending on how users could interact with it.</p><p>With this approach, we started to log around X4 more events, which were all relevant for analyzing our application&#8217;s usage. The best part was that devs didn&#8217;t need to add a single line of code to get more granular analytics &#8211; they just needed to use components from our design system library!</p><p><strong>Async awareness: </strong>React&#8217;s v18 and v19 have introduced and expanded the notion of &#8220;async React,&#8221; which aims to improve user experience and the code&#8217;s performance by processing less important rendering in the background, and prioritizing certain renders. For example, an input box that&#8217;s being typed in should prioritize displaying the key typed, but can defer the display of an error state if a key press triggers a validation error.</p><p>At Rubrik, we&#8217;ve started re-coding our interactive components to use the Async React approach. These kinds of optimizations in the design system library can make an application feel snappier and quicker and also reduce the chance of another engineer introducing lag into the UI.</p><p><strong>Loading states: </strong>Modern UI like React Server Components rely on loading data in the background as the page renders. As a result, displaying loading states becomes more critical, as a component may be rendered immediately even if the data it displays isn&#8217;t available yet.</p><p>At Rubrik, we&#8217;ve re-coded our components that display information to handle loading states. This allows devs using each component to pass in a &#8220;loading&#8221; property and ensure the application keeps a consistent look, even when data isn&#8217;t present.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1qLM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1390a129-d9f1-44fb-89d4-8a2aed32c5e1_280x114.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1qLM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1390a129-d9f1-44fb-89d4-8a2aed32c5e1_280x114.png 424w, https://substackcdn.com/image/fetch/$s_!1qLM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1390a129-d9f1-44fb-89d4-8a2aed32c5e1_280x114.png 848w, https://substackcdn.com/image/fetch/$s_!1qLM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1390a129-d9f1-44fb-89d4-8a2aed32c5e1_280x114.png 1272w, https://substackcdn.com/image/fetch/$s_!1qLM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1390a129-d9f1-44fb-89d4-8a2aed32c5e1_280x114.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1qLM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1390a129-d9f1-44fb-89d4-8a2aed32c5e1_280x114.png" width="280" height="114" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1390a129-d9f1-44fb-89d4-8a2aed32c5e1_280x114.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:114,&quot;width&quot;:280,&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_!1qLM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1390a129-d9f1-44fb-89d4-8a2aed32c5e1_280x114.png 424w, https://substackcdn.com/image/fetch/$s_!1qLM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1390a129-d9f1-44fb-89d4-8a2aed32c5e1_280x114.png 848w, https://substackcdn.com/image/fetch/$s_!1qLM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1390a129-d9f1-44fb-89d4-8a2aed32c5e1_280x114.png 1272w, https://substackcdn.com/image/fetch/$s_!1qLM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1390a129-d9f1-44fb-89d4-8a2aed32c5e1_280x114.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">On the right: the loading state for a component</figcaption></figure></div><h3>Testing</h3><p>As with any quality software, we want to be thorough with testing. At Rubrik, we use several layers of testing to ensure the design system library minimizes regressions:</p><p><strong>Unit tests (including writing lots of them with AI).</strong> We use unit tests extensively, which is a common approach for any standard React component.</p><p>Over the past year, we&#8217;ve come to rely heavily on AI to write unit tests, and have found that it not only creates time savings, but also hits more edge cases. With AI, we can generate tests with extremely high code coverage from surprisingly short prompts.</p><p><strong>Storybook</strong>. <a href="https://storybook.js.org/">This</a> is an open-source tool for publicly displaying and documenting UI components outside of the main application. It allows engineers to create &#8220;stories&#8221;, which are examples of components in different states and configurations. Stories allow Frontend engineers outside of the DSE team to visualize the components without the complexity of a full application.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mS-8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e354baf-7d58-41f1-99ad-fdc88aabc4e8_953x446.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mS-8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e354baf-7d58-41f1-99ad-fdc88aabc4e8_953x446.png 424w, https://substackcdn.com/image/fetch/$s_!mS-8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e354baf-7d58-41f1-99ad-fdc88aabc4e8_953x446.png 848w, https://substackcdn.com/image/fetch/$s_!mS-8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e354baf-7d58-41f1-99ad-fdc88aabc4e8_953x446.png 1272w, https://substackcdn.com/image/fetch/$s_!mS-8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e354baf-7d58-41f1-99ad-fdc88aabc4e8_953x446.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mS-8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e354baf-7d58-41f1-99ad-fdc88aabc4e8_953x446.png" width="953" height="446" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9e354baf-7d58-41f1-99ad-fdc88aabc4e8_953x446.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:446,&quot;width&quot;:953,&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_!mS-8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e354baf-7d58-41f1-99ad-fdc88aabc4e8_953x446.png 424w, https://substackcdn.com/image/fetch/$s_!mS-8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e354baf-7d58-41f1-99ad-fdc88aabc4e8_953x446.png 848w, https://substackcdn.com/image/fetch/$s_!mS-8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e354baf-7d58-41f1-99ad-fdc88aabc4e8_953x446.png 1272w, https://substackcdn.com/image/fetch/$s_!mS-8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e354baf-7d58-41f1-99ad-fdc88aabc4e8_953x446.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>The Storybook of our RangeSlider</em></figcaption></figure></div><p>Storybook also allows other engineers to toggle and adjust the <a href="https://react.dev/learn/passing-props-to-a-component">props</a> into the components and copy/paste the resulting code. Engineers will then have the ability to visually customize the code to their exact needs.</p><p>At Rubrik, we use Storybook extensively and utilize it as a showcase of all available React components within our application. Nearly every Frontend Engineer visits our internal Storybook site on a weekly basis.</p><p><strong>Chromatic</strong>: <a href="https://www.chromatic.com/">This</a> is a visual regression testing tool. When making a change to a single component, an engineer needs to check that it works correctly across all four major browsers and supported themes. Plus, they need to check that any component dependent on the updated component works correctly.</p><p>Chromatic ties into Storybook and takes a visual snapshot of every component, comparing it to the previous snapshot to check for pixels that have changed, which it flags up. Devs can then examine how a change affects the rest of the library. It&#8217;s a great way to test regressions at scale.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!e8Fh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e22489-aafc-4528-a39a-e88585aa7138_706x411.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!e8Fh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e22489-aafc-4528-a39a-e88585aa7138_706x411.png 424w, https://substackcdn.com/image/fetch/$s_!e8Fh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e22489-aafc-4528-a39a-e88585aa7138_706x411.png 848w, https://substackcdn.com/image/fetch/$s_!e8Fh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e22489-aafc-4528-a39a-e88585aa7138_706x411.png 1272w, https://substackcdn.com/image/fetch/$s_!e8Fh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e22489-aafc-4528-a39a-e88585aa7138_706x411.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!e8Fh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e22489-aafc-4528-a39a-e88585aa7138_706x411.png" width="706" height="411" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/04e22489-aafc-4528-a39a-e88585aa7138_706x411.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:411,&quot;width&quot;:706,&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_!e8Fh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e22489-aafc-4528-a39a-e88585aa7138_706x411.png 424w, https://substackcdn.com/image/fetch/$s_!e8Fh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e22489-aafc-4528-a39a-e88585aa7138_706x411.png 848w, https://substackcdn.com/image/fetch/$s_!e8Fh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e22489-aafc-4528-a39a-e88585aa7138_706x411.png 1272w, https://substackcdn.com/image/fetch/$s_!e8Fh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e22489-aafc-4528-a39a-e88585aa7138_706x411.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>Chromatic flagging a visual regression</em></figcaption></figure></div><p>At Rubrik, Chromatic runs on every pull request that touches any file within our design system library. We do this by adding Chromatic as a blocking reviewer in GitHub for all these files. For us, Chromatic takes about 15 minutes to run against the design system library suite. If it finds no regressions, the bot removes Chromatic from the blocking reviewers list. If something has regressed, the blocking reviewer stays and the engineer who submitted the PR resolves the issue.</p><p>Thanks to running on every pull request, Chromatic has prevented 100+ bugs from shipping to production at Rubrik. Without it, I suspect most of those changes would&#8217;ve slipped through and have only been discovered later.</p><h2>4. Design system libraries in the AI era</h2><p>Can a team use AI to create a complete, well-designed, complex design system library from a single prompt? Today, that would be asking too much of AI, but maybe one day soon it will be possible. At Rubrik and in my own experiments with AI and design system libraries, I&#8217;ve found several cases where AI is extremely helpful, and also times when it&#8217;s not. In some situations, it even damages the work.</p>
      <p>
          <a href="https://newsletter.pragmaticengineer.com/p/design-systems-for-software-engineers">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[When AI writes almost all code, what happens to software engineering?]]></title><description><![CDATA[No longer a hypothetical question, this is a mega-trend set to hit the tech industry]]></description><link>https://newsletter.pragmaticengineer.com/p/when-ai-writes-almost-all-code-what</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/when-ai-writes-almost-all-code-what</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 06 Jan 2026 17:41:49 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d77a41b8-2e53-435d-9cf6-8298bd9af3e1_1146x822.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This winter break was an opportunity for devs to step back from day-to-day work and play around with side projects &#8211; including using AI agents to juice up those half-baked or incomplete ideas. At least, that&#8217;s what I did with a few features I&#8217;d meant to build for months, but didn&#8217;t get around to during 2025: related to <a href="https://api.pragmaticengineer.com/newsletter_signup">self-service group subscriptions</a> for larger companies, and my custom-built admin panel for The Pragmatic Engineer.</p><p>Unexpectedly, LLMs like Opus 4.5 and GPT 5.2 did amazing jobs on the mid-sized tasks I assigned them: I ended up pushing a few hundred lines of code to production simply by prompting the LLM, reviewing the output, making sure the tests passed (and new tests I prompted also passed!), then prompting it a bit more for some final tweaking.</p><p>To add to the magical feeling, I then managed to build production software on my phone: I set up Claude Code for Web by connecting it to my GitHub, which let me instruct the Claude mobile app to make changes to my code and to add/run tests. Claude duly created PRs that triggered GitHub actions (which ran the tests Claude couldn&#8217;t) and I found myself reviewing and merging PRs with new functionality purely from my mobile device while travelling. <em>Admittedly, it was low-risk work and all the business logic was covered by automated tests, but I hadn&#8217;t previously felt the thrill of &#8220;creating&#8221; code and pushing it to prod from my phone.</em></p><p>This experience, also shared by many others, suggests to me that a step change is underway in software engineering tooling. In this article &#8211; the first of 2026 for this publication &#8211; we explore where we are, and what a monumental change like AI writing the lion&#8217;s share of code could mean for us developers.</p><p>Today, we cover:</p><ol><li><p><strong>Latest models create &#8220;a-ha&#8221; moments. </strong>It&#8217;s not just devs working at AI vendors who noticed much more capable models, but also independent software engineers.</p></li><li><p><strong>Why now? </strong>Model releases in November and December seem to have been the tipping point: Opus 4.5, GPT-5.2 and Gemini 3.</p></li><li><p><strong>The bad: declining value of expertise. </strong>Prototyping, being a language polyglot or a specialist in a stack are likely to be a lot less valuable, looking ahead.</p></li><li><p><strong>The good: software </strong><em><strong>engineers</strong></em><strong> more valuable than before. </strong>Tech lead traits in more demand, being more &#8220;product-minded&#8221; to be a baseline at startups, and being a solid software engineer and not just a &#8220;coder&#8221; will be more sought-after than before.</p></li><li><p><strong>The ugly: uncomfortable outcomes.</strong> More code generated will lead to more problems, weak software engineering practices start to hurt sooner, and perhaps a tougher work-life balance for devs.</p></li><li><p><strong>Product management vs software engineering: merge or separation? </strong>Product managers can now generate software easier &#8211; needing fewer engineers to realize their goals &#8211; but software engineers also need less product management. Both professions are set to overlap with another more than before.</p></li></ol><h2>1. Latest models create &#8220;a-ha&#8221; moments</h2><p>Over the past few weeks, some experienced software engineers have shared personal &#8220;a-ha&#8221; moments about how AI tooling has become good enough to use for generating most of the code they write.</p><p>Jaana Dogan, principal engineer at Google, was <a href="https://x.com/rakyll/status/2007239758158975130?s=20">very impressed</a> by how far Claude Code has come:</p><blockquote><p>&#8220;I&#8217;m not joking and this isn&#8217;t funny. We have been trying to build distributed agent orchestrators at Google since last year. There are various options, not everyone is aligned, etc. I gave Claude Code a description of the problem, it generated what we built last year in an hour.</p><p>It&#8217;s not perfect and I&#8217;m iterating on it, but this is where we are right now. If you are skeptical of coding agents, try it on a domain you are already an expert in. Build something complex from scratch where you can be the judge of the artifacts&#8221;.</p></blockquote><p>Thorsten Ball, software engineer at Amp <a href="https://registerspill.thorstenball.com/p/joy-and-curiosity-68">reflected</a> (emphasis mine):</p><blockquote><p>&#8220;For more than 15 years, I thought I loved writing code, loved typing out code by hand, and loved the &#8220;cadence of typing&#8221;, as Gary Bernhardt once called it; sitting in front of my editor with my fingers click-clacking on my keyboard.</p><p>Now, I&#8217;m not so sure.</p><p>2025 was the year in which I deeply reconsidered my relationship to programming. In previous years, I had the occasional &#8220;should I become a <a href="https://en.wikipedia.org/wiki/Lisp_(programming_language)">Lisp</a> guy?&#8221;, for sure; but not the question &#8220;do I even like typing out code?&#8221;</p><p><strong>What I learned over the course of the year is that typing out code by hand now frustrates me&#8221;.</strong></p></blockquote><p><a href="https://www.linkedin.com/posts/malteubl_its-been-a-crazy-holiday-period-i-built-activity-7413979798030585856-Qpcs?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAAAIk0KwBsmE3oBadWSg2ettxmEyKbqZKG34">Malte Ubl</a>, CTO at Vercel:</p><blockquote><p>&#8220;It&#8217;s been a crazy holiday period: I built 2 major open-source projects (one unreleased, and the other a full implementation of a bash environment in TypeScript for use by AI agents).</p><ul><li><p>I started writing a book</p></li><li><p>I fixed a bunch of other things</p></li></ul><p>It&#8217;s a very different world now that we&#8217;re in Opus 4.5 world, and these would absolutely not have been possible without it. Opus + Claude Code now behaves like a senior software engineer whom you can just tell what to do, and it&#8217;ll do it. Supervision is still needed for difficult tasks, but it is extremely responsive to feedback and then gets it right.</p><p>I don&#8217;t want to be too dramatic, but y&#8217;all have to throw away your priors. The cost of software production is trending towards zero&#8221;.</p></blockquote><p><em>Longtime readers may recall Malte from his <a href="https://newsletter.pragmaticengineer.com/p/20-years-of-software-engineering">reflections on 20 years in software engineering, including 11 at Google.</a></em></p><p>One could claim that the voices above have an interest in this topic given they work at companies selling AI dev tools. But engineers with no pull towards any vendor also made similar observations:</p><p>David Heinemeier Hansson (DHH), creator of Ruby on Rails, described how his stance on AI <a href="https://x.com/dhh/status/2007503687745490976?s=20">has flipped</a> due to the improved models:</p><blockquote><p>&#8220;You can&#8217;t let the slop and cringe deny you the wonder of AI. This is the most exciting thing we&#8217;ve made computers do since we connected them to the internet. If you spent 2025 being pessimistic or skeptical about AI, why not start 2026 with optimism and curiosity?</p><p>Just last summer, I spoke with Lex Fridman about not letting AI write any code directly, but it turns out part of this resistance was simply based on the models not being good enough at the time! I spent more time rewriting what it wrote, than if I&#8217;d done it from scratch. That has now flipped.&#8221;</p></blockquote><p>Adam Wathan, creator of Tailwind CSS, <a href="https://x.com/adamwathan/status/2007490890059919371?s=20">reflected</a>:</p><blockquote><p>&#8220;Any time I have to type precise syntax by hand now [instead of using AI] feels like such a tedious chore. Surprisingly and thankfully, programming is still fun, probably more fun [with LLMs].</p><p>My biggest problem now is coming up with enough worthwhile ideas to fully leverage the productivity boost.&#8221;</p></blockquote><h3>From &#8220;AI slop&#8221; to rocking the industry</h3><p>One widely circulated &#8220;a-ha&#8221; moment has been from Andrej Karpathy, a cofounder of OpenAI. Andrej has not been involved in OpenAI for years, and is known to be candid in his assessment and critique of AI tools. Last October, he summarized AI coding tools as overhyped on the <a href="https://www.dwarkesh.com/p/andrej-karpathy">Dwarkesh podcast</a> (emphasis mine):</p><blockquote><p>&#8220;Overall, the models are not there. I feel like the industry is making too big of a jump and is trying to pretend like this is amazing, and it&#8217;s not.</p><p><strong>It&#8217;s slop</strong>.</p><p>They&#8217;re not coming to terms with it, and maybe they&#8217;re trying to fundraise or something like that. I&#8217;m not sure what&#8217;s going on, but we&#8217;re at this intermediate stage. The models are amazing. They still need a lot of work.</p><p>For now, autocomplete is my sweet spot. But sometimes, for some types of code, I will go to an LLM agent&#8221;.</p></blockquote><p>Two months on, that view had been thoroughly revised, with Karpathy <a href="https://x.com/karpathy/status/2004607146781278521">writing</a> on 26 December (emphasis mine:)</p><blockquote><p>&#8220;I&#8217;ve never felt this much behind as a programmer.</p><p><strong>The profession is being dramatically refactored as the bits contributed by the programmer are increasingly sparse.</strong> I have a sense that I could be 10X more powerful if I just properly string together what has become available over the last ~year, and a failure to claim the boost feels decidedly like a skill issue.</p><p>There&#8217;s a new programmable layer of abstraction to master in addition to the usual layers involving agents, subagents, their prompts, contexts, memory, modes, permissions, tools, plugins, skills, hooks, MCP, LSP, slash commands, workflows, IDE integrations, and a need to build an all-encompassing mental model for strengths and pitfalls of fundamentally stochastic, fallible, unintelligible and changing entities suddenly intermingled with what used to be good old fashioned engineering.</p><p>Clearly some powerful alien tool was handed around, except it comes with no manual and everyone has to figure out how to hold and operate it while the resulting magnitude 9 earthquake is rocking the profession.</p><p>Roll up your sleeves to not fall behind&#8221;.</p></blockquote><p>The creator of Claude Code, Boris Cherny, <a href="https://x.com/bcherny/status/2004626064187031831?s=20">responded</a>, sharing that all of his committed contributions last month were AI-written:</p><blockquote><p>&#8220;The last month was my first as an engineer when I didn&#8217;t open an IDE at all. Opus 4.5 wrote around 200 PRs, every single line. Software engineering is radically changing, and the hardest part even for early adopters and practitioners like us is to continue to re-adjust our expectations. And this is *still* just the beginning&#8221;.</p></blockquote><p><em>We previously did a deepdive on <a href="https://newsletter.pragmaticengineer.com/p/how-claude-code-is-built">how Claude Code was built</a> with Boris and other founding members of the team.</em></p><h2>2. Why now?</h2><p>Model releases in November and December seem like the tipping point where AI got <em>really</em> good at generating code:</p><ul><li><p><strong>Gemini 3</strong> by Google (17 November): Google&#8217;s best coding model to date</p></li><li><p><strong>Opus 4.5</strong> by Anthropic (24 November): the best coding model from the company, which has become the default model for Claude Code</p></li><li><p><strong>GPT-5.2</strong> by OpenAI (11 December): powering Codex, it&#8217;s similarly impressive as Claude Code with Opus</p></li></ul><p>I&#8217;ve used both Opus 4.5 and GPT-5.2 and they seem very competent at coding, which isn&#8217;t a niche opinion. Here&#8217;s Peter Steinberger, a software engineer with ~20 years&#8217; experience and the creator of PSPDFkit, <a href="https://steipete.me/posts/2025/shipping-at-inference-speed">gave</a> his impression of GPT-5.2:</p><blockquote><p>&#8220;The step from GPT 5/5.1 to 5.2 was massive. Now that GPT 5.2 is out, I have far fewer situations where I need [a custom-built CLI agent called &#8216;oracle&#8217; to get the agent unstuck]. I do use [GPT 5] Pro myself sometimes for research, but the cases where I asked the model to &#8220;ask the oracle&#8221; went from multiple times per day to a few times per week.</p><p>I&#8217;m not mad about this; building &#8216;oracle&#8217; was super fun and I learned lots about browser automation, Windows, and finally took time to look into skills, having dismissed the idea for quite some time. What it does show is how much better 5.2 got at many real-life coding tasks: it one-shots almost anything I throw at it&#8221;.</p></blockquote><p>Simon Willison is an independent software engineering expert in LLMs whom I pay attention to, and he pointed out the <a href="https://x.com/simonw/status/2007904766756880848?s=20">same</a>:</p><blockquote><p>&#8220;<strong>It genuinely feels to me like GPT-5.2 and Opus 4.5 in November represent an inflection point</strong> - one of those moments when the models get incrementally better in a way that tips over an invisible capability line. Suddenly, a whole bunch of much harder coding problems open up.</p><p>It&#8217;s possible Gemini 3 Pro should be included in that group as well, but I&#8217;m not seeing quite the same level of astonished buzz from hardened software engineers around that model that I am for the other two&#8221;.</p></blockquote><p><em>The first-ever The Pragmatic Engineer Podcast episode was with Simon, fittingly entitled <a href="https://newsletter.pragmaticengineer.com/p/ai-tools-for-software-engineers-simon-willison">AI tools for software engineers, but without the hype</a> &#8211; and Simon continues to live up to that sentiment.</em></p><h3>Wild prediction coming true?</h3><p>One forecast which many &#8211; including me &#8211; were sceptical about was made by Anthropic&#8217;s CEO, Dario Amodei, last March, when he <a href="https://www.businessinsider.com/anthropic-ceo-ai-90-percent-code-3-to-6-months-2025-3">said</a>:</p><blockquote><p>&#8220;I think we will be there in three to six months, where AI is writing 90% of the code. And then, in 12 months, we may be in a world where AI is writing essentially all the code&#8221;.</p></blockquote><p>Yet it came to pass in December, when 100% of Cherny&#8217;s code contributed to Claude Code was AI-written. Playing devil&#8217;s advocate, one could point out that Claude Code is closed source, so the claim is hard to validate. And of course, the creator of something like Claude Code wants to showcase its high-performance capabilities. But I&#8217;ve talked with Boris and trust him; also, my own experience of using Claude Code tallies with his: I let Claude Code generate all the code I end up committing.</p><p>When the code is not how I want it, I do more prompting to get the LLM to fix it. Like Boris, I&#8217;ve ceased writing code by hand because I don&#8217;t <em>have</em> to do it, and the models seem capable enough. I can still do it, but it&#8217;s simply faster to leave it to the model.</p><p>Even for code that I know well enough and can navigate in my IDE, I&#8217;ve noticed that prompting the agent can get edits done just as quickly as I would do it, if not faster. Nonetheless, I do find myself going to the IDE as I like to <em>know</em> that I can do the work.</p><p>For my own use case, the claim feels true enough that AI can generate 90% of the code I write, using TypeScript, Node/Express, React, and Postgres as technologies, in my case. I understand the same is increasingly true of languages like Go, Rust and other popular languages and frameworks which LLMs have plenty of training data for. Interestingly, LLMs seem to be pretty good at C as well, as <a href="https://x.com/antirez/status/2007948928252105182?s=20">observed by</a> Redis creator, Salvatore Sanfilippo.</p><p><strong>The remainder of this article assumes AI coding tools WILL become good enough to generate ~90%+ of the code for many devs and teams, this year. </strong>The most likely candidates for this landmark look like being startups seeking product-market fits &#8211; for whom throwaway work is no big deal &#8211; and also greenfield development projects, where no existing codebase needs to be ingested or understood before building something new.</p><p>Of course, there will also be plenty of occasions when it won&#8217;t make sense to totally rely on AI coding tools, either due to them not working well enough in some codebases or contexts, or when devs purposefully choose not to lean on them.</p><p>It&#8217;s worth exploring the directions in which the software engineering profession could go in environments where almost all code is generated by AI via prompts, rather than being typed out by a developer. This would be a sea change that impacts the profession, but how? Let&#8217;s run the rule over the good, bad, and the ugly possibilities, starting with potential negatives.</p><h2>3. The bad: declining value of expertise</h2><p>Some things that used to be valuable will be mostly delegated to the AI:</p><p><strong>Prototyping. </strong>Platforms like Lovable and Replit explicitly advertise themselves as ways for nontechnical folks to build software. In a <a href="https://www.youtube.com/shorts/fbDJ6JXtoFQ">recent ad</a>, Replit teamed up with legendary NBA star Shaquille O&#8217;Neal, who vibe-coded an app for getting the top 5,000 pickup lines in online history, among others:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AHUr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff125c0bb-e079-44d0-8ffe-a19ad80e088f_1398x872.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AHUr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff125c0bb-e079-44d0-8ffe-a19ad80e088f_1398x872.png 424w, https://substackcdn.com/image/fetch/$s_!AHUr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff125c0bb-e079-44d0-8ffe-a19ad80e088f_1398x872.png 848w, https://substackcdn.com/image/fetch/$s_!AHUr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff125c0bb-e079-44d0-8ffe-a19ad80e088f_1398x872.png 1272w, https://substackcdn.com/image/fetch/$s_!AHUr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff125c0bb-e079-44d0-8ffe-a19ad80e088f_1398x872.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AHUr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff125c0bb-e079-44d0-8ffe-a19ad80e088f_1398x872.png" width="1398" height="872" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f125c0bb-e079-44d0-8ffe-a19ad80e088f_1398x872.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:872,&quot;width&quot;:1398,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:504958,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.pragmaticengineer.com/i/183694080?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff125c0bb-e079-44d0-8ffe-a19ad80e088f_1398x872.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AHUr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff125c0bb-e079-44d0-8ffe-a19ad80e088f_1398x872.png 424w, https://substackcdn.com/image/fetch/$s_!AHUr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff125c0bb-e079-44d0-8ffe-a19ad80e088f_1398x872.png 848w, https://substackcdn.com/image/fetch/$s_!AHUr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff125c0bb-e079-44d0-8ffe-a19ad80e088f_1398x872.png 1272w, https://substackcdn.com/image/fetch/$s_!AHUr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff125c0bb-e079-44d0-8ffe-a19ad80e088f_1398x872.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>Shaq vibe coding with no development experience. The apps were prototypes at best. Source: <a href="https://www.youtube.com/shorts/fbDJ6JXtoFQ">Replit</a></em></figcaption></figure></div><p>Still, with AI tools, product folks, designers, and business people can build their own prototypes, and no longer need a dev to make an idea real. Alongside this, it&#8217;ll become a baseline expectation for each and every developer to be able to generate concept apps fast.</p><p><strong>Being a language polyglot will probably be less valuable.</strong> Engineers who are experts in multiple languages have traditionally been coveted because engineering teams often like to hire experts in their own stack. So, a team using Go would often prefer to hire senior engineers with Go knowledge, and the same with Rust, Typescript, etc. <em>I&#8217;d qualify this with the fact that some forward-thinking teams ignore candidates&#8217; expertise in their specific language and assume that competent engineers can pick up languages on the go.</em></p><p>But with AI writing most of the code, the advantage of knowing several languages will become less important when any engineer can jump into any codebase and ask the AI to implement a feature &#8211; which it will probably take a decent stab at. Even better, you can ask AI to explain parts of the codebase and quickly pick up a language much faster than without AI tools.</p><p><strong>The end of language specializations and frontend/backend specializations? </strong>In the early 2000s, I recall most job adverts wanted candidates for a specific language: ASP.NET developer, Java developer, PHP developer, and so on. From the mid-2010s, more companies started to hire based on specialization in the stack: backend developer, frontend developer, native iOS/Android developer, cross-platform mobile developer. On the backend, it became accepted that a dev who knew a language like Go pretty well could pick up Typescript, Scala, Rust or other languages as necessary. Roles where for specific languages still matter were for native mobile, where the iOS and Android frameworks were different enough to require deep expertise in one or the other.</p><p>But today with AI, a backend engineer can prompt <em>decent </em>frontend code, cross-platform code, or even attempt native mobile code. With this tool, I struggle to foresee startups hiring separate frontend and backend devs: they&#8217;ll just hire a specialist whom they trust will use AI to unblock themself across the stack.</p><p><strong>Implementing a well-defined ticket is something AI will increasingly do,</strong> like taking a JIRA or Linear ticket that&#8217;s well-defined &#8211; like a bug report or small feature request &#8211; and implementing it. Even today, the team at Cursor has an automation where all Linear tickets are automatically passed to Cursor, which one-shots an implementation. A dev can then choose to merge it or iterate on it. The more context is passed and the better the models are, the more likely the output will be mergeable.</p><p>This will be a major shift, especially in hierarchical workplaces where project or product managers have long been writing detailed tickets for devs to implement with no questions asked!</p><p><strong>Refactoring will probably be ever more delegated to AI.</strong> It&#8217;s already pretty good at refactoring and the tools will probably only get better. Refactoring by hand will be much slower than spelling out what type of refactor you want the AI to do. Of course, in the pre-AI era, modern IDEs also offered powerful refactoring capabilities for speeding up tedious tasks like renaming functions or classes that did the renaming across the entire codebase, extracting functions.</p><p>Of course, there will always be the risk that AI messes things up, especially with large refactorings. This is why having ways to validate code will surely be even more important this year.</p><p><strong>Paying careful attention to generated code &#8211; in some cases? </strong>Generating code from AI prompts can lead to verbose code, or duplication of existing code instead of using an abstraction. But there are times when this is perfectly acceptable, such as when building proof of concepts, or when topics like program efficiency are unimportant.</p><p>Software engineer Peter Steinberger is building greenfield software, and said he&#8217;s <a href="https://steipete.me/posts/2025/shipping-at-inference-speed">stopped reading</a> code generated by AI:</p><blockquote><p>&#8220;These days, I don&#8217;t read much code anymore. I watch the stream and sometimes look at key parts, but I gotta be honest, most code I don&#8217;t read. I do know where components are and how things are structured, and how the overall system is designed; that&#8217;s usually all that&#8217;s needed.</p><p>The important decisions these days are language/ecosystem and dependencies. My go-to languages are TypeScript for web stuff, Go for CLIs and Swift if it needs to use macOS stuff, or has UI. Go wasn&#8217;t something I gave the slightest thought even a few months ago, but eventually I played around and found that agents are really great at writing it, and its simple type system makes linting fast&#8221;.</p></blockquote><p>Even so, reading code will remain important when extending existing mature software, or when security issues need to be avoided. In general, if shipped code doesn&#8217;t work and hurts the business, then you&#8217;ll want to both test and review it for correctness.</p><h2>4. The good: software engineers more valuable than before</h2>
      <p>
          <a href="https://newsletter.pragmaticengineer.com/p/when-ai-writes-almost-all-code-what">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How AWS deals with a major outage]]></title><description><![CDATA[What happens when there&#8217;s a massive outage at AWS? A member of AWS&#8217;s Incident Response team lifts the lid, after playing a key role in resolving the leading cloud provider&#8217;s most recent major outage]]></description><link>https://newsletter.pragmaticengineer.com/p/how-aws-deals-with-a-major-outage</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/how-aws-deals-with-a-major-outage</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Tue, 16 Dec 2025 16:58:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/fe83102d-fbba-420b-9a15-dadb751dfabf_1596x948.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In October, the largest Amazon Web Services (AWS) region in the world suffered an outage lasting 15 hours, which created a global impact as thousands of sites and apps crashed or degraded &#8211; including Amazon.com, Signal, Snapchat, and <a href="https://newsletter.pragmaticengineer.com/p/the-pulse-aws-takes-down-a-good-part">others</a>.</p><p>AWS released an incident summary three days later, revealing the outage in us-east-1 was <a href="https://newsletter.pragmaticengineer.com/i/176934094/what-caused-the-outage">started by</a> a failure inside DynamoDB&#8217;s DNS system, which then spread to Amazon EC2 and to AWS&#8217;s Network Load Balancer. The incident summary overlooked questions such as why it took so long to resolve, and some media coverage sought to fill the gap.</p><p>The Register <a href="https://www.theregister.com/2025/10/20/aws_outage_amazon_brain_drain_corey_quinn/">claimed</a> that an &#8220;Amazon brain drain finally sent AWS down the spout&#8221;, because some AWS staff who knew the systems inside out had quit the company, and their institutional knowledge was sorely missed.</p><p>For more clarity and detail, I went to an internal source at Amazon: Senior Principal Engineer, <a href="https://www.linkedin.com/in/gavin-mccullagh-1124492/">Gavin McCullagh</a>, who was part of the crew which resolved this outage from start to finish. In this article, Gavin shares his insider perspective and some new details about what happened, and we find out how incident response works at the company.</p><p>This article is based on Gavin&#8217;s account of the incident to me. We cover:</p><ol><li><p><strong>Incident Response team at AWS. </strong>An overview of how global incident response works at the leading cloud provider, and a summary of Gavin&#8217;s varied background at AWS.</p></li><li><p><strong>Mitigating the outage (part 1). </strong>Rapid triage, two simultaneous problems, and extra details on how the DynamoDB outage was eventually resolved.</p></li><li><p><strong>What caused the outage? </strong>An unlucky, unexpected lock contention across the three DNS enactors started it all. Also, a clever usage of Route 53 as an optimistic locking mechanism.</p></li><li><p><strong>Oncall tooling &amp; outage coordination. </strong>Amazon&#8217;s outage severity scale, tooling used for paging and incident management, and why 3+ parallel calls are often run during a single outage.</p></li><li><p><strong>Mitigating the outage (part 2). </strong>After the DynamoDB outage was mitigated, the EC2 and Network Load Balancer (NLB) had issues that took hours to resolve.</p></li><li><p><strong>Post-incident. </strong>The typical ops review process at AWS, and how improvements after a previous major outage in 2023 helped to contain this one.</p></li><li><p><strong>Improvements and learnings. </strong>Changes that AWS is making to its services, and how the team continues to learn how to handle metastable failures better. Also, there&#8217;s a plan to use formal methods for verification, even for systems like DynamoDB&#8217;s DNS services.</p></li></ol><p>Spoiler alert: this outage was <em>not</em> caused by a brain drain. In fact, many engineers who originally built the service, DNS Enactor (responsible for updating routes in Amazon&#8217;s DNS service) ~3 years ago, are very much still at AWS, and five of them hopped onto the outage call in the dead of night, which likely helped to resolve the outage more quickly.</p><p>As it turns out &#8211; and as readers of this newsletter likely already know! &#8211; operating distributed systems is simply hard, and it&#8217;s even harder when several things go wrong at once.</p><p><em>Note: if you work at Amazon, get full access to The Pragmatic Engineer with your corporate email <strong><a href="https://api.pragmaticengineer.com/newsletter_signup">here</a></strong>. It includes deepdives like <a href="https://newsletter.pragmaticengineer.com/p/amazon">Inside Amazon&#8217;s Engineering Culture</a>, ones on <a href="https://newsletter.pragmaticengineer.com/p/facebook">Meta</a>, <a href="https://newsletter.pragmaticengineer.com/p/stripe">Stripe</a>, and <a href="https://newsletter.pragmaticengineer.com/p/google">Google</a>, and a wide variety of <a href="https://newsletter.pragmaticengineer.com/t/engineering-culture-deepdive">engineering culture deepdives</a>.</em></p><h2>1. Incident Response team at AWS</h2><p>Amazon is made up of many different businesses of which the best known are:</p><ul><li><p><strong>Amazon</strong> <strong>Retail</strong>: operates the shopping websites <a href="http://amazon.com">Amazon.com</a>, and 21 regional versions including <a href="http://amazon.co.uk">Amazon.co.uk</a>, <a href="http://amazon.de">Amazon.de</a>, and others.</p></li><li><p><strong>AWS</strong>: everything to do with Amazon Web Services. Retail is a major customer of AWS.</p></li></ul><p>These organizations operate pretty much independently with their own processes and set ups. Processes are similar but not identical, and both groups evolve how they work over time, separately. In this deepdive, our sole focus is AWS, but it could be assumed Retail has some similar functions, like separate Incident Response teams.</p><p><strong>Regions and AZs</strong>: AWS is made up of 38 cloud regions. Each one consists of at least 3 Availability Zones (AZs), which are at least one independent data center, connected via a low-latency network. <em>Note: </em>&#8220;<em>Region&#8221; and &#8220;AZ&#8221; mean slightly different things among cloud providers, as covered in <a href="https://newsletter.pragmaticengineer.com/i/138458677/what-is-a-cloud-region">Three cloud providers, three outages, three different responses.</a></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!szXQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7944cb-a4b4-478d-8b14-1658242929ef_1138x1052.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!szXQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7944cb-a4b4-478d-8b14-1658242929ef_1138x1052.png 424w, https://substackcdn.com/image/fetch/$s_!szXQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7944cb-a4b4-478d-8b14-1658242929ef_1138x1052.png 848w, https://substackcdn.com/image/fetch/$s_!szXQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7944cb-a4b4-478d-8b14-1658242929ef_1138x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!szXQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7944cb-a4b4-478d-8b14-1658242929ef_1138x1052.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!szXQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7944cb-a4b4-478d-8b14-1658242929ef_1138x1052.png" width="1138" height="1052" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0b7944cb-a4b4-478d-8b14-1658242929ef_1138x1052.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1052,&quot;width&quot;:1138,&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_!szXQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7944cb-a4b4-478d-8b14-1658242929ef_1138x1052.png 424w, https://substackcdn.com/image/fetch/$s_!szXQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7944cb-a4b4-478d-8b14-1658242929ef_1138x1052.png 848w, https://substackcdn.com/image/fetch/$s_!szXQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7944cb-a4b4-478d-8b14-1658242929ef_1138x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!szXQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7944cb-a4b4-478d-8b14-1658242929ef_1138x1052.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>AWS is built up of regions, and each region has at least 3 AZs. More in <a href="https://newsletter.pragmaticengineer.com/p/three-cloud-providers-three-outages?utm_source=publication-search">this deepdive</a></em></figcaption></figure></div><p><strong>Incident Response</strong> is a dedicated team at AWS, staffed by experienced support and infrastructure engineers, who do the following:</p><ul><li><p><strong>Monitor</strong> all 38 AWS regions, continuously. Health KPIs (Key Performance Indicators) are set up, so it&#8217;s easy to tell if a service is healthy or not. These KPIs vary by service, but typical ones include monitoring API success rates and response latencies, as well as synthetic canaries.</p></li><li><p><strong>Get alerted</strong> when a region becomes unhealthy, or KPIs suggest it might be.</p></li><li><p><strong>Coordinate</strong> incident calls when an outage happens within a region or AZ.</p></li><li><p><strong>Oncall rotation 24/7</strong>: someone is always available to respond to an alert.</p></li></ul><p>Interesting detail: the oncall team for Incident Response is distributed across Seattle, Dublin, and Sydney, which is a &#8220;follow the sun&#8221; rotation, meaning nobody is oncall when it&#8217;s nighttime where they are.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WQLO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fae0b55-6d91-49b2-9b6c-1b7993e09019_1600x966.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WQLO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fae0b55-6d91-49b2-9b6c-1b7993e09019_1600x966.png 424w, https://substackcdn.com/image/fetch/$s_!WQLO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fae0b55-6d91-49b2-9b6c-1b7993e09019_1600x966.png 848w, https://substackcdn.com/image/fetch/$s_!WQLO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fae0b55-6d91-49b2-9b6c-1b7993e09019_1600x966.png 1272w, https://substackcdn.com/image/fetch/$s_!WQLO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fae0b55-6d91-49b2-9b6c-1b7993e09019_1600x966.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WQLO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fae0b55-6d91-49b2-9b6c-1b7993e09019_1600x966.png" width="1456" height="879" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5fae0b55-6d91-49b2-9b6c-1b7993e09019_1600x966.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:879,&quot;width&quot;:1456,&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_!WQLO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fae0b55-6d91-49b2-9b6c-1b7993e09019_1600x966.png 424w, https://substackcdn.com/image/fetch/$s_!WQLO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fae0b55-6d91-49b2-9b6c-1b7993e09019_1600x966.png 848w, https://substackcdn.com/image/fetch/$s_!WQLO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fae0b55-6d91-49b2-9b6c-1b7993e09019_1600x966.png 1272w, https://substackcdn.com/image/fetch/$s_!WQLO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fae0b55-6d91-49b2-9b6c-1b7993e09019_1600x966.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">Locations of oncall teams in AWS&#8217;s Incident Response team</figcaption></figure></div><p>Oncall team members are a mix of senior+ engineers and relatively junior engineers onboarded after training in how to handle alerts and run calls. For significant events like this latest outage, an oncall &#8220;AWS Call Leader&#8221; is paged automatically. These are more tenured folks, usually principal up to distinguished engineers.</p><p><strong>All AWS Service teams and products run their own independent oncall teams. </strong>The AWS Incident Response group is a &#8220;safety net&#8221; which coordinates large-scale events.</p><p>AWS has a &#8220;you build it, you run it&#8221; mentality: teams have autonomy to decide which service they build, the technologies used, and how they structure it. In return, they are accountable for the service meeting the uptime target; for production services, this means having an active oncall. <em>We cover more about oncall practices in <a href="https://newsletter.pragmaticengineer.com/p/healthy-oncall-practices">Healthy oncall practices,</a> and detailed compensation philosophies in the <a href="https://newsletter.pragmaticengineer.com/p/oncall-compensation">Oncall compensation</a> article.</em></p><h3>Gavin&#8217;s background at AWS</h3><p>For this article, Gavin McCullagh shared the story of how the incident unfolded from his point of view. Gavin joined Amazon&#8217;s Dublin office in 2011 and worked for many years as a DNS and Load Balancing Specialist, including working on Route 53 Public DNS, and Virtual Private Cloud (VPC) DNS Resolver. Nowadays, Gavin works in a team focused on Incident Response and Resilience for AWS services and customer applications. This includes the AWS Incident Response team, and services like Application Recovery Controller and Fault Injection Service.</p><p>Since his early days there, Gavin has been a regular in large-scale incident calls as his first team &#8211; Load Balancing &#8211; was regularly paged into major incidents because it is central to AWS, and telemetry from load balancers can greatly help with debugging.</p><h2>2. Mitigating the outage (part 1)</h2><p><em>All times below are in Pacific time.</em></p><p><strong>19 Oct, 11:48 PM: </strong>the incident begins and regional health indicators degrade, triggering an alert. Minutes later, AWS Incident Response oncall is paged. The AWS call leader also joins the call. Gavin joins despite not actually being oncall because he figures he might be able to help &#8211; which turned out to be a good hunch.</p><h3>Rapid triage</h3><p>Triage starts immediately. At this point, 100+ services were showing problems within us-east-1 due to the broad nature of the outage. From experience, the Incident Response Team has learned that it pays to start systematically debugging common layers of the stack. For such a broad outage, it&#8217;s usually a core building block with an issue.</p><p>Below is a rough checklist of what the team works through:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Gr88!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8189dfd1-198a-4308-abdf-a4be9bbd798b_1476x1032.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Gr88!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8189dfd1-198a-4308-abdf-a4be9bbd798b_1476x1032.png 424w, https://substackcdn.com/image/fetch/$s_!Gr88!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8189dfd1-198a-4308-abdf-a4be9bbd798b_1476x1032.png 848w, https://substackcdn.com/image/fetch/$s_!Gr88!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8189dfd1-198a-4308-abdf-a4be9bbd798b_1476x1032.png 1272w, https://substackcdn.com/image/fetch/$s_!Gr88!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8189dfd1-198a-4308-abdf-a4be9bbd798b_1476x1032.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Gr88!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8189dfd1-198a-4308-abdf-a4be9bbd798b_1476x1032.png" width="1456" height="1018" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8189dfd1-198a-4308-abdf-a4be9bbd798b_1476x1032.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1018,&quot;width&quot;:1456,&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_!Gr88!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8189dfd1-198a-4308-abdf-a4be9bbd798b_1476x1032.png 424w, https://substackcdn.com/image/fetch/$s_!Gr88!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8189dfd1-198a-4308-abdf-a4be9bbd798b_1476x1032.png 848w, https://substackcdn.com/image/fetch/$s_!Gr88!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8189dfd1-198a-4308-abdf-a4be9bbd798b_1476x1032.png 1272w, https://substackcdn.com/image/fetch/$s_!Gr88!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8189dfd1-198a-4308-abdf-a4be9bbd798b_1476x1032.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>Systematic investigations begin at the bottom of the stack</em></figcaption></figure></div><p>The Incident Response team begins by going through a checklist in roughly this order:</p><ol><li><p>Investigate whether there are power failures or significant network failures</p></li><li><p>Check if the software-defined network and load balancing layers are healthy</p></li><li><p>Look for issues within DNS and authentication/ authorization services</p></li><li><p>Confirm that core services are healthy which most AWS products build on; like KMS, DynamoDB and S3</p></li></ol><h3>Two problems at once</h3><p>As the team went through the list, two coincidental issues were uncovered within a minute of each other.</p><p><strong>Sunday, 19 Oct, 11:48 PM: a networking failure event starts. </strong>Network packet loss is detected in the &#8220;border&#8221; network which connects the us-east-1-az1 availability zone to the wider AWS backbone and internet. A Network Border Group is a unique group from which AWS advertises public IP addresses.</p><p><strong>11:48 PM: DynamoDB degradation starts. </strong>As packet loss is being detected, DynamoDB also starts to degrade.</p><p><strong>11:52 PM:</strong> AWS Incident Response automatically detects an impact upon services in us-east-1, and pages the incident response oncall network engineers, and affected service oncalls.</p><p><strong>11:54 PM: Automated Triage suggests Networking.</strong> Incident response&#8217;s automated metric triage system completes, noting a) a change in network performance (increase in packet loss) correlated with the time of the event start, and b) that DynamoDB&#8217;s metrics have changed at the same time. <em>Typically</em>, this would suggest a network issue is the cause of the DynamoDB issue.</p><p><strong>Monday, 20 Oct, 00:08 AM: after failover to a secondary conference system (more later), there&#8217;s an investigation into the networking event. </strong>As the network event is &#8220;lower in the stack&#8221; and initially appears to explain the impact on other services (including DynamoDB), the team focuses on fixing the networking issue.</p><p><strong>00:26 AM: Red herring. </strong>While the Incident Response team is busy resolving the networking failure in the AZ, someone posts in the incident Slack channel:</p><blockquote><p>&#8220;Hang on, why is DynamoDB not resolving in DNS, packet loss would not cause that?&#8221;</p></blockquote><p>This is when the Incident Response team realizes that while the networking event has <em>some</em> impact, something <em>bigger</em> is also happening that&#8217;s not caused by the outage. Whatever it is, it&#8217;s impacting DynamoDB.</p><p>This smaller network outage is lower in the stack and started a few seconds before the first DynamoDB alerts, which led the experienced team off track into mitigating the smaller outage.</p><p><strong>20 Oct, 00:27am: the call is divided. </strong>The DynamoDB investigation is split into its own call, so two technical calls run in parallel:</p><ol><li><p>DynamoDB outage: the focus of the dedicated call</p></li><li><p>Networking outage: resolving the &#8220;smaller&#8221; outage continues</p></li></ol><h3>Resolving the DynamoDB outage</h3><p>To bring more senior leaders into the call, Gavin messages three longtime DynamoDB frontend engineers, and asks Incident Response to page them, too.</p><p><strong>00:31am: realization that it&#8217;s a DNS issue. </strong>Using the ubiquitous &#8220;dig&#8221; tool,<strong> </strong>the team sees that something is wrong with DynamoDB&#8217;s DNS records.</p><p><strong>00:35-00:50am: engineers who designed and authored the DNS Enactor service join. </strong>The root cause of the issue with DynamoDB ended up being identified as a race condition within a DNS Enactor service, as <a href="https://newsletter.pragmaticengineer.com/p/the-pulse-aws-takes-down-a-good-part">previously covered</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!v9yO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9fc81b-4865-45b3-8b7b-20ee6fb69839_1456x1138.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!v9yO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9fc81b-4865-45b3-8b7b-20ee6fb69839_1456x1138.png 424w, https://substackcdn.com/image/fetch/$s_!v9yO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9fc81b-4865-45b3-8b7b-20ee6fb69839_1456x1138.png 848w, https://substackcdn.com/image/fetch/$s_!v9yO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9fc81b-4865-45b3-8b7b-20ee6fb69839_1456x1138.png 1272w, https://substackcdn.com/image/fetch/$s_!v9yO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9fc81b-4865-45b3-8b7b-20ee6fb69839_1456x1138.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!v9yO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9fc81b-4865-45b3-8b7b-20ee6fb69839_1456x1138.png" width="1456" height="1138" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7c9fc81b-4865-45b3-8b7b-20ee6fb69839_1456x1138.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1138,&quot;width&quot;:1456,&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_!v9yO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9fc81b-4865-45b3-8b7b-20ee6fb69839_1456x1138.png 424w, https://substackcdn.com/image/fetch/$s_!v9yO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9fc81b-4865-45b3-8b7b-20ee6fb69839_1456x1138.png 848w, https://substackcdn.com/image/fetch/$s_!v9yO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9fc81b-4865-45b3-8b7b-20ee6fb69839_1456x1138.png 1272w, https://substackcdn.com/image/fetch/$s_!v9yO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9fc81b-4865-45b3-8b7b-20ee6fb69839_1456x1138.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A race condition in DNS Enactor services ended up causing the outage</figcaption></figure></div><p>The quorum (collective) of seven DynamoDB engineers includes folks who built and authored a good part of the DNS Enactor and related services, and who have a combined Amazon tenure of over 50 years. With domain experts on the call, the incident responders let them figure out what has gone wrong with DNS Enactors, while looking for ways to mitigate faster.</p><p>As the team will later learn, the cause of the event is an edge case bug in how the three Enactors interact, as covered below.</p><p><strong>Hitting the &#8220;automation paradox.&#8221; </strong>The DynamoDB team has built a system with DNS Enactors that automatically does a lot of complicated work to keep their DNS updated. But now that it&#8217;s gone wrong, it&#8217;s time to manually fix the DNS records.</p><p>Here&#8217;s where the automation paradox kicked in: the team had never had to manually overwrite the DNS zone files before, as they had a system that could reliably do this! So, it took some time to package up and deploy the change to DNS records via manual intervention.</p><p><strong>01:03 AM: a parallel mitigation, before the &#8220;full fix.&#8221; </strong>The problem is that the DNS records for DynamoDB are empty due to the race condition. The first order of business is to restore <em>something that works and relieves customers</em> &#8211; even before understanding exactly how things went wrong.</p><p>The incident response team prepares a &#8220;quick&#8221; partial mitigation: within the internal private network, call us-east-1 &#8220;<strong>Prod</strong>&#8221; (yes, this really is the name!) and apply an Response Policy Zone (RPZ) override on the DNS resolvers to force the DynamoDB IPs into place, for only this internal network. As it hosts many AWS services, this will help restore services like Identity and Access Management (<a href="https://aws.amazon.com/iam/">IAM</a>) and Secure Token Service (<a href="https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html">STS</a>).</p><p><strong>01:15 AM: mitigation. </strong>The incident team performs an override to force DynamoDB IPs into the us-east-1 Prod DNS on DynamoDB&#8217;s most common domain name. Then, the incident team performs a second override of DynamoDB IPs on DynamoDB&#8217;s other domain names. At this point, services like IAM, STS, and SQS in us-east-1 recover.</p><p><strong>02:15 AM: fix for public DynamoDB DNS found and applied. </strong>The team figures out how to fix the public DNS records for DynamoDB, and applies this to restore DynamoDB for all customers.</p><p>The engineers look through the zone and realize the top-level alias record for the DynamoDB domain is pointing at a non-existent tree of records (the old &#8220;plan&#8221; was deleted). They also note that a set of backup trees which the system maintains are still present. As a result, their task is to stop the automation system to prevent it from interfering, delete the broken alias record, and create a replacement that points at the rollback tree.</p><p><strong>02:25 AM: DynamoDB recovered. </strong>The first part of the incident is resolved. However, Amazon EC2 continues to have issues, and Network Load Balancer (NLB) would have problems later that night.</p><h2>3. What actually caused the outage?</h2><p>AWS runs three independent DNS Enactors, and each takes DNS plans and updates Route 53. DNS Enactors are <em>eventually consistent:</em> meaning that the DNS plans in any single Enactor will eventually be consistent with the source of truth. This is unlike strongly consistent systems where you can be certain that after writing something, the whole system is consistent.</p><p><strong>Using an <a href="https://en.wikipedia.org/wiki/Optimistic_concurrency_control">optimistic locking</a> mechanism</strong> is<strong> </strong>a common solution to prevent multiple writers from changing the same record. The AWS team wanted to achieve this: have only one Enactor writing to Route 53 at any single given time.</p><p>You need to have some kind of key-value database to implement optimistic locking. For example, you could use DynamoDB for this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Yq0a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65323d38-9b1e-465a-87fc-2ff37e7cd7f9_774x424.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Yq0a!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65323d38-9b1e-465a-87fc-2ff37e7cd7f9_774x424.png 424w, https://substackcdn.com/image/fetch/$s_!Yq0a!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65323d38-9b1e-465a-87fc-2ff37e7cd7f9_774x424.png 848w, https://substackcdn.com/image/fetch/$s_!Yq0a!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65323d38-9b1e-465a-87fc-2ff37e7cd7f9_774x424.png 1272w, https://substackcdn.com/image/fetch/$s_!Yq0a!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65323d38-9b1e-465a-87fc-2ff37e7cd7f9_774x424.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Yq0a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65323d38-9b1e-465a-87fc-2ff37e7cd7f9_774x424.png" width="774" height="424" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/65323d38-9b1e-465a-87fc-2ff37e7cd7f9_774x424.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:424,&quot;width&quot;:774,&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_!Yq0a!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65323d38-9b1e-465a-87fc-2ff37e7cd7f9_774x424.png 424w, https://substackcdn.com/image/fetch/$s_!Yq0a!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65323d38-9b1e-465a-87fc-2ff37e7cd7f9_774x424.png 848w, https://substackcdn.com/image/fetch/$s_!Yq0a!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65323d38-9b1e-465a-87fc-2ff37e7cd7f9_774x424.png 1272w, https://substackcdn.com/image/fetch/$s_!Yq0a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65323d38-9b1e-465a-87fc-2ff37e7cd7f9_774x424.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>DynamoDB could be an optimistic locking mechanism &#8211; but it&#8217;s not what the AWS team decided to do</em></figcaption></figure></div><p>The problem with this approach would have been that DynamoDB itself depends on DNS Enactors, so this would create a circular dependency:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2BEz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b81c0f-2c3c-4950-b9ca-39597cad9934_1532x988.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2BEz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b81c0f-2c3c-4950-b9ca-39597cad9934_1532x988.png 424w, https://substackcdn.com/image/fetch/$s_!2BEz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b81c0f-2c3c-4950-b9ca-39597cad9934_1532x988.png 848w, https://substackcdn.com/image/fetch/$s_!2BEz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b81c0f-2c3c-4950-b9ca-39597cad9934_1532x988.png 1272w, https://substackcdn.com/image/fetch/$s_!2BEz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b81c0f-2c3c-4950-b9ca-39597cad9934_1532x988.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2BEz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b81c0f-2c3c-4950-b9ca-39597cad9934_1532x988.png" width="1456" height="939" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/98b81c0f-2c3c-4950-b9ca-39597cad9934_1532x988.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:939,&quot;width&quot;:1456,&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_!2BEz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b81c0f-2c3c-4950-b9ca-39597cad9934_1532x988.png 424w, https://substackcdn.com/image/fetch/$s_!2BEz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b81c0f-2c3c-4950-b9ca-39597cad9934_1532x988.png 848w, https://substackcdn.com/image/fetch/$s_!2BEz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b81c0f-2c3c-4950-b9ca-39597cad9934_1532x988.png 1272w, https://substackcdn.com/image/fetch/$s_!2BEz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b81c0f-2c3c-4950-b9ca-39597cad9934_1532x988.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>Introducing circular dependencies is risky, and the AWS team chose not to do so</em></figcaption></figure></div><p><strong>Instead, the AWS team solved the locking problem in a clever way by using Route 53 as the database for optimistic locking. </strong>As Senior Principal Engineer Craig Howard <a href="https://youtu.be/YZUNNzLDWb8?si=5J19BCNKKXCiW1zu&amp;t=1284">explains</a>:</p><blockquote><p>&#8220;We didn&#8217;t want to add any other dependencies [to DNS Enactors]. Right now, all we depend on is the DNS Plan, and Route 53 (Amazon&#8217;s DNS service.) Can we use Route 53 to create a lock? Well, you can!</p><p>You create a TXT record, and the existence of that TXT record indicates who the holder of the lock is. The value of the text record is the host name of the lock holder, and then you put the <a href="https://en.wikipedia.org/wiki/Epoch_(computing)">epoch</a> [length of time] in seconds for how long this lock is alive for.&#8221;</p></blockquote><p>The AWS team used the transactional characteristic of Route 53: the Route 53 control plane ensures that &#8220;CREATE&#8221; and &#8220;DELETE&#8221; operations for TXT are transactional &#8211; they either succeed or fail.</p><p>So, this is how a lock is created:</p><p>CREATE &#8220;lock.example.com&#8221; TXT &#8220;&lt;hostname&gt; &lt;epoch&gt;&#8221;</p><p>As lock creation is transactional, whenever a DNS Enactor wants to create a <em>new</em> lock for its own use, it first deletes the old lock because it can be certain that lock creation /deletion is transactional. Then it creates the new lock:</p><p>DELETE &#8220;lock.example.com&#8221; TXT &#8220;&lt;hostname&gt; &lt;old epoch&gt;&#8221;<br>CREATE &#8220;lock.example.com&#8221; TXT &#8220;&lt;hostname&gt; &lt;new epoch&gt;&#8221;<br>  // Insert updated Route 53 DNS records</p><p><strong>Lock contention is what started the outage. </strong>In this case, one Enactor was very unlucky and failed to gain a lock several times in succession. At that point, the plan it is trying to install is older than anyone had ever envisioned. By the time this &#8220;unlucky&#8221; Enactor gains the lock, an up-to-date Enactor takes over and its &#8220;record clean-up&#8221; workflow detects a <em>very</em> old plan and deletes it. This was an older plan than the team expected.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7-Pp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F068cdd12-05c3-4690-ac5d-b2f86134bd13_712x368.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7-Pp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F068cdd12-05c3-4690-ac5d-b2f86134bd13_712x368.png 424w, https://substackcdn.com/image/fetch/$s_!7-Pp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F068cdd12-05c3-4690-ac5d-b2f86134bd13_712x368.png 848w, https://substackcdn.com/image/fetch/$s_!7-Pp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F068cdd12-05c3-4690-ac5d-b2f86134bd13_712x368.png 1272w, https://substackcdn.com/image/fetch/$s_!7-Pp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F068cdd12-05c3-4690-ac5d-b2f86134bd13_712x368.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7-Pp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F068cdd12-05c3-4690-ac5d-b2f86134bd13_712x368.png" width="712" height="368" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/068cdd12-05c3-4690-ac5d-b2f86134bd13_712x368.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:368,&quot;width&quot;:712,&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_!7-Pp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F068cdd12-05c3-4690-ac5d-b2f86134bd13_712x368.png 424w, https://substackcdn.com/image/fetch/$s_!7-Pp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F068cdd12-05c3-4690-ac5d-b2f86134bd13_712x368.png 848w, https://substackcdn.com/image/fetch/$s_!7-Pp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F068cdd12-05c3-4690-ac5d-b2f86134bd13_712x368.png 1272w, https://substackcdn.com/image/fetch/$s_!7-Pp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F068cdd12-05c3-4690-ac5d-b2f86134bd13_712x368.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>Unexpected lock contention: one unlucky Enactor failed to get the lock for ages. When it did, its DNS plan was further behind than expected. Source: <a href="https://youtu.be/YZUNNzLDWb8?si=5J19BCNKKXCiW1zu&amp;t=1284">Craig Howard / AWS</a></em></figcaption></figure></div><p>Craig explains how this strange race condition played out <a href="https://youtu.be/YZUNNzLDWb8?si=5J19BCNKKXCiW1zu&amp;t=1284">in this re:Invent talk</a>, shared earlier this week.</p><p><strong>What started the outage? </strong>As the team will later learn, the cause of the event is an edge case bug in how the three Enactors interact. They are designed to operate independently for resilience, with each Enactor optimistically taking a lock on the DNS zone, making their changes, and releasing the lock. If an Enactor fails to obtain a lock, it backs off and then tries again later.</p><h2>4. Oncall tooling &amp; outage coordination at Amazon</h2><p>Let&#8217;s hit pause on the incident mitigation to look into some unique parts of Amazon&#8217;s oncall process.</p>
      <p>
          <a href="https://newsletter.pragmaticengineer.com/p/how-aws-deals-with-a-major-outage">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Frictionless: why great developer experience can help teams win in the ‘AI age’]]></title><description><![CDATA[Exclusive excerpts from the newly-released book &#8216;Frictionless&#8217;, by Nicole Forsgren and Abi Noda.]]></description><link>https://newsletter.pragmaticengineer.com/p/frictionless-why-great-developer</link><guid isPermaLink="false">https://newsletter.pragmaticengineer.com/p/frictionless-why-great-developer</guid><dc:creator><![CDATA[Gergely Orosz]]></dc:creator><pubDate>Wed, 10 Dec 2025 16:43:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!NYjO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F833e5a4f-29ac-4c27-8a3a-e4a82bdf03ea_1600x1200.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hi, this is Gergely with a bonus, free issue of the Pragmatic Engineer Newsletter. In every issue, I cover Big Tech and startups through the lens of senior engineers and engineering leaders. If you&#8217;ve been forwarded this email, you can <a href="https://newsletter.pragmaticengineer.com/about?ref=blog.pragmaticengineer.com">subscribe here</a>.</em></p><p>Begin researching developer productivity, and you&#8217;re likely to soon encounter the work of Nicole Forsgren, as lead author of the best-selling book <em><a href="https://itrevolution.com/product/accelerate/">Accelerate</a></em>, and creator of the widely-adopted <a href="https://dora.dev/">DORA</a> and <a href="https://queue.acm.org/detail.cfm?id=3454124">SPACE</a> developer productivity frameworks. And, beyond SPACE is the <a href="https://newsletter.pragmaticengineer.com/p/developer-productivity-a-new-framework">DevEx framework</a> for productivity measurement, created by Abi Noda in collaboration with Nicole.</p><p>When I heard that the pair&#8217;s work together has continued in a new book about developer experience, I wanted to know more, and had the chance to sit down for a conversation about this big project of theirs.</p><p><em><a href="https://developerexperiencebook.com/">Frictionless</a></em> was released two weeks ago, and Nicole and Noda have been nice enough to share an excerpt from their new title with readers of the Pragmatic Engineer, below.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NYjO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F833e5a4f-29ac-4c27-8a3a-e4a82bdf03ea_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NYjO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F833e5a4f-29ac-4c27-8a3a-e4a82bdf03ea_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NYjO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F833e5a4f-29ac-4c27-8a3a-e4a82bdf03ea_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NYjO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F833e5a4f-29ac-4c27-8a3a-e4a82bdf03ea_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NYjO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F833e5a4f-29ac-4c27-8a3a-e4a82bdf03ea_1600x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NYjO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F833e5a4f-29ac-4c27-8a3a-e4a82bdf03ea_1600x1200.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/833e5a4f-29ac-4c27-8a3a-e4a82bdf03ea_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NYjO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F833e5a4f-29ac-4c27-8a3a-e4a82bdf03ea_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NYjO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F833e5a4f-29ac-4c27-8a3a-e4a82bdf03ea_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NYjO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F833e5a4f-29ac-4c27-8a3a-e4a82bdf03ea_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NYjO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F833e5a4f-29ac-4c27-8a3a-e4a82bdf03ea_1600x1200.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>My copy of <a href="https://developerexperiencebook.com/">Frictionless</a></em></figcaption></figure></div><p>The back cover of <em>Frictionless</em> reads:</p><blockquote><p>&#8220;<strong>AI can generate code in minutes &#8212; so why does shipping software still take forever?</strong></p><p>The answer is friction: the invisible barriers that turn quick wins into endless delays. While your competitors ship daily updates, your developers burn out fighting broken tools instead of solving real problems&#8221;.</p></blockquote><p>Personally, the lack of impact by AI coding tools to date upon the speed of development and quality of software, is amusing to me. If I take the apps I use, websites I visit, and services I access via software, I don&#8217;t see signs of faster iteration, higher quality, and fewer bugs since AI started shaking up the tech industry. An exception might<em> </em>be AI labs that release new features at eye-catching speed, often faster than much nimbler startups, but it could be argued those begin as experimental features.</p><p>What I like about <em>Frictionless</em> is that it gives a step-by-step approach for <em>developers </em>to smooth their own workflows and be more productive. If it helps teams and companies to move faster and produce more and better software &#8211; this is a win for everyone!</p><p>This article begins with our conversation, followed by two excerpts from the new book. We cover:</p><ol><li><p><strong>How </strong><em><strong>Frictionless</strong></em><strong> relates to Accelerate, DORA, and SPACE. </strong>An obvious question, but I had to ask.</p></li><li><p><strong>Writing process.</strong> Frictionless took more than 3 years to write &#8211; including a &#8220;full rewrite&#8221;</p></li><li><p><strong>Making the business case to reduce developer friction.</strong> Excerpt from the new book, chapter 9.</p></li><li><p><strong>How AI changes (and doesn&#8217;t change) the metrics you need. </strong>Chapter 59 of the book.</p></li></ol><p><em>To hear more about developer productivity from Nicole, see <a href="https://newsletter.pragmaticengineer.com/p/developer-productivity-with-dr-nicole">this podcast episode with her in The Pragmatic Engineer Podcast.</a></em></p><p><em>My usual disclaimer: As with all my recommendations, I was not paid to recommend this book, and none of the links are affiliates. See <a href="https://blog.pragmaticengineer.com/ethics-statement/">my ethics statement</a> for more details.</em></p><h2>1. How <em>Frictionless</em> relates to Accelerate, DORA, and SPACE</h2><p><em>When developer productivity is discussed, your book <a href="https://itrevolution.com/product/accelerate/">Accelerate</a> often gets a mention. How does Frictionless relate to it &#8211; and what makes it different?</em></p><blockquote><p><strong>Nicole: </strong>&#8220;Great question! The two are complementary but different in their foundations. <em>Accelerate</em> distills years of research connecting software delivery performance to business outcomes&#8212;it tells you what matters and why, but leaves the how to the reader. <em>Frictionless</em> is built from years of hands-on work advising teams on DevEx improvements, and it&#8217;s designed to help you actually do the work.</p><p>Where <em>Accelerate</em> is research-backed insights, <em>Frictionless</em> is a practitioner&#8217;s guide. It gives you a seven-step process you can start wherever you are, plus organizational change frameworks, metrics guidance, and 100+ pages of workbooks. Many of the practices are informed by research, but the book is ultimately about what we&#8217;ve seen work in the real world when teams try to improve developer experience.</p><p><strong>So, if </strong><em><strong>Accelerate</strong></em><strong> is the &#8216;why,&#8217; </strong><em><strong>Frictionless</strong></em><strong> is the &#8216;how&#8217;&#8221;.</strong></p></blockquote><h3>DORA, SPACE and this book</h3><p><em>To what extent does the new book build upon the DORA and SPACE frameworks?</em></p><blockquote><p><strong>Nicole:</strong> &#8220;They&#8217;re all deeply connected, Frictionless is really the natural evolution of this work.</p><p>DORA and <em>Accelerate</em> was about improving software delivery through technical, cultural, and process changes. Yes, we focused on business outcomes, but a core goal was always to make work better for engineers. <em>Frictionless</em> extends that same idea: start by identifying inefficiencies in the system, talk to developers about where their work is difficult, and you can improve both business outcomes and developer experience.</p><p>SPACE gave us a framework for measuring complex work like software development. Measurement is critical to any DevEx initiative, and we dedicate a full chapter to how AI is changing what we need to measure and how we should think about metrics differently.</p><p>But here&#8217;s the key difference: <em>Frictionless</em> goes beyond measurement. Metrics alone don&#8217;t create change. You also need to sell the initiative to leadership, advocate for change across your organization, plan communications, manage organizational change&#8212;all the messy, human work of actually making improvements happen. That&#8217;s what this book is designed to help with&#8221;.</p></blockquote><h2>2. Writing Process</h2><p><em>It&#8217;s always interesting to learn what goes into writing a book. What made you both decide to take on this project?</em></p><blockquote><p><strong>Nicole: </strong>&#8220;This is a great question, since I didn&#8217;t think I would write <em>another</em> book. However, I realized a couple of things after talking to teams and leaders across many companies and industries: there was increased attention upon, and a push to improve, developer experience. Also, many questions and challenges were very similar: how do I start, how do I prioritize, and how do I convince the business that DevEx is important?&#8221;</p><p><strong>Abi: </strong>&#8220;Over the past several years, I&#8217;ve worked hands-on with Developer Productivity (DevProd) leaders at hundreds of organizations. The same questions and challenges came up repeatedly, so a book felt inevitable. When Nicole reached out about teaming up in 2022, it was a no-brainer to finally make it happen. As a fun fact, I bought the domain developerexperiencebook.com in February 2021 &#8211; so about a year before we started writing the book!&#8221;</p></blockquote><p><em>How long did the writing take?</em></p><blockquote><p><strong>Nicole: </strong>&#8220;The whole process took about 3.5 years, but it wasn&#8217;t linear. I had a false start where I&#8217;d written several thousand words and realized it was way too pedantic; basically a research book with chapters explaining methods, but nothing immediately actionable. I scrapped it and started over.</p><p>This was the point when I reached out to Abi. We&#8217;d written a couple of papers together before, and his work at DX was giving him incredible insights into the key challenges teams face, and what actually works to improve DevEx. The combination is perfect: I brought the frameworks and experience from working with teams, and he brought the frontline practitioner perspective and patterns he was seeing across hundreds of companies.</p><p>Together, we built something practical: the step-by-step process, the workbooks, the real-world examples. Much better than my first attempt!&#8221;</p></blockquote><p><em>Where did you get inspiration for the practices shared in the book?</em></p><blockquote><p><strong>Nicole: </strong>&#8220;Honestly, it all comes from actual work: collaborating or advising actual teams and actual DevEx improvement projects&#8221;.</p><p><strong>Abi: </strong>&#8220;As Nicole mentioned, we didn&#8217;t go reaching for ideas or conduct research specifically for the book. Everything we put into it comes directly from our existing research and practical experience&#8221;.</p></blockquote><p><em>What are your favorite parts of the book, and do any details stick out in particular?</em></p><blockquote><p><strong>Nicole:</strong> &#8220;I love the section on treating metrics like a product. But if I had to pick one story, it&#8217;s how Dave Anderson was able to drive improvements at Amazon. What made it stick with me was how he could influence real change without authority by sharing a dashboard&#8221;.</p></blockquote><p><em>Note from Gergely: longtime newsletter readers and podcast listeners may find Dave Anderson&#8217;s name familiar: he authored the popular guest post, <a href="https://newsletter.pragmaticengineer.com/p/a-day-in-the-life-of-a-senior-manager">A Day in the Life of a Senior Manager at Amazon</a>, and has been a guest on the<a href="https://newsletter.pragmaticengineer.com/p/working-at-amazon-as-a-software-engineer"> Pragmatic Engineer podcast</a>.</em></p><blockquote><p><strong>Abi: </strong>&#8220;Translating developer experience into business terms (Chapter 9) is a topic that&#8217;s especially meaningful to me. Developers &#8211; and most engineering leaders &#8211; instinctively understand how essential a strong developer experience is. But helping non-technical leaders see its strategic importance can be challenging.</p><p>In the chapter, we highlight the story of Mike Fisher, former CTO of Etsy, who led a transformative developer-experience initiative that not only accelerated engineering teams, but was backed by hard, quantifiable ROI&#8221;.</p></blockquote><p><em>What has the feedback about the book been like, so far?</em></p><blockquote><p><strong>Nicole:</strong> &#8220;It&#8217;s been really positive, overall. A lot of folks are finding ways to get unstuck, or engage with people at work in new ways. I&#8217;ve had a few folks insist the AI transformation will change everything, but the core of the book is really about how we build software, how to spot inefficiencies, and how to effect change.</p><p>And, as many of us are seeing, AI amplifies everything. Sometimes, it&#8217;s how much we can prototype and experiment, and other times, it&#8217;s our friction points and bottlenecks. So, while workflows may change, the fundamental importance of reducing friction doesn&#8217;t&#8221;.</p><p><strong>Abi:</strong> &#8220;Like shipping a product, putting a book out into the world is exciting and also nerve wracking! I&#8217;ve been grateful for all the support we&#8217;ve been receiving, as well as feedback.</p><p>I think this book lands at a critical moment for the industry. AI is creating enormous excitement and rapid change, and that makes the fundamentals of measurement and developer experience more important than ever&#8221;.</p></blockquote><div><hr></div><p><em>Frictionless </em>is organized into five parts:</p><ul><li><p>Part I: Understanding DevEx</p></li><li><p>Part II: The three essential parts of DevEx (feedback loops, flow state, cognitive load)</p></li><li><p>Part III: Making the business case [to invest in DevEx]</p></li><li><p>Part IV: Improving DevEx: a 7-step process</p></li><li><p>Part V: Evolving and sustaining DevEx</p></li></ul><p>With that, let&#8217;s jump into two full chapters of the book, from parts III and V.</p><p><em>The excerpts below are from Frictionless, by Nicole Forsgren and Abi Noda. Copyright &#169; 2025 by Nicole Forsgren, Abi Noda. Published by Shift Key Press. Used with permission.</em></p><h2>3. Making the business case to reduce developer friction</h2><p><em>Chapter 9 from Part III: Making the Business Case.</em></p><p>Understanding developer experience and its business impact is just the beginning. The real challenge is securing the resources and organizational support needed to make meaningful improvements. Most DevEx initiatives fail not because of poor technical execution, but because they can&#8217;t effectively communicate their value to decision-makers.</p><p>In this part, we explore how successful teams have translated developer pain points into compelling business cases that resonate with executives. You&#8217;ll learn how to connect DevEx improvements to financial outcomes, align with existing strategic priorities, and position your work as a solution to leadership&#8217;s most pressing concerns. These approaches are designed to be durable&#8212;while the specific tools and technologies you advocate for will evolve with AI and other innovations, the fundamental methods for investigating problems, gathering data, and communicating business value remain constant. Whether you&#8217;re seeking initial funding for DevEx improvements or defending existing investments, these chapters will show you proven approaches for building leadership support.</p><h3>Translate developer experience into business value</h3><p>C-suite executives speak the language of business outcomes.</p><p>While &#8220;improving developer satisfaction&#8221; or reducing lead times&#8221; might resonate with engineering leaders, executive decision-makers need to see clear connections to financial impact. Business leaders are evaluated on metrics like revenue growth, profitability, and market share&#8212;so your DevEx proposals must connect directly to these financial outcomes.</p><p>This doesn&#8217;t mean executives don&#8217;t care about developer well-being. Rather, they need to understand how developer experience investments translate to business results. This financial framing is crucial when selling your strategy (Step 5) and demonstrating value (Step 7).</p><p><strong>Talk about </strong><em><strong>recovering time</strong></em><strong>: Convert developer hours into dollar value.</strong> Developer time has clear financial value. You can:</p><ul><li><p>Measure hours spent on unnecessary toil or waiting for builds/tests.</p></li><li><p>Multiply this time by the fully loaded hourly cost of developers.</p></li><li><p>Present these savings as &#8220;recaptured productivity dollars&#8221; or &#8220;free headcount.&#8221;</p></li></ul><p>For example, if your team of 50 developers each wastes 5 hours weekly on build-related delays at a fully loaded cost of $100/hour, that&#8217;s $25,000 in weekly productivity losses&#8212;or $1.3 million annually.</p><p>Alternatively, express this as &#8220;free headcount,&#8221; for example, 50 developers &#215; 5 hours lost weekly = 250 total hours wasted. Based on a 40-hour workweek, that&#8217;s equivalent to gaining 6.25 additional developers without increasing your budget. This framing resonates particularly well when hiring freezes are in place or during tight labor markets. To safeguard your credibility, be sure to actually measure real, credible time savings.</p><p>The financial impact is substantial. When teams improve developer experience, those benefits compound. A $250,000 developer who recovers just 10 percent of their time by avoiding tooling friction represents $25,000 in reclaimed value. Multiply that across an entire engineering organization, and it&#8217;s equivalent to dozens or hundreds of &#8220;free&#8221; developers.</p><p>But the benefits don&#8217;t stop there&#8212;faster toolchains enable organizations to build, experiment, and iterate more rapidly, creating business value that can climb into the millions. And that&#8217;s before accounting for the compounding effects on delivery timelines, team morale, and customer satisfaction.</p><div><hr></div><h4>Etsy&#8217;s $2.5M DevEx investment: A business case in action</h4><p>As Etsy&#8217;s engineering team rapidly grew from 250 to nearly 1,000 developers, leadership recognized that productivity would suffer without investment in developer experience.</p><p>CTO Mike Fisher&#8217;s approach to securing buy-in was straightforward: Translate improvements into business language. Instead of explaining technical changes to deployment processes, he told executives the work would save 50 percent of engineering hours spent waiting for deployments&#8212;equivalent to a quarter of a full-time engineer&#8217;s salary. The result was an initiative that dedicated 20 percent of engineering capacity to improve DevEx in four key areas: Crafting products, developing and deploying, building with data, and reducing toil.</p><p><a href="https://getdx.com/blog/etsy-devex-initiative/">The initiative</a>, which took 18 months, was so successful that it led to ongoing investment in developer-experience work, integrated into Etsy&#8217;s standard operations. Their key insight: Scale people, process, and technology together, or productivity suffers regardless of growth.</p><div><hr></div><p><strong>Talk about </strong><em><strong>saving money</strong></em><strong>: Quantify cost savings</strong>. Improved developer experience delivers tangible cost savings that directly impact your financial statements. By enhancing automation, streamlining workflows, and eliminating redundancies, you can substantially reduce operational expenses.</p><p>For example, strategic DevEx investments can:</p><ul><li><p>Decrease vendor costs through process optimization and tool consolidation.</p></li><li><p>Reduce cloud computing expenses by improving test efficiency (eliminating redundant tests).</p></li><li><p>Lower infrastructure costs through optimized build processes that require less processing power.</p></li><li><p>Minimize expensive production incidents through better quality controls.</p></li></ul><p>When making your business case, focus on these hard cost savings with specific projections whenever possible. This includes both the immediate savings from reduced delivery costs&#8212;as developers ship features faster with less friction&#8212;and the long-term savings from improved talent retention. Executives respond strongly to initiatives that demonstrate clear paths to expense reduction while maintaining or improving output quality.</p><div><hr></div><h4>Strategic standardization: How Block delivered millions in savings</h4><p>Block is a leading fintech company made up of brands like Square, CashApp, and Tidal. Rather than pursuing standardization for its own sake, they centered their DevEx strategy on consolidating tools to create well-supported golden paths for developers.</p><p>When making their business case, Block&#8217;s team could have focused on abstract benefits such as developer satisfaction or code throughput. Instead, they focused on the dollar-impact that engineering friction and avoidable reliability incidents were having on the business..</p><p>The business-focused approach paid off. Their developer experience initiative was funded and delivered impressive results in 12 months. Thanks to investments in better developer environments, golden paths, and AI tooling, they saw millions of dollars in documented savings and double-digit improvements in developer satisfaction scores.</p><div><hr></div><p><strong>Talk about </strong><em><strong>making money</strong></em><strong>: Accelerating revenue through DevEx.</strong> While developer experience initiatives aren&#8217;t direct revenue generators, they significantly accelerate your existing revenue streams. For software-driven companies, revenue growth depends on five key factors:</p><ol><li><p>Feature velocity (how quickly new capabilities reach customers).</p></li><li><p>Feature quality (how well new capabilities meet customer needs).</p></li><li><p>Experimentation speed (how quickly you can test and iterate on new ideas).</p></li><li><p>Service reliability (how consistently your products perform).</p></li><li><p>Security posture (how well you protect customer data and trust).</p></li></ol><p>All five factors depend on effective developer workflows. Consider the AI transformation, where companies racing to integrate AI capabilities into their products are pursuing increased revenue, competitive advantage, and expanded market share. However, these AI features must be:</p><ul><li><p>Designed and coded.</p></li><li><p>Reviewed for quality.</p></li><li><p>Built and tested.</p></li><li><p>Integrated into existing systems and products.</p></li><li><p>Securely deployed.</p></li><li><p>Maintained and improved.</p></li></ul><p>When developers wrestle with suboptimal tools and fragmented processes, these technical bottlenecks become business problems. Your company faces delayed market entry, compromised quality, and security vulnerabilities&#8212;all directly hitting revenue.</p><p>Consider this: If competitors release AI features quarterly while your team needs six months due to workflow inefficiencies, you&#8217;re not just accumulating technical debt, you&#8217;re experiencing actual revenue losses and diminishing market relevance. Smart DevEx investments create a multiplier effect where your existing teams deliver more value faster, enhancing revenue streams and capturing market opportunities before competitors do.</p><div><hr></div><h4>Accelerating revenue growth: Capital One&#8217;s DevEx transformation</h4><p>Capital One dramatically transformed their market position by strategically investing in developer experience and cloud infrastructure.</p><p>Before their DevEx overhaul, launching new financial products took 6-9 months, limiting the company&#8217;s competitive agility. By standardizing development environments, implementing modern CI/CD pipelines, and embracing cloud-native technologies, Capital One slashed delivery times from months to weeks or days.</p><p>The business impact was fast and measurable. Faster deployment cycles meant Capital One could capture market opportunities before competitors, respond quickly to customer needs, and optimize revenue-generating features through rapid iteration.</p><p>Capital One secured executive buy-in by directly connecting their DevEx investments to accelerated time-to-market and customer acquisition&#8212;metrics that translate directly to revenue growth. Their story demonstrates how improving developer workflows isn&#8217;t just a technical win&#8212;it&#8217;s a powerful revenue accelerator.</p><div><hr></div><p><strong>Talk about </strong><em><strong>proven correlations</strong></em><strong>: Link technical metrics to business outcomes</strong>. Sometimes the most powerful business cases come from identifying correlations between technical metrics and business outcomes.</p><p>In <a href="http://www.cio.com/article/3832738/how-block-is-accelerating-engineering-velocity-through-developer-experience.html">How to Measure Anything</a>, Douglas Hubbard writes, &#8220;If you can correlate two things to each other, and then if you can correlate one of them to money, then you can express them both in terms of money.&#8221;</p><p>At eBay, a breakthrough analysis showed that every 10 millisecond improvement in page speed translated to millions of dollars in increased web purchases. This correlation transformed how the business viewed page speed&#8212;from a technical concern to a critical revenue driver deserving investment.</p><p>A specific example of this approach is the developer experience index (DXI), developed by DX. The DXI score is the average of 14 survey questions that ask developers about different aspects of their development process. By correlating this score against self-reported time loss, DX has found that each one-point gain in DXI score translates to saving 13 minutes per week per developer, equivalent to <a href="http://getdx.com/research/the-one-number-you-need-to-increase-roi-per-engineer/">10 hours annually</a>. This correlation allows organizations to predict financial impact from DevEx improvements.</p><p>You can apply this same approach to developer experience:</p><ul><li><p>Correlate developer satisfaction scores with reduced time-to-market.</p></li><li><p>Link build system reliability to fewer production incidents.</p></li><li><p>Connect onboarding experience improvements to faster new-hire productivity.</p></li></ul><p>However, be cautious of trying to tie a developer productivity metric straight to revenue&#8212;a common mistake in this space. DevEx leaders attempt this, they don&#8217;t know how to get started, and then they give up trying to convince their management of the value of their work.</p><h4>Storytelling matters more than the exact numbers</h4><p>When building your DevEx business case, perfect is the enemy of good. Many leaders get stuck trying to calculate perfectly precise ROI figures or collect perfect data. This perfectionism is rarely necessary.</p><p>In most situations, reasonably credible data is sufficient&#8212;what really matters is how you weave that data into a compelling narrative. While data points make good headlines or proof points, they need a clear, concise story to be meaningful to decision-makers.</p><p>Remember: Even the most impressive numbers rarely speak for themselves. Your presentation skills, narrative structure, and understanding of your audience&#8217;s priorities will ultimately determine whether your business case succeeds. We discuss this more in Step 5: Sell Your Strategy.</p><h2>4. How AI changes (and doesn&#8217;t change) the metrics you need</h2><p><em>The excerpt below is Chapter 59 from Part V: Evolving and Sustaining DevEx</em></p><p>AI changes what developers do every day, so your metrics need to change too.</p><p>The good news? The measurement fundamentals you just learned still apply. As AI tools become woven into daily development work, you&#8217;re probably wondering: &#8220;Do I need to throw out everything I know about measuring developer experience?&#8221; The short answer is no&#8212;but the longer answer is more interesting.</p><p><strong>The fundamentals still matter.</strong> The SPACE framework and DORA metrics remain relevant because developers still need fast builds, reliable deployments, good documentation, and strong collaboration&#8212;and AI often amplifies the pain of bad foundations rather than masking them. Flow and friction haven&#8217;t gone anywhere: Developers still need focus, and slow pipelines, flaky tests, and unclear ownership still break it. And while AI shifts what developers do, it doesn&#8217;t change their need for clarity, autonomy, mastery, and purpose.</p><div><hr></div><h4>Applying SPACE to AI-Augmented Development</h4><p>In Chapter 58, we introduced the SPACE framework as a way to balance your metrics across five dimensions. That framework remains just as valuable when measuring AI-augmented workflows&#8212;you just need to ask slightly different questions:</p><ul><li><p><strong>Satisfaction</strong>: How do developers feel about AI tools? Do the tools improve or frustrate their work experience? Are they satisfied with the quality of AI suggestions?</p></li><li><p><strong>Performance</strong>: Are outcomes improving with AI assistance? Track defect rates, feature completion times, and time-to-resolution for incidents.</p></li><li><p><strong>Activity</strong>: What are the AI usage patterns? Monitor suggestion acceptance rates, what types of work get delegated to AI, and where AI gets used most (tests, docs, debugging).</p></li><li><p><strong>Communication</strong>: How does AI affect collaboration? Are code reviews shifting from syntax to architecture? Are developers asking AI instead of peers? Is documentation improving or declining?</p></li><li><p><strong>Efficiency</strong>: Where does AI save time versus create overhead? Measure workflow changes, time saved on routine tasks, and friction from context gaps or validation effort.</p></li></ul><p>Consider adding a sixth dimension: Trust. How much do developers trust AI-generated code, comments, and recommendations? This affects both adoption patterns and the value teams ultimately derive from AI tools.</p><div><hr></div><p><strong>AI doesn&#8217;t just speed up existing work&#8212;it changes workflows</strong>. Developers aren&#8217;t just writing code; they&#8217;re reviewing, prompting, and steering AI. And here&#8217;s what most people miss: Most AI usage involves reasoning about information rather than generating it. Developers spend more time using AI to write summaries, compare alternatives, conduct smart searches, and synthesize research than generating code. This means existing metrics that capture time spent coding or lines of code written miss the bulk of AI-augmented work&#8212;the time spent crafting prompts, reviewing suggestions, and making decisions based on AI synthesis.</p><p>New metrics can help answer new, emerging questions. Track prompting efficiency&#8212;how many attempts developers need before getting a useful AI suggestion. Measure validation effort&#8212;the time spent reviewing and correcting AI-generated code, which reveals whether AI truly saves time or just shifts where developers spend it. And monitor trust calibration&#8212;when developers trust AI too much (shipping bugs) versus too little (wasting time double-checking correct code). These metrics reveal friction that traditional measures like commit frequency or lines changed simply can&#8217;t capture.</p><p>AI usage telemetry can reveal important patterns and changes in workflows. Capture what types of work developers do themselves versus what they hand off to AI agents&#8212;this shows where AI is valuable and may reveal new system blockers. Deep insights also come from watching how AI reshapes team dynamics: Are engineers asking AI instead of peers for help? Are code reviews shifting from syntax nitpicks to architecture discussions? Are new developers getting up to speed faster because AI explains your internal codebase?</p><p>Most importantly, collect this data thoughtfully. AI instrumentation typically involves much more detail than other methods. Aggregate at the team level rather than tracking individuals, be transparent about what you&#8217;re measuring and why, and work with HR and legal partners early to establish clear privacy boundaries. The goal is to improve developer experience, not create surveillance.</p><p>Your metrics product also needs to adapt. Create segmented views that compare AI and non-AI performance. Build feedback loops that reveal where AI adds the most value. And introduce visualizations that track how AI affects collaboration patterns.</p><div><hr></div><h4>Use AI to build your AI metrics</h4><p>There&#8217;s a helpful irony here: While AI changes what you need to measure, it can also help you build that measurement infrastructure faster.</p><p>Use AI coding assistants to:</p><ul><li><p>Generate data pipeline code for collecting AI telemetry</p></li><li><p>Create dashboard prototypes and visualizations</p></li><li><p>Write scripts to analyze prompt patterns and acceptance rates</p></li><li><p>Build data transformation logic for aggregating team-level metrics</p></li></ul><p>What once required weeks of custom development can now be scaffolded in hours. Just remember to validate AI-generated code carefully&#8212;especially for instrumentation that feeds critical decisions. And leverage AI for the scaffolding and boilerplate, while keeping human expertise focused on the measurement strategy and interpretation.</p><div><hr></div><p><strong>Mixed methods become even more important with AI</strong>. Logs tell you what AI suggested and what got accepted, but only surveys and interviews tell you why. Your telemetry might show developers rejecting 80% of AI suggestions for authentication code&#8212;but you need to talk to developers to learn whether that&#8217;s because AI hallucinates security vulnerabilities, doesn&#8217;t understand your internal frameworks, or because developers don&#8217;t trust it for security-critical work. The &#8220;what&#8221; reveals patterns; the &#8220;why&#8221; reveals the root cause and tells you what to fix.</p><p><strong>The shift from output to outcomes becomes critical.</strong> AI makes it painfully obvious that lines of code was always a bad metric&#8212;but more importantly, it forces us to connect our metrics to what actually matters. Developer productivity isn&#8217;t the goal; faster customer value delivery is. That means measuring problem-solving speed (time from idea to working solution), breadth of exploration (how many approaches developers can test), and cognitive load (whether AI helps or overwhelms). These outcome-focused metrics tell you what actually moves the needle on business value, not just code volume.</p><p><strong>Behind the scenes, your infrastructure needs to evolve&#8212;and not just for developer workflows.</strong> Traditional telemetry doesn&#8217;t capture AI interaction loops, so you need new instrumentation for prompting workflows, completions, and accept/reject events. These real-time metrics reveal patterns and friction that retrospective analysis can miss.</p><p>But don&#8217;t stop there&#8212;instrument agentic workflows too. Tracking what agents do reveals which tasks are best suited for automation and which require human judgment. It also shows how delegation to agents affects developers&#8217; mental models of the system: Does offloading routine tasks free developers to think architecturally, or does it create blind spots where they lose understanding of how things work?</p><p><strong>Start by auditing your existing metrics through an AI lens.</strong> Ask: &#8220;Does this metric still capture what we care about?&#8221; and &#8220;What important tasks, workflows, and feedback loops does our data miss?&#8221; Don&#8217;t throw everything out and don&#8217;t start over from scratch&#8212;add data that fills important gaps and helps you answer new questions.</p><p>Your metrics strategy should also anticipate questions stakeholders will ask about AI adoption: &#8220;Where is AI providing the most value?&#8221; &#8220;Are we seeing quality trade-offs?&#8221; &#8220;Which teams are benefiting most?&#8221; Your metrics should answer these, not just operational velocity questions. Having these insights ready builds confidence in your AI implementation strategy while helping teams make better decisions about where and how to leverage these tools.</p><p><strong>The bottom line: AI changes what you measure, but not why you measure it.</strong> You&#8217;re still trying to understand and improve developer experience&#8212;the SPACE framework still applies, as shown in the callout above. The fundamentals remain sound; you just need new instruments to capture the new reality.</p><p><em>End of excerpt.</em></p><h2>Takeaways</h2><p><em>Gergely, again.</em> Thanks to Nicole and Abi for talking with me, and sharing excerpts from <em>Frictionless</em>. You can buy the book <a href="https://developerexperiencebook.com/">here</a>, and <a href="https://developerexperiencebook.com/#workbook">download a free DevEx workbook</a> that accompanies the title.</p><p><a href="https://developerexperiencebook.com/">Get the book</a></p><p>Before AI tools started to spread, larger tech companies invested in developer experience. Amazon calls this area &#8220;builder experience&#8221;, Spotify uses &#8220;R&amp;D experience&#8221;, and other places use terms like &#8220;engineering experience&#8221;, or &#8220;maker experience&#8221; as per Frictionless.</p><p>With AI coding tools in use, there are expectations that productivity should increase for us devs &#8211; basically; assuming these AI tools are any good, products should be built faster, and iteration speed should improve. But we seem to be going back to basics in figuring out why this happens at some companies, but not at others.</p><p>Engineering leaders finally have a case for the resources of time and money to reduce/remove processes, improve tooling, and make developer experience better at both small and large teams.</p><p>I like Frictionless because it doesn&#8217;t talk about how to use AI differently or &#8220;better&#8221;: instead, it provides suggestions about removing annoying friction from devs&#8217; day-to-day lives.</p><p>Thanks, Nicole and Abi for writing this book; hopefully it makes the case easier for reducing developer friction at your workplace, too!</p><p>For more reading on developer productivity, check out these deepdives:</p><ul><li><p><a href="https://newsletter.pragmaticengineer.com/p/how-tech-companies-measure-the-impact-of-ai">How tech companies measure the impact of AI on software development</a></p></li><li><p><a href="https://newsletter.pragmaticengineer.com/p/measuring-developer-productivity-bae">Measuring developer productivity: 17 real-world examples</a>. Examples from Google, LinkedIn, Peloton and other companies</p></li><li><p><a href="https://newsletter.pragmaticengineer.com/p/uber-eng-productivity">How Uber measures developer productivity</a></p></li><li><p><a href="https://newsletter.pragmaticengineer.com/p/linkedin-engineering-efficiency">Measuring engineering efficiency at LinkedIn</a></p></li><li><p><a href="https://newsletter.pragmaticengineer.com/p/developer-productivity-a-new-framework">DevEx framework: an overview</a></p></li></ul>]]></content:encoded></item></channel></rss>