---
title: "Do We Grow Software or Do We Design It?"
description: "Vibe-coding is growing software in parallel petri dishes. State machines and formal verification design it. In this new era, we'll need both."
categories: ["AI","engineering"]
keywords: ["vibe-coding","software design","state machine design","formal verification","AI engineering","Boris Cherny","Lean","TLA+"]
ai_summary: "Explores the contrast between organic 'growing' of software via vibe-coding and deterministic 'designing' via state machines and formal verification."
date: 2026-10-02
lastmod: 2026-10-02
canonical_url: https://tomtunguz.com/grow-or-design-software/
author: "Tomasz Tunguz"
---


{{< email_image src="p6udcadiy91473rvo8ca" alt="Petri dishes with organic bacterial cultures side by side with a rigid data table on graph paper" width="540" height="304" >}}

Do we grow software or do we design it?

Vibe-coding is growing software. Start with the germ of the idea. Iterate on it. Let's try this. Poke the petri dish with a bit of glucose ; oh, that didn't work. Maybe some thymol blue to see if the colony is alive? Time to start again.

The most sophisticated vibe-coders test with 4-5 different petri dishes in parallel & pick the one whose bacteria have evolved optimally.

Designed software in the AI era is state machine design : flow charts that work. First, the email comes in. Three options : archive, add to the CRM, or escalate to a person. If adding to the CRM, determine the company's stage.

When co-designing a state machine with AI, ask for the flowchart. The AI willingly shares schematics. Lay out every fork in a table with the right outcome. The holes jump out immediately. Plus, formal verification proves the software will work as intended.

Boris explains why.[^1]

{{< email_image src="iprcihy1ovh6rhpoebrs" alt="Boris Cherny tweet on formal verification with Lean & TLA+ using Claude" width="540" height="365" >}}

Growing software is organic. We can just program! State-machines are mechanical, industrial, & rigid : great for core systems that must work.

Software engineering has many philosophies : test-driven development,[^2] pair programming,[^3] move fast & break things.[^4] In this new era, we add two more.

[^1]: Boris Cherny on [formally verifying the Claude Agent SDK](https://x.com/bcherny/status/2102543349102338309) with Lean & TLA+.

[^2]: Test-Driven Development (TDD), popularized by Kent Beck in 'Test-Driven Development: By Example' (2002), dictates writing automated test cases before writing the minimal production code necessary to pass them.

[^3]: Pair programming, a core practice of Extreme Programming (XP), pairs two developers at one workstation : one 'driver' typing code while the other 'navigator' reviews and plans strategic direction in real time.

[^4]: 'Move fast and break things' was Facebook's early internal motto, celebrated by Mark Zuckerberg as a mandate to accept collateral bugs as the acceptable cost of developer velocity, later replaced in 2014 by 'Move fast with stable infra.'
