Petri dishes with organic bacterial cultures side by side with a rigid data table on graph paper

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

Boris Cherny tweet on formal verification with Lean & TLA+ using Claude

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 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.’ ↩︎