<?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[Ryan Delgado]]></title><description><![CDATA[I'm on the engineering team at Ramp, and I lead our Data Platform team. I like writing about Platform Engineering, Data, ML, AI, and soft skills.]]></description><link>https://www.ryantime.dev</link><image><url>https://www.ryantime.dev/img/substack.png</url><title>Ryan Delgado</title><link>https://www.ryantime.dev</link></image><generator>Substack</generator><lastBuildDate>Thu, 04 Jun 2026 00:28:07 GMT</lastBuildDate><atom:link href="https://www.ryantime.dev/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Ryan Delgado]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[ryantime@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[ryantime@substack.com]]></itunes:email><itunes:name><![CDATA[Ryan Delgado]]></itunes:name></itunes:owner><itunes:author><![CDATA[Ryan Delgado]]></itunes:author><googleplay:owner><![CDATA[ryantime@substack.com]]></googleplay:owner><googleplay:email><![CDATA[ryantime@substack.com]]></googleplay:email><googleplay:author><![CDATA[Ryan Delgado]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[How AI changes Platform Engineering]]></title><description><![CDATA[(writing this as of May 2026.]]></description><link>https://www.ryantime.dev/p/how-ai-changes-platform-engineering</link><guid isPermaLink="false">https://www.ryantime.dev/p/how-ai-changes-platform-engineering</guid><dc:creator><![CDATA[Ryan Delgado]]></dc:creator><pubDate>Mon, 11 May 2026 01:52:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!tWAm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c64f939-4365-4a21-95fd-daa4a30f0a7f_1944x1090.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>(writing this as of May 2026. It might be out of date by the time you read this)</p><p>AI is a really big deal, including for Platform Engineering. The role, possibilities, and expectations of the platform engineer change significantly with coding agents. I&#8217;ve spent the last year and a half building with coding agents (mainly Claude Code) and building platforms for engineers who use coding agents. I&#8217;ve seen agents excel in tedious but important tasks, lower the barrier to entry onto platforms, and reduce the cost of code and time to delivery. I&#8217;ve also seen them cause problems. We&#8217;re in a different world now, and platform engineering teams must adapt. I&#8217;ll review what I&#8217;ve experienced and learned since building with/for coding agents.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.ryantime.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! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>I feel bold talking about the Topic of our Times in blog two, but eh. In that vein, I&#8217;ll start off in the most obnoxious way possible by saying</p><h1><em>IN THE AGE OF AI</em></h1><p>Everything <a href="https://www.ryantime.dev/p/good-platforms-good-platform-engineers">from before</a> still matters, and actually matters <em>more</em>. Before, we built on platforms by writing code with their bare hands in our IDEs. Nowadays, we instead prompt a coding agent, and the coding agent writes the code <em>and takes other actions</em> around the platform in order to build The Thing. Two major risks here: the agent writes the code wrong or it does something it shouldn&#8217;t. Agents are rapidly becoming as good or better than humans at writing code, but their doggone persistence and naivety of the risks they take make them sometimes at best annoying and at worst dangerous.</p><p>At the same time, the - enormous - productivity gains that agents provide make the trade worth it. When the cost of generating code approaches zero, bottlenecks in other parts of the dev lifecycle become more pronounced. When writing the code took three hours, that ten minute spin-up time for a cloud QA environment was nothing. If it takes three <em>minutes</em> for Claude to generate the code, then it takes &gt;3x as long to spin up a testing environment than it does to write the code, the tests, and maybe even run the tests. The platform becomes the bottleneck.</p><p>AI-by-default is the norm in AI-pilled engineering teams and will become the norm industry-wide soon (best guess is two years, tops). This means that platform teams need to build platforms for <em>agents driven by engineers</em> rather than just engineers. A lot of stuff changes in this new paradigm.</p><h2>Agents - not humans - are the primary users of platforms</h2><p>AI is trained on text produced by humans, its reasoning has similar thought patterns to humans, and AI agents take similar actions to humans. They&#8217;re also similar to us in how we build software, and they have the same needs as us in order to build (except food and water, and sleep apparently). Their default interface is also the terminal rather than the browser (for now, at least). Because agentic engineering will become the default mode of working, a platform isn&#8217;t ready for Prime Time until agents can interact with it and build on it. Let&#8217;s use the Back-end Engineering platform <a href="https://www.ryantime.dev/p/good-platforms-good-platform-engineers">from my first blog</a> as an example. Coding agents should be able to</p><ul><li><p>Clone and fully interact with the git repo. Create branches, commits, PRs, etc.</p></li><li><p>Spin up a local dev environment, and iterate with it.</p></li><li><p>Spin up an ephemeral QA environment in the cloud, including a database.</p></li><li><p>Query Datadog, Sentry, and build logs in the CI tool.</p></li><li><p>Query the database directly.</p></li><li><p>Interact with stuff in AWS.</p></li></ul><p>These are all things we human developers take for granted, but if the coding agent can&#8217;t do all/most these things then they can&#8217;t build on the platform effectively. If your developers primarily use local agents, this is actually easy, because the agent will assume the human&#8217;s identity and act on their behalf while running. Remote agents (e.g. <a href="https://devin.ai/">Devin</a> or maybe you&#8217;ve <a href="https://builders.ramp.com/post/why-we-built-our-background-agent">built your own</a>) are trickier. They can&#8217;t (yet?) assume your identity, and they&#8217;re likely running in a different VPC than the rest of your infra. You&#8217;ll need to work this out with your Infra and Security teams. I&#8217;ll discuss this more later on.</p><h2>SKILL.md files, not Notion docs</h2><p>Well, mostly. Notion and other knowledge management tools still have a place. But much of the content related to writing code and interacting with other aspects of the platform should live in agent skills. Specifically:</p><ul><li><p>How to write code/use the abstractions <em>in the best way</em> on the platform.</p></li><li><p>How to provision and interact with a dev or testing environment.</p></li><li><p>What metrics to look at or what log filters to use in Datadog to monitor application health.</p></li><li><p>How to run tests, linters, and other checks before raising a PR.</p></li></ul><p>Most - but not any - task(s) that a human developer normally does on the platform should also doable by an agent with the same or almost the same quality. North star: users of your platform should be able to one-shot a working v0 of their application &gt;80% of the time. You get here with <a href="https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview">agent skills</a> and other context provided to your agents.</p><h2>On access - More breadth, less depth</h2><p>Think about all of the systems you use in your day-to-day as an engineer. It probably consists of your IDE, Slack, Notion, Linear/Jira, Datadog, and the CLI &amp; web interface for your cloud provider. Sub out any of those apps for a similar app you use. Let&#8217;s say there&#8217;s a Linear ticket that says the <code>/search/invoices</code> route in your back-end service has become slow for larger enterprise customers. If you&#8217;re a human, you&#8217;d probably do something like this:</p><ol><li><p>Read the relevant Linear ticket. Mark it as In Progress.</p></li><li><p>Examine the existing code and tables around the slow route.</p></li><li><p>Noodle on an approach.</p></li><li><p>Write the code for that approach. Iteratively test &amp; write it in your local dev environment.</p></li><li><p>Test it again, but in a testing environment that&#8217;s more prod-like.</p></li><li><p>Code is ready, so you post a &#8220;yo can I get a review?: &lt;link to pr&gt;&#8221; message in a Slack channel.</p></li><li><p>Wait for a review.</p></li><li><p>Code merges and deploys.</p></li><li><p>You check Datadog to see if the route sped up after the change. Assuming it does, you mark the Linear ticket as &#8220;Done.&#8221;</p></li></ol><p>A human can do this no problem. If it has access to Linear, Slack, GitHub, Datadog, and AWS, then so can an agent. To perform a task successfully, an agent needs a clear objective to meet, an environment to experiment on solutions, a way to evaluate those solutions, a way to promote those solutions to production, and time. An agent with enough access to all of the dev tooling paired with a well-written prompt can be as effective as a human engineer in most/all shallow engineering tasks.</p><p>The keyword in that last sentence is &#8220;enough&#8221; access, and I&#8217;d even say <em>just enough</em> <em>and nothing more</em> is more correct. An agent with full access to production systems can <a href="https://www.theguardian.com/technology/2026/apr/29/claude-ai-deletes-firm-database">wreak havoc</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_!tWAm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c64f939-4365-4a21-95fd-daa4a30f0a7f_1944x1090.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tWAm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c64f939-4365-4a21-95fd-daa4a30f0a7f_1944x1090.png 424w, https://substackcdn.com/image/fetch/$s_!tWAm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c64f939-4365-4a21-95fd-daa4a30f0a7f_1944x1090.png 848w, https://substackcdn.com/image/fetch/$s_!tWAm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c64f939-4365-4a21-95fd-daa4a30f0a7f_1944x1090.png 1272w, https://substackcdn.com/image/fetch/$s_!tWAm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c64f939-4365-4a21-95fd-daa4a30f0a7f_1944x1090.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tWAm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c64f939-4365-4a21-95fd-daa4a30f0a7f_1944x1090.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2c64f939-4365-4a21-95fd-daa4a30f0a7f_1944x1090.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2008701,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.ryantime.dev/i/197164515?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c64f939-4365-4a21-95fd-daa4a30f0a7f_1944x1090.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tWAm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c64f939-4365-4a21-95fd-daa4a30f0a7f_1944x1090.png 424w, https://substackcdn.com/image/fetch/$s_!tWAm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c64f939-4365-4a21-95fd-daa4a30f0a7f_1944x1090.png 848w, https://substackcdn.com/image/fetch/$s_!tWAm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c64f939-4365-4a21-95fd-daa4a30f0a7f_1944x1090.png 1272w, https://substackcdn.com/image/fetch/$s_!tWAm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c64f939-4365-4a21-95fd-daa4a30f0a7f_1944x1090.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">Another prescient joke from Silicon Valley</figcaption></figure></div><p>The appropriate safeguards are <em>guardrails, not friction</em>. Some specific advice:</p><ul><li><p>Agents should have baseline read access to public knowledge stores (Notion, Slack), GitHub, the data warehouse, observability tools like Datadog and Sentry, and - yes - Production databases. The more systems they have access to, the more context they can gather, and the more effective they&#8217;ll be.</p></li><li><p>Agents should not be able to write or mutate data or code in Production. Database migrations, code deployments, backfills, and similar functions should be handled by non-agent automated processes. Agents should be able to monitor them and troubleshoot issues, but they should not be able to trigger them.</p></li><li><p>Agents should not be able to read PII. Gate your database behind a proxy layer (<a href="https://www.formal.ai/">Formal</a> is a good solution, or you could build your own), and set up ACLs on PII fields across your tables/collections.</p></li><li><p>Data warehouses need fine-grained ACLs. A marketing professional querying Snowflake through Claude Desktop doesn&#8217;t need access to the <code>super_sensitive_financial_data</code> schema to do their job, so they shouldn&#8217;t have access.</p></li><li><p>Only humans with elevated privileges should be able to delete, restart, or make similar changes to critical systems or data. Default to using <a href="https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_DeleteCluster.html#USER_DeletionProtection">delete protection</a> on critical infrastructure.</p></li><li><p>Credentials should be hidden from agents. Dangling database passwords, API keys, etc. are ways agents can get elevated privilege unintentionally.</p></li><li><p>Data egress should always have a human in the loop. Agents shouldn&#8217;t be able to send emails, upload files to an external S3 bucket, or post in external Slack channels when they also have access to sensitive data. If you give them that access, then that&#8217;s a security incident waiting to happen.</p></li></ul><p>The shrewd security engineer reading this is likely thinking &#8220;these were good ideas before agents.&#8221; Yep, except they&#8217;re way more important now. Platform engineers <em>need</em> to be more security-minded and partner closely with their security engineers on setting up guardrails. A bad security breach could cost you your job, and it&#8217;s way more likely to happen with agents in the loop.</p><h2>The barrier to entry is lower</h2><p>With coding agents, customer experience team members can take a first pass at fixing bugs reported by customers. Members of the Finance team can build their own Streamlit apps rather than relying on someone on the Data team. Members of the Growth team can tune the outbound lead scoring model and ship changes to the ML pipeline without help from an Applied Scientist. Since more stuff gets shipped, this is mostly a good thing. Mostly. Non-engineers should be able to specify intent and get something working <em>and shipped</em> as long as it&#8217;s low risk. Prompts like these should work on the first try:</p><pre><code><code>&gt; I'm just starting in this repo. Set up my local environment, and give me directions on how to build and test Streamlit apps.
</code></code></pre><pre><code><code>&gt; Build a Streamlit app that plots the sale of widgets across our three major hubs. Use the `orders` table in Delta Lake as the primary data source. Also give me the ability to include or exclude customers from a particular industry. Read through the Streamlit docs to find the best a way to do it, and then implement. Execute the appropriate command to run the Streamlit app locally.
</code></code></pre><pre><code><code>&gt; A customer reported a UI bug [pasted screenshot in prompt]. It's supposed to look like &lt;description&gt; but it changed within the last week or so. Please fix it.
</code></code></pre><p>Doing this well while staying sane requires easier &amp; more automated onboarding, easier dev &amp; testing environments, stronger opinions, better enablement materials, stiffer guardrails, and direct engagement with new stakeholders.</p><h2>The quality bar is much higher</h2><p>Spinning up a local dev environment, provisioning an ephemeral QA environment, running deployments, building Docker images, and other not-so-obvious components and tasks on the platform will become painfully obvious if they&#8217;re slow or unreliable. Those flaky tests that developers always ignore because they can easily retry the GitHub Action now become a snag that agents get caught on during an overnight job, or a stampeding herd problem from agents cancelling and retrying when things seem to hang or fail intermittently. (Btw this is a huge reason why Modal <a href="https://techcrunch.com/2026/02/11/ai-inference-startup-modal-labs-in-talks-to-raise-at-2-5b-valuation-sources-say/">is taking off</a> - stuff spins up <em>really</em> quickly, which makes it awesome for agents) Smaller issues become especially pronounced when engineers use long-running &amp; complex teams of agents to ship something complex, one of them gets snagged by a temporary failure, causing all of the other downstream steps to fail. Optimizing provisioning latency and reliability will be a constant task for platform engineers (or their agents, more ideally). Platform teams need to adopt a &#8220;If we can do in 10 minutes, why not 5? If in 5, why not 2?&#8221; mantra when it comes to quality.</p><h2>Build more, buy less</h2><p>The main value props of a managed service are:</p><ul><li><p>Outsourced infra management. They (often) own the infrastructure, and are thus responsible for all of the standard infra duties like patching software, scaling, and ensuring reliability.</p></li><li><p>Premium support. When something goes wrong, you have someone you can depend on to help out.</p></li><li><p>Additional features. A polished UI, faster startup times, observability out of the box, or other pre-baked <em>opinions</em> that provide a better user experience.</p></li><li><p>(if it&#8217;s open source) A better version of what you can build for free. Maybe it&#8217;s a database product and their forked version provides more scalability or performance.</p></li></ul><p>A good vendor means you need to hire one - or more! - fewer engineers on your team. There are tradeoffs, though:</p><ul><li><p>Data security. Outsourcing the infra often means the data resides off-prem. As mentioned before, security is <em>more</em> important with agents, and it&#8217;s heightened by the <a href="https://www.theatlantic.com/technology/2026/04/claude-mythos-hacking/686746/">imminent security risks</a> from more powerful AI.</p></li><li><p>Product velocity. Vendors build to meet the needs of <em>most</em> customers rather than prioritizing <em>your</em> needs. If you flag sharp edges in the product that slow you down, they&#8217;ll likely answer &#8220;We&#8217;ll get to it in the next few quarters.&#8221; With fast things are moving and how quickly your needs likely change, this often isn&#8217;t acceptable.</p></li></ul><p>I could go on-and-on about buy vs build (and I will in a future post), but let&#8217;s go back to agents. With coding agents much of the vendor value prop erodes. Recurring agent jobs can proactively discover new software patches and automate much of the infra upgrades. An on-call agent can be extremely effective with support when it has full access to the documentation, source code, infra diagnostics, and human-written skills. Most of the nice-to-have features offered by a managed service can be easily replicated by a cracked engineer with Claude Code. With full control of the platform direction, you and your coding agents can compress timelines of new platform improvements from months to days. Over time, the compounding effects add up. Platform teams should choose their vendors carefully and default to building first instead of buying for most problems, at least to understand why the problem is hard enough to warrant a vendor.</p><h2>Platforms are less sticky</h2><p>&#8220;If we could migrate off of &lt;managed service&gt;, we could save 600k a year.&#8221;</p><p>&#8220;I wish we could upgrade &lt;framework&gt; to version 3.0, but it we&#8217;ll need to make small changes in hundreds of places in our codebase.&#8221;</p><p>&#8220;Our data scientists could be <em>flying</em> if we used &lt;other framework&gt;, but we&#8217;ve used &lt;current framework&gt; for years and it&#8217;s so ingrained. A migration will be painful.&#8221;</p><p>Platform engineers often groan at these tasks because the work is tedious and the business value takes time to realize or goes unnoticed. As a result, it gets pushed off. This changes with agents. Prompts like these are possible and successful now:</p><pre><code><code>&gt; Find every Kubeflow pipeline in the `pipelines/` subdirectory, and look at the git blame to determine the owner. Create a new "Kubeflow to Prefect" migration Notion Database with these columns: Pipeline Name, Owner Name, Status, PR. Then for each pipeline
  1. Spin up an Opus sub-agent.
  2. Use the kubeflow-to-prefect-migration skill to rewrite the pipeline as a Prefect flow.
  3. Run the flow to test it. Specifically, test its outputs. If it writes to Snowflake, run a parity check between the Kubeflow-derived data and Prefect derived data - row counts, aggregations over columns, etc. If it trains a model, then confirm the version is saved in MLFlow.
  4. Raise a PR and assign to the owner.
  5. Update the entry for the flow in the Notion database.
  
  Use good judgement on expensive training jobs. If the code runs a large, expensive distributed training job, then either aggressively downsample the dataset or adjust the training parameters to cut down costs. Leave a comment in the PR indicating that you made this change.
</code></code></pre><p>or</p><pre><code><code>&gt; Upgrade us to version 2.15.0 of the Snowflake Terraform provider. Use the snowflake-in-localstack skill to run `terraform plan` and `terraform apply` in LocalStack to test changes. "Done" means
- We've upgraded to version 2.15.0
- `terraform plan` results in no changes to the infra, and `terraform apply` runs successfully.
Make changes only in the `snowflake/` and `modules/snowflake/` subdirectories. Raise a PR after you're done.
</code></code></pre><p>or similar. Coding agents can automate much of the tedium with large scale migrations. Now, a migration that would take six+ months and 15 engineers from three different teams can largely be done by one or two cracked platform engineers in a single quarter. Agents excel at extremely tedious tasks, especially migrations and upgrades.</p><h2>Self-managing platforms</h2><p>The automation that agents provide raise the possibility - and expectations - of how proactive platform engineers can be. With the right prompt and access to code &amp; production systems, agents <a href="https://ramplabs.substack.com/p/self-maintaining">can manage</a> codebases and platforms <em>for</em> the platform engineer. This part of the platform engineer&#8217;s job transitions from managing platforms themselves to providing context and setting up agents to manage the platform for the engineer. Specifically it can look like:</p><ul><li><p>An on-call agent spins up upon creation of each incident and kicks off the initial investigation. Before the on-call engineer has even acknowledged the page and logged in, the agent has spent five minutes investigating the issue, and maybe even raised a PR to resolve the issue. The on-call agent uses skills written by platform engineers to query the correct in the correct way systems for context.</p></li><li><p>A recurring agent looks for antipatterns in the codebase not caught by static analyzers and proactively fixes them. It makes a code changes, tests them, and assigns PRs to the code owners.</p></li><li><p>A recurring agent looks at telemetry data on the Spark clusters spun up for each data pipeline and right-sizes overprovisioned clusters to save money.</p></li><li><p>A recurring agent looks at a Slowest Database Queries Datadog dashboard and identifies the top five queries that are the slowest and frequently run. For each query, it spins up a sandbox environment to iterate on faster ways to query the same data. If it finds one, it makes a change, tests it, and raises a PR.</p></li></ul><p>The context provided to agents in recurring jobs provides a new way to express and enforce the opinions of the platform engineer. When done correctly, technical debt is addressed, costs stay under control, and performance is optimized proactively rather than reactively or never at all.</p><h1>Tying it all together</h1><p>With AI, the fundamentals of building and running a platform still matter, and the qualities that make a platform engineer successful still hold. However, like other types of engineering (and other professions) the role is changing significantly. The quality bar is higher, the barrier to entry lower, the platform will be more automated and nimble, the needs will evolve faster, and solid security controls are P0. This makes the engineering (and people) problems around platforms more difficult, but also more interesting.</p><p>Thanks for reading!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.ryantime.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! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Good Platforms, Good Platform Engineers]]></title><description><![CDATA[I&#8217;ve built on developer platforms for almost ten years and building them for about five. Here's my intuition on what "good" looks and feels like.]]></description><link>https://www.ryantime.dev/p/good-platforms-good-platform-engineers</link><guid isPermaLink="false">https://www.ryantime.dev/p/good-platforms-good-platform-engineers</guid><dc:creator><![CDATA[Ryan Delgado]]></dc:creator><pubDate>Mon, 04 May 2026 01:20:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!LYx6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cabc9df-1584-4d16-b85b-f09e9de597f8_1095x818.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve built on developer platforms for almost ten years and have built them for the last five. I&#8217;d like to think I&#8217;ve developed a sense of what &#8220;good&#8221; looks like for both the Platform and the Platform Engineer, so I&#8217;m sharing. The content comes from my experiencing building and using developer platforms, seeing what works and doesn&#8217;t, and hearing people&#8217;s complaints. Mostly the complaints. The opinions are my own.</p><h1>What is a &#8220;Platform&#8221; anyway?</h1><h2>Short answer</h2><p>It&#8217;s software used to build other software.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.ryantime.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! 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>Longer answer</h2><p>There are roughly two types of platforms:</p><ul><li><p>A <strong>Developer Platform</strong>. This is often one or more frameworks, a code repository, infrastructure running in dev/staging/prod environments, a prescribed way of building and path to Production, and automation &amp; tooling around that way of building.</p></li><li><p>A <strong>Core Service</strong>. This is an abstraction over a critical business function (e.g. processing a payment, sending an email or SMS) made available via an API. The API could be REST, gRPC, or something similar like a collection of classes &amp; functions inside of a repo.</p></li></ul><p>Both types of platforms are used to build <em>applications</em>. An application is software that directly solves a business problem. Engineers use a Developer Platform to build, ship, and host applications. They use core services to power specific features in those applications. There are platforms sold as products, e.g. Vercel (dev platform) or Stripe (core service), but I&#8217;ll focus on internal platforms, i.e. a platform built by one engineer at a company in service to another engineer building applications.</p><p>I&#8217;ll mostly focus on developer platforms because I have the most experience with them. I&#8217;m also a Data Engineer by trade, so most of my examples will be Data Engineer-y, but the underlying principles apply to platforms that serve other types of engineers.</p><h2>Examples</h2><ul><li><p>Back-end developer platform. This is a developer platform that enables back-end software engineers to build applications &amp; features on a monolith back-end. It runs on Kubernetes in AWS EKS and Aurora Postgres. The code is written in Python and lives in a single repo. The back-end is a REST service running as a FastAPI web server. Table schemas are managed with SQLAlchemy and Alembic. Asynchronous tasks are managed with Temporal. Developers can run the application locally and send requests to it with Postman. Deployments are managed with GitHub Actions, and trigger when a developer merges to main.</p></li><li><p>A Data Engineering platform. Developers write data pipelines using Airflow, and they load data from external sources into a <code>RAW</code> database in Snowflake. Data is transformed using dbt in a single daily dbt run, also orchestrated with Snowflake. All Airflow and dbt code lives in a single repo but have separate deployment processes. Airflow runs in a Kubernetes cluster on AWS EKS, while dbt runs in an Airflow DAG. Developers can provision fully-functional local Airflow environments or developer-specific dbt databases and can run Airflow DAGs and dbt runs locally.</p></li></ul><h1>The Fundamentals of a &#8220;Good&#8221; Platform</h1><p>My favorite analogy for what a &#8220;good&#8221; developer platform looks like is a lane in a bowling alley:</p><ul><li><p><strong>The bowling pins.</strong> The primary use case(s) of the platform are at the center. It&#8217;s clearly documented in documentation and is <em>broadly known</em> throughout the engineering org.</p></li><li><p><strong>The bumper rails</strong> (I&#8217;m terrible at bowling). It&#8217;s impossible - or extremely difficult - to do the wrong thing. Static analyzers block bad patterns at time of commit or PR. The abstractions catch common errors and show descriptive error messages <em>and</em> suggest good solutions. Non-prod environments are as Prod-like as possible, giving developers high confidence that if their code runs in dev, then it&#8217;ll run in prod.</p></li><li><p><strong>The lane</strong> - It&#8217;s <em>dead simple</em> and low friction to do the right thing. Any services, patterns, or other abstractions on our platform are intuitive, and building with them is concise. We have reasonable defaults for inputs into these abstractions. Secrets management and authentication is largely hidden from the developer. There are minimal/no footguns - no data/schema consistency issues, weird permission differences between environments, flaky tests or deployment quirks, or arcane errors. There&#8217;s no &#8220;tribal knowledge&#8221; - any knowledge a new developer needs in order to build is documented or immediately obvious.</p></li><li><p><strong>The bowling ball</strong> - applications are independent of each other. There&#8217;s minimal/no resource contention between applications and deployments of one application don&#8217;t affect the state of other applications.</p></li><li><p><strong>The pinsetter</strong> - Deployments are automated, reliable, and fast. dev or staging environments are easy and fast to spin up and use. We&#8217;re using the latest tools like uv, ruff (I&#8217;m a Python guy), ast grep, etc. to reduce developer idle time. The Production environment is highly reliable.</p></li><li><p><strong>The scoring monitor</strong> - At any given time, the developer knows the state of their application, deployment, job, or other Stuff on the platform. They have a Datadog dashboard that measures the latency and success rate of their APIs or the success/failure rate of asynchronous jobs. They can watch the CICD pipeline progress, and they know <em>exactly</em> when their change lands in Production. There are high-signal, automated alerts for anomalous and problematic behavior. The platform team also has infrastructure-level or broad observability tracking overall system health.</p></li></ul><p>There&#8217;s probably more, but you get the idea. These are general guidelines, and not all of the details apply to you. An internal developer platform is <em>only</em> good if it enables and accelerates other builders in the org and it&#8217;s baked-in <em>opinions</em> fits the company&#8217;s way of building. Opinions are critical - more on that later.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LYx6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cabc9df-1584-4d16-b85b-f09e9de597f8_1095x818.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LYx6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cabc9df-1584-4d16-b85b-f09e9de597f8_1095x818.png 424w, https://substackcdn.com/image/fetch/$s_!LYx6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cabc9df-1584-4d16-b85b-f09e9de597f8_1095x818.png 848w, https://substackcdn.com/image/fetch/$s_!LYx6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cabc9df-1584-4d16-b85b-f09e9de597f8_1095x818.png 1272w, https://substackcdn.com/image/fetch/$s_!LYx6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cabc9df-1584-4d16-b85b-f09e9de597f8_1095x818.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LYx6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cabc9df-1584-4d16-b85b-f09e9de597f8_1095x818.png" width="1095" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7cabc9df-1584-4d16-b85b-f09e9de597f8_1095x818.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1095,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1217860,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.ryantime.dev/i/196323713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cabc9df-1584-4d16-b85b-f09e9de597f8_1095x818.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LYx6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cabc9df-1584-4d16-b85b-f09e9de597f8_1095x818.png 424w, https://substackcdn.com/image/fetch/$s_!LYx6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cabc9df-1584-4d16-b85b-f09e9de597f8_1095x818.png 848w, https://substackcdn.com/image/fetch/$s_!LYx6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cabc9df-1584-4d16-b85b-f09e9de597f8_1095x818.png 1272w, https://substackcdn.com/image/fetch/$s_!LYx6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cabc9df-1584-4d16-b85b-f09e9de597f8_1095x818.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">Builders will use your platform in ways you don&#8217;t expect.</figcaption></figure></div><h1>Qualities of a &#8220;good&#8221; Platform Engineer</h1><p>There are obvious qualities - technical excellence, agreeableness, can-do attitude. I&#8217;ll focus on the nonobvious ones.</p><h2>Understands Asymmetries</h2><p>The most important quality of a platform engineer is they understand the company&#8217;s <a href="https://aryod.com/writing/asymmetry/">asymmetries</a> and tradeoffs. A developer platform at a Series A startup and a high frequency trading firm might be built on similar technology but will look completely different, because those companies and their engineering teams don&#8217;t operate the same way. A high frequency trading firm has more <em>asymmetric downsides</em>, i.e. each change could interrupt normal trading operations causing millions of dollars in losses. A young startup has more asymmetric <em>upsides,</em> as each change they make could bring them closer to product-market fit. One company needs high reliability, while the other needs product velocity. This isn&#8217;t static either. If that young startup builds a business critical product that tens of thousands of customers depend on, the tradeoffs change, because reliability and scalability matter more than they did previously. If the platform engineer understands this, they can build a platform with the right amount of complexity at each stage to maximize the platform&#8217;s business value.</p><h2>Empathetic</h2><p>Next is empathy for the application engineers and their <em>use cases</em>. The use cases&#8217; requirements dictate the technology choice and the abstractions built into the platform. Let&#8217;s use the Data Engineering platform example from before, and let&#8217;s say we want to establish the pattern for loading data into Snowflake. The simplest approach we could take may look something like</p><pre><code><code>@task
def load_data(file_path: str, **context):
    import pandas as pd # I'm a simple man with simple solutions.
    from airflow.providers.snowflake.hooks.snowflake import SnowflakeHook
    hook = SnowflakeHook()
    df = pd.read_csv(file_path)
    df.to_sql(...) # etc...

# etc...
</code></code></pre><p>This will work great if the files are small and are in a format that pandas can read. It won&#8217;t work for terabytes of data or files with poor/no structure. Likewise, you shouldn&#8217;t force other engineers to use Spark if they&#8217;re only dealing with small &amp; medium-sized data. The platform engineer can only know what pattern to implement if they work with the stakeholder engineer and understand the business problems they solve. The best engagement model for this is the <em>embedded model</em>, where the platform engineer embeds on the stakeholder engineer&#8217;s team and solves the problem <em>with them.</em> I have a lot of thoughts on embedding platform engineers on other teams, but I&#8217;ll save that for a future post.</p><h2>Opinionated</h2><p>The next quality is <em>opinions</em>. Engineers that use a platform do not want to hear &#8220;you can approach it in X or Y way. Up to you!&#8221; from the platform engineer. They want Dr. Platform Engineer to <em>prescribe</em> a solution to their problem, i.e. an opinion. The difference between a Good and a Great developer platform are the opinions baked into it through abstractions, guardrails, default arguments, code organization, and other stuff. Let&#8217;s use loading CSV files into Snowflake as an example again. Here&#8217;s an unopinionated way to do it:</p><pre><code><code>COPY INTO RAW.EXAMPLE.TABLE
FROM 's3://my-internal-bucket-name/path/to/file.csv'
CREDENTIALS = (
  AWS_KEY_ID = 'yep'
  AWS_SECRET_KEY = 'mhmm'
)
FILE_FORMAT = (
  TYPE = CSV,
  SKIP_HEADER = 1,
  FIELD_OPTIONALLY_ENCLOSED_BY = '"', 
  NULL_IF = ('nan', '')
);</code></code></pre><p>and here&#8217;s an opinionated way:</p><pre><code><code>COPY INTO RAW.EXAMPLE.TABLE
FROM @RAW.PUBLIC.MY_BUCKET/path/to/file.csv
FILE_FORMAT = RAW.PUBLIC.DEFAULT_CSV_FORMAT;</code></code></pre><p>The second one is better because nobody needs to think about the name of the bucket (I&#8217;m surprisingly bad at this), values to pass into <code>FILE_FORMAT</code>, or AWS credentials, because the platform engineer already set up an <a href="https://docs.snowflake.com/en/user-guide/data-load-s3-config-storage-integration">S3 Integration</a>, <a href="https://docs.snowflake.com/en/user-guide/data-load-s3-create-stage">stage</a>, and <a href="https://docs.snowflake.com/en/sql-reference/sql/create-file-format">file format</a> that other engineers can use off-the-shelf and know it &#8220;just works.&#8221; Opinions from the platform engineer reduce the cognitive load on everyone else. They accelerate development, improve the success rate, and improve the maintainability. Opinions come from</p><ul><li><p>Repeated use of a common pattern that you formalize it into an abstraction.</p></li><li><p>Previous incidents or small bugs reveal new failure modes, so you add guardrails.</p></li><li><p>Your experience with the technology. You know the footguns and the &#8220;best&#8221; parameters default to use, so you make that the default.</p></li></ul><p></p><div><hr></div><p>That&#8217;s all for now! Thanks for reading.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.ryantime.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! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>