Thirteen commitments about working with AI, written down so that anyone who reads my code or my text knows the terms it was made under. The first of them is that this page was written by a machine, and that I answer for it.
Three ways to hand code around — a block that runs now, a closure that runs later, a function with a name — and how to choose. Tests that become a table. And conditional compilation: code decided before the program runs, and why that is safer than deciding it while it runs.
postres picks a default output name, and one run showed it can be wrong. Tests that say what right means, a regular expression that fails them twice, the fix that was in the standard library all along — and a rule that would have found it first.
Some and None turn out to be an enum — and not the kind Java has. Tagged unions, an Option that cannot pass for the value it might hold, inputs kept apart from the domain, and a Config the rest of postres can trust: private, settled once built, and named even when the user does not name it.
postres learns to listen, and we write no parser to make it happen: the command line described as a struct, a macro that writes the parser from it — help screen and typo suggestions included — and what structs, attributes and macros are, and why they make Rust feel like a high-level language.
An empty directory becomes a Rust project: why a file-to-file converter is shaped like a compiler, a library and a binary in one package, modules and who can see them, a manifest with no dependencies in it, two lines that let the build refuse undocumented and unsafe code, and CI on three operating systems from the very first commit.
Everybody was told agents only write code. They also read, and reason about what they read, and for a product owner that changes the job: feasibility with the code cited, a prototype that costs what a drawing did, and what an organisation has to assemble — training, access, an environment, a budget nobody has to justify — before the loop before the loop can close.
A product owner who wanted to know whether their idea was even possible had one way to find out: interrupt somebody who was building something already decided. What that did to their work, why the two-line ticket was never laziness, and why the oldest fight in our industry was never about personalities.
Around the loop a second time, and this time built for real: the two documents the spec turns out to be, the inner loop the agent runs alone while nobody watches, the checkpoint that is one command, the second read a machine does first, a merge nobody attends a meeting for, and the letters going back to the desk.
NullPointerException. Cannot read properties of undefined. ConcurrentModificationException. Segmentation fault. A tour of the failures that have nowhere left to happen once the types stop evaporating — and an honest account of the ones that stay.
The things you actually like about TypeScript, Java, Python and Go — unions, Optional, streams, lambdas, promises, channels, one command that builds everything — and where every one of them lives in Rust. No complaints in this one. Just the shape of an ordinary working day.
I learned Rust by building a bank in it, having never written a line of it before, while the corridor explained that Rust needs PhD-level programmers. What actually changed was not safety. It was relief: I stopped spending my day avoiding mistakes and got to spend it solving the problem.
Four rules for the moment an agent takes the writer’s chair: why you do not get to wait this one out, why a team that waits for a nod is not using agents, the one sentence about control that this series hangs on, and what happens to every estimate you have ever given.
Every trade has a loop between “it is written” and “it is right”. Ours too. We drew it, built half of it, and a person quietly did the rest. What that cost, and how I know. Spoiler: I was the person.
Cognition published a case study about EBANX and Devin, and I am most of the way through it. The number everyone will take away is twelve hours. This is about the month before them and the bet around them, which is the part a case study has no room for.
Every mechanism this series has described, and the six things that beat them anyway — the wrong remedy for a right diagnosis, the machine that never complains, the gate that lied about itself, and the rule I was proudest of, whose hole an agent found and was entirely right about.
The architecture conversation that filled the twenty-six days: one reader-agnostic server, one bridge per screen reader in whatever language that reader dictates, and a decision to reject Rust for a reason I have never seen written down.
Twenty-six days between one commit on the terminal and the next, because every pull request cost me an evening of listening. What I built instead, and the four questions that separate this from procrastination.
What the method from last time actually produced, measured rather than asserted: where the hours went, how much had to be done twice, and the afternoon a machine that had never built any of this was ready in nine minutes.
What I actually typed on the first night, and why almost none of it was an instruction. Five moves, quoted from the record — including the ones where I told the agent I did not understand a word of what it had just proposed.
Five hundred and forty lines of documentation, six files, and not one line of code — then fourteen more commits before the first one. Six jobs got done that evening, and I did not notice I was switching between them.
A extrapolação é toda a razão para você usar um agente — e todo o risco de usá-lo, porque os dois são o mesmo mecanismo. Então a pergunta nunca é como impedi-la: é onde ela deve ser ampla e onde precisa ser estreita.
A coisa que eu queria havia anos e nunca consegui construir, como soa um terminal navegável por cabeçalhos, e por que mesmo assim eu não comecei pedindo a um agente que o escrevesse.
Sempre fomos o engenheiro e o pedreiro ao mesmo tempo, porque, em software, erguer as paredes é um trabalho altamente qualificado. Agora, existe algo para assentar os tijolos — o que não o torna menos engenheiro, mas sim, finalmente, apenas um engenheiro.