<?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[Software at Scale]]></title><description><![CDATA[Discussions on running software systems, teams, and products.]]></description><link>https://www.softwareatscale.dev</link><image><url>https://substackcdn.com/image/fetch/$s_!NNuR!,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%2F19cc5488-ca75-4af8-a903-6971f778093a_1000x1000.png</url><title>Software at Scale</title><link>https://www.softwareatscale.dev</link></image><generator>Substack</generator><lastBuildDate>Sat, 11 Apr 2026 05:59:02 GMT</lastBuildDate><atom:link href="https://www.softwareatscale.dev/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Utsav Shah]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[reliability@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[reliability@substack.com]]></itunes:email><itunes:name><![CDATA[Utsav Shah]]></itunes:name></itunes:owner><itunes:author><![CDATA[Utsav Shah]]></itunes:author><googleplay:owner><![CDATA[reliability@substack.com]]></googleplay:owner><googleplay:email><![CDATA[reliability@substack.com]]></googleplay:email><googleplay:author><![CDATA[Utsav Shah]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Software at Scale 60 - Data Platforms with Aravind Suresh]]></title><description><![CDATA[Aravind was a Staff Software Engineer at Uber, and currently works at OpenAI.]]></description><link>https://www.softwareatscale.dev/p/software-at-scale-60-data-platforms</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/software-at-scale-60-data-platforms</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Mon, 05 Aug 2024 17:58:51 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/147242871/a34985326abfb4482fd7a16943669365.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p><a href="https://www.linkedin.com/in/aravind0suresh/">Aravind</a> was a Staff Software Engineer at Uber, and currently works at OpenAI.</p><p><a href="https://podcasts.apple.com/us/podcast/software-at-scale/id1543617436">Apple Podcasts</a>&nbsp;|&nbsp;<a href="https://open.spotify.com/show/7eGnnZnfb3mOGTqWR4gTjK?si=DMsJIWg3QjiiJS65A1nEbQ">Spotify</a>&nbsp;|&nbsp;<a href="https://podcasts.google.com/feed/aHR0cHM6Ly9yZWxpYWJpbGl0eS5zdWJzdGFjay5jb20vZmVlZC8">Google Podcasts</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_!ThMA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff825d14b-6a70-4b92-bc96-b68f06ab8fe6_800x800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ThMA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff825d14b-6a70-4b92-bc96-b68f06ab8fe6_800x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ThMA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff825d14b-6a70-4b92-bc96-b68f06ab8fe6_800x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ThMA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff825d14b-6a70-4b92-bc96-b68f06ab8fe6_800x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ThMA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff825d14b-6a70-4b92-bc96-b68f06ab8fe6_800x800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ThMA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff825d14b-6a70-4b92-bc96-b68f06ab8fe6_800x800.jpeg" width="800" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f825d14b-6a70-4b92-bc96-b68f06ab8fe6_800x800.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Profile photo of Aravind Suresh&quot;,&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="Profile photo of Aravind Suresh" title="Profile photo of Aravind Suresh" srcset="https://substackcdn.com/image/fetch/$s_!ThMA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff825d14b-6a70-4b92-bc96-b68f06ab8fe6_800x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ThMA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff825d14b-6a70-4b92-bc96-b68f06ab8fe6_800x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ThMA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff825d14b-6a70-4b92-bc96-b68f06ab8fe6_800x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ThMA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff825d14b-6a70-4b92-bc96-b68f06ab8fe6_800x800.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Edited Transcript</h2><p><strong>Can you tell us about the scale of data Uber was dealing with when you joined in 2018, and how it evolved?</strong></p><p>When I joined Uber in mid-2018, we were handling a few petabytes of data. The company was going through a significant scaling journey, both in terms of launching in new cities and the corresponding increase in data volume. By the time I left, our data had grown to over an exabyte. To put it in perspective, the amount of data grew by a factor of about 20 in just a three to four-year period.</p><p>Currently, Uber ingests roughly a petabyte of data daily. This includes some replication, but it's still an enormous amount. About 60-70% of this is raw data, coming directly from online systems or message buses. The rest is derived data sets and model data sets built on top of the raw data.</p><p><strong>That's an incredible amount of data. What kinds of insights and decisions does this enable for Uber?</strong></p><p>This scale of data enables a wide range of complex analytics and data-driven decisions. For instance, we can analyze how many concurrent trips we're handling throughout the year globally. This is crucial for determining how many workers and CPUs we need running at any given time to serve trips worldwide.</p><p>We can also identify trends like the fastest growing cities or seasonal patterns in traffic. The vast amount of historical data allows us to make more accurate predictions and spot long-term trends that might not be visible in shorter time frames.</p><p>Another key use is identifying anomalous user patterns. For example, we can detect potentially fraudulent activities like a single user account logging in from multiple locations across the globe. We can also analyze user behavior patterns, such as which cities have higher rates of trip cancellations compared to completed trips.</p><p>These insights don't just inform day-to-day operations; they can lead to key product decisions. For instance, by plotting heat maps of trip coordinates over a year, we could see overlapping patterns that eventually led to the concept of Uber Pool.</p><p><strong>How does Uber manage real-time versus batch data processing, and what are the trade-offs?</strong></p><p>We use both offline (batch) and online (real-time) data processing systems, each optimized for different use cases. For real-time analytics, we use tools like Apache Pinot. These systems are optimized for low latency and quick response times, which is crucial for certain applications.</p><p>For example, our restaurant manager system uses Pinot to provide near-real-time insights. Data flows from the serving stack to Kafka, then to Pinot, where it can be queried quickly. This allows for rapid decision-making based on very recent data.</p><p>On the other hand, our offline flow uses the Hadoop stack for batch processing. This is where we store and process the bulk of our historical data. It's optimized for throughput &#8211; processing large amounts of data over time.</p><p>The trade-off is that real-time systems are generally 10 to 100 times more expensive than batch systems. They require careful tuning of indexes and partitioning to work efficiently. However, they enable us to answer queries in milliseconds or seconds, whereas batch jobs might take minutes or hours.</p><p>The choice between batch and real-time depends on the specific use case. We always ask ourselves: Does this really need to be real-time, or can it be done in batch? The answer to this question goes a long way in deciding which approach to use and in building maintainable systems.</p><p><strong>What challenges come with maintaining such large-scale data systems, especially as they mature?</strong></p><p>As data systems mature, we face a range of challenges beyond just handling the growing volume of data. One major challenge is the need for additional tools and systems to manage the complexity.</p><p>For instance, we needed to build tools for data discovery. When you have thousands of tables and hundreds of users, you need a way for people to find the right data for their needs. We built a tool called Data Book at Uber to solve this problem.</p><p>Governance and compliance are also huge challenges. When you're dealing with sensitive customer data, you need robust systems to enforce data retention policies and handle data deletion requests. This is particularly challenging in a distributed system where data might be replicated across multiple tables and derived data sets.</p><p>We built an in-house lineage system to track which workloads derive from what data. This is crucial for tasks like deleting specific data across the entire system. It's not just about deleting from one table &#8211; you need to track down and update all derived data sets as well.</p><p>Data deletion itself is a complex process. Because most files in the batch world are kept immutable for efficiency, deleting data often means rewriting entire files. We have to batch these operations and perform them carefully to maintain system performance.</p><p>Cost optimization is an ongoing challenge. We're constantly looking for ways to make our systems more efficient, whether that's by optimizing our storage formats, improving our query performance, or finding better ways to manage our compute resources.</p><p><strong>How do you see the future of data infrastructure evolving, especially with recent AI advancements?</strong></p><p>The rise of AI and particularly generative AI is opening up new dimensions in data infrastructure. One area we're seeing a lot of activity in is vector databases and semantic search capabilities. Traditional keyword-based search is being supplemented or replaced by embedding-based semantic search, which requires new types of databases and indexing strategies.</p><p>We're also seeing increased demand for real-time processing. As AI models become more integrated into production systems, there's a need to handle more GPUs in the serving flow, which presents its own set of challenges.</p><p>Another interesting trend is the convergence of traditional data analytics with AI workloads. We're starting to see use cases where people want to perform complex queries that involve both structured data analytics and AI model inference.</p><p>Overall, I think we're moving towards more integrated, real-time, and AI-aware data infrastructure. The challenge will be balancing the need for advanced capabilities with concerns around cost, efficiency, and maintainability.</p>]]></content:encoded></item><item><title><![CDATA[How Software Infrastructure affects Sales]]></title><description><![CDATA[Notes for CTOs and Infrastructure Leads of B2B products]]></description><link>https://www.softwareatscale.dev/p/how-software-infrastructure-affects</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/how-software-infrastructure-affects</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Mon, 27 May 2024 16:40:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Nb3p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe46efe51-4f9b-4668-a84a-eff80a22e0f5_1600x1386.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It&#8217;s easy to assume that software infrastructure for B2B products has little impact on sales. However, choices like hosting on AWS or Azure, or using Kubernetes, can significantly influence positioning, marketing and sales. Here&#8217;s a breakdown of some key implications, ordered by least to most surprising.</p><h4><strong>What is Software Infrastructure?</strong></h4><p>In this context, software infrastructure includes hosting options (self-hosted, on-prem, cloud providers), infrastructure components (database services like RDS; container orchestration like Fargate, Kubernetes; message brokers like Kafka), and architectural choices (e.g., single-tenant deployments).</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software at Scale! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2><strong>Security</strong></h2><p>As a rule of thumb, the security requirements of a prospect are proportional to their headcount, the criticality of data being stored by the product, and the riskiness of the capabilities of the product. For example, a prospect with 1,000 employees will likely have a stricter security review process compared to a prospect with 100 employees.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>&nbsp;</p><p>Security teams weigh the value of a product along with the risk introduced by using it, therefore reduction in perceived risk may directly improve sales. Security features might also be useful marketing collateral for security-focused products. We focus this section on a key architectural decision that impacts security.</p><h3><strong>Tenancy</strong></h3><p>Software tenancy relates to how co-located customer data is within the application. For example, single-tenant applications tend to have some architectural separation between data between two customers. Anecdotally, security-conscious prospects in the procurement process often include questions about tenant isolation controls, and many products market tenancy controls to appeal to security-conscious buyers.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Nb3p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe46efe51-4f9b-4668-a84a-eff80a22e0f5_1600x1386.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Nb3p!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe46efe51-4f9b-4668-a84a-eff80a22e0f5_1600x1386.png 424w, https://substackcdn.com/image/fetch/$s_!Nb3p!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe46efe51-4f9b-4668-a84a-eff80a22e0f5_1600x1386.png 848w, https://substackcdn.com/image/fetch/$s_!Nb3p!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe46efe51-4f9b-4668-a84a-eff80a22e0f5_1600x1386.png 1272w, https://substackcdn.com/image/fetch/$s_!Nb3p!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe46efe51-4f9b-4668-a84a-eff80a22e0f5_1600x1386.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Nb3p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe46efe51-4f9b-4668-a84a-eff80a22e0f5_1600x1386.png" width="1456" height="1261" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e46efe51-4f9b-4668-a84a-eff80a22e0f5_1600x1386.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1261,&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_!Nb3p!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe46efe51-4f9b-4668-a84a-eff80a22e0f5_1600x1386.png 424w, https://substackcdn.com/image/fetch/$s_!Nb3p!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe46efe51-4f9b-4668-a84a-eff80a22e0f5_1600x1386.png 848w, https://substackcdn.com/image/fetch/$s_!Nb3p!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe46efe51-4f9b-4668-a84a-eff80a22e0f5_1600x1386.png 1272w, https://substackcdn.com/image/fetch/$s_!Nb3p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe46efe51-4f9b-4668-a84a-eff80a22e0f5_1600x1386.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><h4><strong>Multi-Tenancy</strong></h4><p>Most SaaS applications are multi-tenant, which implies the same application and data-storage is shared across multiple customers. That doesn't completely preclude enterprise sales: Large-scale products like AWS S3, <a href="https://dropbox.tech/infrastructure/atlas--our-journey-from-a-python-monolith-to-a-managed-platform">Dropbox</a> and Box have multi-tenant architectures, and are still used by sensitive enterprise customers, since prospects have developed trust over time.</p><p>Enterprises are concerned for the right reasons: multi-tenant applications are,<a href="https://openai.com/index/march-20-chatgpt-outage/"> unsurprisingly</a>, prone to cross-tenant data leakages. These are tricky problems to prevent due to their heterogeneous nature.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8ZiL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6ddd3aa-2b5b-463d-a1e4-0443c63c51ae_1210x450.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8ZiL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6ddd3aa-2b5b-463d-a1e4-0443c63c51ae_1210x450.png 424w, https://substackcdn.com/image/fetch/$s_!8ZiL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6ddd3aa-2b5b-463d-a1e4-0443c63c51ae_1210x450.png 848w, https://substackcdn.com/image/fetch/$s_!8ZiL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6ddd3aa-2b5b-463d-a1e4-0443c63c51ae_1210x450.png 1272w, https://substackcdn.com/image/fetch/$s_!8ZiL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6ddd3aa-2b5b-463d-a1e4-0443c63c51ae_1210x450.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8ZiL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6ddd3aa-2b5b-463d-a1e4-0443c63c51ae_1210x450.png" width="1210" height="450" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d6ddd3aa-2b5b-463d-a1e4-0443c63c51ae_1210x450.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:450,&quot;width&quot;:1210,&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_!8ZiL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6ddd3aa-2b5b-463d-a1e4-0443c63c51ae_1210x450.png 424w, https://substackcdn.com/image/fetch/$s_!8ZiL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6ddd3aa-2b5b-463d-a1e4-0443c63c51ae_1210x450.png 848w, https://substackcdn.com/image/fetch/$s_!8ZiL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6ddd3aa-2b5b-463d-a1e4-0443c63c51ae_1210x450.png 1272w, https://substackcdn.com/image/fetch/$s_!8ZiL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6ddd3aa-2b5b-463d-a1e4-0443c63c51ae_1210x450.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">ChatGPT cross-tenant data leak</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uOCm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F510ac4e9-161a-4280-96a4-1f77f0fc1af2_1366x234.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uOCm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F510ac4e9-161a-4280-96a4-1f77f0fc1af2_1366x234.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uOCm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F510ac4e9-161a-4280-96a4-1f77f0fc1af2_1366x234.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uOCm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F510ac4e9-161a-4280-96a4-1f77f0fc1af2_1366x234.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uOCm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F510ac4e9-161a-4280-96a4-1f77f0fc1af2_1366x234.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uOCm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F510ac4e9-161a-4280-96a4-1f77f0fc1af2_1366x234.jpeg" width="1366" height="234" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/510ac4e9-161a-4280-96a4-1f77f0fc1af2_1366x234.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:234,&quot;width&quot;:1366,&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_!uOCm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F510ac4e9-161a-4280-96a4-1f77f0fc1af2_1366x234.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uOCm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F510ac4e9-161a-4280-96a4-1f77f0fc1af2_1366x234.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uOCm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F510ac4e9-161a-4280-96a4-1f77f0fc1af2_1366x234.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uOCm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F510ac4e9-161a-4280-96a4-1f77f0fc1af2_1366x234.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Azure potential cross-tenant data leak</figcaption></figure></div><h4><strong>Single-Tenancy</strong></h4><p>Some products claim to have better data isolation via a single-tenant architecture. Data is still controlled by the product, but the architecture separates customer data at some layer of the stack, so code bugs are less likely to lead to cross-tenant data leaks. For example, <a href="https://material.security/deployment-and-security">Material Security</a> separates data and application at the Google Cloud Platform (GCP) project layer, and <a href="https://community.pinecone.io/t/clarification-on-how-namespaces-work/609">Pinecone</a> and <a href="https://turso.tech/database-per-tenant">Turso</a> are database platforms that offer single-tenancy as a first-class construct.</p><p>Single-tenant architectures tend to have higher infrastructure costs as well as developer productivity slowdowns. For example, managing a database per customer is generally more expensive than managing a single larger multi-tenant database. There&#8217;s also additional tooling required to manage accounts or databases across separated tenants. This is a very common problem - before public cloud, many B2B software products were deployed on-premise, and to support cloud versions, the shortest path often involved taking on-premise software and running it single-tenant in the cloud. In conversations with Chief Technology Officers (CTOs), I&#8217;ve noticed several such products aim to migrate to multi-tenant architectures as the most feasible route to reduce infrastructure costs and maintenance burdens.</p><p>But there has been significant recent innovation to offset single-tenant costs. For example, a combination of server-less architectures for application logic, along with smaller, cheaper databases like <a href="https://turso.tech/">SQLite</a> rewired for single-tenant production storage may make it palatable to run single-tenant architectures efficiently.</p><h4><strong>Cloud-Prem + Control/Data-Plane Cloud Split</strong></h4><p>Some products like Planetscale,<a href="https://www.gitpod.io/blog/introducing-gitpod-enterprise"> GitPod</a> and<a href="https://hasura.io/docs/3.0/glossary/#hasura-data-delivery-network-ddn"> Hasura</a> have split control and data-planes, where data resides in customer cloud accounts, but control and configuration management is in the product&#8217;s cloud account. </p><p>In this approach, the control plane is deployed as a traditional SaaS application to the product&#8217;s cloud, but it communicates to the data plane - a smaller, well-scoped system in the customer&#8217;s cloud accounts, which is where the customer&#8217;s data is, or where the risky actions take place. The communication between the control and data plane is secured by methods like <a href="https://www.cloudflare.com/learning/access-management/what-is-mutual-tls/#:~:text=Mutual%20TLS%2C%20or%20mTLS%20for,have%20the%20correct%20private%20key.">mTLS</a> because both the server and the client need to know and trust each other.</p><p>This provides both security and developer productivity (therefore product) improvements. For example, security teams can fully audit access to their data, while products can quickly iterate on feature-heavy control-planes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5siK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ad9592-e272-4f35-8a3b-d98526cb540b_1456x560.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5siK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ad9592-e272-4f35-8a3b-d98526cb540b_1456x560.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5siK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ad9592-e272-4f35-8a3b-d98526cb540b_1456x560.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5siK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ad9592-e272-4f35-8a3b-d98526cb540b_1456x560.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5siK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ad9592-e272-4f35-8a3b-d98526cb540b_1456x560.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5siK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ad9592-e272-4f35-8a3b-d98526cb540b_1456x560.jpeg" width="1456" height="560" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b8ad9592-e272-4f35-8a3b-d98526cb540b_1456x560.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:560,&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_!5siK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ad9592-e272-4f35-8a3b-d98526cb540b_1456x560.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5siK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ad9592-e272-4f35-8a3b-d98526cb540b_1456x560.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5siK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ad9592-e272-4f35-8a3b-d98526cb540b_1456x560.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5siK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ad9592-e272-4f35-8a3b-d98526cb540b_1456x560.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">cloud-prem + control/data plane split</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_!hT-r!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4bd6c2-cf9d-416b-89bd-d3c66329544c_1512x1120.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hT-r!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4bd6c2-cf9d-416b-89bd-d3c66329544c_1512x1120.png 424w, https://substackcdn.com/image/fetch/$s_!hT-r!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4bd6c2-cf9d-416b-89bd-d3c66329544c_1512x1120.png 848w, https://substackcdn.com/image/fetch/$s_!hT-r!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4bd6c2-cf9d-416b-89bd-d3c66329544c_1512x1120.png 1272w, https://substackcdn.com/image/fetch/$s_!hT-r!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4bd6c2-cf9d-416b-89bd-d3c66329544c_1512x1120.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hT-r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4bd6c2-cf9d-416b-89bd-d3c66329544c_1512x1120.png" width="1456" height="1079" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cb4bd6c2-cf9d-416b-89bd-d3c66329544c_1512x1120.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1079,&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_!hT-r!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4bd6c2-cf9d-416b-89bd-d3c66329544c_1512x1120.png 424w, https://substackcdn.com/image/fetch/$s_!hT-r!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4bd6c2-cf9d-416b-89bd-d3c66329544c_1512x1120.png 848w, https://substackcdn.com/image/fetch/$s_!hT-r!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4bd6c2-cf9d-416b-89bd-d3c66329544c_1512x1120.png 1272w, https://substackcdn.com/image/fetch/$s_!hT-r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4bd6c2-cf9d-416b-89bd-d3c66329544c_1512x1120.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">An example control plane / data plane split architecture. The control plane is in Planetscale&#8217;s AWS account, and the data plane is in the customer&#8217;s AWS account.</figcaption></figure></div><p>However, this may not be sufficient for some security teams, as the product still controls the customer&#8217;s cloud account.</p><h4><strong>On-Prem / Customer Managed Cloud Accounts</strong></h4><p>For even more security-conscious customers, products may be hosted on non-cloud servers, or customers-managed cloud accounts. Many regulated organizations, especially in finance and healthcare, tend to require this setup for  complete control - a security vulnerability in the product doesn&#8217;t matter, as long as it&#8217;s correctly air-gapped by the customer.</p><p>There is a significant tradeoff here: these have the highest maintenance burden. For example, Gitpod gave up<a href="https://www.gitpod.io/blog/building-for-the-long-run"> seven-figure revenue</a> by no longer supporting their on-prem product due to high installation and maintenance costs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iOIW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e49201-15e8-40a4-991d-cab1700d2ae2_1360x342.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iOIW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e49201-15e8-40a4-991d-cab1700d2ae2_1360x342.jpeg 424w, https://substackcdn.com/image/fetch/$s_!iOIW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e49201-15e8-40a4-991d-cab1700d2ae2_1360x342.jpeg 848w, https://substackcdn.com/image/fetch/$s_!iOIW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e49201-15e8-40a4-991d-cab1700d2ae2_1360x342.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!iOIW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e49201-15e8-40a4-991d-cab1700d2ae2_1360x342.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iOIW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e49201-15e8-40a4-991d-cab1700d2ae2_1360x342.jpeg" width="1360" height="342" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/04e49201-15e8-40a4-991d-cab1700d2ae2_1360x342.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:342,&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_!iOIW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e49201-15e8-40a4-991d-cab1700d2ae2_1360x342.jpeg 424w, https://substackcdn.com/image/fetch/$s_!iOIW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e49201-15e8-40a4-991d-cab1700d2ae2_1360x342.jpeg 848w, https://substackcdn.com/image/fetch/$s_!iOIW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e49201-15e8-40a4-991d-cab1700d2ae2_1360x342.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!iOIW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e49201-15e8-40a4-991d-cab1700d2ae2_1360x342.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YLbZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7910759f-be65-413d-9275-07e1096c6686_1360x716.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YLbZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7910759f-be65-413d-9275-07e1096c6686_1360x716.jpeg 424w, https://substackcdn.com/image/fetch/$s_!YLbZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7910759f-be65-413d-9275-07e1096c6686_1360x716.jpeg 848w, https://substackcdn.com/image/fetch/$s_!YLbZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7910759f-be65-413d-9275-07e1096c6686_1360x716.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!YLbZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7910759f-be65-413d-9275-07e1096c6686_1360x716.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YLbZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7910759f-be65-413d-9275-07e1096c6686_1360x716.jpeg" width="1360" height="716" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7910759f-be65-413d-9275-07e1096c6686_1360x716.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:716,&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_!YLbZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7910759f-be65-413d-9275-07e1096c6686_1360x716.jpeg 424w, https://substackcdn.com/image/fetch/$s_!YLbZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7910759f-be65-413d-9275-07e1096c6686_1360x716.jpeg 848w, https://substackcdn.com/image/fetch/$s_!YLbZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7910759f-be65-413d-9275-07e1096c6686_1360x716.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!YLbZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7910759f-be65-413d-9275-07e1096c6686_1360x716.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">An explanation of more security-conscious enterprise security/platform team process for an on-prem startup</figcaption></figure></div><p>Even popular enterprise-focused products like ServiceNow <a href="https://www.servicenow.com/community/in-other-news/should-you-self-host/ba-p/2719513">discourage</a> on-premise usage via complex decision-flowcharts and warnings.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nwNn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5eeddbc-8364-47b5-a6fd-863a56e87677_999x564.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nwNn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5eeddbc-8364-47b5-a6fd-863a56e87677_999x564.png 424w, https://substackcdn.com/image/fetch/$s_!nwNn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5eeddbc-8364-47b5-a6fd-863a56e87677_999x564.png 848w, https://substackcdn.com/image/fetch/$s_!nwNn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5eeddbc-8364-47b5-a6fd-863a56e87677_999x564.png 1272w, https://substackcdn.com/image/fetch/$s_!nwNn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5eeddbc-8364-47b5-a6fd-863a56e87677_999x564.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nwNn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5eeddbc-8364-47b5-a6fd-863a56e87677_999x564.png" width="999" height="564" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c5eeddbc-8364-47b5-a6fd-863a56e87677_999x564.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:564,&quot;width&quot;:999,&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_!nwNn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5eeddbc-8364-47b5-a6fd-863a56e87677_999x564.png 424w, https://substackcdn.com/image/fetch/$s_!nwNn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5eeddbc-8364-47b5-a6fd-863a56e87677_999x564.png 848w, https://substackcdn.com/image/fetch/$s_!nwNn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5eeddbc-8364-47b5-a6fd-863a56e87677_999x564.png 1272w, https://substackcdn.com/image/fetch/$s_!nwNn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5eeddbc-8364-47b5-a6fd-863a56e87677_999x564.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>On-premise maintenance costs are often high due to inconsistent release cadence, version skew, limited debugging workflows, and limited observability. Customers often control the upgrade process (and tend not to upgrade), which implies the product often stays several versions behind. Getting access to logs is challenging if the system is air-gapped or not allowed to ship logs to product owners. I&#8217;ve noticed that products tend to avoid these completely, or significantly increase deal size to make the costs worth it.</p><h2><strong>Compliance</strong></h2><p>Products that sell to sensitive customer segments need to meet the regulatory/compliance requirements of their customers, which in turn can force changes to your architecture.</p><h4><strong>High Maturity Compliance</strong></h4><p>For more involved compliance procedures like<a href="https://www.fedramp.gov/"> Fedramp</a>, a product will find it difficult to be compliant if their cloud provider or database is not compliant. This is another case where cloud-prem deployments help - a product itself may not need to be Fedramp compliant if it can be hosted in the customer&#8217;s cloud environment.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!scHk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0f215f-13b9-4db9-ac3d-8309fa28121b_1456x378.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!scHk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0f215f-13b9-4db9-ac3d-8309fa28121b_1456x378.jpeg 424w, https://substackcdn.com/image/fetch/$s_!scHk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0f215f-13b9-4db9-ac3d-8309fa28121b_1456x378.jpeg 848w, https://substackcdn.com/image/fetch/$s_!scHk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0f215f-13b9-4db9-ac3d-8309fa28121b_1456x378.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!scHk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0f215f-13b9-4db9-ac3d-8309fa28121b_1456x378.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!scHk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0f215f-13b9-4db9-ac3d-8309fa28121b_1456x378.jpeg" width="1456" height="378" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cd0f215f-13b9-4db9-ac3d-8309fa28121b_1456x378.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:378,&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_!scHk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0f215f-13b9-4db9-ac3d-8309fa28121b_1456x378.jpeg 424w, https://substackcdn.com/image/fetch/$s_!scHk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0f215f-13b9-4db9-ac3d-8309fa28121b_1456x378.jpeg 848w, https://substackcdn.com/image/fetch/$s_!scHk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0f215f-13b9-4db9-ac3d-8309fa28121b_1456x378.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!scHk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0f215f-13b9-4db9-ac3d-8309fa28121b_1456x378.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">Heroku is not Fedramp compliant</figcaption></figure></div><h4><strong>Government</strong></h4><p>Many cloud providers support specific regions/data-centers for government customers. For example,<a href="https://aws.amazon.com/govcloud-us/getting-started/"> AWS has a GovCloud</a> region, and Azure supports a version for the<a href="https://azure.microsoft.com/en-us/explore/global-infrastructure/government"> US Government</a>. Products selling to governments often market that they&#8217;re hosted in these environments. For example, GitHub has a landing page that demonstrates that it can run on<a href="https://government.github.com/aws-govcloud"> AWS GovCloud</a>.</p><p>Therefore, if a product wants to reduce friction in government sales, it&#8217;s advantageous to use a cloud provider that has government region support.</p><h4><strong>Regional Deployment - Europe, Australia, India (and others)</strong></h4><p>Products selling across the globe often support deployments to specific regions. Products like<a href="https://www.vanta.com/resources/accelerating-international-momentum-announcing-vantas-eu-data-centre"> Vanta</a>,<a href="https://help.merge.dev/en/articles/6480050-eu-multi-tenant-frequently-asked-questions-faq"> Merge</a> and<a href="https://blog.sentry.io/sentrys-eu-data-region-now-in-early-access/"> Sentry</a> support EU deployments for customers who prefer that their data lives in the EU, and cloud providers like AWS have also responded by launching <a href="https://aws.amazon.com/compliance/digital-sovereignty/#:~:text=Control%20over%20the%20location%20of%20your%20data&amp;text=You%20have%20the%20choice%20to,to%20meet%20your%20regulatory%20requirements.">Digital Sovereignty</a> functionality.&nbsp;</p><p>Many<a href="https://pro.bloomberglaw.com/insights/privacy/state-privacy-legislation-tracker/#:~:text=Currently%2C%20there%20are%2015%20states,data%20privacy%20laws%20in%20place."> states</a>,<a href="https://usercentrics.com/knowledge-hub/data-privacy-in-2024-what-we-are-watching/"> countries</a>, and regions are increasingly passing privacy/data residency legislations that add compliance friction to the sales process.</p><h2><strong>Customer Comfort</strong></h2><p>Even the most discerning buyers (like the<a href="https://aws.amazon.com/federal/us-intelligence-community/"> CIA</a>) seem to use products hosted on AWS, Azure, or GCP. These services aren&#8217;t perfect - Azure is prone to<a href="https://chaosdb.wiz.io/"> many</a> security<a href="https://www.crn.com/news/security/microsoft-flaw-in-windows-crash-process-enabled-cloud-email-breach"> issues</a>, and GCP is prone to<a href="https://blog.railway.app/p/gcp-incidents"> too</a> many<a href="https://www.datacenterdynamics.com/en/news/google-cloud-issues-linked-to-spotify-and-discord-outages/"> bugs</a> and<a href="https://www.theregister.com/2024/05/09/unisuper_google_cloud_outage_caused/"> freak incidents</a>. Still, the benefits provided by the top cloud providers are so high, that the security/reliability risks are often a &#8220;cost of doing business&#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_!SBQf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a54a80e-f436-4031-857f-a0ede1b01d0c_1047x604.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SBQf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a54a80e-f436-4031-857f-a0ede1b01d0c_1047x604.jpeg 424w, https://substackcdn.com/image/fetch/$s_!SBQf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a54a80e-f436-4031-857f-a0ede1b01d0c_1047x604.jpeg 848w, https://substackcdn.com/image/fetch/$s_!SBQf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a54a80e-f436-4031-857f-a0ede1b01d0c_1047x604.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!SBQf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a54a80e-f436-4031-857f-a0ede1b01d0c_1047x604.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SBQf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a54a80e-f436-4031-857f-a0ede1b01d0c_1047x604.jpeg" width="1047" height="604" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9a54a80e-f436-4031-857f-a0ede1b01d0c_1047x604.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:604,&quot;width&quot;:1047,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Karen on X: \&quot;@UniSuperNews Today is the 5th day in a row that UniSuper's  online account services have been unavailable. And no further news about it  since Friday. Yeah, today's Sunday. But&quot;,&quot;title&quot;:&quot;Karen on X: \&quot;@UniSuperNews Today is the 5th day in a row that UniSuper's  online account services have been unavailable. And no further news about it  since Friday. Yeah, today's Sunday. But&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="Karen on X: &quot;@UniSuperNews Today is the 5th day in a row that UniSuper's  online account services have been unavailable. And no further news about it  since Friday. Yeah, today's Sunday. But" title="Karen on X: &quot;@UniSuperNews Today is the 5th day in a row that UniSuper's  online account services have been unavailable. And no further news about it  since Friday. Yeah, today's Sunday. But" srcset="https://substackcdn.com/image/fetch/$s_!SBQf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a54a80e-f436-4031-857f-a0ede1b01d0c_1047x604.jpeg 424w, https://substackcdn.com/image/fetch/$s_!SBQf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a54a80e-f436-4031-857f-a0ede1b01d0c_1047x604.jpeg 848w, https://substackcdn.com/image/fetch/$s_!SBQf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a54a80e-f436-4031-857f-a0ede1b01d0c_1047x604.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!SBQf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a54a80e-f436-4031-857f-a0ede1b01d0c_1047x604.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">Google Cloud deleted the Cloud VMWare instances of one of Australia&#8217;s largest superannuation (similar to 401k contribution) fund</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_!cCcV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bdc64b-9a96-41f5-9f59-5b951697c95c_1456x395.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cCcV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bdc64b-9a96-41f5-9f59-5b951697c95c_1456x395.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cCcV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bdc64b-9a96-41f5-9f59-5b951697c95c_1456x395.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cCcV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bdc64b-9a96-41f5-9f59-5b951697c95c_1456x395.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cCcV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bdc64b-9a96-41f5-9f59-5b951697c95c_1456x395.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cCcV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bdc64b-9a96-41f5-9f59-5b951697c95c_1456x395.jpeg" width="1456" height="395" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/13bdc64b-9a96-41f5-9f59-5b951697c95c_1456x395.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:395,&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_!cCcV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bdc64b-9a96-41f5-9f59-5b951697c95c_1456x395.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cCcV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bdc64b-9a96-41f5-9f59-5b951697c95c_1456x395.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cCcV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bdc64b-9a96-41f5-9f59-5b951697c95c_1456x395.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cCcV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bdc64b-9a96-41f5-9f59-5b951697c95c_1456x395.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">Azure paying a $40k bounty for a multi-tenant data leak that impacts several thousand customers</figcaption></figure></div><p>Anecdotally, enterprise customers in certain segments tend to prefer products based on the Microsoft stack, especially if they already use Microsoft products. For example, Harvey, a legal startup, markets that its<a href="https://www.harvey.ai/blog/harvey-launches-ai-powered-professional-services-platform-on-microsoft-azure"> deployed on Microsoft Azure</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_!rBGr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee719ed1-f84b-4d63-b866-82f90398ac4a_1456x612.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rBGr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee719ed1-f84b-4d63-b866-82f90398ac4a_1456x612.jpeg 424w, https://substackcdn.com/image/fetch/$s_!rBGr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee719ed1-f84b-4d63-b866-82f90398ac4a_1456x612.jpeg 848w, https://substackcdn.com/image/fetch/$s_!rBGr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee719ed1-f84b-4d63-b866-82f90398ac4a_1456x612.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!rBGr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee719ed1-f84b-4d63-b866-82f90398ac4a_1456x612.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rBGr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee719ed1-f84b-4d63-b866-82f90398ac4a_1456x612.jpeg" width="1456" height="612" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ee719ed1-f84b-4d63-b866-82f90398ac4a_1456x612.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:612,&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_!rBGr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee719ed1-f84b-4d63-b866-82f90398ac4a_1456x612.jpeg 424w, https://substackcdn.com/image/fetch/$s_!rBGr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee719ed1-f84b-4d63-b866-82f90398ac4a_1456x612.jpeg 848w, https://substackcdn.com/image/fetch/$s_!rBGr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee719ed1-f84b-4d63-b866-82f90398ac4a_1456x612.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!rBGr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee719ed1-f84b-4d63-b866-82f90398ac4a_1456x612.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">Legal startup Harvey markets itself as &#8220;Deployed on Microsoft Azure&#8221;</figcaption></figure></div><p>If a product is targeted towards a certain segment of enterprise customers, it&#8217;s worth understanding whether that segment would feel more comfortable with the Microsoft stack. For example, the Microsoft CEO mentioned that <a href="https://www.pymnts.com/earnings/2024/microsoft-unlocking-ai-benefits-will-require-cultural-changes-for-enterprises/#:~:text=%E2%80%9CMore%20than%2065%25%20of%20Fortune,chief%20financial%20officer%20of%20Microsoft.">65% of the Fortune 500 use Azure OpenAI</a>. This is consistent with the idea that once a product is trusted to safeguard customer data, it doesn&#8217;t necessarily need to be hosted on-premise.</p><h2><strong>Marketplaces</strong></h2><p>There&#8217;s increasing value for B2B products to sell on cloud marketplaces. Big companies often have &#8220;<a href="https://learn.microsoft.com/en-us/partner-center/marketplace/azure-consumption-commitment-enrollment">spend commitments&#8221; on their cloud providers</a> that go<a href="https://www.ciodive.com/news/cloud-spending-unused-infosys-/693345/"> unused</a>. Therefore, there&#8217;s a large financial incentive to spend on the cloud, and software sold on cloud marketplaces count towards these spend commitments. Additionally, cloud marketplace products go through the same billing process as the rest of cloud spend, which helps the customers&#8217; finance team with one less relationship to manage.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yElu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5473d09e-8ef3-42d8-8066-28f63dd1a37a_1456x382.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yElu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5473d09e-8ef3-42d8-8066-28f63dd1a37a_1456x382.jpeg 424w, https://substackcdn.com/image/fetch/$s_!yElu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5473d09e-8ef3-42d8-8066-28f63dd1a37a_1456x382.jpeg 848w, https://substackcdn.com/image/fetch/$s_!yElu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5473d09e-8ef3-42d8-8066-28f63dd1a37a_1456x382.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!yElu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5473d09e-8ef3-42d8-8066-28f63dd1a37a_1456x382.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yElu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5473d09e-8ef3-42d8-8066-28f63dd1a37a_1456x382.jpeg" width="1456" height="382" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5473d09e-8ef3-42d8-8066-28f63dd1a37a_1456x382.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:382,&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_!yElu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5473d09e-8ef3-42d8-8066-28f63dd1a37a_1456x382.jpeg 424w, https://substackcdn.com/image/fetch/$s_!yElu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5473d09e-8ef3-42d8-8066-28f63dd1a37a_1456x382.jpeg 848w, https://substackcdn.com/image/fetch/$s_!yElu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5473d09e-8ef3-42d8-8066-28f63dd1a37a_1456x382.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!yElu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5473d09e-8ef3-42d8-8066-28f63dd1a37a_1456x382.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ak1a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74881416-3aec-4710-9a14-6452fc2b6fa1_1456x290.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ak1a!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74881416-3aec-4710-9a14-6452fc2b6fa1_1456x290.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ak1a!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74881416-3aec-4710-9a14-6452fc2b6fa1_1456x290.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ak1a!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74881416-3aec-4710-9a14-6452fc2b6fa1_1456x290.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ak1a!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74881416-3aec-4710-9a14-6452fc2b6fa1_1456x290.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ak1a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74881416-3aec-4710-9a14-6452fc2b6fa1_1456x290.jpeg" width="1456" height="290" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74881416-3aec-4710-9a14-6452fc2b6fa1_1456x290.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:290,&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_!Ak1a!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74881416-3aec-4710-9a14-6452fc2b6fa1_1456x290.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ak1a!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74881416-3aec-4710-9a14-6452fc2b6fa1_1456x290.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ak1a!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74881416-3aec-4710-9a14-6452fc2b6fa1_1456x290.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ak1a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74881416-3aec-4710-9a14-6452fc2b6fa1_1456x290.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">From https://future.com/planetscale-cloud-prem-engineering-management/ - an additional benefit of Cloud-Prem deployments</figcaption></figure></div><p>To take advantage of a cloud provider's distribution channel, products need to host significant portions of their software with that cloud provider. For example, here&#8217;s a screenshot of GCP&#8217;s marketplace<a href="https://cloud.google.com/marketplace/docs/partners/get-started"> requirements</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_!a0X0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf943c08-175e-4fe2-9081-57268aa55e79_1456x803.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!a0X0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf943c08-175e-4fe2-9081-57268aa55e79_1456x803.jpeg 424w, https://substackcdn.com/image/fetch/$s_!a0X0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf943c08-175e-4fe2-9081-57268aa55e79_1456x803.jpeg 848w, https://substackcdn.com/image/fetch/$s_!a0X0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf943c08-175e-4fe2-9081-57268aa55e79_1456x803.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!a0X0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf943c08-175e-4fe2-9081-57268aa55e79_1456x803.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!a0X0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf943c08-175e-4fe2-9081-57268aa55e79_1456x803.jpeg" width="1456" height="803" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/df943c08-175e-4fe2-9081-57268aa55e79_1456x803.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:803,&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_!a0X0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf943c08-175e-4fe2-9081-57268aa55e79_1456x803.jpeg 424w, https://substackcdn.com/image/fetch/$s_!a0X0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf943c08-175e-4fe2-9081-57268aa55e79_1456x803.jpeg 848w, https://substackcdn.com/image/fetch/$s_!a0X0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf943c08-175e-4fe2-9081-57268aa55e79_1456x803.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!a0X0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf943c08-175e-4fe2-9081-57268aa55e79_1456x803.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Therefore, many new B2B products seem to be available on all clouds, so that they can sell on all marketplaces. For example,<a href="https://www.sigmacomputing.com/"> Sigma Computing</a> announced that their product is available on all<a href="https://www.sigmacomputing.com/blog/sigma-is-now-available-on-all-three-major-cloud-providers"> three major cloud providers</a>, and is also<a href="https://aws.amazon.com/marketplace/seller-profile?id=817b3d13-3eb2-4cda-a7ba-3d26581de0ce"> available</a> on<a href="https://azuremarketplace.microsoft.com/en-us/marketplace/apps/aad.sigmacomputing?tab=overview"> all</a> three<a href="https://cloud.google.com/find-a-partner/partner/sigma-computing"> marketplaces</a>. Therefore, it may make sense to use cloud-agnostic infrastructure components, like Kubernetes and Kafka, so that it&#8217;s simple to deploy to multiple clouds early on.</p><h2>Conclusion</h2><p>There&#8217;s a growing number of tradeoffs to consider when considering a product&#8217;s architectural choices due to the surprising number of non-engineering related implications.</p><p>On a personal note, I&#8217;m looking to learn how multi-tenant products can better prevent cross-tenant breaches. If you&#8217;re struggling with the same problem, want to share any resources, or are willing to chat - please send me an email to reliability [at] substack.com</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>This is a gross oversimplification, as there are many compounding factors like the prospect&#8217;s compliance requirements, date of their last breach, the values of their security team, etc but it&#8217;s a useful starting point.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The Hidden Performance Cost of NodeJS and GraphQL]]></title><description><![CDATA[NodeJS and GraphQL are popular technologies for building web applications, but in my experience, they come with certain scaling and performance tradeoffs to be aware of.]]></description><link>https://www.softwareatscale.dev/p/the-hidden-performance-cost-of-nodejs</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/the-hidden-performance-cost-of-nodejs</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Sun, 08 Oct 2023 20:01:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!AK8m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd068eab5-0302-4c9a-931d-9834ef43e143_1438x566.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://nodejs.org/en">NodeJS</a> and <a href="https://graphql.org/">GraphQL</a> are popular technologies for building web applications, but in my experience, they come with certain scaling and performance tradeoffs to be aware of.</p><p><strong>tl;dr</strong>: GraphQL's modular structure generally leads to code that instantiates excessive promises, which degrades request performance. Benchmarks show a 2-3x latency increase.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software at Scale! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2><strong>Background</strong></h2><p>NodeJS is known for its non-blocking I/O operations, thanks to its design of the event loop. The event loop is a single <a href="https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick">dispatcher thread</a> that enables concurrent I/O operations without forcing developers to reason about managing parallelism.</p><p>All synchronous work in NodeJS happens on the event loop thread (other than a few isolated multithreaded features like <a href="https://nodejs.org/api/worker_threads.html">worker_threads</a>). When the event loop is managed well, and <a href="http://highscalability.com/blog/2013/12/11/using-nodejs-paypal-doubles-rps-lowers-latency-with-fewer-de.html">I/O is a true bottleneck</a>, NodeJS can be a very efficient/scalable technology.</p><p>On the other hand, if a request does a lot of processing on the event loop, it will block other requests on that container. NodeJS applications are particularly susceptible to sporadic performance issues due to noisy neighbors - other heavy request handlers - that overly consume the event loop. Additionally, GraphQL's resolver structure can result in more promise overhead compared to REST endpoints, which may cause suboptimal user-perceived latency if not managed carefully.</p><h2>GraphQL and the Event Loop</h2><p>GraphQL enables a modular design for APIs. For example, we can define a type in our schema, and define one resolver for that type, regardless of where that type appears in the graph.</p><pre><code>// schema.
// we only have to define one type resolver for User
type User {
  name: String!
  accountId: String!
  friends: [User!]!
}

