I’ve been obsessed with software design for almost twenty years. In that time I’ve developed rather strong opinions on what makes for good software.
The field that thinks most about the properties of great software is UX; User Experience. I asked AI to generate a definition of UX in the styles of great authors throughout history. Here’s Oscar Wilde:
UX is the art of making necessity appear gracious. Any fool can build a system that performs a function; the trick is to make the function feel inevitable, as if no committee or regrettable compromise had ever existed. Bad UX explains itself constantly, like a bore at dinner. Good UX has the manners to be useful without recounting its difficulties.
‘Inevitable’ is the most operative word. The greatest compliment a UX designer can receive is that “anybody could have designed this.” Because the solution is so obvious that there’s no other way it could work. But ‘obvious’ here is in hindsight. It’s very easy to connect the dots backwards. The path to intuitive is paved with dead ends and false promise.
I’ve built hundreds of apps for dozens of clients over the years. I’ve studied problem spaces and chipped away towards inevitable solutions. Every single project has had one thing in common, the user is human.
Do agents need software?
If “software” means a fixed sequence of instructions that runs the same way on every machine, then less and less of what gets shipped to an agent counts. The agent isn’t a CPU. It already knows its environment, and most of what makes traditional software work — the part that translates a developer’s intent into something a dumb runtime can execute — already lives inside it. Andrej Karpathy calls this Software 3.0: a third era of programming where the program is natural language and the runtime is a model.
You notice the shift in small places. The installer for an agent skill rarely works the same across laptops — curl | bash strips environment variables, harnesses each keep their skills directory somewhere different — so the script grows into a flowchart the agent could have skipped in two lines. The same shape comes up wherever a fixed string used to live: paths, configs, magic numbers, all baked in by twenty years of training data the model keeps reaching for.
Structured tool calling is the same trade scaled up. Anthropic’s Model Context Protocol is the standard layer for it: portable across hosts, but every tool definition takes context, every call is a round-trip with intermediate JSON, and at enough tools the registration block fills the window before the agent has done any work. Anthropic’s own engineering team has argued that the answer is to wrap MCP tools in code execution, deferring the actual work to bash. David Crawshaw puts it plainly: the agent is a for loop around an LLM call, and find, cat, and grep -R are how it actually navigates a codebase. Schemas still earn their place for auth and audit, but the surface area where they clearly beat shell access keeps shrinking.
So the shape of what gets shipped to an agent is starting to look different from the shape of what gets shipped to a person. More and more, the artifact is a description of intent, and the agent makes the implementation in the environment it lands in.
A few small things in this direction. Fold makes a folder of context portable as a single markdown file. Portdown wraps any markdown as a self-installing polyglot — readable when pasted to an agent, executable when piped through bash. Seeds puts them together: any folder becomes a five-character URL the agent can paste in one line. None of them carry much structure of their own; they lean on the agent for the parts that change between environments.
These are early days. I’ve been treating them less like products and more like worked examples — exercises in the discipline rather than the destination. The discipline is the same as it’s always been: study the problem space, chip away towards inevitable solutions, remove things from the path until the user can pick the thing up without thinking. The user is no longer human. The work is still the work.