<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Felipe Antolinez's Weblog: software-engineering</title><link href="https://antolinez.ch/" rel="alternate"/><link href="https://antolinez.ch/tags/software-engineering.atom" rel="self"/><id>https://antolinez.ch/</id><updated>2026-04-13T11:16:31.378778+00:00</updated><author><name>Felipe Antolinez</name></author><entry><title>An AI State of the Union: We've Passed the Inflection Point, Dark Factories Are Coming, and Automation Timelines | Simon Willison (Lenny's Podcast)</title><link href="https://antolinez.ch/2026/Apr/13/willison-ai-state-of-the-union-lennys-podcast/#atom-tag" rel="alternate"/><published>2026-04-13T11:16:31.378778+00:00</published><updated>2026-04-13T11:16:31.378778+00:00</updated><id>https://antolinez.ch/2026/Apr/13/willison-ai-state-of-the-union-lennys-podcast/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.lennysnewsletter.com/p/an-ai-state-of-the-union"&gt;An AI State of the Union: We&amp;#x27;ve Passed the Inflection Point, Dark Factories Are Coming, and Automation Timelines | Simon Willison (Lenny&amp;#x27;s Podcast)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
As someone who follows Simon Willison closely, this interview didn't contain many new ideas for me. But I would still strongly recommend it to anyone who doesn't follow him as closely, because it covers many of his main beliefs and insights in one place, and I consider many of them to be very strong.&lt;/p&gt;
&lt;p&gt;The main thing I picked up from the podcast is &lt;a href="https://factory.strongdm.ai/"&gt;StrongDM's work on the "dark factory"&lt;/a&gt;, which Simon &lt;a href="https://simonwillison.net/2026/Feb/7/software-factory/"&gt;covered on his own blog&lt;/a&gt; and is definitely worth reading. I have heard the "dark (software) factory" term before and didn't quite understand it, but it is an analogy for manufacturing facilities so automated that the lights are literally turned off because no humans are operating the factory. The core idea of this movement is building development factory in which specs and scenarios drive coding agents to &lt;strong&gt;write and review (!) code without humans&lt;/strong&gt; completely autonomously.&lt;/p&gt;
&lt;p&gt;Other things I picked up from this podcast episode: the distinction between &lt;a href="/2026/Apr/8/vibe-coding-vs-agentic-engineering/"&gt;agentic engineering and vibe coding&lt;/a&gt;, using "red/green TDD" as a micro-prompt to improve coding agent output, and the strategy of building "digital twins" of external services for testing by giving a coding agent just public API docs.


    &lt;p&gt;Tags: &lt;a href="https://antolinez.ch/tags/coding-agents"&gt;coding-agents&lt;/a&gt;, &lt;a href="https://antolinez.ch/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://antolinez.ch/tags/software-engineering"&gt;software-engineering&lt;/a&gt;, &lt;a href="https://antolinez.ch/tags/podcast"&gt;podcast&lt;/a&gt;&lt;/p&gt;



</summary><category term="coding-agents"/><category term="ai"/><category term="software-engineering"/><category term="podcast"/></entry><entry><title>Minions: Stripe's One-Shot, End-to-End Coding Agents (Stripe Engineering Blog)</title><link href="https://antolinez.ch/2026/Apr/12/stripe-minions-coding-agents/#atom-tag" rel="alternate"/><published>2026-04-12T08:10:38+00:00</published><updated>2026-04-12T08:10:38+00:00</updated><id>https://antolinez.ch/2026/Apr/12/stripe-minions-coding-agents/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://stripe.dev/blog/minions-stripes-one-shot-end-to-end-coding-agents"&gt;Minions: Stripe&amp;#x27;s One-Shot, End-to-End Coding Agents (Stripe Engineering Blog)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
A fascinating two-part blog post (&lt;a href="https://stripe.dev/blog/minions-stripes-one-shot-end-to-end-coding-agents"&gt;Part 1&lt;/a&gt;, &lt;a href="https://stripe.dev/blog/minions-stripes-one-shot-end-to-end-coding-agents-part-2"&gt;Part 2&lt;/a&gt;) from Stripe's engineering team on how they built their internal coding agents, which they call minions. What first stood out to me is how remarkably well-written these posts are. At a time when many engineering blog posts read as if they were mostly AI-generated, a piece with this much clarity is a strong signal of Stripe's commitment to quality in everything they do.&lt;/p&gt;
&lt;p&gt;Stripe's minions are fully unattended agents built for one-shot coding tasks. An engineer can kick off a minion from Slack, and it produces a pull request that passes CI and is ready for review, with no human interaction in between. Over a thousand PRs merged per week at Stripe are entirely minion-produced.&lt;/p&gt;
&lt;p&gt;As someone working at a startup, I find it fascinating to see this level of investment in what I've been calling &lt;a href="https://antolinez.ch/2026/Apr/8/vibe-coding-vs-agentic-engineering/"&gt;"engineering the machine that writes the code"&lt;/a&gt;. What makes this particularly notable is that Stripe is operating in a very high-stakes environment with high demands on reliability and robustness.&lt;/p&gt;
&lt;p&gt;Stripe's system is complex, far beyond what a startup with limited resources could build internally. But what makes it interesting is that minions were built on top of infrastructure Stripe had already developed for human engineers:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We built out devboxes for the needs of human engineers, long before LLM coding agents existed. As it turns out, parallelism, predictability, and isolation were also very desirable properties as well for Stripe engineers to be able to work most effectively. &lt;strong&gt;What's good for humans is good for agents&lt;/strong&gt;, and building on this infrastructural primitive paid dividends as a natural home for LLM agents.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The most interesting technical concept in the post is what they call "blueprints." Anthropic's blog post on &lt;a href="https://www.anthropic.com/engineering/building-effective-agents"&gt;building effective agents&lt;/a&gt; distinguishes between workflows (fixed execution graphs of LLM calls) and agents (loops with tools). Blueprints are a hybrid: a state machine that interleaves agentic nodes (LLMs or agents can work non-deterministically) with deterministic nodes (e.g., linters, git operations, test runners) that don't invoke an LLM at all. The idea is to put the LLMs in a contained box for each subtask, constraining its tools and context as needed, and guarantee that certain steps always happen correctly.&lt;/p&gt;
&lt;p&gt;A few other things stuck with me. Stripe built a centralized internal MCP server, called Toolshed, which hosts nearly 500 tools spanning internal systems and SaaS platforms, and to which all of Stripe's agents can connect. Stripe's engineers also make extensive use of agent rule files that are conditionally applied based on which subdirectory or code files the agent is working in. These rules dynamically provide their coding agents with the necessary context, rather than loading a massive global ruleset, e.g., from a CLAUDE.md file, that would bloat the context window. Notably, all coding at Stripe, whether by humans or agents, happens in sandboxed cloud developer environments called devboxes, which can be spun up in about 10 seconds with all necessary dependencies preloaded.&lt;/p&gt;
&lt;p&gt;Our backend engineer, &lt;a href="https://jangiacomelli.com/"&gt;Jan Giacomelli&lt;/a&gt;, was inspired by this blog post and just last week built our own internal version: a sandboxed coding agent that one-shots tasks and creates pull requests, which we're calling a "renion." I'm very curious to try it and see where this goes. I'm a strong believer that professional engineering organizations need to engineer their own internal AI systems to some extent, because each company's development environment and requirements are different enough that general tools can't provide maximum value on their own. I'm also curious about how we can bring the "blueprint" pattern of wrapping agents in deterministic workflows to other parts of the AI-powered business logic in our backend.


    &lt;p&gt;Tags: &lt;a href="https://antolinez.ch/tags/coding-agents"&gt;coding-agents&lt;/a&gt;, &lt;a href="https://antolinez.ch/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://antolinez.ch/tags/agentic-ai"&gt;agentic-ai&lt;/a&gt;, &lt;a href="https://antolinez.ch/tags/ren"&gt;ren&lt;/a&gt;, &lt;a href="https://antolinez.ch/tags/software-engineering"&gt;software-engineering&lt;/a&gt;&lt;/p&gt;



</summary><category term="coding-agents"/><category term="ai"/><category term="agentic-ai"/><category term="ren"/><category term="software-engineering"/></entry><entry><title>Note on 8th April 2026</title><link href="https://antolinez.ch/2026/Apr/8/vibe-coding-vs-agentic-engineering/#atom-tag" rel="alternate"/><published>2026-04-08T11:22:50+00:00</published><updated>2026-04-08T11:22:50+00:00</updated><id>https://antolinez.ch/2026/Apr/8/vibe-coding-vs-agentic-engineering/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;img alt="Vibe Coding vs. Agentic Engineering" src="https://res.cloudinary.com/dc7ady43d/image/upload/w_1200,f_auto,q_auto/v1775647808/blog/fcssh5epahghsp3ouyr4.png" /&gt;&lt;/p&gt;
&lt;p&gt;Vibe coding and agentic engineering are two terms that come up constantly right now, but are often confused. Both describe building software where AI writes most or all of the code, but there is a fundamental difference.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vibe coding&lt;/strong&gt;, as Andrej Karpathy originally defined it, means building something without looking at the code. You describe what you want, see if it works, and iterate on the vibes without even intending to read or understand the code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agentic engineering&lt;/strong&gt; is something very different. It's not about writing code with agents, but about engineering a system that uses agents to write code that meets specifications and is well-tested. The resulting code needs to match existing patterns in the codebase, adhere to the company's engineering principles, and pass an extensive test suite.&lt;/p&gt;
&lt;p&gt;From what I'm seeing, the best engineering organizations right now are spending a lot of their time on building the machine that writes the code. In practice, this means aligning conventions and patterns throughout the codebase, improving the feedback loop for coding agents, automating review processes, tightening deployment practices, and wrapping LLMs in deterministic workflows.&lt;/p&gt;
&lt;p&gt;At Ren Systems, our team has been putting a lot of work into this. Together with &lt;a href="https://jangiacomelli.com/"&gt;Jan Giacomelli&lt;/a&gt; and Giorgio Nicoli, we have been working on things like fully typing our test suite, writing custom skills for zero-downtime database migrations, implementing custom linters that deterministically check our desired coding patterns and provide feedback to coding agents when they are violated, and building an AI-assisted code review flow trained on our own review comments from many thousands of past code reviews.&lt;/p&gt;
&lt;p&gt;All of this was implemented much more quickly with the help of coding agents, but it required deliberate engineering. As a result, we can now build on our codebase with agents much more quickly, and it is in a much better overall state than it was one year ago.&lt;/p&gt;
&lt;p&gt;There is absolutely a place for vibe coding, even for professional developers. It's great for prototyping, exploring ideas, and internal tooling, where the stakes are low, and you're the only person who gets hurt if it has bugs. But this isn't what companies employ professional software engineers for, and that job isn't going away with AI.&lt;/p&gt;
&lt;p&gt;If you define software engineering as typing out code by hand, then yes, that job is being replaced. But if you define it as engineering the machine that builds production-grade code, software engineers with these skills are going to be more valuable than ever.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/posts/felipeantolinez_vibe-coding-and-agentic-engineering-are-two-share-7447604808892510208-t9Ld"&gt;View the original LinkedIn post&lt;/a&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://antolinez.ch/tags/linkedin"&gt;linkedin&lt;/a&gt;, &lt;a href="https://antolinez.ch/tags/coding-agents"&gt;coding-agents&lt;/a&gt;, &lt;a href="https://antolinez.ch/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://antolinez.ch/tags/software-engineering"&gt;software-engineering&lt;/a&gt;&lt;/p&gt;



</summary><category term="linkedin"/><category term="coding-agents"/><category term="ai"/><category term="software-engineering"/></entry><entry><title>Parse, don't validate</title><link href="https://antolinez.ch/2024/Aug/15/king-parse-dont-validate/#atom-tag" rel="alternate"/><published>2024-08-15T10:00:00+00:00</published><updated>2024-08-15T10:00:00+00:00</updated><id>https://antolinez.ch/2024/Aug/15/king-parse-dont-validate/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/"&gt;Parse, don&amp;#x27;t validate&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
A classic that I keep coming back to. The core idea is very simple: instead of validating data and throwing away what you learned, parse it into a more precise type that preserves that knowledge. The rest of your code gets simpler because impossible states become unrepresentable.&lt;/p&gt;
&lt;p&gt;Using this pattern well will remove a lot of „if" statements and error handling scattered around the codebase.


    &lt;p&gt;Tags: &lt;a href="https://antolinez.ch/tags/software-engineering"&gt;software-engineering&lt;/a&gt;&lt;/p&gt;



</summary><category term="software-engineering"/></entry><entry><title>Quoting George Hotz</title><link href="https://antolinez.ch/2023/Jun/28/hotz-complexity-collapse/#atom-tag" rel="alternate"/><published>2023-06-28T19:15:00+00:00</published><updated>2023-06-28T19:15:00+00:00</updated><id>https://antolinez.ch/2023/Jun/28/hotz-complexity-collapse/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://podcasts.apple.com/ch/podcast/latent-space-the-ai-engineer-podcast-codegen-agents/id1674008350?i=1000617737857"&gt;&lt;p&gt;I'm trying to build something that manages complexity. Like, you can always make your software do more. The magic is when you can make your software do more without adding complexity. Because complex things eventually collapse under their own weight.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://podcasts.apple.com/ch/podcast/latent-space-the-ai-engineer-podcast-codegen-agents/id1674008350?i=1000617737857"&gt;George Hotz&lt;/a&gt;, From the Latent Space podcast, around 15:50.&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://antolinez.ch/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://antolinez.ch/tags/software-engineering"&gt;software-engineering&lt;/a&gt;&lt;/p&gt;



</summary><category term="ai"/><category term="software-engineering"/></entry><entry><title>Imaginary Problems Are the Root of Bad Software</title><link href="https://antolinez.ch/2023/Jun/20/imaginary-problems-root-bad-software/#atom-tag" rel="alternate"/><published>2023-06-20T15:00:00+00:00</published><updated>2023-06-20T15:00:00+00:00</updated><id>https://antolinez.ch/2023/Jun/20/imaginary-problems-root-bad-software/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://cerebralab.com/Imaginary_Problems_Are_the_Root_of_Bad_Software"&gt;Imaginary Problems Are the Root of Bad Software&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
A great essay on why software ends up overcomplicated: developers solve the problems they find interesting rather than the ones that matter, and long chains of communication between client and developer mutate requirements beyond recognition. I can see this in myself. There's a natural pull toward the interesting, challenging problem when the simple solution is what's actually needed.


    &lt;p&gt;Tags: &lt;a href="https://antolinez.ch/tags/software-engineering"&gt;software-engineering&lt;/a&gt;&lt;/p&gt;



</summary><category term="software-engineering"/></entry><entry><title>Note on 15th February 2022</title><link href="https://antolinez.ch/2022/Feb/15/state-coupling-complexity-code/#atom-tag" rel="alternate"/><published>2022-02-15T09:00:00+00:00</published><updated>2022-02-15T09:00:00+00:00</updated><id>https://antolinez.ch/2022/Feb/15/state-coupling-complexity-code/#atom-tag</id><summary type="html">
    &lt;p&gt;This comment by &lt;a href="https://news.ycombinator.com/item?id=11042400"&gt;curun1r on Hacker News&lt;/a&gt; (from 2016) has strongly influenced my thinking about software engineering:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dependencies (coupling) is an important concern to address, but it's only 1 of 4 criteria that I consider and it's not the most important one. I try to optimize my code around reducing state, coupling, complexity and code, in that order.&lt;/p&gt;
&lt;p&gt;I'm willing to add increased coupling if it makes my code more stateless. I'm willing to make it more complex if it reduces coupling. And I'm willing to duplicate code if it makes the code less complex. Only if it doesn't increase state, coupling or complexity do I dedup code.&lt;/p&gt;
&lt;p&gt;The reason I put stateless code as the highest priority is it's the easiest to reason about. Stateless logic functions the same whether run normally, in parallel or distributed. It's the easiest to test, since it requires very little setup code. And it's the easiest to scale up, since you just run another copy of it. Once you introduce state, your life gets significantly harder.&lt;/p&gt;
&lt;p&gt;I think the reason that novice programmers optimize around code reduction is that it's the easiest of the 4 to spot. The other 3 are much more subtle and subjective and so will require greater experience to spot. But learning those priorities, in that order, has made me a significantly better developer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Those four criteria beautifully capture many goals of software design. Strive to reduce&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;State&lt;/li&gt;
&lt;li&gt;Coupling&lt;/li&gt;
&lt;li&gt;Complexity&lt;/li&gt;
&lt;li&gt;Code&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;in that order.&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://antolinez.ch/tags/software-engineering"&gt;software-engineering&lt;/a&gt;&lt;/p&gt;



</summary><category term="software-engineering"/></entry></feed>