type Query {
  user: [User!]!
}

// query.
// we can pick the fields we need.
query q {
  user {
     accountId
     friends {
       name
     }
  }
}</code></pre><p>This modular design is great for developer experience but leads to promise-heavy code. Each promise adds a minuscule, but non-zero amount of work for the event loop, which is discussed <a href="https://madelinemiller.dev/blog/javascript-promise-overhead/">here</a>.</p><p>To demonstrate, let&#8217;s say we want to write a feature that retrieves a user&#8217;s items on a shopping site. We might build a REST endpoint that looks like this:</p><pre><code><code>/user/items/details</code></code></pre><p>This would be powered by a few SQL queries.</p><pre><code><code>SELECT item_id from users where user_id = $user_id;

SELECT details from items where id in (item_ids);</code></code></pre><p>A well-structured REST endpoint would have some relatively simple code that makes these database queries and massages the data back into a desired format. We would have no more than a few promises invoked and resolved in the request lifecycle.</p><p>In GraphQL, we would be encouraged to write a query like this:</p><pre><code><code>user {
  items {
    id
    details {
      id
      ...otherFields
    }
  }
}</code></code></pre><p>If we have it well-structured as GraphQL resolvers, we might have type resolvers for users and item details.</p><pre><code><code>resolvers: {
  // returns { items: String[] }
  User: async (req) =&gt; GetUserById(req.auth.user), 
  ItemDetails: async (req, { itemId }) =&gt; GetItemDetailsById(itemId),
}</code></code></pre><p>When executed, a GraphQL query with nested fields will result in a promise per field being created, such as:</p><pre><code><code>const user = await getUser()
for itemId in user.items:
  const { id, ...otherFields } = await GetItemDetailsById(itemId)</code></code></pre><p>If we use <a href="https://github.com/graphql/dataloader">Dataloaders</a> to prevent the <a href="https://medium.com/the-marcy-lab-school/what-is-the-n-1-problem-in-graphql-dd4921cb3c1a">N+1 query</a> problem, this would translate to the same SQL queries as we described in the REST endpoint case. So the I/O cost would be as optimized as possible. But we would create one promise per item in a loop. And each promise adds work to the event loop.</p><p>I&#8217;ve written a <a href="https://github.com/utsav2/graphql-benchmarks">benchmark</a> of a GraphQL server that returns users to demonstrate the impact &#8212; the overhead increases as we increase the number of promises involved. We chose two GraphQL servers - <a href="https://www.apollographql.com/docs/apollo-server/">Apollo Server + Express</a>, and <a href="https://mercurius.dev/#/">Mercurius</a>.</p><p>The benchmarked queries return the same data - but one wraps every field response in a promise, and the other returns data synchronously. We return 100 items per user.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AK8m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd068eab5-0302-4c9a-931d-9834ef43e143_1438x566.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AK8m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd068eab5-0302-4c9a-931d-9834ef43e143_1438x566.png 424w, https://substackcdn.com/image/fetch/$s_!AK8m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd068eab5-0302-4c9a-931d-9834ef43e143_1438x566.png 848w, https://substackcdn.com/image/fetch/$s_!AK8m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd068eab5-0302-4c9a-931d-9834ef43e143_1438x566.png 1272w, https://substackcdn.com/image/fetch/$s_!AK8m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd068eab5-0302-4c9a-931d-9834ef43e143_1438x566.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AK8m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd068eab5-0302-4c9a-931d-9834ef43e143_1438x566.png" width="1438" height="566" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d068eab5-0302-4c9a-931d-9834ef43e143_1438x566.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:566,&quot;width&quot;:1438,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:79348,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AK8m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd068eab5-0302-4c9a-931d-9834ef43e143_1438x566.png 424w, https://substackcdn.com/image/fetch/$s_!AK8m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd068eab5-0302-4c9a-931d-9834ef43e143_1438x566.png 848w, https://substackcdn.com/image/fetch/$s_!AK8m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd068eab5-0302-4c9a-931d-9834ef43e143_1438x566.png 1272w, https://substackcdn.com/image/fetch/$s_!AK8m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd068eab5-0302-4c9a-931d-9834ef43e143_1438x566.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>We see that wrapping each user and item in a promise causes a 2x or 3x increase in request latency.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><p>An invalid criticism here is that real-world GraphQL resolvers perform I/O, so the overhead here will reduce significantly as a percentage of the time taken by the resolver. A well-tuned database can perform two SQL queries to return 10k items in &lt; 100 milliseconds, which is a reasonably small percentage of the high latency caused by the GraphQL server here (regardless of Express or Mercurius).</p><p>Real-world code is even messier - we might check feature flags or perform other ~async work in a resolver, which further increases the number of promises the event loop has to process.</p><h3>Diagnosing the Problem</h3><p>It&#8217;s useful to know how to diagnose this problem in certain operations. First, we should confirm that our application is actually blocked on the event loop. NodeJS exposes useful <a href="https://nodesource.com/blog/event-loop-utilization-nodejs/">perf hooks</a> to measure event loop utilization.</p><p>Next, we should confirm that our event loop isn&#8217;t blocked by code we control. In my case, I confirmed this by inspecting CPU profiles. If the event loop is occupied for &gt;50ms with no obvious culprit in sight, the culprit is likely in the runtime.</p><p>Next, we can confirm how promise-heavy our code is through the following code snippet. Each GraphQL operation should increase the number of promises created and give us a clue about how promise-heavy our code is. </p><pre><code><code>import async_hooks from 'async_hooks';

let count = 0;

const hook = async_hooks.createHook({
  init(asyncId: number, type: string) {
    if (type === 'PROMISE') {
      count++;
    }
  },
});

hook.enable();

