Rui Salgado

Sweat Out The Design

Coding harnesses. Git worktrees. "Loops" and "graphs", terms whose meaning seems to have been hijacked. The narrative around AI seems to revolve around maximizing output. Keep the machine busy pumping out code and iterating like an army of confused freshmen until something decent comes out the other end. grep, sed, run, tweak, compact, rinse and repeat.

There's definitely progress being made. The question is, towards what?

Great software has never been about the number of features or lines of code. If anything, it's the opposite: deliver a delightful experience with as few of both as possible. Like the old saying goes, perfection is achieved when there is nothing else to take away.

Agentic development presents a low fidelity interface for defining the systems and applications you're building. You write prose, and the LLM tries to infer your intent and derive the details (the code!) from it. The broader the scope of the request, the more the model will inject its own statistically derived "intuition" into the final output. It cannot form a mental model of the system and tweak it in subtle ways to achieve breakthroughs in design. It just adds more code to the pile.

This obsession for automating code generation certainly has its place. There are tasks well suited to it, particularly when there's no "design thinking" involved. Platform and language upgrades, migrations, straightforward translations come to mind - I've seen it be effective at those.

Yet when you're building something novel and purportedly valuable, its success is mostly a function of its fundamental design. How it's laid out to do what it sets out to do. And this is something that LLMs are not good at. Here, you must be firmly in the driver's seat, and the best these agentic tools can do is to free you to focus on that design.

Famed programmer Charles Simonyi is said to have often left behind unimplemented function signatures for others to fill in. He'd design the system in code, deferring some of the implementation minutiae to his team. I'm reminded of this as I incorporate AI into my own work.

When I'm designing a system, I find that often prose is not the best medium - there are things that I don't want to get lost in translation. I'll switch between prose and higher level code that drives the internal design of the system, with AI filling in some function implementations. Then I'll jump into the deeper functions - as always, the devil is in the details.

In the same vein, the system observing a certain behavior is also often not a sufficient success criterion. It must do that while exhibiting an internal design I'm happy with - one that is consistent with what was already there and with what I'm trying to achieve.

Code is cheaper to create than it's ever been - but good design is as challenging as ever. And AI will happily amplify all your bad design decisions, while distracting you with a misleading sense of progress.