setInterval(() =&gt; {
  console.log(`Promise count: ${count}`)
}, 1000);</code></code></pre><p>Another practical approach to determine whether the event loop is a blocker is determining the difference between client-reported database query latency, and database-reported query latency. For example, I noticed that client-side reporting of certain database queries was often &gt;100 milliseconds, even though we were making an indexed query in a table with &lt;1000 rows. As expected, we couldn&#8217;t replicate such a slow performance when manually querying our databases. This slow-down was because the event loop was overwhelmed after making database requests, so even though the database responded to certain requests very quickly, the web application did not get around to processing the response until after a significant delay.</p><h2>Open-Source and Promises</h2><p>Since async/await only affects request throughput in certain, promise-heavy conditions, most open-source code is not heavily optimized to prevent unnecessary promises. For example, <a href="https://the-guild.dev/graphql/shield">GraphQL Shield</a>, one of the most popular GraphQL authz libraries, <a href="https://github.com/dimatill/graphql-shield/issues/1522">assumes every field resolver is async</a>. Therefore, it constructs a promise for every field in a GraphQL response, which further amplifies the number of promises created in the lifecycle of a request.</p><p>Typescript and JavaScript do not prevent developers from unnecessarily marking functions as `async`, so we need eslint rules like <a href="https://eslint.org/docs/latest/rules/require-await">require-await</a> to avoid unnecessary `await` calls on functions that do not construct promises.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a></p><h2>APM and Promises</h2><p>Finally, we can incredibly slow down promise execution if we use <a href="https://nodejs.org/api/async_hooks.html">Async Hooks</a>, a deprecated but widely used NodeJS feature. Async hooks help us track asynchronous resources. For example, a tracing library might desire to track a request across callbacks and promises.</p><p>Unfortunately, any code we import may rely on this feature and can auto-enable it. For example, `<a href="https://github.com/DataDog/dd-trace-js">dd-trace</a>`, Datadog&#8217;s APM library (and likely <a href="https://nodesource.com/blog/In-depth-analysis-APMs-performance-cost-Nodejs/">many others</a>), uses the feature to provide traces across promise executions.</p><p>To understand the cost of async hooks, I added them to the GraphQL benchmark using Apollo Server. We run the same benchmark as above with <a href="https://nodejs.org/api/async_context.html">AsyncLocalStorage</a> (another slow, but supported feature), and with Async Hooks. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IcvP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc602e973-dae8-446f-b842-9db7c213d2a6_1192x734.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IcvP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc602e973-dae8-446f-b842-9db7c213d2a6_1192x734.png 424w, https://substackcdn.com/image/fetch/$s_!IcvP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc602e973-dae8-446f-b842-9db7c213d2a6_1192x734.png 848w, https://substackcdn.com/image/fetch/$s_!IcvP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc602e973-dae8-446f-b842-9db7c213d2a6_1192x734.png 1272w, https://substackcdn.com/image/fetch/$s_!IcvP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc602e973-dae8-446f-b842-9db7c213d2a6_1192x734.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IcvP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc602e973-dae8-446f-b842-9db7c213d2a6_1192x734.png" width="1192" height="734" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c602e973-dae8-446f-b842-9db7c213d2a6_1192x734.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:734,&quot;width&quot;:1192,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:62358,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!IcvP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc602e973-dae8-446f-b842-9db7c213d2a6_1192x734.png 424w, https://substackcdn.com/image/fetch/$s_!IcvP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc602e973-dae8-446f-b842-9db7c213d2a6_1192x734.png 848w, https://substackcdn.com/image/fetch/$s_!IcvP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc602e973-dae8-446f-b842-9db7c213d2a6_1192x734.png 1272w, https://substackcdn.com/image/fetch/$s_!IcvP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc602e973-dae8-446f-b842-9db7c213d2a6_1192x734.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!q3ej!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e6820cc-ed0f-4047-90b2-49bb7c57950e_1840x194.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!q3ej!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e6820cc-ed0f-4047-90b2-49bb7c57950e_1840x194.png 424w, https://substackcdn.com/image/fetch/$s_!q3ej!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e6820cc-ed0f-4047-90b2-49bb7c57950e_1840x194.png 848w, https://substackcdn.com/image/fetch/$s_!q3ej!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e6820cc-ed0f-4047-90b2-49bb7c57950e_1840x194.png 1272w, https://substackcdn.com/image/fetch/$s_!q3ej!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e6820cc-ed0f-4047-90b2-49bb7c57950e_1840x194.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!q3ej!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e6820cc-ed0f-4047-90b2-49bb7c57950e_1840x194.png" width="1456" height="154" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e6820cc-ed0f-4047-90b2-49bb7c57950e_1840x194.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:154,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:43157,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!q3ej!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e6820cc-ed0f-4047-90b2-49bb7c57950e_1840x194.png 424w, https://substackcdn.com/image/fetch/$s_!q3ej!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e6820cc-ed0f-4047-90b2-49bb7c57950e_1840x194.png 848w, https://substackcdn.com/image/fetch/$s_!q3ej!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e6820cc-ed0f-4047-90b2-49bb7c57950e_1840x194.png 1272w, https://substackcdn.com/image/fetch/$s_!q3ej!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e6820cc-ed0f-4047-90b2-49bb7c57950e_1840x194.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>We see that Async Hooks adds a significant amount of latency to resolvers that return lists of data.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PME8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2112b7ce-15ff-4e8d-b354-d5b7cc124279_1200x742.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PME8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2112b7ce-15ff-4e8d-b354-d5b7cc124279_1200x742.png 424w, https://substackcdn.com/image/fetch/$s_!PME8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2112b7ce-15ff-4e8d-b354-d5b7cc124279_1200x742.png 848w, https://substackcdn.com/image/fetch/$s_!PME8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2112b7ce-15ff-4e8d-b354-d5b7cc124279_1200x742.png 1272w, https://substackcdn.com/image/fetch/$s_!PME8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2112b7ce-15ff-4e8d-b354-d5b7cc124279_1200x742.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PME8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2112b7ce-15ff-4e8d-b354-d5b7cc124279_1200x742.png" width="1200" height="742" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2112b7ce-15ff-4e8d-b354-d5b7cc124279_1200x742.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:742,&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_!PME8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2112b7ce-15ff-4e8d-b354-d5b7cc124279_1200x742.png 424w, https://substackcdn.com/image/fetch/$s_!PME8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2112b7ce-15ff-4e8d-b354-d5b7cc124279_1200x742.png 848w, https://substackcdn.com/image/fetch/$s_!PME8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2112b7ce-15ff-4e8d-b354-d5b7cc124279_1200x742.png 1272w, https://substackcdn.com/image/fetch/$s_!PME8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2112b7ce-15ff-4e8d-b354-d5b7cc124279_1200x742.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gnSa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75669687-2d57-402d-b186-574012d89d3f_1200x742.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gnSa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75669687-2d57-402d-b186-574012d89d3f_1200x742.png 424w, https://substackcdn.com/image/fetch/$s_!gnSa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75669687-2d57-402d-b186-574012d89d3f_1200x742.png 848w, https://substackcdn.com/image/fetch/$s_!gnSa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75669687-2d57-402d-b186-574012d89d3f_1200x742.png 1272w, https://substackcdn.com/image/fetch/$s_!gnSa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75669687-2d57-402d-b186-574012d89d3f_1200x742.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gnSa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75669687-2d57-402d-b186-574012d89d3f_1200x742.png" width="1200" height="742" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/75669687-2d57-402d-b186-574012d89d3f_1200x742.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:742,&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_!gnSa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75669687-2d57-402d-b186-574012d89d3f_1200x742.png 424w, https://substackcdn.com/image/fetch/$s_!gnSa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75669687-2d57-402d-b186-574012d89d3f_1200x742.png 848w, https://substackcdn.com/image/fetch/$s_!gnSa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75669687-2d57-402d-b186-574012d89d3f_1200x742.png 1272w, https://substackcdn.com/image/fetch/$s_!gnSa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75669687-2d57-402d-b186-574012d89d3f_1200x742.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>We roughly see that Async Hooks roughly adds a 3 - 3.5x overhead to these resolvers.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rbvN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c420c4-0eea-4c61-ad0c-a6c0765fdcd2_1832x472.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rbvN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c420c4-0eea-4c61-ad0c-a6c0765fdcd2_1832x472.png 424w, https://substackcdn.com/image/fetch/$s_!rbvN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c420c4-0eea-4c61-ad0c-a6c0765fdcd2_1832x472.png 848w, https://substackcdn.com/image/fetch/$s_!rbvN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c420c4-0eea-4c61-ad0c-a6c0765fdcd2_1832x472.png 1272w, https://substackcdn.com/image/fetch/$s_!rbvN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c420c4-0eea-4c61-ad0c-a6c0765fdcd2_1832x472.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rbvN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c420c4-0eea-4c61-ad0c-a6c0765fdcd2_1832x472.png" width="1456" height="375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/97c420c4-0eea-4c61-ad0c-a6c0765fdcd2_1832x472.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:375,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:93806,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rbvN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c420c4-0eea-4c61-ad0c-a6c0765fdcd2_1832x472.png 424w, https://substackcdn.com/image/fetch/$s_!rbvN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c420c4-0eea-4c61-ad0c-a6c0765fdcd2_1832x472.png 848w, https://substackcdn.com/image/fetch/$s_!rbvN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c420c4-0eea-4c61-ad0c-a6c0765fdcd2_1832x472.png 1272w, https://substackcdn.com/image/fetch/$s_!rbvN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c420c4-0eea-4c61-ad0c-a6c0765fdcd2_1832x472.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>Datadog engineers are diligently working to reduce this overhead by contributing <a href="https://github.com/nodejs/node/issues/46265">Node.JS and v8 features</a>. However, improvements in this area are critical to get right and take time to be implemented.</p><h1>Potential Solutions</h1><p>In general, we want to reduce the overhead of promises and reduce the number of promises we invoke.</p><h3>Reducing Promise Overhead</h3><p>To reduce promise overhead, we want to minimize promise introspection features like Async Hooks in production.</p><h3>Reducing the Number of Promises</h3><p>To reduce promises invoked, we have a few areas to consider. </p><p>We could remove the use of GraphQL middleware, especially ones that assume every field is async. </p><p>We could also rewrite GraphQL queries to use fewer async type-resolvers by writing one-shot resolvers - a single resolver that manually queries the database and returns all the data needed for a performance-sensitive query, rather than relying on GraphQL to hydrate nested fields via type resolvers. Let&#8217;s take our earlier query:</p><pre><code><code>user {
  items {
    id 
    details {
      id
       ...otherFields
    }
  }
}</code></code></pre><p>We could write a one-shot resolver that implements the entire query:</p><pre><code>const UserResolver = async (root, { userId }) =&gt; {

  const [user, items] = await User.findById(userId);
  const itemDetails = await ItemDetails.find({itemIds: items.map(i =&gt; i.id)});

  return {
    items: items.map(item =&gt; {
      const details = itemDetails.find(d =&gt; d.id === item.id)  
      return {
        id: item.id,
        details: {
          id: details.id,
          ...details
        }
      }
    })
  }
}</code></pre><p>Instead of multiple batches of promises, we fetch the user, items, and details in one shot. This brings up the meta-question about why use GraphQL in the first place, but that&#8217;s a larger conversation for a separate time.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software at Scale! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>I found a &lt;5% difference between using dataloaders (that implicitly use promises) and using promises directly.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Interestingly, Meta is trying to solve a very similar issue in Python: <strong><a href="https://engineering.fb.com/2023/10/05/developer-tools/python-312-meta-new-features/">https://engineering.fb.com/2023/10/05/developer-tools/python-312-meta-new-features/</a></strong></p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[Software at Scale 59 - Incident Management with Nora Jones]]></title><description><![CDATA[Nora is the CEO and co-founder of Jeli, an incident management platform.]]></description><link>https://www.softwareatscale.dev/p/software-at-scale-59-incident-management</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/software-at-scale-59-incident-management</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Wed, 05 Jul 2023 14:36:02 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/133068161/85f0245dcf8adba3baf8a3a3f59e6f72.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Nora is the CEO and co-founder of <a href="https://www.jeli.io/">Jeli</a>, an incident management platform.</p><p><a href="https://podcasts.apple.com/us/podcast/software-at-scale/id1543617436">Apple Podcasts</a>&nbsp;|&nbsp;<a href="https://open.spotify.com/show/7eGnnZnfb3mOGTqWR4gTjK?si=DMsJIWg3QjiiJS65A1nEbQ">Spotify</a>&nbsp;|&nbsp;<a href="https://podcasts.google.com/feed/aHR0cHM6Ly9yZWxpYWJpbGl0eS5zdWJzdGFjay5jb20vZmVlZC8">Google Podcasts</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_!A5RX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bbf388-3f7b-4360-9f3b-0de20d77c93a_800x800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A5RX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bbf388-3f7b-4360-9f3b-0de20d77c93a_800x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!A5RX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bbf388-3f7b-4360-9f3b-0de20d77c93a_800x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!A5RX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bbf388-3f7b-4360-9f3b-0de20d77c93a_800x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!A5RX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bbf388-3f7b-4360-9f3b-0de20d77c93a_800x800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A5RX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bbf388-3f7b-4360-9f3b-0de20d77c93a_800x800.jpeg" width="800" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01bbf388-3f7b-4360-9f3b-0de20d77c93a_800x800.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Nora Jones&quot;,&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="Nora Jones" title="Nora Jones" srcset="https://substackcdn.com/image/fetch/$s_!A5RX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bbf388-3f7b-4360-9f3b-0de20d77c93a_800x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!A5RX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bbf388-3f7b-4360-9f3b-0de20d77c93a_800x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!A5RX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bbf388-3f7b-4360-9f3b-0de20d77c93a_800x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!A5RX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bbf388-3f7b-4360-9f3b-0de20d77c93a_800x800.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Nora provides an in-depth look into incident management within the software industry and discusses the incident management platform Jeli.</p><p>Nora's fascination with risk and its influence on human behavior stems from her early career in hardware and her involvement with a home security company. These experiences revealed the high stakes associated with software failures, uncovering the importance of learning from incidents and fostering a blame-aware culture that prioritizes continuous improvement. In contrast to the traditional blameless approach, which seeks to eliminate blame entirely, a blame-aware culture acknowledges that mistakes happen and focuses on learning from them instead of assigning blame. This approach encourages open discussions about incidents, creating a sense of safety and driving superior long-term outcomes.</p><p>We also discuss chaos engineering - the practice of deliberately creating turbulent conditions in production to simulate real-world scenarios. This approach allows teams to experiment and acquire the necessary skills to effectively respond to incidents.</p><p>Nora then introduces Jeli, an incident management platform that places a high priority on the human aspects of incidents. Unlike other platforms that solely concentrate on technology, Jeli aims to bridge the gap between technology and people. By emphasizing coordination, communication, and learning, Jeli helps organizations reduce incident costs and cultivate a healthier incident management culture. </p><p>We discuss how customer expectations in the software industry have evolved over time, with users becoming increasingly intolerant of low reliability, particularly in critical services (Dan Luu has an incredible <a href="https://danluu.com/everything-is-broken/">blog</a> on the incidence of bugs in day-to-day software). This shift in priorities has compelled organizations to place greater importance on reliability and invest in incident management practices. We conclude by discussing how incident management will further evolve and how leaders can set their organizations up for success.</p>]]></content:encoded></item><item><title><![CDATA[Quadratic C.I. Cost Growth]]></title><description><![CDATA[A significant portion of cost of software infrastructure at a technology organization is due to CI/CD (Continuous Integration/Continuous Deployment).]]></description><link>https://www.softwareatscale.dev/p/quadratic-ci-cost-growth</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/quadratic-ci-cost-growth</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Fri, 30 Jun 2023 13:08:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!iGke!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2029da51-397f-42f8-86ee-d08adda8ef0c_2720x2016.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A significant portion of cost of software infrastructure at a technology organization is due to <a href="https://www.redhat.com/en/topics/devops/what-is-ci-cd">CI/CD</a> (Continuous Integration/Continuous Deployment). It is easy to overlook CI cost since CI isn&#8217;t strictly required to operate a software application, but it&#8217;s a critical component of the software development lifecycle.</p><p>A less obvious aspect of CI cost is that, in some cases, it can increase at a quadratic rate over time. <a href="https://www.softwareatscale.dev/p/software-at-scale-12-john-micco-cloud#details">John Micco</a>, the ex lead of the Google Test Automation Platform group, mentioned that Google would spend more on CI than the rest of its compute combined if it didn&#8217;t introduce serious optimizations along the way.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software at Scale! Subscribe for free to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>We&#8217;ll explore the worst-case scenario: an engineering organization that uses a monorepo (a single repository that stores all the code and assets for a project) and runs the entire test suite on every code change (no selective testing).</p><p>There are two primary dimensions to the growth in CI cost. The first dimension is the size of the engineering team. As the engineering team grows, the number of code changes to the monorepo being tested in the CI system often grows linearly<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>.</p><p>The second dimension is the size of the codebase and the corresponding size of the test suite. Codebases and test suites often grow with new features over time. Additionally, software engineers are often hesitant to delete tests unless they&#8217;re confident that the system under test is deprecated and unused. So every code change tests a slightly larger codebase, which takes some more CPU time. Since there&#8217;s no selective testing, each test adds CPU time, regardless of parallelism.</p><p>In summary, as the organization grows, there are more code changes, and there&#8217;s more CPU time spent testing each change. Multiplying the increasing number of code changes with the growing CPU time needed for each change results in a quadratic rate of growth in CI CPU time, which is proportionate to resource use.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iGke!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2029da51-397f-42f8-86ee-d08adda8ef0c_2720x2016.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iGke!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2029da51-397f-42f8-86ee-d08adda8ef0c_2720x2016.png 424w, https://substackcdn.com/image/fetch/$s_!iGke!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2029da51-397f-42f8-86ee-d08adda8ef0c_2720x2016.png 848w, https://substackcdn.com/image/fetch/$s_!iGke!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2029da51-397f-42f8-86ee-d08adda8ef0c_2720x2016.png 1272w, https://substackcdn.com/image/fetch/$s_!iGke!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2029da51-397f-42f8-86ee-d08adda8ef0c_2720x2016.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iGke!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2029da51-397f-42f8-86ee-d08adda8ef0c_2720x2016.png" width="1456" height="1079" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2029da51-397f-42f8-86ee-d08adda8ef0c_2720x2016.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1079,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:268715,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!iGke!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2029da51-397f-42f8-86ee-d08adda8ef0c_2720x2016.png 424w, https://substackcdn.com/image/fetch/$s_!iGke!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2029da51-397f-42f8-86ee-d08adda8ef0c_2720x2016.png 848w, https://substackcdn.com/image/fetch/$s_!iGke!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2029da51-397f-42f8-86ee-d08adda8ef0c_2720x2016.png 1272w, https://substackcdn.com/image/fetch/$s_!iGke!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2029da51-397f-42f8-86ee-d08adda8ef0c_2720x2016.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>There are several strategies to mitigate this growth. Selective testing is a key strategy for reducing costs and ensuring faster feedback times from CI on code changes. Examples include <a href="https://github.com/Tinder/bazel-diff">Tinder</a> and <a href="https://dropbox.tech/infrastructure/continuous-integration-and-deployment-with-bazel">Dropbox</a> for algorithmic selective testing and machine-learning approaches from larger organizations like <a href="https://research.facebook.com/publications/predictive-test-selection/">Meta</a>. Additionally, there are <a href="https://www.datadoghq.com/blog/streamline-ci-testing-with-datadog-intelligent-test-runner/">products</a> and <a href="https://www.launchableinc.com/">organizations</a> focused on selective testing as a service. Other approaches include <a href="https://github.com/tj-actions/changed-files">file-based test selection</a>. Multirepo systems sidestep the problem but have other downsides like trickier code-sharing.</p><p>CI cost can also be much harder to optimize through one-time projects. It&#8217;s hard to meaningfully reduce the test-suite size in a large organization, and there&#8217;s often no easy way to retrofit better test selection in a poorly structured codebase. Other options like running fewer tests may disproportionately affect developer velocity.</p><p>Maintaining lower CI costs involves general code quality improvements. This includes ensuring the codebase remains modular, preventing the blind copying of slow and inefficient test patterns, and making sure that sufficient test tooling, like mocks and fakes, is available for developers to use.</p><p>Overall, CI cost exhibits the challenging combination of growing quadratically and being hard to optimize. By actively monitoring CI costs and employing strategic optimization techniques, organizations can maintain a balance between resource efficiency and robust testing, fostering a sustainable software development lifecycle.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>If it doesn&#8217;t grow linearly, that might be another developer velocity problem to debug.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Software at Scale 58 - Measuring Developer Productivity with Abi Noda]]></title><description><![CDATA[Abi Noda is the CEO and co-founder of DX, a developer productivity platform.]]></description><link>https://www.softwareatscale.dev/p/software-at-scale-58-measuring-developer</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/software-at-scale-58-measuring-developer</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Tue, 13 Jun 2023 16:00:35 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/127620971/0c5646764d3d34d1f688e906a129ba35.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Abi Noda is the CEO and co-founder of <a href="https://getdx.com/">DX</a>, a developer productivity platform.</p><p><a href="https://podcasts.apple.com/us/podcast/software-at-scale/id1543617436">Apple Podcasts</a>&nbsp;|&nbsp;<a href="https://open.spotify.com/show/7eGnnZnfb3mOGTqWR4gTjK?si=DMsJIWg3QjiiJS65A1nEbQ">Spotify</a>&nbsp;|&nbsp;<a href="https://podcasts.google.com/feed/aHR0cHM6Ly9yZWxpYWJpbGl0eS5zdWJzdGFjay5jb20vZmVlZC8">Google Podcasts</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_!XRpl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8860a474-28f0-45b9-99c3-7fce19954b2a_368x368.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XRpl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8860a474-28f0-45b9-99c3-7fce19954b2a_368x368.png 424w, https://substackcdn.com/image/fetch/$s_!XRpl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8860a474-28f0-45b9-99c3-7fce19954b2a_368x368.png 848w, https://substackcdn.com/image/fetch/$s_!XRpl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8860a474-28f0-45b9-99c3-7fce19954b2a_368x368.png 1272w, https://substackcdn.com/image/fetch/$s_!XRpl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8860a474-28f0-45b9-99c3-7fce19954b2a_368x368.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XRpl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8860a474-28f0-45b9-99c3-7fce19954b2a_368x368.png" width="368" height="368" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8860a474-28f0-45b9-99c3-7fce19954b2a_368x368.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:368,&quot;width&quot;:368,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!XRpl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8860a474-28f0-45b9-99c3-7fce19954b2a_368x368.png 424w, https://substackcdn.com/image/fetch/$s_!XRpl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8860a474-28f0-45b9-99c3-7fce19954b2a_368x368.png 848w, https://substackcdn.com/image/fetch/$s_!XRpl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8860a474-28f0-45b9-99c3-7fce19954b2a_368x368.png 1272w, https://substackcdn.com/image/fetch/$s_!XRpl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8860a474-28f0-45b9-99c3-7fce19954b2a_368x368.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>My view on developer experience and productivity measurement aligns extremely closely with DX&#8217;s view. The productivity of a group of engineers cannot be measured by tools alone - there&#8217;s too many qualitative factors like cross-functional stakeholder beuracracy or inefficiency, and inherent domain/codebase complexity that cannot be measured by tools. At the same time, there are <em>some</em> metrics, like whether an engineer has committed any code-changes in their first week/month, that serve as useful guardrails for engineering leadership. A combination of tools and metrics may provide the holistic view and insights into the engineering organization&#8217;s throughput.</p><p>In this episode, we discuss the DX platform, and Abi&#8217;s recently published research <a href="http://The developer-centric approach to measuring and improving productivity">paper on developer experience</a>. We talk about how organizations can use tools and surveys to iterate and improve upon developer experience, and ultimately, engineering throughput.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!T9dD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faced9bc7-a348-4dba-91b9-53cbe21d2cd5_932x716.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!T9dD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faced9bc7-a348-4dba-91b9-53cbe21d2cd5_932x716.png 424w, https://substackcdn.com/image/fetch/$s_!T9dD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faced9bc7-a348-4dba-91b9-53cbe21d2cd5_932x716.png 848w, https://substackcdn.com/image/fetch/$s_!T9dD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faced9bc7-a348-4dba-91b9-53cbe21d2cd5_932x716.png 1272w, https://substackcdn.com/image/fetch/$s_!T9dD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faced9bc7-a348-4dba-91b9-53cbe21d2cd5_932x716.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!T9dD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faced9bc7-a348-4dba-91b9-53cbe21d2cd5_932x716.png" width="932" height="716" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aced9bc7-a348-4dba-91b9-53cbe21d2cd5_932x716.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:716,&quot;width&quot;:932,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:77122,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!T9dD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faced9bc7-a348-4dba-91b9-53cbe21d2cd5_932x716.png 424w, https://substackcdn.com/image/fetch/$s_!T9dD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faced9bc7-a348-4dba-91b9-53cbe21d2cd5_932x716.png 848w, https://substackcdn.com/image/fetch/$s_!T9dD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faced9bc7-a348-4dba-91b9-53cbe21d2cd5_932x716.png 1272w, https://substackcdn.com/image/fetch/$s_!T9dD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faced9bc7-a348-4dba-91b9-53cbe21d2cd5_932x716.png 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><h2>GPT-4 generated summary</h2><p>In this episode, Abi Noda and I explore the landscape of engineering metrics and a quantifiable approach towards developer experience. Our discussion goes from the value of developer surveys and system-based metrics to the tangible ways in which DX is innovating the field.</p><p>We initiate our conversation with a comparison of developer surveys and system-based metrics. Abi explains that while developer surveys offer a qualitative perspective on tool efficacy and user sentiment, system-based metrics present a quantitative analysis of productivity and code quality.</p><p>The discussion then moves to the real-world applications of these metrics, with Pfizer and eBay as case studies. Pfizer, for example, uses a model where they employ metrics for a detailed understanding of developer needs, subsequently driving strategic decision-making processes. They have used these metrics to identify bottlenecks in their development cycle, and strategically address these pain points. eBay, on the other hand, uses the insights from developer sentiment surveys to design tools that directly enhance developer satisfaction and productivity.</p><p>Next, our dialogue around survey development centered on the dilemma between standardization and customization. While standardization offers cost efficiency and benchmarking opportunities, customization acknowledges the unique nature of every organization. Abi proposes a blend of both to cater to different aspects of developer sentiment and productivity metrics.</p><p>The highlight of the conversation was the introduction of DX's innovative data platform. The platform consolidates data across internal and third-party tools in a ready-to-analyze format, giving users the freedom to build their queries, reports, and metrics. The ability to combine survey and system data allows the unearthing of unique insights, marking a distinctive advantage of DX's approach.</p><p>In this episode, Abi Noda shares enlightening perspectives on engineering metrics and the role they play in shaping the developer experience. We delve into how DX's unique approach to data aggregation and its potential applications can lead organizations toward more data-driven and effective decision-making processes.</p>]]></content:encoded></item><item><title><![CDATA[Software at Scale 57 - Scalable Frontends with Robert Cooke]]></title><description><![CDATA[React is not enough]]></description><link>https://www.softwareatscale.dev/p/software-at-scale-57-scalable-frontends</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/software-at-scale-57-scalable-frontends</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Tue, 16 May 2023 14:46:03 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/121412229/5f7bfdb94d0da6285941657fbe677c57.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Robert Cooke is the CTO and co-founder of <a href="https://www.3forge.com/">3Forge</a>, a real-time data visualization platform.</p><p><a href="https://podcasts.apple.com/us/podcast/software-at-scale/id1543617436">Apple Podcasts</a>&nbsp;|&nbsp;<a href="https://open.spotify.com/show/7eGnnZnfb3mOGTqWR4gTjK?si=DMsJIWg3QjiiJS65A1nEbQ">Spotify</a>&nbsp;|&nbsp;<a href="https://podcasts.google.com/feed/aHR0cHM6Ly9yZWxpYWJpbGl0eS5zdWJzdGFjay5jb20vZmVlZC8">Google Podcasts</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_!yw6F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc16a4336-6d84-4165-9668-336f1417a949_800x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yw6F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc16a4336-6d84-4165-9668-336f1417a949_800x800.png 424w, https://substackcdn.com/image/fetch/$s_!yw6F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc16a4336-6d84-4165-9668-336f1417a949_800x800.png 848w, https://substackcdn.com/image/fetch/$s_!yw6F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc16a4336-6d84-4165-9668-336f1417a949_800x800.png 1272w, https://substackcdn.com/image/fetch/$s_!yw6F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc16a4336-6d84-4165-9668-336f1417a949_800x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yw6F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc16a4336-6d84-4165-9668-336f1417a949_800x800.png" width="800" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c16a4336-6d84-4165-9668-336f1417a949_800x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Robert Cooke - Kitcaster&quot;,&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="Robert Cooke - Kitcaster" title="Robert Cooke - Kitcaster" srcset="https://substackcdn.com/image/fetch/$s_!yw6F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc16a4336-6d84-4165-9668-336f1417a949_800x800.png 424w, https://substackcdn.com/image/fetch/$s_!yw6F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc16a4336-6d84-4165-9668-336f1417a949_800x800.png 848w, https://substackcdn.com/image/fetch/$s_!yw6F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc16a4336-6d84-4165-9668-336f1417a949_800x800.png 1272w, https://substackcdn.com/image/fetch/$s_!yw6F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc16a4336-6d84-4165-9668-336f1417a949_800x800.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>In this episode, we delve into Wall Street's high-frequency trading evolution and the importance of high-volume trading data observability. We examine traditional software observability tools, such as Datadog, and contrast them with 3Forge&#8217;s financial observability platform, AMI.</p><h2>GPT-4 generated summary</h2><p>In this episode of the Software at Scale podcast, Robert Cooke, CTO and Co-founder of 3Forge, a comprehensive internal tools platform, shares his journey and insights. He outlines his career trajectory, which includes prominent positions such as the Infrastructure Lead at Bear Stearns and the Head of Infrastructure at Liquidnet, and his work on high-frequency trading systems that employ software and hardware to perform rapid, automated trading decisions based on market data.</p><p>Cooke elucidates how 3Forge empowers subject matter experts to automate trading decisions by encoding business logic. He underscores the criticality of robust monitoring systems around these automated trading systems, drawing an analogy with nuclear reactors due to the potential catastrophic repercussions of any malfunction.</p><p>The dialogue then shifts to the impact of significant events like the COVID-19 pandemic on high-frequency trading systems. Cooke postulates that these systems can falter under such conditions, as they are designed to follow developer-encoded instructions and lack the flexibility to adjust to unforeseen macro events. He refers to past instances like the Facebook IPO and Knight Capital's downfall, where automated trading systems were unable to handle atypical market conditions, highlighting the necessity for human intervention in such scenarios.</p><p>Cooke then delves into how 3Forge designs software for mission-critical scenarios, making an analogy with military strategy. Utilizing the OODA loop concept - Observe, Orient, Decide, and Act, they can swiftly respond to situations like outages. He argues that traditional observability tools only address the first step, whereas their solution facilitates quick orientation and decision-making, substantially reducing reaction time.</p><p>He cites a scenario involving a sudden surge in Facebook orders where their tool allows operators to detect the problem in real time, comprehend the context, decide on the response, and promptly act on it. He extends this example to situations like government incidents or emergencies where an expedited response is paramount.</p><p>Additionally, Cooke emphasizes the significance of low latency UI updates in their tool. He explains that their software uses an online programming approach, reacting to changes in real-time and only updating the altered components. As data size increases and reaction time becomes more critical, this feature becomes increasingly important.</p><p>Cooke concludes this segment by discussing the evolution of their clients' use cases, from initially needing static data overviews to progressively demanding real-time information and interactive workflows. He gives the example of users being able to comment on a chart and that comment being immediately visible to others, akin to the real-time collaboration features in tools like Google Docs.</p><p>In the subsequent segment, Cooke shares his perspective on choosing the right technology to drive business decisions. He stresses the importance of understanding the history and trends of technology, having experienced several shifts in the tech industry since his early software writing days in the 1980s. He projects that while computer speeds might plateau, parallel computing will proliferate, leading to CPUs with more cores. He also predicts continued growth in memory, both in terms of RAM and disk space.</p><p>He further elucidates his preference for web-based applications due to their security and absence of installation requirements. He underscores the necessity of minimizing the data in the web browser and shares how they have built every component from scratch to achieve this. Their components are designed to handle as much data as possible, constantly pulling in data based on user interaction.</p><p>He also emphasizes the importance of constructing a high-performing component library that integrates seamlessly with different components, providing a consistent user experience. He asserts that developers often face confusion when required to amalgamate different components since these components tend to behave differently. He envisions a future where software development involves no JavaScript or HTML, a concept that he acknowledges may be unsettling to some developers.</p><p>Using the example of a dropdown menu, Cooke explains how a component initially designed for a small amount of data might eventually need to handle much larger data sets. He emphasizes the need to design components to handle the maximum possible data from the outset to avoid such issues.</p><p>The conversation then pivots to the concept of over-engineering. Cooke argues that building a robust and universal solution from the start is not over-engineering but an efficient approach. He notes the significant overlap in applications use cases, making it advantageous to create a component that can cater to a wide variety of needs.</p><p>In response to the host's query about selling software to Wall Street, Cooke advocates targeting the most demanding customers first. He believes that if a product can satisfy such customers, it's easier to sell to others. They argue that it's challenging to start with a simple product and then scale it up for more complex use cases, but it's feasible to start with a complex product and tailor it for simpler use cases.</p><p>Cooke further describes their process of creating a software product. Their strategy was to focus on core components, striving to make them as efficient and effective as possible. This involved investing years on foundational elements like string libraries and data marshalling. After establishing a robust foundation, they could then layer on additional features and enhancements. This approach allowed them to produce a mature and capable product eventually.</p><p>They also underscore the inevitability of users pushing software to its limits, regardless of its optimization. Thus, they argue for creating software that is as fast as possible right from the start. They refer to an interview with Steve Jobs, who argued that the best developers can create software that's substantially faster than others. Cooke's team continually seeks ways to refine and improve the efficiency of their platform.</p><p>Next, the discussion shifts to team composition and the necessary attributes for software engineers. Cooke emphasizes the importance of a strong work ethic and a passion for crafting good software. He explains how his ambition to become the best software developer from a young age has shaped his company's culture, fostering a virtuous cycle of hard work and dedication among his team.</p><p>The host then emphasizes the importance of engineers working on high-quality products, suggesting that problems and bugs can sap energy and demotivate a team. Cooke concurs, comparing the experience of working on high-quality software to working on an F1 race car, and how the pursuit of refinement and optimization is a dream for engineers.</p><p>The conversation then turns to the importance of having a team with diverse thought processes and skillsets. Cooke recounts how the introduction of different disciplines and perspectives in 2019 profoundly transformed his company.</p><p>The dialogue then transitions to the state of software solutions before the introduction of their high-quality software, touching upon the compartmentalized nature of systems in large corporations and the problems that arise from it. Cooke explains how their solution offers a more comprehensive and holistic overview that cuts across different risk categories.</p><p>Finally, in response to the host's question about open-source systems, Cooke expresses reservations about the use of open-source software in a corporate setting. However, he acknowledges the extensive overlap and redundancy among the many new systems being developed. Although he does not identify any specific groundbreaking technology, he believes the rapid proliferation of similar technologies might lead to considerable technical debt in the future.</p><p>Host Utsav wraps up the conversation by asking Cooke about his expectations and concerns for the future of technology and the industry. Cooke voices his concern about the continually growing number of different systems and technologies that companies are adopting, which makes integrating and orchestrating all these components a challenge. He advises companies to exercise caution when adopting multiple technologies simultaneously.</p><p>However, Cooke also expresses enthusiasm about the future of 3Forge, a platform he has devoted a decade of his life to developing. He expresses confidence in the unique approach and discipline employed in building the platform. Cooke is optimistic about the company's growth and marketing efforts and their focus on fostering a developer community. He believes that the platform will thrive as developers share their experiences, and the product gains momentum.</p><p>Utsav acknowledges the excitement and potential challenges that lie ahead, especially in managing community-driven systems. They conclude the conversation by inviting Cooke to return for another discussion in the future to review the progression and evolution of the topic. Both express their appreciation for the fruitful discussion before ending the podcast.</p>]]></content:encoded></item><item><title><![CDATA[Software at Scale 56 - SaaS cost with Roi Rav-Hon]]></title><description><![CDATA[Disclaimer: you might hear how tired I am of Datadog bills throughout this episode.]]></description><link>https://www.softwareatscale.dev/p/software-at-scale-56-saas-cost-with</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/software-at-scale-56-saas-cost-with</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Mon, 17 Apr 2023 16:01:13 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/115255137/ecc1da9552fb5aa254760b3ff3826912.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Roi Rav-Hon is the co-founder and CEO of Finout, a SaaS cost management platform.</p><p><a href="https://podcasts.apple.com/us/podcast/software-at-scale/id1543617436">Apple Podcasts</a>&nbsp;|&nbsp;<a href="https://open.spotify.com/show/7eGnnZnfb3mOGTqWR4gTjK?si=DMsJIWg3QjiiJS65A1nEbQ">Spotify</a>&nbsp;|&nbsp;<a href="https://podcasts.google.com/feed/aHR0cHM6Ly9yZWxpYWJpbGl0eS5zdWJzdGFjay5jb20vZmVlZC8">Google Podcasts</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_!5gA9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce7e78e-84fd-423b-80fa-f4b6476176eb_800x800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5gA9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce7e78e-84fd-423b-80fa-f4b6476176eb_800x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5gA9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce7e78e-84fd-423b-80fa-f4b6476176eb_800x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5gA9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce7e78e-84fd-423b-80fa-f4b6476176eb_800x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5gA9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce7e78e-84fd-423b-80fa-f4b6476176eb_800x800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5gA9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce7e78e-84fd-423b-80fa-f4b6476176eb_800x800.jpeg" width="800" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7ce7e78e-84fd-423b-80fa-f4b6476176eb_800x800.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Profile photo of Roi Ravhon&quot;,&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="Profile photo of Roi Ravhon" title="Profile photo of Roi Ravhon" srcset="https://substackcdn.com/image/fetch/$s_!5gA9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce7e78e-84fd-423b-80fa-f4b6476176eb_800x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5gA9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce7e78e-84fd-423b-80fa-f4b6476176eb_800x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5gA9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce7e78e-84fd-423b-80fa-f4b6476176eb_800x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5gA9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce7e78e-84fd-423b-80fa-f4b6476176eb_800x800.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In this episode, we review the challenge of maintaining reasonable SaaS costs for tech companies. Usage-based pricing models of infrastructure costs lead to a gradual ramp-up of costs and always have sneakily come up as a priority in my career as an infrastructure/platform engineer. So I&#8217;m particularly interested in how engineering teams can better understand, track, and &#8220;shift left&#8221; infrastructure cost tracking and prevent regressions.</p><p>We specifically go over Kubernetes cost management, and why cost management needs to be attributable to the most specific teams in order to be self-governing in an organization.</p>]]></content:encoded></item><item><title><![CDATA[Software at Scale 55 - Troubleshooting and Operating K8s with Ben Ofiri]]></title><description><![CDATA[Everything you wanted to know about running Kubernetes, and more.]]></description><link>https://www.softwareatscale.dev/p/software-at-scale-55-troubleshooting</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/software-at-scale-55-troubleshooting</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Wed, 15 Mar 2023 16:28:00 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/107526273/49ab09dccb22f85ebb8bb4a6a01c55fd.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Ben Ofiri is the CEO and Co-Founder of Komodor, a <a href="https://komodor.com/">Kubernetes</a> troubleshooting platform. </p><p><a href="https://podcasts.apple.com/us/podcast/software-at-scale/id1543617436">Apple Podcasts</a>&nbsp;|&nbsp;<a href="https://open.spotify.com/show/7eGnnZnfb3mOGTqWR4gTjK?si=DMsJIWg3QjiiJS65A1nEbQ">Spotify</a>&nbsp;|&nbsp;<a href="https://podcasts.google.com/feed/aHR0cHM6Ly9yZWxpYWJpbGl0eS5zdWJzdGFjay5jb20vZmVlZC8">Google Podcasts</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_!duGH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef6e9a0a-20f1-41d1-944d-f96fc272fa9f_684x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!duGH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef6e9a0a-20f1-41d1-944d-f96fc272fa9f_684x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!duGH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef6e9a0a-20f1-41d1-944d-f96fc272fa9f_684x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!duGH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef6e9a0a-20f1-41d1-944d-f96fc272fa9f_684x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!duGH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef6e9a0a-20f1-41d1-944d-f96fc272fa9f_684x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!duGH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef6e9a0a-20f1-41d1-944d-f96fc272fa9f_684x1024.jpeg" width="684" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef6e9a0a-20f1-41d1-944d-f96fc272fa9f_684x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:684,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Komodor: Comprehensive Kubernetes Troubleshooting &#8211; The Prime View&quot;,&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="Komodor: Comprehensive Kubernetes Troubleshooting &#8211; The Prime View" title="Komodor: Comprehensive Kubernetes Troubleshooting &#8211; The Prime View" srcset="https://substackcdn.com/image/fetch/$s_!duGH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef6e9a0a-20f1-41d1-944d-f96fc272fa9f_684x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!duGH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef6e9a0a-20f1-41d1-944d-f96fc272fa9f_684x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!duGH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef6e9a0a-20f1-41d1-944d-f96fc272fa9f_684x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!duGH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef6e9a0a-20f1-41d1-944d-f96fc272fa9f_684x1024.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We had an <a href="https://www.softwareatscale.dev/p/software-at-scale-27-itiel-schwartz#details">episode</a> with the other founder of Komodor, Itiel, in 2021, and I thought it would be fun to revisit the topic.</p><h2>Highlights (ChatGPT Generated)</h2><p>[0:00] Introduction to the Software At Scale podcast and the guest speaker, Ben Ofiri, CEO and co-founder of Komodor.</p><p>- Discussion of why Ben decided to work on a Kubernetes platform and the potential impact of Kubernetes becoming the standard for managing microservices.</p><p>- Reasons why companies are interested in adopting Kubernetes, including the ability to scale quickly and cost-effectively, and the enterprise-ready features it offers.</p><p>- The different ways companies migrate to Kubernetes, either starting from a small team and gradually increasing usage, or a strategic decision from the top down.</p><p>- The flexibility of Kubernetes is its strength, but it also comes with complexity that can lead to increased time spent on alerts and managing incidents.</p><p>- The learning curve for developers to be able to efficiently troubleshoot and operate Kubernetes can be steep and is a concern for many organizations.</p><p>[8:17] Tools for Managing Kubernetes.</p><p>- The challenges that arise when trying to operate and manage Kubernetes.</p><p>- DevOps and SRE teams become the bottleneck due to their expertise in managing Kubernetes, leading to frustration for other teams.</p><p>- A report by the cloud native observability organization found that one out of five developers felt frustrated enough to want to quit their job due to friction between different teams.</p><p>- Ben's idea for Komodor was to take the knowledge and expertise of the DevOps and SRE teams and democratize it to the entire organization.</p><p>- The platform simplifies the operation, management, and troubleshooting aspects of Kubernetes for every engineer in the company, from junior developers to the head of engineering.</p><p>- One of the most frustrating issues for customers is identifying which teams should care about which issues in Kubernetes, which Komodor helps solve with automated checks and reports that indicate whether the problem is an infrastructure or application issue, among other things.</p><p>- Komodor provides suggestions for actions to take but leaves the decision-making and responsibility for taking the action to the users.</p><p>- The platform allows users to track how many times they take an action and how useful it is, allowing for optimization over time.</p><p>[8:17] Tools for Managing Kubernetes.</p><p>[12:03] The Challenge of Balancing Standardization and Flexibility.</p><p>- Kubernetes provides a lot of flexibility, but this can lead to fragmented infrastructure and inconsistent usage patterns.</p><p>- Komodor aims to strike a balance between standardization and flexibility, allowing for best practices and guidelines to be established while still allowing for customization and unique needs.</p><p>[16:14] Using Data to Improve Kubernetes Management.</p><p>- The platform tracks user actions and the effectiveness of those actions to make suggestions and fine-tune recommendations over time.</p><p>- The goal is to build a machine that knows what actions to take for almost all scenarios in Kubernetes, providing maximum benefit to customers.</p><p>[20:40] Why Kubernetes Doesn't Include All Management Functionality.</p><p>- Kubernetes is an open-source project with many different directions it can go in terms of adding functionality.</p><p>- Reliability, observability, and operational functionality are typically provided by vendors or cloud providers and not organically from the Kubernetes community.</p><p>- Different players in the ecosystem contribute different pieces to create a comprehensive experience for the end user.</p><p>[25:05] Keeping Up with Kubernetes Development and Adoption.</p><p>- How Komodor keeps up with Kubernetes development and adoption.</p><p>- The team is data-driven and closely tracks user feedback and needs, as well as new developments and changes in the ecosystem.</p><p>- The use and adoption of custom resources is a constantly evolving and rapidly changing area, requiring quick research and translation into product specs.</p><p>- The company hires deeply technical people, including those with backgrounds in DevOps and SRE, to ensure a deep understanding of the complex problem they are trying to solve.</p><p>[32:12] The Effects of the Economy on Komodor.</p><p>- The effects of the economy pivot on Komodor.</p><p>- Companiesmust be more cost-efficient, leading to increased interest in Kubernetes and tools like Komodor.</p><p>- The pandemic has also highlighted the need for remote work and cloud-based infrastructure, further fueling demand.</p><p>- Komodor has seen growth as a result of these factors and believes it is well-positioned for continued success.</p><p>[36:17] The Future of Kubernetes and Komodor.</p><p>- Kubernetes will continue to evolve and be adopted more widely by organizations of all sizes and industries.</p><p>- The team is excited about the potential of rule engines and other tools to improve management and automation within Kubernetes.</p>]]></content:encoded></item><item><title><![CDATA[Software at Scale 54 - Community Trust with Vikas Agarwal]]></title><description><![CDATA[Hillary Clinton, Donald Trump Jr, Elon Musk, Jeff Bezos, AI and ML - this episode really has it all]]></description><link>https://www.softwareatscale.dev/p/software-at-scale-54-community-trust</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/software-at-scale-54-community-trust</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Wed, 01 Feb 2023 17:18:04 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/100149186/5e1a29bf45fc5d851ac1d42d78483f6a.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Vikas Agarwal is an engineering leader with over twenty years of experience leading engineering teams. We focused this episode on his experience as the Head of Community Trust at Amazon and dealing with the various challenges of fake reviews on Amazon products.</p><p><a href="https://podcasts.apple.com/us/podcast/software-at-scale/id1543617436">Apple Podcasts</a>&nbsp;|&nbsp;<a href="https://open.spotify.com/show/7eGnnZnfb3mOGTqWR4gTjK?si=DMsJIWg3QjiiJS65A1nEbQ">Spotify</a>&nbsp;|&nbsp;<a href="https://podcasts.google.com/feed/aHR0cHM6Ly9yZWxpYWJpbGl0eS5zdWJzdGFjay5jb20vZmVlZC8">Google Podcasts</a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.softwareatscale.dev/subscribe?"><span>Subscribe now</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share Software at Scale&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.softwareatscale.dev/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share Software at Scale</span></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_!HVM6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208478bb-b06d-4c70-8471-44ea96f9d24c_718x718.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HVM6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208478bb-b06d-4c70-8471-44ea96f9d24c_718x718.jpeg 424w, https://substackcdn.com/image/fetch/$s_!HVM6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208478bb-b06d-4c70-8471-44ea96f9d24c_718x718.jpeg 848w, https://substackcdn.com/image/fetch/$s_!HVM6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208478bb-b06d-4c70-8471-44ea96f9d24c_718x718.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!HVM6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208478bb-b06d-4c70-8471-44ea96f9d24c_718x718.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HVM6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208478bb-b06d-4c70-8471-44ea96f9d24c_718x718.jpeg" width="718" height="718" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/208478bb-b06d-4c70-8471-44ea96f9d24c_718x718.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:718,&quot;width&quot;:718,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Profile photo of Vikas Agarwal&quot;,&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="Profile photo of Vikas Agarwal" title="Profile photo of Vikas Agarwal" srcset="https://substackcdn.com/image/fetch/$s_!HVM6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208478bb-b06d-4c70-8471-44ea96f9d24c_718x718.jpeg 424w, https://substackcdn.com/image/fetch/$s_!HVM6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208478bb-b06d-4c70-8471-44ea96f9d24c_718x718.jpeg 848w, https://substackcdn.com/image/fetch/$s_!HVM6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208478bb-b06d-4c70-8471-44ea96f9d24c_718x718.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!HVM6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208478bb-b06d-4c70-8471-44ea96f9d24c_718x718.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Highlights (GPT-3 generated)</h1><p>[0:00:17] Vikas Agarwal's origin story.</p><p>[0:00:52] How Vikas learned to code.</p><p>[0:03:24] Vikas's first job out of college.</p><p>[0:04:30] Vikas' experience with the review business and community trust.</p><p>[0:06:10] Mission of the community trust team.</p><p>[0:07:14] How to start off with a problem.</p><p>[0:09:30] Different flavors of review abuse.</p><p>[0:10:15] The program for gift cards and fake reviews.</p><p>[0:12:10] Google search and FinTech.</p><p>[0:14:00] Fraud and ML models.</p><p>[0:15:51] Other things to consider when it comes to trust.</p><p>[0:17:42] Ryan Reynolds' funny review on his product.</p><p>[0:18:10] Reddit-like problems.</p><p>[0:21:03] Activism filters.</p><p>[0:23:03] Elon Musk's changing policy.</p><p>[0:23:59] False positives and appeals process.</p><p>[0:28:29] Stress levels and question mark emails from Jeff Bezos.</p><p>[0:30:32] Jeff Bezos' mathematical skills.</p><p>[0:31:45] Amazon's closed loop auditing process.</p><p>[0:32:24] Amazon's success and leadership principles.</p><p>[0:33:35] Operationalizing appeals at scale.</p><p>[0:35:45] Data science, metrics, and hackathons.</p><p>[0:37:14] Developer experience and iterating changes.</p><p>[0:37:52] Advice for tackling a problem of this scale.</p><p>[0:39:19] Striving for trust and external validation.</p><p>[0:40:01] Amazon's efforts to combat abuse.</p><p>[0:40:32] Conclusion.</p>]]></content:encoded></item><item><title><![CDATA[Software at Scale 53 - Testing Culture with Mike Bland]]></title><description><![CDATA[Mike Bland is a software instigator - he helped drive adoption of automated testing at Google, and the Quality Culture Initiative at Apple.]]></description><link>https://www.softwareatscale.dev/p/software-at-scale-53-testing-culture</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/software-at-scale-53-testing-culture</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Wed, 28 Dec 2022 17:33:30 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/91630783/39194fd9add93f0ea3bee6e647a5f81d.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Mike Bland is a software <em>instigator</em> - he helped drive adoption of<a href="https://mike-bland.com/about.html#presentations"> automated testing at Google</a>, and the <a href="https://mike-bland.com/2022/11/07/leaving-apple.html">Quality Culture Initiative at Apple</a>.</p><p><a href="https://podcasts.apple.com/us/podcast/software-at-scale/id1543617436">Apple Podcasts</a>&nbsp;|&nbsp;<a href="https://open.spotify.com/show/7eGnnZnfb3mOGTqWR4gTjK?si=DMsJIWg3QjiiJS65A1nEbQ">Spotify</a>&nbsp;|&nbsp;<a href="https://podcasts.google.com/feed/aHR0cHM6Ly9yZWxpYWJpbGl0eS5zdWJzdGFjay5jb20vZmVlZC8">Google Podcasts</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_!Ibnb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66ebcb2a-4ae2-45cb-b598-41d5c637d5e8_489x489.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ibnb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66ebcb2a-4ae2-45cb-b598-41d5c637d5e8_489x489.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ibnb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66ebcb2a-4ae2-45cb-b598-41d5c637d5e8_489x489.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ibnb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66ebcb2a-4ae2-45cb-b598-41d5c637d5e8_489x489.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ibnb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66ebcb2a-4ae2-45cb-b598-41d5c637d5e8_489x489.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ibnb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66ebcb2a-4ae2-45cb-b598-41d5c637d5e8_489x489.jpeg" width="489" height="489" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/66ebcb2a-4ae2-45cb-b598-41d5c637d5e8_489x489.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:489,&quot;width&quot;:489,&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_!Ibnb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66ebcb2a-4ae2-45cb-b598-41d5c637d5e8_489x489.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ibnb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66ebcb2a-4ae2-45cb-b598-41d5c637d5e8_489x489.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ibnb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66ebcb2a-4ae2-45cb-b598-41d5c637d5e8_489x489.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ibnb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66ebcb2a-4ae2-45cb-b598-41d5c637d5e8_489x489.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share Software at Scale&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.softwareatscale.dev/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share Software at Scale</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.softwareatscale.dev/subscribe?"><span>Subscribe now</span></a></p><p></p><p>Mike&#8217;s blog was instrumental towards my decision to pick a job in developer productivity/platform engineering. We talk about the <a href="https://mike-bland.com/the-rainbow-of-death">Rainbow of Death</a> - the idea of driving cultural change in large engineering organizations - one of the key challenges of platform engineering teams. And we deep dive into the value and common pushbacks against automated testing. </p><h1>Highlights (GPT-3 generated)</h1><p>[0:00 - 0:29] Welcome</p><p>[0:29 - 0:38] Explanation of Rainbow of Death </p><p>[0:38 - 0:52] Story of Testing Grouplet at Google</p><p>[0:52 - 5:52] Benefits of Writing Blogs and Engineering Culture Change </p><p>[5:52 - 6:48] Impact of Mike's Blog</p><p>[6:48 - 7:45] Automated Testing at Scale </p><p>[7:45 - 8:10] "I'm a Snowflake" Mentality </p><p>[8:10 - 8:59] Instigator Theory and Crossing the Chasm Model </p><p>[8:59 - 9:55] Discussion of Dependency Injection and Functional Decomposition</p><p>[9:55 - 16:19] Discussion of Testing and Testable Code </p><p>[16:19 - 24:30] Impact of Organizational and Cultural Change on Writing Tests </p><p>[24:30 - 26:04] Instigator Theory </p><p>[26:04 - 32:47] Strategies for Leaders to Foster and Support Testing </p><p>[32:47 - 38:50] Role of Leadership in Promoting Testing </p><p>[38:50 - 43:29] Philosophical Implications of Testing Practices </p>]]></content:encoded></item><item><title><![CDATA[Software at Scale 52 - Building Build Systems with Benjy Weinberger]]></title><description><![CDATA[Benjy Weinberger is the co-founder of Toolchain, a build tool platform.]]></description><link>https://www.softwareatscale.dev/p/software-at-scale-52-building-build</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/software-at-scale-52-building-build</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Thu, 17 Nov 2022 15:49:24 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/84405146/efacaad5b498034dba6dd4000da033e1.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Benjy Weinberger is the co-founder of <a href="https://toolchain.com/">Toolchain</a>, a build tool platform. He is one of the creators of the original Pants, an in-house Twitter build system focused on Scala, and was the VP of Infrastructure at Foursquare. Toolchain now focuses on <a href="https://www.pantsbuild.org/">Pants 2</a>, a revamped build system.</p><p><a href="https://podcasts.apple.com/us/podcast/software-at-scale/id1543617436">Apple Podcasts</a>&nbsp;|&nbsp;<a href="https://open.spotify.com/show/7eGnnZnfb3mOGTqWR4gTjK?si=DMsJIWg3QjiiJS65A1nEbQ">Spotify</a>&nbsp;|&nbsp;<a href="https://podcasts.google.com/feed/aHR0cHM6Ly9yZWxpYWJpbGl0eS5zdWJzdGFjay5jb20vZmVlZC8">Google Podcasts</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_!fx_x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F881957ae-7936-4e81-a9e5-fb668c55f345_256x269.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fx_x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F881957ae-7936-4e81-a9e5-fb668c55f345_256x269.png 424w, https://substackcdn.com/image/fetch/$s_!fx_x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F881957ae-7936-4e81-a9e5-fb668c55f345_256x269.png 848w, https://substackcdn.com/image/fetch/$s_!fx_x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F881957ae-7936-4e81-a9e5-fb668c55f345_256x269.png 1272w, https://substackcdn.com/image/fetch/$s_!fx_x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F881957ae-7936-4e81-a9e5-fb668c55f345_256x269.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fx_x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F881957ae-7936-4e81-a9e5-fb668c55f345_256x269.png" width="256" height="269" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/881957ae-7936-4e81-a9e5-fb668c55f345_256x269.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:269,&quot;width&quot;:256,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:100461,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fx_x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F881957ae-7936-4e81-a9e5-fb668c55f345_256x269.png 424w, https://substackcdn.com/image/fetch/$s_!fx_x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F881957ae-7936-4e81-a9e5-fb668c55f345_256x269.png 848w, https://substackcdn.com/image/fetch/$s_!fx_x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F881957ae-7936-4e81-a9e5-fb668c55f345_256x269.png 1272w, https://substackcdn.com/image/fetch/$s_!fx_x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F881957ae-7936-4e81-a9e5-fb668c55f345_256x269.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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.softwareatscale.dev/subscribe?"><span>Subscribe now</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share Software at Scale&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.softwareatscale.dev/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share Software at Scale</span></a></p><p></p><p>In this episode, we go back to the basics, and discuss the technical details of scalable build systems, like <a href="https://www.pantsbuild.org/">Pants</a>, <a href="https://bazel.io/">Bazel</a> and <a href="https://buck.build/">Buck</a>. A common challenge with these build systems is that it is extremely hard to migrate to them, and have them interoperate with open source tools that are built differently. Benjy&#8217;s team redesigned Pants with an initial hyper-focus on Python to fix these shortcomings, in an attempt to create a third generation of build tools - one that easily interoperates with differently built packages, but still fast and scalable.</p><h1>Machine-generated Transcript</h1><p>[0:00] Hey, welcome to another episode of the Software at Scale podcast. Joining me here today is Benji Weinberger, previously a software engineer at Google and Twitter, VP of Infrastructure at Foursquare, and now the founder and CEO of Toolchain.<br>Thank you for joining us.<br>Thanks for having me. It's great to be here. Yes. Right from the beginning, I saw that you worked at Google in 2002, which is forever ago, like 20 years ago at this point.<br>What was that experience like? What kind of change did you see as you worked there for a few years?<br><br>[0:37] As you can imagine, it was absolutely fascinating. And I should mention that while I was at Google from 2002, but that was not my first job.<br>I have been a software engineer for over 25 years. And so there were five years before that where I worked at a couple of companies.<br>One was, and I was living in Israel at the time. So my first job out of college was at Check Point, which was a big successful network security company. And then I worked for a small startup.<br>And then I moved to California and started working at Google. And so I had the experience that I think many people had in those days, and many people still do, of the work you're doing is fascinating, but the tools you're given to do it with as a software engineer are not great.<br>This, I'd had five years of experience of sort of struggling with builds being slow, builds being flaky with everything requiring a lot of effort. There was almost a hazing,<br>ritual quality to it. Like, this is what makes you a great software engineer is struggling through the mud and through the quicksand with this like awful substandard tooling. And,<br>We are not users, we are not people for whom products are meant, right?<br>We make products for other people. Then I got to Google.<br><br>[2:03] And Google, when I joined, it was actually struggling with a very massive, very slow make file that took forever to parse, let alone run.<br>But the difference was that I had not seen anywhere else was that Google paid a lot of attention to this problem and Google devoted a lot of resources to solving it.<br>And Google was the first place I'd worked and I still I think in many ways the gold standard of developers are first class participants in the business and deserve the best products and the best tools and we will if there's nothing out there for them to use, we will build it in house and we will put a lot of energy into that.<br>And so it was for me, specifically as an engineer.<br><br>[2:53] A big part of watching that growth from in the sort of early to late 2000s was. The growth of engineering process and best practices and the tools to enforce it and the thing i personally am passionate about is building ci but i'm also talking about.<br>Code review tools and all the tooling around source code management and revision control and just everything to do with engineering process.<br>It really was an object lesson and so very, very fascinating and really inspired a big chunk of the rest of my career.<br>I've heard all sorts of things like Python scripts that had to generate make files and finally they move the Python to your first version of Blaze. So it's like, it's a fascinating history.<br><br>[3:48] Maybe can you tell us one example of something that was like paradigm changing that you saw, like something that created like a magnitude, like order of magnitude difference,<br>in your experience there and maybe your first aha moment on this is how good like developer tools can be?<br><br>[4:09] Sure. I think I had been used to using make basically up till that point. And Google again was, as you mentioned, using make and really squeezing everything it was possible to squeeze out of that lemon and then some.<br><br>[4:25] But when the very early versions of what became blaze which was that big internal build system which inspired basil which is the open source variant of that today. Hey one thing that really struck me was the integration with the revision controls system which was and i think still is performance.<br>I imagine many listeners are very familiar with Git. Perforce is very different. I can only partly remember all of the intricacies of it, because it's been so long since I've used it.<br>But one interesting aspect of it was you could do partial checkouts. It really was designed for giant code bases.<br>There was this concept of partial checkouts where you could check out just the bits of the code that you needed. But of course, then the question is, how do you know what those bits are?<br>But of course the build system knows because the build system knows about dependencies. And so there was this integration, this back and forth between the, um.<br><br>[5:32] Perforce client and the build system that was very creative and very effective.<br>And allowed you to only have locally on your machine, the code that you actually needed to work on the piece of the codebase you're working on,<br>basically the files you cared about and all of their transitive dependencies. And that to me was a very creative solution to a problem that involved some lateral thinking about how,<br>seemingly completely unrelated parts of the tool chain could interact. And that's kind of been that made me realize, oh, there's a lot of creative thought at work here and I love it.<br><br>[6:17] Yeah, no, I think that makes sense. Like I interned there way back in 2016. And I was just fascinated by, I remember by mistake, I ran like a grep across the code base and it just took forever. And that's when I realized, you know, none of this stuff is local.<br>First of all, like half the source code is not even checked out to my machine.<br>And my poor grep command is trying to check that out. But also how seamlessly it would work most of the times behind the scenes.<br>Did you have any experience or did you start working on developer tools then? Or is that just what inspired you towards thinking about developer tools?<br>I did not work on the developer tools at Google. worked on ads and search and sort of Google products, but I was a big user of the developer tools.<br>Exception which was that I made some contributions to the.<br><br>[7:21] Protocol buffer compiler which i think many people may be familiar with and that is. You know if i very deep part of the toolchain that is very integrated into everything there and so that gave me.<br>Some experience with what it's like to hack on a tool that's everyone in every engineer is using and it's the sort of very deep part of their workflow.<br>But it wasn't until after google when i went to twitter.<br><br>[7:56] I noticed that the in my time of google my is there the rest of the industry had not. What's up and suddenly i was sort of stressed ten years into the past and was back to using very slow very clunky flaky.<br>Tools that were not designed for the tasks we were trying to use them for. And so that made me realize, wait a minute, I spent eight years using these great tools.<br>They don't exist outside of these giant companies. I mean, I sort of assumed that maybe, you know, Microsoft and Amazon and some other giants probably have similar internal tools, but there's something out there for everyone else.<br>And so that's when I started hacking on that problem more directly was at Twitter together with John, who is now my co-founder at Toolchain, who was actually ahead of me and ahead of<br>the game at Twitter and already begun working on some solutions and I joined him in that.<br>Could you maybe describe some of the problems you ran into? Like were the bills just taking forever or was there something else?<br><br>[9:09] So there were...<br><br>[9:13] A big part of the problem was that Twitter at the time, the codebase I was interested in and that John was interested in was using Scala. Scala is a fascinating, very rich language.<br><br>[9:30] Its compiler is very slow. And we were in a situation where, you know, you'd make some small change to a file and then builds would take just,<br>10 minutes, 20 minutes, 40 minutes. The iteration time on your desktop was incredibly slow.<br>And then CI times, where there was CI in place, were also incredibly slow because of this huge amount of repetitive or near repetitive work. And this is because the build tools,<br>etc. were pretty naive about understanding what work actually needs to be done given a set of changes.<br>There's been a ton of work specifically on SBT since then.<br><br>[10:22] It has incremental compilation and things like that, but nonetheless, that still doesn't really scale well to large corporate codebases that are what people often refer to as monorepos.<br>If you don't want to fragment your codebase with all of the immense problems that that brings, you end up needing tooling that can handle that situation.<br>Some of the biggest challenges are, how do I do less than recompile the entire codebase every time. How can tooling help me be smart about what is the correct minimal amount of work to do.<br><br>[11:05] To make compiling and testing as fast as it can be?<br><br>[11:12] And I should mention that I dabbled in this problem at Twitter with John. It was when I went to Foursquare that I really got into it because Foursquare similarly had this big Scala codebase with a very similar problem of incredibly slow builds.<br><br>[11:29] The interim solution there was to just upgrade everybody's laptops with more RAM and try and brute force the problem. It was very obvious to everyone there, tons of,<br>force-creation pattern still has lots of very, very smart engineers.<br>And it was very obvious to them that this was not a permanent solution and we were casting around for...<br><br>[11:54] You know what can be smart about scala builds and i remember this thing that i had hacked on twitter and. I reached out to twitter and ask them to open source it so we could use it and collaborate on it wasn't obviously some secret sauce and that is how the very first version of the pants open source build system came to be.<br>I was very much designed around scarlet did eventually.<br>Support other languages. And we hacked on it a lot at Foursquare to get it to...<br><br>[12:32] To get the codebase into a state where we could build it sensibly. So the one big challenge is build speed, build performance.<br>The other big one is managing dependencies, keeping your codebase sane as it scales.<br>Everything to do with How can I audit internal dependencies?<br>How do I make sure that it is very, very easy to accidentally create all sorts of dependency tangles and cycles and create a code base whose dependency structure is unintelligible, really,<br>hard to work with and actually impacts performance negatively, right?<br>If you have a big tangle of dependencies, you're more likely to invalidate a large chunk of your code base with a small change.<br>And so tooling that allows you to reason about the dependencies in your code base and.<br><br>[13:24] Make it more tractable was the other big problem that we were trying to solve. Mm-hmm. No, I think that makes sense.<br>I'm guessing you already have a good understanding of other build systems like Bazel and Buck.<br>Maybe could you walk us through what are the difference for PANs, Veevan? What is the major design differences? And even maybe before that, like, how was Pants designed?<br>And is it something similar to like creating a dependency graph? You need to explicitly include your dependencies.<br>Is there something else that's going on?<br><br>[14:07] Maybe just a primer. Yeah. Absolutely. So I should mention, I was careful to mention, you mentioned Pants V1.<br>The version of Pants that we use today and base our entire technology stack around is what we very unimaginatively call Pants V2, which we launched two years ago almost to the day.<br>That is radically different from Pants V1, from Buck, from Bazel. It is quite a departure in ways that we can talk about later.<br>One thing that I would say Panacea V1 and Buck and Bazel have in common is that they were designed around the use cases of a single organization. is a.<br><br>[14:56] Open source variant or inspired by blaze its design was very much inspired by. Here's how google does engineering and a buck similarly for facebook and pansy one frankly very similar for.<br><br>[15:11] Twitter and we sort of because Foursquare also contributed a lot to it, we sort of nudged it in that direction quite a bit. But it's still very much if you did engineering in this one company's specific image, then this might be a good tool for you.<br>But you had to be very much in that lane.<br>But what these systems all look like is, and the way they are different from much earlier systems is.<br><br>[15:46] They're designed to work in large scalable code bases that have many moving parts and share a lot of code and that builds a lot of different deployables, different, say, binaries or Docker<br>Docker images or AWS lambdas or cloud functions or whatever it is you're deploying, Python distributions, Java files, whatever it is you're building, typically you have many of them in this code base.<br>Could be lots of microservices, could be just lots of different things that you're deploying.<br>And they live in the same repo because you want that unity. You want to be able to share code easily. you don't want to introduce dependency hell problems in your own code. It's bad enough that we have dependency hell problems third-party code.<br><br>[16:34] And so these systems are all if you squint at them from thirty thousand feet today all very similar in that they make that the problem of. Managing and building and testing and packaging in a code base like that much more tractable and the way they do this is by applying information about the dependencies in your code base.<br>So the important ingredient there is that these systems understand the find the relatively fine grained dependencies in your code base.<br>And they can use that information to reason about work that needs to happen. So a naive build system, you'd say, run all the tests in the repo or in this part of the repo.<br>So a naive system would literally just do that, and first they would compile all the code.<br><br>[17:23] But a scalable build system like these would say, well, you've asked me to run these tests, but some of them have already been cached and these others, okay, haven't.<br>So I need to look at these ones I actually need to run. So let me see what needs to be done before I can run them.<br>Oh, so these source files need to be compiled, but some of those already in cache and then these other ones I need to compile. But I can apply concurrency because there are multiple cores on this machine.<br>So I can know through dependency analysis which compile jobs can run concurrently and which cannot. And then when it actually comes time to run the tests, again, I can apply that sort of concurrency logic.<br><br>[18:03] And so these systems, what they have in common is that they use dependency information to make your building testing packaging more tractable in a large code base.<br>They allow you to not have to do the thing that unfortunately many organizations find themselves doing, which is fragmenting the code base into lots of different bits and<br>saying, well, every little team or sub team works in its own code base and they consume each other's code through, um, so it was third party dependencies in which case you are introducing a dependency versioning hell problem.<br>Yeah. And I think that's also what I've seen that makes the migration to a tool like this hard. Cause if you have an existing code base that doesn't lay out dependencies explicitly.<br><br>[18:56] That migration becomes challenging. If you already have an import cycle, for example.<br><br>[19:01] Bazel is not going to work with you. You need to clean that up or you need to create one large target where the benefits of using a tool like Bazel just goes away. And I think that's a key,<br>bit, which is so fascinating because it's the same thing over several years. And I'm hoping that,<br>it sounds like newer tools like Go, at least, they force you to not have circular dependencies and they force you to keep your code base clean so that it's easy to migrate to like a scalable build system.<br><br>[19:33] Yes exactly so it's funny that is the exact observation that let us to pans to see to so they said pans to be one like base like buck was very much inspired by and developed for the needs of a single company and other companies were using it a little bit.<br>But it also suffered from any of the problems you just mentioned with pans to for the first time by this time i left for square and i started to chain with the exact mission of every company every team of any size should have this kind of tooling should have this ability this revolutionary ability to make the code base is fast and tractable at any scale.<br>And that made me realize.<br>We have to design for that we have to design for not for. What a single company's code base looks like but we have to design.<br>To support thousands of code bases of all sorts of different challenges and sizes and shapes and languages and frameworks so.<br>We actually had to sit down and figure out what does it mean to make a tool.<br>Like this assistant like this adoptable over and over again thousands of times you mentioned.<br><br>[20:48] Correctly, that it is very hard to adopt one of those earlier tools because you have to first make your codebase conform to whatever it is that tool expects, and then you have to write huge amounts of manual metadata to describe all of the dependencies in your,<br>the structure and dependencies of your codebase in these so-called build files.<br>If anyone ever sees this written down, it's usually build with all capital letters, like it's yelling at you and that those files typically are huge and contain a huge amount of information your.<br><br>[21:27] I'm describing your code base to the tool with pans be to eat very different approaches first of all we said this needs to handle code bases as they are so if you have circular dependencies it should handle them if you have. I'm going to handle them gracefully and automatically and if you have multiple conflicting external dependencies in different parts of your code base this is pretty common right like you need this version of whatever.<br>Hadoop or NumPy or whatever it is in this part of the code base, and you have a different conflicting version in this other part of the code base, it should be able to handle that.<br>If you have all sorts of dependency tangles and criss-crossing and all sorts of things that are unpleasant, and better not to have, but you have them, the tool should handle that.<br>It should help you remove them if you want to, but it should not let those get in the way of adopting it.<br>It needs to handle real-world code bases. The second thing is it should not require you to write all this crazy amount of metadata.<br>And so with Panzer V2, we leaned in very hard on dependency inference, which means you don't write these crazy build files.<br>You write like very tiny ones that just sort of say, you know, here is some code in this language for the build tool to pay attention to.<br><br>[22:44] But you don't have to edit the added dependencies to them and edit them every time you change dependencies.<br>Instead, the system infers dependencies by static analysis. So it looks at your, and it does this at runtime.<br>So you, you know, almost all your dependencies, 99% of the time, the dependencies are obvious from import statements.<br><br>[23:05] And there are occasional and you can obviously customize this because sometimes there are runtime dependencies that have to be inferred from like a string. So from a json file or whatever is so there are various ways to customize this and of course you can always override it manually.<br>If you have to be generally speaking ninety.<br>Seven percent of the boilerplate that used to going to build files in those old systems including pans v1 no. You know not claiming we did not make the same choice but we goes away with pans v2 for exactly the reason that you mentioned these tools,<br>because they were designed to be adopted once by a captive audience that has no choice in the matter.<br>And it was designed for how that code base that adopting code base already is. is these tools are very hard to adopt.<br>They are massive, sometimes multi-year projects outside of that organization. And we wanted to build something that you could adopt in days to weeks and would be very easy,<br>to customize to your code base and would not require these massive wholesale changes or huge amounts of metadata.<br>And I think we've achieved that. Yeah, I've always wondered like, why couldn't constructing the build file be a part of the build. In many ways, I know it's expensive to do that every time. So just like.<br><br>[24:28] Parts of the build that are expensive, you cache it and then you redo it when things change.<br>And it sounds like you've done exactly that with BANs V2.<br><br>[24:37] We have done exactly that. The results are cached on a profile basis. So the very first time you run something, then dependency inference can take some time. And we are looking at ways to to speed that up.<br>I mean, like no software system has ever done, right? Like it's extremely rare to declare something finished. So we are obviously always looking at ways to speed things up.<br>But yeah, we have done exactly what you mentioned. We don't, I should mention, we don't generate the dependencies into build for, we don't edit build files and then you check them in.<br>We do that a little bit. So I mentioned you do still with PANSTL V2, you need these little tiny build files that just say, here is some code.<br>They typically can literally be one line sometimes, almost like a marker file just to say, here is some code for you to pay attention to.<br>We're even working on getting rid of those.<br>We do have a little script that generates those one time just to help you onboard.<br>But...<br><br>[25:41] The dependencies really are just generated a runtime as on demand as needed and used a runtime so we don't have this problem of. Trying to automatically add or edit a otherwise human authored file that is then checked in like this generating and checking in files is.<br>Problematic in many ways, especially when those files also have to take human written edits.<br>So we just do away with all of that and the dependency inference is at runtime, on demand, as needed, sort of lazily done, and the information is cached. So both cached in memory in the surpassed V2 has this daemon that runs and caches a huge amount of state in memory.<br>And the results of running dependency inference are also cached on disk. So they survive a daemon restart, etc.<br>I think that makes sense to me. My next question is going to be around why would I want to use panthv2 for a smaller code base, right? Like, usually with the smaller codebase, I'm not running into a ton of problems around the build.<br><br>[26:55] I guess, do you notice these inflection points that people run into? It's like, okay, my current build setup is not enough. What's the smallest codebase that you've seen that you think could benefit? Or is it like any codebase in the world? And I should start with,<br>a better build system rather than just Python setup.py or whatever.<br>I think the dividing line is, will this code base ever be used for more than one thing?<br><br>[27:24] So if you have a, let's take the Python example, if literally all this code base will ever do is build this one distribution and a top level setup pie is all I need. And that is, you know, this,<br>sometimes you see this with open source projects and the code base is going to remain relatively small, say it's only ever going to be a few thousand lines and the tests, even if I run<br>the tests from scratch every single time, it takes under five minutes, then you're probably fine.<br>But I think two things I would look at are, am I going to be building multiple things in this code base in the future, or certainly if I'm doing it now.<br>And that is much more common with corporate code bases. You have to ask yourself, okay, my team is growing, more and more people are cooperating on this code base.<br>I want to be able to deploy multiple microservices. I want to be able to deploy multiple cloud functions.<br>I want to be able to deploy multiple distributions or third-party artifacts.<br>I want to be able to.<br><br>[28:41] You know, multiple sort of data science jobs, whatever it is that you're building. If you want, if you ever think you might have more than one, now's the time to think about,<br>okay, how do I structure the code base and what tooling allows me to do this effectively?<br>And then the other thing to look at is build times. If you're using compiled languages, then obviously compilation, in all cases testing, if you start to see like, I can already see that that tests are taking five minutes, 10 minutes, 15 minutes, 20 minutes.<br>Surely, I want some technology that allows me to speed that up through caching, through concurrency, through fine-grained invalidation, namely, don't even attempt to do work that isn't necessary for the result that was asked for.<br>Then it's probably time to start thinking about tools like this, because the earlier you adopt it, the easier it is to adopt.<br>So if you wait until you've got a tangle of multiple setup pies in the repo and it's unclear how you manage them and how you keep their dependencies synchronized,<br>so there aren't version conflicts across these different projects, specifically with Python,<br>this is an interesting problem.<br>I would say with other languages, there is more because of the compilation step in jvm languages or go you.<br><br>[30:10] Encounter the need for a build system much much earlier a bill system of some kind and then you will ask yourself what kind with python because you can get a bite for a while just running. What are the play gate and pie test and i directly and all everything is all together in a single virtual and.<br>But the Python tooling, as mighty as it is, mostly is not designed for larger code bases with multiple, that deploy multiple things and have multiple different sets of.<br><br>[30:52] Internal and external dependencies the tooling generally implicitly assume sort of one top level set up i want top level. Hi project dot com all you know how are you configuring things and so especially using python let's say for jango flask apps or for data science<br>and your code base is growing and you've hired a bunch of data scientists and there's more and more code going in there. With Python, you need to start thinking about what tooling allows me to scale this code base. No, I think I mostly resonate with that. The first question that comes to my mind is,<br>let's talk specifically about the deployment problem. If you're deployed to multiple AWS lambdas or cloud functions or whatever, the first thought that would come to my mind is<br>is I can use separate Docker images that can let me easily produce this container image that I can ship independently.<br>Would you say that's not enough? I totally get that for the build time problem.<br>A Docker image is not going to solve anything. But how about the deployment step?<br><br>[32:02] So again, with deployments, I think there are two ways where a tool like this can really speed things up.<br>One is only build the things that actually need to be redeployed. And because the tool understands dependencies and can do change analysis, it can figure that out.<br>So one of the things that HansB2 does is it integrates with Git.<br>And so it natively understands how to figure out Git diffs. So you can say something like, show me all the whatever, lambdas, let's say, that are affected by changes between these two branches.<br><br>[32:46] And it knows and it understands it can say, well, these files changed and you know, we, I understand the transitive dependencies of those files.<br>So I can see what actually needs to be deployed. And, you know, many cases, many things will not need to be redeployed because they haven't changed.<br>The other thing is there's a lot of performance improvements and process improvements around building those images. So, for example, we have for Python specifically, we have an executable format called PEX,<br>which stands for Python executable, which is a single file that embeds all of your Python code that is needed for your deployable and all of its external requirements, transitive external requirements, all bundled up into this single sort of self-executing file.<br>This allows you to do things like if you have to deploy 50 of these, you can basically have a single docker image.<br><br>[33:52] The different then on top of that you add one layer for each of these fifty and the only difference in that layer is the presence of this pecs file. Where is without all this typically what you would do is.<br>You have fifty docker images each one of which contains a in each one of which you have to build a virtual and which means running.<br><br>[34:15] Pip as part of building the image, and that gets slow and repetitive, and you have to do it 50 times.<br>We have a lot of ways to speed up. Even if you are deploying 50 different Docker images, we have ways of speeding that up quite dramatically.<br>Because again, of things like dependency analysis, the PECS format, and the ability to build incrementally.<br>Yeah, I think I remember that at Dropbox, we came up with our own, like, par format to basically bundle up a Python binary with, I think par stood for Python archive. I'm not<br>entirely sure. But it did something remarkably similar to solve exactly this problem. It just takes so long, especially if you have a large Python code base. I think that makes sense to me. The other thing that one might ask is, with Python, you don't really have,<br>too long of a build time, is what you would guess, because there's nothing to build. Maybe myPy takes some time to do some static analysis, and, of course, your tests can take forever,<br>and you don't want to rerun them. But there isn't that much of a build time that you have to think about. Would you say that you agree with this, or there's some issues that end,<br>up happening on real-world code basis.<br><br>[35:37] Well that's a good question the word builds means different things to different people and we recently taken to using the time see i more. Because i think that is clear to people what that means but when i say build or see i mean it in the law in in the extended sense everything you do to go from.<br>Human written source code to a verified.<br>Test did. deployable artifact and so it's true that for python there's no compilation step although arguably. Running my pie is really important and now that i'm really in the habit of using.<br>My pie i will probably never not use it on python code ever again but so that are.<br><br>[36:28] Sort of build-ish steps for Python such as type checking, such as running code generators like Thrift or Protobuf.<br>And obviously a big, big one is running, resolving third-party dependencies such as running PIP or poetry or whatever it is you're using. So those are all build steps.<br>But with Python, really the big, big, big thing is testing and packaging and primarily testing.<br>And so with Python, you have to be even more rigorous about unit testing than you do with other languages because you don't have a compiler that is catching whole classes of bugs.<br>So and again, MyPy and type checking does really help with that. And so when I build to me includes, build in the large sense includes running tests,<br>includes packaging and includes everything, all the quality control that you run typically in CI or on your desktop in order to go say, well, I've made some edits and here's the proof that these edits are good and I can merge them or deploy them.<br><br>[37:35] I think that makes sense to me. And like, I certainly saw it with the limited number of testing, the limited amount of type checking you can do with Python, like MyPy is definitely<br>improving on this. You just need to unit test a lot to get the same amount of confidence in your own code and then unit tests are not cheap. The biggest question that comes to<br>my mind is that is BANs V2 focused on Python? Because I have a TypeScript code base at my workplace and I would love to replace the TypeScript compiler with something that was slightly smarter and could tell me, you know what, you don't need to run every unit test every change.<br><br>[38:16] Great question so when we launched a pass me to which was two years ago. The.<br>We focused on python and that was the initial language we launched with because you had to start somewhere and in the city ten years in between the very scarlet centric work we were doing on pansy one. And the launch of hands be to something really major happened in the industry which was the python skyrocketed in popularity sky python went from.<br>Mostly the little scripting language around the edges of your quote unquote real code, I can use python like fancy bash to people are building massive multi billion dollar businesses entirely on python code bases and there are a few things that drove this one was.<br>I would say the biggest one probably was the python became the. Language of choice for data science and we have strong support for those use cases. There was another was the,<br>Django and Flask became very popular for writing web apps more and more people were used there were more in Intricate DevOps use cases and Python is very popular for DevOps for various good reasons. So.<br><br>[39:28] Python became super popular. So that was the first thing we supported in pants v2, but we've since added support for or Go, Java, Scala, Kotlin, Shell.<br>Definitely what we don't have yet is JavaScript TypeScript. We are looking at that very closely right now, because that is the very obvious next thing we want to add.<br>Actually, if any listeners have strong opinions about what that should look like, we would love to hear from them or from you on our Slack channels or on our GitHub discussions where we are having some lively discussions about exactly this because the JavaScript.<br><br>[40:09] And TypeScript ecosystem is already very rich with tools and we want to provide only value add, right? We don't want to say, you have to, oh, you know, here's another paradigm you have to adopt.<br>And here's, you know, you have to replace, you've just done replacing whatever this with this, you know, NPM with yarn. And now you have to do this thing. And now we're, we don't want to be<br>another flavor of the month. We only want to do the work that uses those tools, leverages the existing ecosystem but adds value. This is what we do with Python and this is one of the reasons why our Python support is very, very strong, much stronger than any other comparable tool out there is.<br><br>[40:49] A lot of leaning in on the existing Python tool ecosystem but orchestrating them in a way that brings rigor and speed to your builds.<br>And I haven't used the word we a lot. And I just kind of want to clarify who we is here.<br>So there is tool chain, the company, and we're working on, um, uh, SAS and commercial, um, solutions around pants, which we can talk about in a bit.<br>But there is a very robust open source community around pants that is not. tightly held by Toolchain, the company in a way that some other companies open source projects are.<br>So we have a lot of contributors and maintainers on Pants V2 who are not working at Toolchain, but are using Pants in their own companies and their own organizations.<br>And so we have a very wide range of use cases and opinions that are brought to bear. And this is very important because, as I mentioned earlier,<br>we are not trying to design a system for one use case, for one company or a team's use case.<br>We are trying, you know, we are working on a system we want.<br><br>[42:05] Adoption for over and over and over again at a wide variety of companies. And so it's very important for us to have the contributions and the input from a wide variety of teams and companies<br>and people. And it's very fortunate that we now do. I mean, on that note, the thing that comes to my mind is another benefit of your scalable build system like Vance or Bazel or Buck is that you<br>You don't have to learn various different commands when you are spelunking through the code base, whether it's like a Go code base or like a Java code base or TypeScript code base.<br>You just have to run pants build X, Y, Z, and it can construct the appropriate artifacts for you. At least that was my experience with Bazel.<br>Is that something that you are interested in or is that something that pants V2 does kind of act as this meta layer for various other build systems or is it much more specific and knowledgeable about languages itself?<br><br>[43:09] It's, I think your intuition is correct. The idea is we want you to be able to do something like pants test or pants test, you know, give it a path to a directory and it understands what that means.<br>Oh, this directory contains Python code. Therefore, I should run PyTest in this way. And oh, Oh, it also contains some JavaScript code, so I should run the JavaScript test in this way.<br>And it basically provides a conceptual layer above all the individual tools that gives you this uniformity across frameworks, across languages.<br>One way to think about this is.<br><br>[43:52] The tools are all very imperative. say you have to run them with a whole set of flags and inputs and you have to know how to use each one separately. So it's like having just the blades of a Swiss Army knife with<br>no actual Swiss Army knife. A tool like Pants will say, okay, we will encapsulate all of that complexity into a much more simple command line interface. So you can do, like I said,<br>test or pants lint or pants format and it understands, oh, you asked me to format your code. I see that you have the black and I sort configured as formatters. So I will run them. And I happen to know that formatting, because formatting can change the source files,<br>I have to run them sequentially. But when you ask for lint, it's not changing the source files. So I know that I can run them multiple lint as concurrently, that sort of logic. And And different tools have different ways of being configured or of telling you what they want to do, but we...<br><br>[44:58] Can't be to sort of encapsulate all that away from you and so you get this uniform simple command line interface that abstract away a lot of the specifics of these tools and let you run simple commands and the reason this is important is that. This extra layer of indirection is partly what allows pants to apply things like cashing.<br>And invalidation and concurrency because what you're saying is.<br><br>[45:25] Hey, the way to think about it is not, I am telling pants to run tests. It is I am telling pants that I want the results of tests, which is a subtle difference.<br>But pants then has the ability to say, well, I don't actually need to run pi test on all these tests because I have results from some of them already cached. So I will return them from cache.<br>So that layer of indirection not only simplifies the UI, but provides the point where you can apply things like caching and concurrency.<br>Yeah, I think every programmer wants to work with declarative tools. I think SQL is one of those things where you don't have to know how the database works. If SQL were somewhat easier, that dream would be fulfilled. But I think we're all getting there.<br>I guess the next question that I have is, what benefit do I get by using the tool chain, like SaaS product versus Pants V2?<br>When I think about build systems, I think about local development, I think about CI.<br><br>[46:29] Why would I want to use the SaaS product? That's a great question.<br>So Pants does a huge amount of heavy lifting, but in the end it is restricted to the resources is on the machine on which it's running. So when I talk about cash, I'm talking about the local cash on that machine. When I talk about concurrency, I'm talking about using,<br>the cores on your machine. So maybe your CI machine has four cores and your laptop has eight cores. So that's the amount of concurrency you get, which is not nothing at all, which is great.<br><br>[47:04] Thanks for watching!<br><br>[47:04] You know as i mentioned i worked at google for many years and then other companies where distributed systems were saying like i come from a distributed systems background and it really. Here is a problem.<br>All of a piece of work taking a long time because of. Single machine resource constraints the obvious answer here is distributed distributed the work user distributed system and so that's what tool chain offers essentially.<br><br>[47:30] You configure Pants to point to the toolchain system, which is currently SAS.<br>And we will have some news soon about some on-prem solutions.<br>And now the cache that I mentioned is not just did this test run with these exact inputs before on my machine by me me while I was iterating, but has anyone in my organization or any CI run this test before,<br>with these exact inputs?<br>So imagine a very common situation where you come in in the morning and you pull all the changes that have happened since you last pulled.<br>Those changes presumably passed CI, right? And the CI populated the cache.<br>So now when I run tests, I can get cache hits from the CI machine.<br><br>[48:29] Now pretty much, yeah. And then with concurrency, again, so let's say, you know, post cache, there are still 200 tests that need to be run.<br>I could run them eight at a time on my machine or the CI machine could run them, you know, say, four at a time on four cores, or I could run 50 or 100 at a time on a cluster of machines.<br>That's where, again, as your code base gets bigger and bigger, that's where some massive, massive speedups come in.<br>The other aspects of the... I should mention that the remote execution that I just mentioned is something we're about to launch. It is not available today. The remote caching is.<br>The other aspects are things like observability. So when you run builds on your laptop or CI, they're ephemeral.<br>Like the output gets lost in the scroll back.<br>And it's just a wall of text that gets lost with them.<br><br>[49:39] Toolchain all of that information is captured and stored in structured form so you have. Hey the ability to see past bills and see build behavior over time and drill death search builds and drill down into individual builds and see well.<br>How often does this test fail and you know when did this get slow all this kind of information and so you get.<br>This more enterprise level.<br>Observability into a very core piece of developer productivity, which is the iteration time.<br>The time it takes to run tests and build deployables and parcel the quality control checks so that you can merge and deploy code directly relates to time to release.<br>It directly relates to some of the core metrics of developer productivity. How long is it going to take to get this thing out the door?<br>And so having the ability to both speed that up dramatically through distributing the work and having observability into what work is going on, that is what toolchain provides,<br>on top of the already, if I may say, pretty robust open source offering.<br><br>[51:01] So yeah, that's kind of it.<br><br>[51:07] Pants on its own gives you a lot of advantages, but it runs standalone. Plugging it into a larger distributed system really unleashes the full power of Pants as a client to that system.<br><br>[51:21] No, I think what I'm seeing is this interesting convergence. There's several companies trying to do this for Bazel, like BuildBuddy and Edgeflow. So, and it really sounds like the build system of the future, like 10 years from now.<br><br>[51:36] No one will really be developing on their local machines anymore. Like there's GitHub code spaces on one side. It's like you're doing all your development remotely.<br><br>[51:46] I've always found it somewhat odd that development that happens locally and whatever scripts you need to run to provision your CI machine to run the same set of tests<br>are so different sometimes that you can never tell why something's passing locally and failing in in CI or vice versa. And there really should just be this one execution layer that can say, you know what, I'm going to build at a certain commit or run at a certain commit.<br>And that's shared between the local user and the CI user. And your CI script is something as simple as pants build slash slash dot dot dot. And it builds the whole code base for,<br>you. So yeah, I certainly feel like the industry is moving in that direction. I'm curious whether You think that's the same.<br>Do you have an even stronger vision of how folks will be developing 10 years from now? What do you think it's going to look like?<br>Oh, no, I think you're absolutely right. I think if anything, you're underselling it. I think this is how all development should be and will be in the future for multiple reasons.<br>One is performance.<br><br>[52:51] Two is the problem of different platforms. And so today, big thorny problem is I want to, you know, I want to,<br>I'm developing on my Mac book, but the production, so I'm running, when I run tests locally and when I run anything locally, it's running on my Mac book, but that's not our deployable, right?<br>Typically your deploy platform is some flavor of Linux. So...<br><br>[53:17] With the distributed system approach you can run the work in. Containers that exactly match your production environments you don't even have to care about can this run.<br>On will my test pass on mac os do i need ci the runs on mac os just to make sure the developers can. past test on Mac OS and that is somehow correlated with success on the production environment.<br>You can cut away a whole suite of those problems, which today, frankly, I had mentioned earlier, you can get cache hits on your desktop from remote, from CI populating the cache.<br>That is hampered by differences in platform.<br>Is hampered by other differences in local setup that we are working to mitigate. But imagine a world in which build logic is not actually running on your MacBook, or if it is,<br>it's running in a container that exactly matches the container that you're targeting.<br>It cuts away a whole suite of problems around platform differences and allows you to focus because on just a platform you're actually going to deploy too.<br><br>[54:35] And the...<br><br>[54:42] And just the speed and the performance of being able to work and deploy and the visibility that it gives you into the productivity and the operational work of your development team,<br>I really think this absolutely is the future.<br>There is something very strange about how in the last 15 years or so, so many business functions have had the distributed systems treatment applied to them.<br>Function is now that there are these massive valuable companies providing systems that support sales and systems that support marketing and systems that support HR and systems support<br>operations and systems support product management and systems that support every business function,<br>and there need to be more of these that support engineering as a business function.<br><br>[55:48] And so i absolutely think the idea that i need a really powerful laptop so that my running tests can take thirty minutes instead of forty minutes when in reality it should take three minutes is. That's not the future right the future is to as it has been for so many other systems to the web the laptop is that i can take anywhere is.<br>Particularly in these work from home times, is a work from anywhere times, is just a portal into the system that is doing the actual work.<br><br>[56:27] Yeah. And there's all these improvements across the stack, right? When I see companies like Versel, they're like, what if you use Next.js, we provide the best developer platform for<br>that and we want to provide caching. Then there's like the lower level systems with build systems, of course, like bands and Bazel and all that. And at each layer, we're kind<br>of trying to abstract the problem out. So to me, it still feels like there is a lot of innovation to be done. And I'm also going to be really curious to know, you know, there's<br>going to be like a few winners of this space, or if it's going to be pretty broken up. And like everyone's using different tools. It's going to be fascinating, like either way.<br>Yeah, that's really hard to know. I think one thing you mentioned that I think is really important is you said your CI should be as simple as just pants build colon, colon, or whatever.<br>That's our syntax would be sort of pants test lint or whatever.<br>I think that's really important. So.<br><br>[57:30] Today one of the big problems with see i. Which is still growing right now home market is still growing is more more teams realize the value and importance of automated.<br>Very aggressive automated quality control. But configuring CI is really, really complicated. Every CI provider have their own configuration language,<br>and you have to reason about caching, and you have to manually construct cache keys to the extent,<br>that caching is even possible or useful.<br>There's just a lot of figuring out how to configure and set up CI, And even then it's just doing the naive thing.<br><br>[58:18] So there are a couple of interesting companies, Dagger and Earthly, or interesting technologies around simplifying that, but again, you still have to manually,<br>so they are providing a, I would say, better config and more uniform config language that allows you to, for example, run build steps in containers.<br>And that's not nothing at all.<br><br>[58:43] Um, but you still manually creating a lot of, uh, configuration to run these very coarse grained large scale, long running build steps, you know, I think<br>the future is something like my entire CI config post cloning the repo is basically pants build colon, colon, because the system does the configuration for you.<br><br>[59:09] It figures out what that means in a very fast, very fine grained way and does not require you to manually decide on workflows and steps and jobs and how they all fit together.<br>And if I want to speed this thing up, then I have to manually partition the work somehow and write extra config to implement that partitioning.<br>That is the future, I think, is rather than there's the CI layer, say, which would be the CI providers proprietary config or theodagger and then underneath that there is the build<br>tool, which would be Bazel or Pants V2 or whatever it is you're using, could still be we make for many companies today or Maven or Gradle or whatever, I really think the future is the integration of those two layers.<br>In the same way that I referenced much, much earlier in our conversation, how one thing that stood out to me at Google was that they had the insight to integrate the version control layer and the build tool to provide really effective functionality there.<br>I think the build tool being the thing that knows about your dependencies.<br><br>[1:00:29] Can take over many of the jobs of the c i configuration layer in a really smart really fast. Where is the future where essentially more and more of how do i set up and configure and run c i is delegated to the thing that knows about your dependencies and knows about cashing and knows about concurrency and is able,<br>to make smarter decisions than you can in a YAML config file.<br><br>[1:01:02] Yeah, I'm excited for the time that me as a platform engineer has to spend less than 5% of my time thinking about CI and CD and I can focus on other things like improving our data models rather than mucking with the YAML and Terraform configs. Well, yeah.<br>Yeah. Yeah. Today you have to, we're still a little bit in that state because we are engineers and because we, the tools that we use are themselves made out of software. There's,<br>a strong impulse to tinker and there's a strong impulse sake. Well, I want to solve this problem myself or I want to hack on it or I should be able to hack on it. And that's, you should be able to hack on it for sure. But we do deserve more tooling that requires less hacking,<br>and more things and paradigms that have tested and have survived a lot of tire kicking.<br><br>[1:02:00] Will we always need to hack on them a little bit? Yes, absolutely, because of the nature of what we do. I think there's a lot of interesting things still to happen in this space.<br>Yeah, I think we should end on that happy note as we go back to our day jobs mucking with YAML. Well, thanks so much for being a guest. I think this was a great conversation and I hope to have you again for the show sometime.<br>Would love that. Thanks for having me. It was fascinating.</p>]]></content:encoded></item><item><title><![CDATA[Software at Scale 51 - Usage based Pricing with Puneet Gupta]]></title><description><![CDATA[Puneet Gupta is the co-founder and CEO of Amberflo, a cloud metering and usage based pricing platform.]]></description><link>https://www.softwareatscale.dev/p/software-at-scale-51-usage-based</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/software-at-scale-51-usage-based</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Thu, 13 Oct 2022 15:49:25 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/77661410/c085f0ecd8ace397ac4675ae08a8ca03.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Puneet Gupta is the co-founder and CEO of <a href="https://www.amberflo.io/">Amberflo</a>, a cloud metering and usage based pricing platform.</p><p><a href="https://podcasts.apple.com/us/podcast/software-at-scale/id1543617436">Apple Podcasts</a>&nbsp;|&nbsp;<a href="https://open.spotify.com/show/7eGnnZnfb3mOGTqWR4gTjK?si=DMsJIWg3QjiiJS65A1nEbQ">Spotify</a>&nbsp;|&nbsp;<a href="https://podcasts.google.com/feed/aHR0cHM6Ly9yZWxpYWJpbGl0eS5zdWJzdGFjay5jb20vZmVlZC8">Google Podcasts</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_!iDeV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3fd87ade-7e7a-49f9-8e16-9fd6dc0733a6_555x486.svg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iDeV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3fd87ade-7e7a-49f9-8e16-9fd6dc0733a6_555x486.svg 424w, https://substackcdn.com/image/fetch/$s_!iDeV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3fd87ade-7e7a-49f9-8e16-9fd6dc0733a6_555x486.svg 848w, https://substackcdn.com/image/fetch/$s_!iDeV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3fd87ade-7e7a-49f9-8e16-9fd6dc0733a6_555x486.svg 1272w, https://substackcdn.com/image/fetch/$s_!iDeV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3fd87ade-7e7a-49f9-8e16-9fd6dc0733a6_555x486.svg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iDeV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3fd87ade-7e7a-49f9-8e16-9fd6dc0733a6_555x486.svg" width="555" height="486" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/3fd87ade-7e7a-49f9-8e16-9fd6dc0733a6_555x486.svg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:486,&quot;width&quot;:555,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Amberflo - Cloud Metering and Usage-Based Pricing and Billing Platform&quot;,&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="Amberflo - Cloud Metering and Usage-Based Pricing and Billing Platform" title="Amberflo - Cloud Metering and Usage-Based Pricing and Billing Platform" srcset="https://substackcdn.com/image/fetch/$s_!iDeV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3fd87ade-7e7a-49f9-8e16-9fd6dc0733a6_555x486.svg 424w, https://substackcdn.com/image/fetch/$s_!iDeV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3fd87ade-7e7a-49f9-8e16-9fd6dc0733a6_555x486.svg 848w, https://substackcdn.com/image/fetch/$s_!iDeV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3fd87ade-7e7a-49f9-8e16-9fd6dc0733a6_555x486.svg 1272w, https://substackcdn.com/image/fetch/$s_!iDeV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3fd87ade-7e7a-49f9-8e16-9fd6dc0733a6_555x486.svg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.softwareatscale.dev/subscribe?"><span>Subscribe now</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share Software at Scale&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.softwareatscale.dev/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share Software at Scale</span></a></p><p>In this episode, we discuss Puneet&#8217;s fascinating background early at AWS as a GM and his early experience at Oracle Cloud. We initially discuss why AWS shipped S3 as its first product before any other services. After, we go over the cultural differences between AWS and Oracle, and how usage based pricing and sales tied into the organization&#8217;s culture and efficiency.</p><p>Our episode covers all the different ways organizations align themselves better when pricing is directly tied to the usage metrics of customers. We discuss how SaaS subscription models are simply reworking of traditional software licenses, how vendors can dispel fears around overages due to dynamic pricing models, and even why Netflix should be a usage-based-priced service :-)</p><p>We don&#8217;t have a show notes, but I thought it would be interesting to link the <a href="https://press.aboutamazon.com/news-releases/news-release-details/amazon-web-services-launches-amazon-s3-simple-storage-service">initial PR newsletter for S3&#8217;s launch</a>, to reflect on how our industry has completely changed over the last few years.</p>]]></content:encoded></item><item><title><![CDATA[Thoughts on API Reliability]]></title><description><![CDATA[Building and maintaining a public API is a unique software engineering challenge.]]></description><link>https://www.softwareatscale.dev/p/thoughts-on-api-reliability</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/thoughts-on-api-reliability</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Fri, 30 Sep 2022 17:17:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MwBD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9f337830-88cf-44dd-ae89-583d8be994f1_1600x847.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Building and maintaining a public API is a unique software engineering challenge. We have to consider (roughly prioritized):</p><ul><li><p>Security - exposing a service on the public internet has a variety of security implications - we want authentication/authorization as airtight as possible.</p></li><li><p>Reliability - the API is not useful if it&#8217;s down often.</p></li><li><p>Ease of use - it should be as frictionless as possible for developers to work with the API. Authentication flows, pagination, documentation should be as smooth and consistent as possible.</p></li><li><p>Stability - public API callers cannot change in lockstep with the internal codebase, so long term stability guarantees should be thought through.</p></li><li><p>Internal Developer Velocity - it should be simple for other developers in the organization to add new endpoints.</p></li></ul><p>This is a vast and complex area, so I want to focus on one topic - API reliability. Once we want to consider our API<a href="https://en.wikipedia.org/wiki/Software_release_life_cycle#General_availability_(GA)"> generally available</a> for a non-trivial set of users, we need to ensure it will stay reliable. In this post, we discuss common API reliability risks, mitigations, and a framework to keep our APIs reliable for the long term.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software at Scale! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1><strong>Reliability Risk Model</strong></h1><p>Just like <a href="https://slsa.dev/spec/v0.1/threats">security threat models</a>, it&#8217;s useful to think about all the risks and potential scenarios that our API should be able to defend against.&nbsp;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MwBD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9f337830-88cf-44dd-ae89-583d8be994f1_1600x847.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MwBD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9f337830-88cf-44dd-ae89-583d8be994f1_1600x847.png 424w, https://substackcdn.com/image/fetch/$s_!MwBD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9f337830-88cf-44dd-ae89-583d8be994f1_1600x847.png 848w, https://substackcdn.com/image/fetch/$s_!MwBD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9f337830-88cf-44dd-ae89-583d8be994f1_1600x847.png 1272w, https://substackcdn.com/image/fetch/$s_!MwBD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9f337830-88cf-44dd-ae89-583d8be994f1_1600x847.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MwBD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9f337830-88cf-44dd-ae89-583d8be994f1_1600x847.png" width="1456" height="771" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/9f337830-88cf-44dd-ae89-583d8be994f1_1600x847.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:771,&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_!MwBD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9f337830-88cf-44dd-ae89-583d8be994f1_1600x847.png 424w, https://substackcdn.com/image/fetch/$s_!MwBD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9f337830-88cf-44dd-ae89-583d8be994f1_1600x847.png 848w, https://substackcdn.com/image/fetch/$s_!MwBD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9f337830-88cf-44dd-ae89-583d8be994f1_1600x847.png 1272w, https://substackcdn.com/image/fetch/$s_!MwBD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9f337830-88cf-44dd-ae89-583d8be994f1_1600x847.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>Breaking down risks into four categories:</p><p><strong>Development risks</strong>: New faulty application code or infrastructure as code changes can lead to reliability issues. Additionally, application architecture and engineering practices also dictate ongoing reliability. For example, the right RPC library will enforce request timeouts and prevent overloads.</p><p><strong>Deployment risks</strong>: The set of issues that prevent safe deployments. For example, the time it takes for a team to roll back a bad code change, and the likelihood that an on-call is empowered and trained to take a quick set of mitigations. There&#8217;s also the risk impact around faulty changes that can be tuned. For example, a faulty change might lead to a small availability impact to a canary environment, or a global outage, depending on our infrastructure and processes.</p><p><strong>Abuse and load risks</strong>: APIs can go down even if there&#8217;s no changes going out due to changes in client behavior. Bad actors, and good but misconfigured clients are almost indistinguishable in most cases - and there&#8217;s a set of risks around abusive request patterns that have to be considered.</p><p><strong>Infrastructure/dependency/operator risks: </strong>APIs are hosted somewhere, whether it may be a single machine in an office, or on thousands of cloud instances, and there&#8217;s physical infrastructure that might have issues. Alternatively, software infrastructure that our API depends on, like a caching layer, might fail and cause cascading issues.</p><p>Examples from my past experience/conversations:</p><ul><li><p>Bad code deployments - new bugs/misconfigurations that take our API down.</p></li><li><p>Scanners that check for known vulnerabilities of common deployments. For example, Wordpress scanners that check if our admin site is publicly available. These might cause a large request volume.</p></li><li><p>Security scanners deployed by the company&#8217;s security team that perform the same operations as above, but are less concerned about getting rate limited/banned. So the request throughput may even be higher.</p></li><li><p>Cron jobs that make large bursts of requests on the hour that a service isn&#8217;t provisioned for.</p></li><li><p>Large bursts of requests when a particular resource goes viral (<a href="https://news.ycombinator.com/item?id=20147951">the HackerNews hug of death</a>).</p></li><li><p>Large customers attempting a programmatic data-export/migration that cause database load due to<a href="https://stackoverflow.com/questions/49857507/understanding-hot-keys-in-dynamo-db"> hot keys</a>/contention.</p></li><li><p>Extremely large customers performing unbounded API operations.</p><ul><li><p>At one of my previous jobs, we had a concept of users and teams, and teams were generally not more than hundreds of users. But we signed up with a university, and they added forty thousand students to a one team. None of our features and APIs were designed for that sized team.</p></li></ul></li><li><p>Internal services or batch jobs that overload a service that serves external requests.</p></li><li><p>A single bad host in a small deployment that causes a large availability hit due to error amplification. </p><ul><li><p>For example, successful RPCs to the service generally take hundreds of milliseconds, but failures return almost instantaneously. Therefore, more requests get routed to the bad host since it has more capacity.</p></li></ul></li><li><p>The website is down but the on-call engineer does not feel comfortable rolling back and is waiting for a 90 minute CI build for a forward fix to go out.</p></li></ul><p>It&#8217;s worth coming up with a set of risks for our API, as it helps guide a set of principles to operate on and prioritize mitigations.</p><h1><strong>Mitigations</strong></h1><p>These are some common mitigations for various reliability risks.</p><h2>Development Risks</h2><h3><strong>Bounded operations</strong></h3><p>Our first observation is that most API defense measures like rate limiting, request quotas, and timeouts take place per operation. For example, rate limits are most often set up on requests per second. Therefore, we never want a single API operation to do unbounded work. Examples:</p><ul><li><p>List operations should always be paginated.</p><ul><li><p>Let&#8217;s say we have a ListUsers API call - this might be very cheap for small customers, but expensive for large customers - there&#8217;s increased database load, network bandwidth and serialization cost for the same operation. We have to tune the rate limit for our largest customers, which increases our developer friction.</p></li><li><p>In addition, the number of returned items have to be capped. Otherwise, pagination is not useful.</p></li></ul></li><li><p>Set operations that need to operate on a list of items should always take a list of IDs.</p><ul><li><p>And limit the number of items that can be operated on at a time.</p></li></ul></li></ul><p>This is likely the highest ROI principle to keep in mind - it&#8217;s easy to add more rate limiting infrastructure after the fact, but it&#8217;s hard to convert an unpaginated operation into a paginated one, because users will depend on older behavior.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Tna_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7efe102-64b5-4b36-8257-993ebb00295f_1456x296.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Tna_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7efe102-64b5-4b36-8257-993ebb00295f_1456x296.png 424w, https://substackcdn.com/image/fetch/$s_!Tna_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7efe102-64b5-4b36-8257-993ebb00295f_1456x296.png 848w, https://substackcdn.com/image/fetch/$s_!Tna_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7efe102-64b5-4b36-8257-993ebb00295f_1456x296.png 1272w, https://substackcdn.com/image/fetch/$s_!Tna_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7efe102-64b5-4b36-8257-993ebb00295f_1456x296.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Tna_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7efe102-64b5-4b36-8257-993ebb00295f_1456x296.png" width="1456" height="296" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/c7efe102-64b5-4b36-8257-993ebb00295f_1456x296.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:296,&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_!Tna_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7efe102-64b5-4b36-8257-993ebb00295f_1456x296.png 424w, https://substackcdn.com/image/fetch/$s_!Tna_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7efe102-64b5-4b36-8257-993ebb00295f_1456x296.png 848w, https://substackcdn.com/image/fetch/$s_!Tna_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7efe102-64b5-4b36-8257-993ebb00295f_1456x296.png 1272w, https://substackcdn.com/image/fetch/$s_!Tna_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7efe102-64b5-4b36-8257-993ebb00295f_1456x296.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">An example email from a vendor adding pagination to their APIs</figcaption></figure></div><h3><strong>Request timeouts</strong></h3><p>Low request timeouts are primarily an expectation setting mechanism and guardrail - if our API operations take too long, timeouts inform users that the operations have failed. If this happens sufficiently often, ideally, the API operator finds out about it through observability tools or support tickets, and can change the operation to do less work. It forces us to time-bound API operations. Ideally, the timeout also aborts the request so that the operation does not do any more work, but that&#8217;s often hard to implement correctly. For example, it&#8217;s really tricky to abort an<a href="https://stackoverflow.com/questions/69545993/express-js-abort-request-on-timeout?rq=1"> ongoing request in</a> Node. These little things are deeply considered in<a href="https://grpc.io/blog/deadlines/"> RPC libraries</a> and implemented best by them - don&#8217;t roll your own request timeouts!</p><p>It&#8217;s very easy to bump up request timeouts as a cheap mitigation to a user perceived bug, but resist this temptation/schedule work to clean this up.</p><h2>Deployment Risks</h2><h3>Change management&nbsp;</h3><p>Once a faulty change has been rolled out, there needs to be a clear set of owners or DRIs who are trained or feel empowered to mitigate the issue. For business critical services, consider having an on-call rotation of engineers who are trained and equipped to drive mitigations.</p><h4>Emergency rollbacks</h4><p>For stateless services, a rollback is almost always the right approach to mitigate code change related outages. Rollbacks don&#8217;t need to go through the full test suite, as long as we can guarantee that service is being deployed at a change that was previously tested and deployed - which greatly helps with mitigation time.</p><h3>API validation tests</h3><p>A staging deployment that has no reliability bearings on the production deployment is a great test bed for risky changes and continuous <a href="https://docs.datadoghq.com/synthetics/">API validation tests</a>.</p><h3>Canary deployments / Staged rollouts</h3><p>After a certain scale, it&#8217;s worth considering a separate canary deployment which receives code changes before the rest of the fleet. This helps prevent large outages if a faulty code change hasn&#8217;t been tested well enough in other environments. A canary deployment has the advantage of being most similar to the production environment, so it helps testing changes in a more realistic scenario. More sophisticated setups may benefit from <a href="https://netflixtechblog.com/automated-canary-analysis-at-netflix-with-kayenta-3260bc7acc69">Canary Analysis</a>.</p><p>A canary deployment has an unexpected benefit of being a load request<a href="https://www.softwareatscale.dev/p/why-you-should-frequently-turn-down"> playground</a> and can help us understand our load limits. For example, by introducing a load balancer that automatically retries on 500s and spreads requests across canary and production deployments, we can afford to have a few requests to our canaries fail without impacting global availability. This lets us run experiments, like tuning down the number of canary replicas and see how our instances operate under load. This area is worth investing in if we run a high throughput, business critical service.</p><p>Additionally, larger, multi-region or stateful services should be deployed in stages to reduce the blast radius of faulty changes.</p><h3>Separating live and batch traffic</h3><p>With a service oriented architecture, it&#8217;s very simple to overload an externally facing, critical service with an internal batch job that needs to RPC to the service. Even worse, I&#8217;ve seen cases where mobile applications run end to end tests against the production service. The major downside here is that completely disabling such a workflow becomes infeasible over time, since other business critical parts of the system depend on the API.</p><p>It&#8217;s worth trying to completely separate traffic tiers, or even deployments, to prevent non-critical traffic from taking down our system. The Google <a href="https://sre.google/sre-book/handling-overload/">SRE book has a good notion on criticality</a>.</p><h2>Abuse and load risks</h2><h3>Token limits</h3><p>Simple limits can go a long way in helping with API reliability. For example, a limit on the number of API tokens created per user can prevent a malicious bot-farm from working around disabled/rate-limited API tokens.</p><h3><strong>Admin tools</strong></h3><p>Consider having an option to disable a misbehaving API key in an admin portal. This significantly reduces the amount of time it will take to mitigate an outage, and the on-call engineer will thank us for it. Having this ability to disable misbehaving API keys relies on having enough observability to know which clients are being the most troublesome. The simplest path is to have sampled logs on request counts, broken down by customer ID/user ID/hashed API token/token ID so we can find the offender easily.</p><h3><strong>Web Application Firewalls (WAFs)</strong></h3><p>WAFs (<a href="https://aws.amazon.com/waf/">AWS</a>,<a href="https://www.cloudflare.com/learning/ddos/glossary/web-application-firewall-waf/"> Cloudflare</a>) are multi-purpose, and help with basic security posture as well as coarse rate limiting.</p><p>WAFs often let us set up rate limiting rules per IP address, and some even let us set up rules on<a href="https://cloud.google.com/armor/docs/rules-language-reference"> request headers/bodies</a>. They&#8217;re good at preventing misconfigured clients, scanners, and other tools from hitting our service at all, so that more sophisticated rate limiting only needs to be applied at another layer with lower request volumes. Another advantage is that they&#8217;re very cheap -<a href="https://aws.amazon.com/waf/pricing/"> AWS charges 60 cents per million requests</a> + a flat fee, and in terms of engineering time - it&#8217;s very easy to add it in a cloud console/<a href="https://en.wikipedia.org/wiki/Infrastructure_as_code">IaC</a>. Finally, WAFs often have an option to manually block requests from an I.P. address, which can come in very handy during emergencies. Open source proxies like Envoy have enough configurability to enable WAF-like functionality, and may<a href="https://github.com/envoyproxy/envoy/issues/7918"> support holistic in-built ones</a> some day.</p><p>A limitation of WAFs is that they only apply on small time frames, like &#8220;request count over the past five minutes&#8221;. So they won&#8217;t really help with cron-jobs with a greater than five minute cadence, and they&#8217;re completely useless for the first few minutes of an outage. Another issue is that many universities and corporate entities have a <a href="https://en.wikipedia.org/wiki/Network_address_translation">NAT gateway</a>, which all requests through a single I.P. address. So over-aggressive WAF rules are certain to block legitimate traffic.</p><h3><strong>API Gateways</strong></h3><p>API Gateways are a nebulous topic. They provide a central point for our internal services with the external internet, for example, you can serve requests through different services for different routes on the same domain. For the purposes of reliability, they can be thought of as a layer of abstraction between the chaotic outside internet and internal systems. For example, if our setup will ever have more than a single service available over the external internet, we will have to think about the same measures - WAF, observability, timeouts, rate limits, for all such services. Whereas if all our services are protected by the gateway, then these defense measures only need to be set up once. And over time, as we might want to centralize other aspects, like authentication/authorization, and the gateway&#8217;s routing logic can be updated accordingly and without needing to duplicate this logic across several services.</p><p>In practice,<a href="https://aws.amazon.com/api-gateway/"> API Gateways</a> often provide<a href="https://zuplo.com/"> rate limiting</a> as well, so we don&#8217;t have to re-implement it in-house. They offer capabilities like<a href="https://docs.aws.amazon.com/apigateway/latest/developerguide/canary-release.html"> canary deployments</a> to reduce the blast radius of code deployments. So it&#8217;s worth considering whether to start an API architecture with a gateway.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VVKN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1e095335-9d39-4323-b3dd-b2c51c155d71_1600x1140.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VVKN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1e095335-9d39-4323-b3dd-b2c51c155d71_1600x1140.png 424w, https://substackcdn.com/image/fetch/$s_!VVKN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1e095335-9d39-4323-b3dd-b2c51c155d71_1600x1140.png 848w, https://substackcdn.com/image/fetch/$s_!VVKN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1e095335-9d39-4323-b3dd-b2c51c155d71_1600x1140.png 1272w, https://substackcdn.com/image/fetch/$s_!VVKN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1e095335-9d39-4323-b3dd-b2c51c155d71_1600x1140.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VVKN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1e095335-9d39-4323-b3dd-b2c51c155d71_1600x1140.png" width="1456" height="1037" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/1e095335-9d39-4323-b3dd-b2c51c155d71_1600x1140.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1037,&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_!VVKN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1e095335-9d39-4323-b3dd-b2c51c155d71_1600x1140.png 424w, https://substackcdn.com/image/fetch/$s_!VVKN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1e095335-9d39-4323-b3dd-b2c51c155d71_1600x1140.png 848w, https://substackcdn.com/image/fetch/$s_!VVKN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1e095335-9d39-4323-b3dd-b2c51c155d71_1600x1140.png 1272w, https://substackcdn.com/image/fetch/$s_!VVKN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1e095335-9d39-4323-b3dd-b2c51c155d71_1600x1140.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><strong>Rate limiting</strong></h3><p>The value proposition of rate limiting is fairly straightforward. The main question of rate limiting is always whether to fail open or fail closed.</p><ul><li><p>If the rate limiter fails open - we have to consider the case where an abusive client causes the rate limiter to go down. We need to be vigilant about monitoring operational errors in the rate limiter, since it can silently be disabled, which might lead to an outage.</p></li><li><p>If it fails closed - we have to trust another infrastructure component with not degrading the availability of our API. For example, if our API has an availability SLA, then our rate limiter needs to meet or exceed that.</p><ul><li><p>See the discussion on load testing below.</p></li></ul></li></ul><h3><strong>Auto-scaling</strong></h3><p>In a nutshell, auto-scaling means dynamically changing the number of replicas for a service based on a set of signals, like CPU utilization, request queue length, etc. <a href="https://render.com/autoscaling">Infrastructure platforms</a> and <a href="https://github.com/kubernetes/autoscaler">orchestration frameworks</a> often provide auto-scaling out of the box.</p><p>We have to be very careful to understand our systems before deploying auto-scaling. Let&#8217;s take the following barebones API architecture:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LrTg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe81a1136-86ef-4e34-b09a-1e1b557c5597_1456x425.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LrTg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe81a1136-86ef-4e34-b09a-1e1b557c5597_1456x425.png 424w, https://substackcdn.com/image/fetch/$s_!LrTg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe81a1136-86ef-4e34-b09a-1e1b557c5597_1456x425.png 848w, https://substackcdn.com/image/fetch/$s_!LrTg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe81a1136-86ef-4e34-b09a-1e1b557c5597_1456x425.png 1272w, https://substackcdn.com/image/fetch/$s_!LrTg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe81a1136-86ef-4e34-b09a-1e1b557c5597_1456x425.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LrTg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe81a1136-86ef-4e34-b09a-1e1b557c5597_1456x425.png" width="1456" height="425" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/e81a1136-86ef-4e34-b09a-1e1b557c5597_1456x425.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:425,&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_!LrTg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe81a1136-86ef-4e34-b09a-1e1b557c5597_1456x425.png 424w, https://substackcdn.com/image/fetch/$s_!LrTg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe81a1136-86ef-4e34-b09a-1e1b557c5597_1456x425.png 848w, https://substackcdn.com/image/fetch/$s_!LrTg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe81a1136-86ef-4e34-b09a-1e1b557c5597_1456x425.png 1272w, https://substackcdn.com/image/fetch/$s_!LrTg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe81a1136-86ef-4e34-b09a-1e1b557c5597_1456x425.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>It might be simple to set up auto-scaling on the API service based on request latency. But that increases the number of concurrent requests to the database. If the database slows down due to increased load, that might lead to the auto-scaler adding even more API service replicas, which adds even more pressure to the database and might cause an outage. We expect this situation to happen whenever we&#8217;re I/O bound. This frequently happened at<a href="https://www.softwareatscale.dev/p/software-at-scale-002-christine-dodrill#details"> Heroku</a>. Reactive auto-scaling should not be seen as a solution to malicious/abusive patterns, and more as a toil reduction measure for human operators, as well as a cost-saving measure for seasonal request loads. It is not an effective measure for sudden, borderline abusive changes in request throughput.</p><p>There&#8217;s also seasonal auto-scaling - preemptively scaling up instance counts during business hours or some other cadence due to a well known seasonal increases in load. This is generally more well understood, and a very reasonable approach.</p><h2>Infrastructure / dependency risks</h2><h3>Outlier host detection</h3><p>Given a sufficiently large number of instances running in a deployment, it&#8217;s very likely that a few instances will not be as performant as others. Cloud providers try to automatically replace or terminate poorly performing instances, but often, we have to do that work ourselves. That&#8217;s why, it may become relevant to set up <a href="https://www.datadoghq.com/blog/outlier-detection-algorithms-at-datadog/">monitoring for outliers</a> and <a href="https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/outlier#:~:text=Outlier%20detection%20and%20ejection%20is,the%20healthy%20load%20balancing%20set.">prevent requests</a> reaching them. A poorly performing instance in a small deployment may cause error amplification if the instance fails requests much more quickly than a well-behaved instance processing successful requests.</p><h3>Load testing</h3><p>With a sufficiently complex architecture, it&#8217;s very hard to know how a system will perform under increased load. It&#8217;s worth understanding through synthetic load so that we know the system&#8217;s limits and can plan for future growth or seasonality of requests. Read <a href="https://itnext.io/how-i-tripled-load-in-production-for-testing-purposes-at-amazon-518df002465b">this</a> for a fascinating insight into load testing at Amazon.</p><h1><strong>Conclusion</strong></h1><p>To tie this up, an API developer has an array of things to consider to strengthen a public API. A suggested framework:</p><ul><li><p>Come up with a reliability threat model to the API which produces a set of risks.</p><ul><li><p>All APIs have to defend against scanners - this is a standard risk.</p></li><li><p>APIs that allow unauthenticated use have to defend against bots and abuse much more than ones that only allow authenticated use - so some risks are unique to our business and technical context.</p></li></ul></li><li><p>Understand the impact of each risk - would the lack of defenses for the risk take down our entire site, or would the impact be limited to a single customer? These answers depend on our pre-existing software architecture. For example, if we have a<a href="https://www.techtarget.com/searchcloudcomputing/definition/single-tenancy"> single tenant architecture</a>, the blast radius due to an abusive customer is much smaller.</p></li><li><p>Consider the mitigation speed for various risks, especially as they tie into your SLOs, as that will drive a discussion into remediation procedures.</p></li></ul><p>With this input, we can come up with mitigations, a software architecture, and development principles and processes to keep our APIs reliable for a long time.</p><h3>Credits</h3><p>Thanks to Allan Reyes for reading early drafts of this post and providing excellent feedback!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software at Scale! Subscribe for free to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Software at Scale 50 - Redefining Labor with Akshay Buddiga]]></title><description><![CDATA[Akshay Buddiga is the co-founder and CTO of Traba, a labor management platform.]]></description><link>https://www.softwareatscale.dev/p/software-at-scale-50-redefining-labor</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/software-at-scale-50-redefining-labor</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Thu, 08 Sep 2022 16:02:40 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/71673357/7e650b2ffe115132fec84a75d81379a2.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Akshay Buddiga is the co-founder and CTO of Traba, a labor management platform.</p><p><a href="https://podcasts.apple.com/us/podcast/software-at-scale/id1543617436">Apple Podcasts</a>&nbsp;|&nbsp;<a href="https://open.spotify.com/show/7eGnnZnfb3mOGTqWR4gTjK?si=DMsJIWg3QjiiJS65A1nEbQ">Spotify</a>&nbsp;|&nbsp;<a href="https://podcasts.google.com/feed/aHR0cHM6Ly9yZWxpYWJpbGl0eS5zdWJzdGFjay5jb20vZmVlZC8">Google Podcasts</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_!20AA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff58741cf-6082-488a-8733-00833b6da805_1536x1097.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!20AA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff58741cf-6082-488a-8733-00833b6da805_1536x1097.jpeg 424w, https://substackcdn.com/image/fetch/$s_!20AA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff58741cf-6082-488a-8733-00833b6da805_1536x1097.jpeg 848w, https://substackcdn.com/image/fetch/$s_!20AA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff58741cf-6082-488a-8733-00833b6da805_1536x1097.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!20AA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff58741cf-6082-488a-8733-00833b6da805_1536x1097.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!20AA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff58741cf-6082-488a-8733-00833b6da805_1536x1097.jpeg" width="1456" height="1040" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/f58741cf-6082-488a-8733-00833b6da805_1536x1097.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1040,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:160447,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!20AA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff58741cf-6082-488a-8733-00833b6da805_1536x1097.jpeg 424w, https://substackcdn.com/image/fetch/$s_!20AA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff58741cf-6082-488a-8733-00833b6da805_1536x1097.jpeg 848w, https://substackcdn.com/image/fetch/$s_!20AA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff58741cf-6082-488a-8733-00833b6da805_1536x1097.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!20AA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff58741cf-6082-488a-8733-00833b6da805_1536x1097.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Sorry for the long hiatus in episodes! </p><p>Today&#8217;s episode covers a myriad of interesting topics - from being the star of one of the <a href="https://www.theringer.com/sports/2021/7/8/22567880/national-spelling-bee-akshay-buddiga-faint-untold-history">internet&#8217;s first viral videos</a>, to experiencing the hyper-growth at the somewhat controversial Zenefits, scaling out the technology platform at Fanatics, starting a company, picking an accelerator, only permitting in-person work, facilitating career growth of gig workers, and more!</p><h1>Highlights</h1><p>[0:00] - The infamous Spelling Bee incident.</p><p>[06:30] - Why pivot to Computer Science after an undergraduate focus in biomedical engineering?</p><p>[09:30] - Going to Stanford for Management Science and getting an education in Computer Science.</p><p>[13:00] - <a href="https://www.bloomberg.com/features/2016-zenefits/">Zenefits</a> during hyper-growth. Learning from Parker Conrad.</p><p>[18:30] - Building an e-commerce platform with reasonably high scale (powering all NFL gear) as a first software engineering gig. Dealing with lots of constraints from the beginning - like multi-currency support - and delivering a complete solution over several years.</p><p>The interesting seasonality - like Game 7 of the NBA finals - and the implications on the software engineers maintaining e-commerce systems. Watching all the super-bowls with coworkers.</p><p>[26:00] - A large outage, obviously due to DNS routing.</p><p>[31:00] - Why start a company?</p><p>[37:30] - Why join <a href="https://www.beondeck.com/">OnDeck</a>?</p><p>[41:00] - Contrary to the current trend, Traba only allows in-person work. Why is that?</p><p>We go on to talk about the implications of remote work and other decisions in an early startup&#8217;s product velocity.</p><p>[57:00] - On being competitive.</p><p>[58:30] - Velocity is really about not working on the incorrect stuff.</p><p>[68:00] - What&#8217;s next for Traba? What&#8217;s the vision?</p><p>[72:30] - Building two-sided marketplaces, and the career path for gig workers.</p>]]></content:encoded></item><item><title><![CDATA[Software at Scale 49 - State Management with James Cowling]]></title><description><![CDATA[James Cowling is the co-founder of Convex, a state management platform for web developers.]]></description><link>https://www.softwareatscale.dev/p/software-at-scale-49-state-management</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/software-at-scale-49-state-management</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Thu, 23 Jun 2022 14:35:39 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/60694537/0f3bb8bafbf189beb3bc40bc4cd9b22c.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>James Cowling is the co-founder of <a href="https://www.convex.dev/">Convex</a>, a state management platform for web developers.</p><p><a href="https://podcasts.apple.com/us/podcast/software-at-scale/id1543617436">Apple Podcasts</a> | <a href="https://open.spotify.com/show/7eGnnZnfb3mOGTqWR4gTjK?si=DMsJIWg3QjiiJS65A1nEbQ">Spotify</a> | <a href="https://podcasts.google.com/feed/aHR0cHM6Ly9hcGkuc3Vic3RhY2suY29tL2ZlZWQvcG9kY2FzdC81NTcyNS5yc3M">Google Podcasts</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_!evS_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701474-7db2-4737-af8c-26d725105701_1539x1600.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!evS_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701474-7db2-4737-af8c-26d725105701_1539x1600.jpeg 424w, https://substackcdn.com/image/fetch/$s_!evS_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701474-7db2-4737-af8c-26d725105701_1539x1600.jpeg 848w, https://substackcdn.com/image/fetch/$s_!evS_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701474-7db2-4737-af8c-26d725105701_1539x1600.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!evS_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701474-7db2-4737-af8c-26d725105701_1539x1600.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!evS_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701474-7db2-4737-af8c-26d725105701_1539x1600.jpeg" width="1456" height="1514" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/d9701474-7db2-4737-af8c-26d725105701_1539x1600.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1514,&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_!evS_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701474-7db2-4737-af8c-26d725105701_1539x1600.jpeg 424w, https://substackcdn.com/image/fetch/$s_!evS_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701474-7db2-4737-af8c-26d725105701_1539x1600.jpeg 848w, https://substackcdn.com/image/fetch/$s_!evS_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701474-7db2-4737-af8c-26d725105701_1539x1600.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!evS_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701474-7db2-4737-af8c-26d725105701_1539x1600.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We discuss the state of web development in the industry today, and the various different approaches to make it easier. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kkHM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1707fcfd-74a3-4c93-bf65-661ea27f5baf_1600x1158.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kkHM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1707fcfd-74a3-4c93-bf65-661ea27f5baf_1600x1158.png 424w, https://substackcdn.com/image/fetch/$s_!kkHM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1707fcfd-74a3-4c93-bf65-661ea27f5baf_1600x1158.png 848w, https://substackcdn.com/image/fetch/$s_!kkHM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1707fcfd-74a3-4c93-bf65-661ea27f5baf_1600x1158.png 1272w, https://substackcdn.com/image/fetch/$s_!kkHM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1707fcfd-74a3-4c93-bf65-661ea27f5baf_1600x1158.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kkHM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1707fcfd-74a3-4c93-bf65-661ea27f5baf_1600x1158.png" width="1456" height="1054" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/1707fcfd-74a3-4c93-bf65-661ea27f5baf_1600x1158.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1054,&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_!kkHM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1707fcfd-74a3-4c93-bf65-661ea27f5baf_1600x1158.png 424w, https://substackcdn.com/image/fetch/$s_!kkHM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1707fcfd-74a3-4c93-bf65-661ea27f5baf_1600x1158.png 848w, https://substackcdn.com/image/fetch/$s_!kkHM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1707fcfd-74a3-4c93-bf65-661ea27f5baf_1600x1158.png 1272w, https://substackcdn.com/image/fetch/$s_!kkHM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1707fcfd-74a3-4c93-bf65-661ea27f5baf_1600x1158.png 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>Contrasting the Hasura and Convex approach as a good way to illustrate some of the ideas. Hasura lets you skip the web-app, and run queries against the database through GraphQL queries. Convex, on the other hand, helps you stop worrying about databases. No setup or scaling concerns. It&#8217;s interesting to see how various systems are evolving to help developers with reducing the busywork around more and more layers of the stack, and just focus on delivering business value instead.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.softwareatscale.dev/subscribe?"><span>Subscribe now</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share Software at Scale&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.softwareatscale.dev/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share Software at Scale</span></a></p><p>Convex also excels at the developer experience portion - they provide a deep integration with React, use hooks (<a href="https://www.apollographql.com/docs/react/api/react/hooks/">just like Apollo GraphQL</a>) and seem to have a fully typed (and therefore auto-completable) SDK. I expect more companies will move &#8220;up the stack&#8221; to provide deeper integrations with popular tools like React.</p><h1>Episode Reading List</h1><ul><li><p>The co-founders of this company led Dropbox&#8217;s <a href="https://dropbox.tech/infrastructure/inside-the-magic-pocket">Magic Pocket</a> project.</p></li><li><p><a href="https://www.netlify.com/blog/state-management-with-convex/">Convex &#8594; Netlify</a></p></li><li><p><a href="https://docs.convex.dev/understanding/convex-vs-firebase">Convex vs. Firebase</a></p></li><li><p><a href="https://www.prisma.io/">Prisma</a></p><p></p></li></ul>]]></content:encoded></item><item><title><![CDATA[Software at Scale 48 - API Gateway Management with Josh Twist]]></title><description><![CDATA[Listen now | Josh Twist is the co-founder and CEO of Zuplo, a programmable, developer friendly API Gateway Management Platform. We discuss a new category of developer tools startups - API Gateway Management Platforms. We go over what an API Gateway is, why do companies use gateways, common pain-points in gateway management, building reliable systems that serve billions of requests at scale. But most importantly, we dive into the story of Josh&#8217;s UK Developer of the Year 2009 award.]]></description><link>https://www.softwareatscale.dev/p/software-at-scale-48-api-gateway</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/software-at-scale-48-api-gateway</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Thu, 09 Jun 2022 15:55:24 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/58644693/f9055ac63fee39372e5814dc0af2ca82.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Josh Twist is the co-founder and CEO of <a href="https://zuplo.com/">Zuplo</a>, a programmable, developer friendly API Gateway Management Platform.</p><p><a href="https://podcasts.apple.com/us/podcast/software-at-scale/id1543617436">Apple Podcasts</a> | <a href="https://open.spotify.com/show/7eGnnZnfb3mOGTqWR4gTjK?si=DMsJIWg3QjiiJS65A1nEbQ">Spotify</a> | <a href="https://podcasts.google.com/feed/aHR0cHM6Ly9hcGkuc3Vic3RhY2suY29tL2ZlZWQvcG9kY2FzdC81NTcyNS5yc3M">Google Podcasts</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_!4pFq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53893ab2-7fd8-40e6-acf0-3ebb85197fc5_1200x1196.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4pFq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53893ab2-7fd8-40e6-acf0-3ebb85197fc5_1200x1196.png 424w, https://substackcdn.com/image/fetch/$s_!4pFq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53893ab2-7fd8-40e6-acf0-3ebb85197fc5_1200x1196.png 848w, https://substackcdn.com/image/fetch/$s_!4pFq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53893ab2-7fd8-40e6-acf0-3ebb85197fc5_1200x1196.png 1272w, https://substackcdn.com/image/fetch/$s_!4pFq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53893ab2-7fd8-40e6-acf0-3ebb85197fc5_1200x1196.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4pFq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53893ab2-7fd8-40e6-acf0-3ebb85197fc5_1200x1196.png" width="1200" height="1196" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/53893ab2-7fd8-40e6-acf0-3ebb85197fc5_1200x1196.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1196,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1770873,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4pFq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53893ab2-7fd8-40e6-acf0-3ebb85197fc5_1200x1196.png 424w, https://substackcdn.com/image/fetch/$s_!4pFq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53893ab2-7fd8-40e6-acf0-3ebb85197fc5_1200x1196.png 848w, https://substackcdn.com/image/fetch/$s_!4pFq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53893ab2-7fd8-40e6-acf0-3ebb85197fc5_1200x1196.png 1272w, https://substackcdn.com/image/fetch/$s_!4pFq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53893ab2-7fd8-40e6-acf0-3ebb85197fc5_1200x1196.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>We discuss a new category of developer tools startups - API Gateway Management Platforms. We go over what an API Gateway is, why do companies use gateways, common pain-points in gateway management, building reliable systems that serve billions of requests at scale. But most importantly, we dive into the story of Josh&#8217;s UK Developer of the Year 2009 award.</p><p>Recently, I&#8217;ve been working on the <a href="https://developer.vanta.com/">Vanta API</a> and was surprised at how poor the performance and developer experience around Amazon&#8217;s API Gateway is. It has poor support for rate limiting, and has very high edge latency. So I&#8217;m excited for a new crop of companies to provide good solutions in this space.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.softwareatscale.dev/subscribe?"><span>Subscribe now</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share Software at Scale&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.softwareatscale.dev/?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share Software at Scale</span></a></p><h2>Episode Reading List</h2><ul><li><p><a href="https://aws.amazon.com/api-gateway/">Amazon&#8217;s API Gateway</a></p></li><li><p><a href="https://stripe.com/blog/payment-api-design">Stripe&#8217;s API - The first ten years</a></p></li><li><p><a href="https://konghq.com/blog/envoy-service-mesh">Envoy</a></p></li></ul><h2>The Award</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_J3n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9689798b-51bc-4943-862d-418225fb3ffa_3024x4032.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_J3n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9689798b-51bc-4943-862d-418225fb3ffa_3024x4032.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_J3n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9689798b-51bc-4943-862d-418225fb3ffa_3024x4032.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_J3n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9689798b-51bc-4943-862d-418225fb3ffa_3024x4032.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_J3n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9689798b-51bc-4943-862d-418225fb3ffa_3024x4032.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_J3n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9689798b-51bc-4943-862d-418225fb3ffa_3024x4032.jpeg" width="1456" height="1941" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/9689798b-51bc-4943-862d-418225fb3ffa_3024x4032.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2629087,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_J3n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9689798b-51bc-4943-862d-418225fb3ffa_3024x4032.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_J3n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9689798b-51bc-4943-862d-418225fb3ffa_3024x4032.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_J3n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9689798b-51bc-4943-862d-418225fb3ffa_3024x4032.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_J3n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9689798b-51bc-4943-862d-418225fb3ffa_3024x4032.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p>]]></content:encoded></item><item><title><![CDATA[Software at Scale 47 - OpenTelemetry with Ted Young]]></title><description><![CDATA[Ted Young is the Director of Developer Education at Lightstep and a co-founder of the OpenTelemetry project.]]></description><link>https://www.softwareatscale.dev/p/software-at-scale-47-opentelemetry</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/software-at-scale-47-opentelemetry</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Thu, 26 May 2022 18:25:59 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/56664849/521e706a67c4a83eec3f97856bd2ff84.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Ted Young is the Director of Developer Education at <a href="https://lightstep.com/">Lightstep</a> and a co-founder of the <a href="https://opentelemetry.io/">OpenTelemetry</a> project.</p><p><a href="https://podcasts.apple.com/us/podcast/software-at-scale/id1543617436">Apple Podcasts</a> | <a href="https://open.spotify.com/show/7eGnnZnfb3mOGTqWR4gTjK?si=DMsJIWg3QjiiJS65A1nEbQ">Spotify</a> | <a href="https://podcasts.google.com/feed/aHR0cHM6Ly9yZWxpYWJpbGl0eS5zdWJzdGFjay5jb20vZmVlZC8">Google Podcasts</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_!57Yc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec6bae04-ce0a-422d-95c3-4a2b2d5ef745_320x320.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!57Yc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec6bae04-ce0a-422d-95c3-4a2b2d5ef745_320x320.jpeg 424w, https://substackcdn.com/image/fetch/$s_!57Yc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec6bae04-ce0a-422d-95c3-4a2b2d5ef745_320x320.jpeg 848w, https://substackcdn.com/image/fetch/$s_!57Yc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec6bae04-ce0a-422d-95c3-4a2b2d5ef745_320x320.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!57Yc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec6bae04-ce0a-422d-95c3-4a2b2d5ef745_320x320.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!57Yc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec6bae04-ce0a-422d-95c3-4a2b2d5ef745_320x320.jpeg" width="320" height="320" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/ec6bae04-ce0a-422d-95c3-4a2b2d5ef745_320x320.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:320,&quot;width&quot;:320,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Ted Young&quot;,&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="Ted Young" title="Ted Young" srcset="https://substackcdn.com/image/fetch/$s_!57Yc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec6bae04-ce0a-422d-95c3-4a2b2d5ef745_320x320.jpeg 424w, https://substackcdn.com/image/fetch/$s_!57Yc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec6bae04-ce0a-422d-95c3-4a2b2d5ef745_320x320.jpeg 848w, https://substackcdn.com/image/fetch/$s_!57Yc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec6bae04-ce0a-422d-95c3-4a2b2d5ef745_320x320.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!57Yc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fec6bae04-ce0a-422d-95c3-4a2b2d5ef745_320x320.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>This episode dives deep into the history of OpenTelemetry, why we need a new telemetry standard, all the work that goes into building generic telemetry processing infrastructure, and the vision for unified logging, metrics and traces.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OdvO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F42b4f583-770d-476d-8de0-7a4d9feebc29_1000x567.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OdvO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F42b4f583-770d-476d-8de0-7a4d9feebc29_1000x567.png 424w, https://substackcdn.com/image/fetch/$s_!OdvO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F42b4f583-770d-476d-8de0-7a4d9feebc29_1000x567.png 848w, https://substackcdn.com/image/fetch/$s_!OdvO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F42b4f583-770d-476d-8de0-7a4d9feebc29_1000x567.png 1272w, https://substackcdn.com/image/fetch/$s_!OdvO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F42b4f583-770d-476d-8de0-7a4d9feebc29_1000x567.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OdvO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F42b4f583-770d-476d-8de0-7a4d9feebc29_1000x567.png" width="1000" height="567" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/42b4f583-770d-476d-8de0-7a4d9feebc29_1000x567.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:567,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:116473,&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;: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_!OdvO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F42b4f583-770d-476d-8de0-7a4d9feebc29_1000x567.png 424w, https://substackcdn.com/image/fetch/$s_!OdvO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F42b4f583-770d-476d-8de0-7a4d9feebc29_1000x567.png 848w, https://substackcdn.com/image/fetch/$s_!OdvO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F42b4f583-770d-476d-8de0-7a4d9feebc29_1000x567.png 1272w, https://substackcdn.com/image/fetch/$s_!OdvO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F42b4f583-770d-476d-8de0-7a4d9feebc29_1000x567.png 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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.softwareatscale.dev/subscribe?"><span>Subscribe now</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share Software at Scale&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.softwareatscale.dev/?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share Software at Scale</span></a></p><h2>Episode Reading List</h2><p>Instead of highlights, I&#8217;ve attached links to some of our discussion points.</p><ul><li><p>HTTP <a href="https://www.w3.org/TR/trace-context/">Trace Context</a> - new headers to support a standard way to preserve state across HTTP requests.</p></li><li><p><a href="https://opentelemetry.io/docs/concepts/data-collection/">OpenTelemetry Data Collection</a></p></li><li><p><a href="https://zipkin.io/">Zipkin</a></p></li><li><p><a href="https://opencensus.io/">OpenCensus</a> and <a href="https://opentracing.io/">OpenTracing</a> - the precursor projects to OpenTelemetry</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Software at Scale 46 - Authorization with Or Weis]]></title><description><![CDATA[RBAC, ABAC, GBAC, OPAL, and even more acronyms in this deep-dive of permission management]]></description><link>https://www.softwareatscale.dev/p/software-at-scale-46-authorization</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/software-at-scale-46-authorization</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Tue, 10 May 2022 17:31:05 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/54077778/3f86ecdcf05689c821d786cb6a88de96.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Or Weis is the CEO and founder of <a href="https://www.permit.io/">Permit.io</a>, a Permission as a Service platform. Previously, he founded <a href="https://www.rookout.com/">Rookout</a>, a cloud-debugging tool.</p><p><a href="https://podcasts.apple.com/us/podcast/software-at-scale/id1543617436">Apple Podcasts</a> | <a href="https://open.spotify.com/show/7eGnnZnfb3mOGTqWR4gTjK?si=DMsJIWg3QjiiJS65A1nEbQ&amp;nd=1">Spotify</a> | <a href="https://podcasts.google.com/feed/aHR0cHM6Ly9hcGkuc3Vic3RhY2suY29tL2ZlZWQvcG9kY2FzdC81NTcyNS5yc3M">Google Podcasts</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_!qqwl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7b08abcf-9ca0-465d-b3d8-0e6cc239e50a_1500x1000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qqwl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7b08abcf-9ca0-465d-b3d8-0e6cc239e50a_1500x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qqwl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7b08abcf-9ca0-465d-b3d8-0e6cc239e50a_1500x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qqwl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7b08abcf-9ca0-465d-b3d8-0e6cc239e50a_1500x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qqwl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7b08abcf-9ca0-465d-b3d8-0e6cc239e50a_1500x1000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qqwl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7b08abcf-9ca0-465d-b3d8-0e6cc239e50a_1500x1000.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7b08abcf-9ca0-465d-b3d8-0e6cc239e50a_1500x1000.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;:142838,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qqwl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7b08abcf-9ca0-465d-b3d8-0e6cc239e50a_1500x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qqwl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7b08abcf-9ca0-465d-b3d8-0e6cc239e50a_1500x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qqwl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7b08abcf-9ca0-465d-b3d8-0e6cc239e50a_1500x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qqwl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7b08abcf-9ca0-465d-b3d8-0e6cc239e50a_1500x1000.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share Software at Scale&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.softwareatscale.dev/?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share Software at Scale</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.softwareatscale.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.softwareatscale.dev/subscribe?"><span>Subscribe now</span></a></p><p></p><p>Many of us have struggled (or are struggling) with permission management in the various applications we&#8217;ve built. The complexity of these systems always tends to increase through business requirements - for example, some content should only be accessed by paid users or users in a certain geography. Certain architectures like filesystems have hierarchical permissions that efficient evaluation, and there&#8217;s technical complexity that&#8217;s often unique to the specific application.</p><p>We talk about all the complexity around permission management, and techniques to solve it in this episode. We also explore how Permit tries to solve this as a product and abstract this problem out for everyone.</p><h1>Highlights</h1><p>[0:00] - Why work on access control?</p><p>[02:00] - Sources of complexity in permission management</p><p>[08:00] - Which cloud system manages permissions well?</p><p>[11:00] - Product-izing a solution to this problem</p><p>[17:00] - What kind of companies approach you for solutions to this problem?</p><p>[22:00] - Why are there <a href="https://research.google/pubs/pub48190/">research papers</a> written about permission management?</p><p>[38:00] - Permission management across the technology stack (inter-service communication)</p><p>[42:00] - What are you excited about building next?</p>]]></content:encoded></item><item><title><![CDATA[Systemizing Platform Strategy]]></title><description><![CDATA[For small to mid-sized engineering organizations]]></description><link>https://www.softwareatscale.dev/p/systemizing-platform-strategy</link><guid isPermaLink="false">https://www.softwareatscale.dev/p/systemizing-platform-strategy</guid><dc:creator><![CDATA[Utsav Shah]]></dc:creator><pubDate>Sat, 30 Apr 2022 17:20:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KudP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e1f796b-7fc0-4ee6-a28d-e9e21bdcb5d8_1456x899.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As technology organizations grow, there&#8217;s a lot of software engineering work that doesn&#8217;t translate to additional customer value but is just the &#8220;cost of doing business&#8221; - like initiatives for reliability, security, and developer infrastructure. This work is often undertaken by so-called platform teams.</p><p>For the purpose of this blog post, let&#8217;s solidify the definition of a platform team - a platform team doesn&#8217;t directly focus on additional customer value (new products/features) <strong>and</strong> has other engineering teams as customers. Examples include developer tools teams, infrastructure, or reliability teams where the team works on internal systems which other customer-facing teams use, directly or indirectly. On the other hand, a team that purely focuses on the reliability of an internal system, where the work doesn&#8217;t impact other engineering teams, is not a platform team.</p><p>I&#8217;ve been on such platform teams that own developer tools, build and deploy infrastructure, and internal platforms for the past few years. In these teams, the largest challenge has been crafting, scoping, and prioritizing initiatives every planning cycle. Each team operated with a unique set of constraints and aimed to solve different problems, but over time, I noticed some themes that held true across teams, and also resonated with other folks I spoke to across the industry.</p><p>So I created an aspirational process to systemize prioritization of platform work, and I&#8217;ve sketched it out in this blog.</p><h2><strong>Strategy Challenges</strong></h2><p>Platform strategy is tricky for many reasons.</p><p>First, you probably have customers with conflicting needs. It&#8217;s easy to make your system seem more reliable by reducing the frequency of changes you allow or preventing<a href="https://charity.wtf/2019/05/01/friday-deploy-freezes-are-exactly-like-murdering-puppies/"> Friday night deploys</a>, but that would affect developer velocity so it might not be the right trade-off.</p><p>Second, it&#8217;s an N-dimensional problem - if you own multiple areas like security and reliability, you might have projects that could solve problems in both areas, so we should be forcing ourselves to think holistically. For example, a project to improve build times might improve both developer experience and get the finance team off your back, and leave you room for other important initiatives. In contrast, driving a project solely to optimize CI/CD infrastructure might help with the same cost savings, but won&#8217;t improve developer experience.</p><p>Third, technical choices tend to have compounding implications over time, which make decisions (and the corresponding opportunity costs) feel expensive and<a href="https://www.businessinsider.com/jeff-bezos-on-type-1-and-type-2-decisions-2016-4"> Type-1</a>. For example, if you choose to punt on enforcing that your codebase is fully typed today, the codebase will keep growing, and solving this problem in the future will require more work, with the additional work often proportional to the growth of your engineering team.</p><p>Lastly, the cost/benefit calculation of each initiative constantly changes due to the rapid changes in our industry and the technological landscape. For example, if you wait just one more quarter, maybe AWS/Kafka/&lt;insert offering&gt; will add that feature that solves this problem for you in a much cheaper way. Alternatively, you might pick the wrong horse when you&#8217;re an early adopter of a particular technology, and you might have to pay down that cost by a painful migration later on.</p><p>To summarize:</p><ol><li><p>Platform teams often have customers with conflicting needs and have to think carefully about the implications of each project</p></li><li><p>Projects might have an impact across multiple areas of ownership so it pays to think holistically</p></li><li><p>Technical choices compound over time, increasing the cost of mistakes</p></li><li><p>The fast-moving industry landscape causes the cost/benefit calculation of each choice to change rapidly</p></li></ol><h1><strong>Prioritization Considerations</strong></h1><p>With all these in mind, it&#8217;s helpful to come up with a set of guidelines that help with effective prioritization.</p><h3><strong>Principles &amp; Commitments</strong></h3><p>Principles are an abstract set of statements that help guide prioritization. For instance, AWS has a<a href="https://aws.amazon.com/blogs/enterprise-strategy/security-at-aws/"> job zero</a> which is considered table-stakes for the team and takes precedence over any other work. AWS states that security is their job zero, and for good reason - a customer data leak could be highly damaging to the brand, turn away future customers, and cause significant monetary loss. Losing the keys to the kingdom might cause<a href="https://www.infoworld.com/article/2608076/murder-in-the-amazon-cloud.html"> your business to shut down</a>.</p><p>Slightly more concrete is commitments - the set of properties that your system should adhere to, or the set of features that are considered the bare minimum to support. It&#8217;s important to ensure that commitments are met, and breakages are resolved in a timely manner. For example, at <a href="http://vanta.com/">Vanta</a> (where I work at the time of writing), the Platform team commits to ensuring that hot-reloading works for front-end development.</p><p>It&#8217;s important to systemize commitments - shared publicly within the organization, and have general alignment on the importance within the team, so that teams can share a reference on the prioritization of commitment-related work. Without systemized commitments, teams often end up having implicit commitments, where the set of what actually gets fixed depends on the interests and engagement of individuals, rather than the team. For example, if you have an engineer who cares that alert volume stays low, it&#8217;s easy to grow dependent on them, and the system would degrade over time when they decide to move on and no one prioritizes work to improve the situation.</p><p>SLAs are basically metric-based commitments, and provide easier tracking, alerting, therefore accountability.</p><p>Having a list of commitments makes your job as a prioritizer easier - if it&#8217;s not easy maintaining a set of commitments, it&#8217;s very likely that you either need to change them or prioritize a project that solves the underlying problems. This is similar to Will Larson&#8217;s thinking on whether your team is operating in<a href="https://lethain.com/product-management-infra-engineering/"> Foundation or Innovation mode</a> - it should be somewhat straightforward to plan your work if there&#8217;s a lot of work to be done to meet what your team considers table-stakes.</p><h3><strong>Understanding</strong></h3><p>A platform team has to have a deep understanding of its domain. The team has to understand its mission, purpose, and how it helps with the overall business. After this, it needs to have a reasonable understanding of the industry - how teams with similar missions in other companies are generally run, and upcoming technology in their field. For example, an observability team should have a rough understanding of the capabilities of observability systems that can be used for companies of their given scale. A developer tooling team at a certain company size should understand how much companies at their size usually spend per engineer on internal tools.</p><p>There are fairly obvious downsides when a team doesn&#8217;t understand its mission. But if it doesn&#8217;t understand its systems - it will likely find it hard to resolve issues during an outage, efficiently make small changes to meet simple internal customer needs, empathize with the quirks in the system, and be aware of when the system genuinely isn&#8217;t going to be enough. Common symptoms of a platform team without sufficient knowledge are team-members grumbling about how complex and opaque the existing system is, a fear of making changes, and a continuous stream of reactive work.</p><h3><strong>Toil</strong></h3><p>Platform teams need to have a strong focus on toil reduction. A team that works purely on the most business impactful projects and doesn&#8217;t take team sustainability into account is likely to have burned-out team members and attrition, which doesn&#8217;t help the business. The exact amount of time that your team spends on toil vs. projects is case by case -<a href="https://sre.google/sre-book/eliminating-toil/"> Google SRE points to 50%</a>, but I&#8217;ve found that to be too much in practice in a smaller company - more than 30% is probably excessive.</p><h3><strong>Impact</strong></h3><p>First, it&#8217;s important to recognize that platform teams are ultimately responsible for business continuity and performance, not employee happiness. A platform team might nominally be serving internal teams, but it needs to prioritize based on what will help the business most, not by the raw number of teams impacted. In order to do this, platform teams have to understand company and business strategy as well as regular product teams. </p><p>Measuring the impact of a particular project is often an art when there aren&#8217;t reasonable metrics to help guide the decision, and deserves its own blog post.</p><p>Taking all these pieces, we have enough of the picture to help formulate our system.</p><h1><strong>Platform Strategy Decision Maze</strong></h1><p>Putting all the considerations together - we show a rough flow-chart to help formulate strategy. This is similar to the concept of an<a href="https://cdixon.org/2013/08/04/the-idea-maze"> idea-maze for thinking about startup ideas</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_!KudP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e1f796b-7fc0-4ee6-a28d-e9e21bdcb5d8_1456x899.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KudP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e1f796b-7fc0-4ee6-a28d-e9e21bdcb5d8_1456x899.png 424w, https://substackcdn.com/image/fetch/$s_!KudP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e1f796b-7fc0-4ee6-a28d-e9e21bdcb5d8_1456x899.png 848w, https://substackcdn.com/image/fetch/$s_!KudP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e1f796b-7fc0-4ee6-a28d-e9e21bdcb5d8_1456x899.png 1272w, https://substackcdn.com/image/fetch/$s_!KudP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e1f796b-7fc0-4ee6-a28d-e9e21bdcb5d8_1456x899.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KudP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e1f796b-7fc0-4ee6-a28d-e9e21bdcb5d8_1456x899.png" width="1456" height="899" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/9e1f796b-7fc0-4ee6-a28d-e9e21bdcb5d8_1456x899.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:899,&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_!KudP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e1f796b-7fc0-4ee6-a28d-e9e21bdcb5d8_1456x899.png 424w, https://substackcdn.com/image/fetch/$s_!KudP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e1f796b-7fc0-4ee6-a28d-e9e21bdcb5d8_1456x899.png 848w, https://substackcdn.com/image/fetch/$s_!KudP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e1f796b-7fc0-4ee6-a28d-e9e21bdcb5d8_1456x899.png 1272w, https://substackcdn.com/image/fetch/$s_!KudP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e1f796b-7fc0-4ee6-a28d-e9e21bdcb5d8_1456x899.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>We can call this the decision maze.</p><p><strong>The key idea is for the team to develop the muscle to successfully execute foundational work, obtain mastery over their systems, reduce toil to ensure that unplanned work is bounded, and fundamentally understand their domain. This buys time and expertise for the successful execution of forward-thinking projects and keeps the system sustainable for changing circumstances.</strong></p><p>For foundational investments, in prioritized order, the team should:</p><ul><li><p>Maintain its commitments to the business (or tweak them)</p></li><li><p>Understand its domain</p></li><li><p>Minimize toil</p></li><li><p>Ensure sufficient investment in each area that they own</p></li></ul><p>Armed with the breathing room from these foundational investments, the team could focus on compounding leverage - initiatives that can deliver increasing value over time, or prevent issues that would get likelier over time, and cross-cutting efforts - systematic efforts that would improve multiple areas of ownership.</p><p>Let&#8217;s explore how this solves the problems we originally laid out.</p><ol><li><p>Teams ensure that they stick to their commitments as they execute projects, keeping customers with conflicting needs satisfied.</p></li><li><p>Teams develop a holistic understanding of their systems and the state of the industry, which helps tease out projects that might impact multiple areas of ownership and understand what they can incorporate from outside.</p></li><li><p>Teams focus on solving problems with compounding leverage and multiple areas of impact over other problems.</p></li></ol><p>The next challenge is being satisfied with the answers to the questions at each decision point in the decision maze.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DDLN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb12a59-b245-439a-adb3-56c94d64be9c_5110x3760.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DDLN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb12a59-b245-439a-adb3-56c94d64be9c_5110x3760.png 424w, https://substackcdn.com/image/fetch/$s_!DDLN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb12a59-b245-439a-adb3-56c94d64be9c_5110x3760.png 848w, https://substackcdn.com/image/fetch/$s_!DDLN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb12a59-b245-439a-adb3-56c94d64be9c_5110x3760.png 1272w, https://substackcdn.com/image/fetch/$s_!DDLN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb12a59-b245-439a-adb3-56c94d64be9c_5110x3760.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DDLN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb12a59-b245-439a-adb3-56c94d64be9c_5110x3760.png" width="1456" height="1071" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/fdb12a59-b245-439a-adb3-56c94d64be9c_5110x3760.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1071,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:697130,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DDLN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb12a59-b245-439a-adb3-56c94d64be9c_5110x3760.png 424w, https://substackcdn.com/image/fetch/$s_!DDLN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb12a59-b245-439a-adb3-56c94d64be9c_5110x3760.png 848w, https://substackcdn.com/image/fetch/$s_!DDLN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb12a59-b245-439a-adb3-56c94d64be9c_5110x3760.png 1272w, https://substackcdn.com/image/fetch/$s_!DDLN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb12a59-b245-439a-adb3-56c94d64be9c_5110x3760.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>Above, we&#8217;ve sketched out potential methods to help guide each decision.</p><p>Let&#8217;s take an example of an infrastructure or reliability team tasked with network traffic management trying to lay out its strategy. The team could:</p><ul><li><p>Set up their security principles and SLAs on availability numbers, and gain the confidence they will be able to hit those in the medium term, otherwise, fund a project to get there</p></li><li><p>Understand their various owned subsystems like reverse proxies, the subsystem&#8217;s relative strengths and weaknesses, and how they stack up with similar open-source systems/paid products</p></li><li><p>Reduce their toil like on-call alarms through tackling low-hanging fruit, or have a plan on the roadmap to resolve the problem</p></li><li><p>Perform risk analysis and forecast growth to understand whether they need to invest in security, availability, or both</p></li><li><p>Talk to internal customers about capabilities that their systems should have and do some requirements gathering to understand blind spots</p></li><li><p>Investigate whether a project would let the team have significantly better commitments, increased system simplicity, reduced toil, or provide significant business impact on an important dimension like latency</p></li></ul><p>To be clear, this isn&#8217;t a hard-and-fast ruleset, and teams often need to prioritize projects that don&#8217;t follow the prescribed ordering for various important reasons like team morale or momentum. Additionally, there might be the need for foundational projects in one area of ownership, and innovative projects in another area, and work can take place in parallel. So truly, these are just rules of thumb to kick-start a conversation on the extremely tricky and unverifiable process of crafting a strategy for platform teams.</p><h3><strong>Credits</strong></h3><p>Credits to Robbie Ostrow for teaching me about systemizing commitments, and Will Larson for his excellent writing on<a href="https://lethain.com/infrastructure-planning/"> infrastructure prioritization</a>, foundational vs. innovation investments, and<a href="https://lethain.com/work-on-what-matters/"> picking the right work</a>.</p>]]></content:encoded></item></channel></rss>