How I use AI for coding

Why write this now? Well it starts to be a while since I wrote It seems like Stevey was right. Everyone has a take on AI; this one is just a description of what actually works for me, not a manifesto. I must note that my views (and usage) evolve as the tools themselves evolve. LLMs are incredibly useful and incredibly fast (at writing code, that is). I always compare them to an eager carpenter’s apprentice who can build walls in no time but doesn’t have the wisdom to know if you should build them in the first place. With that incredibly long intro out of the way, here is how I use them:

I barely use SKILL.md/CLAUDE.md/…

I’ve maintained both a .vimrc and a .emacs, and I’m not interested in turning agent configuration into a full-time job. I leave that to the harness experts at OpenCode or Earendil. Besides, the models evolve so fast that any config I write might be stale in months.

I pair program and debug with the agents

Of course it depends on the project or how much I care, but letting a swarm of agents loose on the codebase is a recipe for creating tech debt at the speed of light. There is no substitute for understanding. I frequently hear people saying stuff like the price of writing code went down to zero but the price of reviewing has stayed the same. I disagree: with LLMs, it has never been easier to introspect a system. If they do something that is puzzling to you, you can just… ask. More often than not, I come away understanding the system better, and occasionally I catch a disaster waiting to happen. It seems slower than letting a swarm of agents loose but if your business depends on the stability of the software, I’d argue it’s worth it, and you are faster in the long run. Every now and then I go full vibe coding, but whenever the project reaches a certain size and I want to modify things, I always regret it. For one-off stuff or something I don’t really care about, vibe coding is perfect. I think it’s worth remembering that durable software is formed slowly and usually for this kind of project the coding speed is marginal.

I (ab)use them for prototyping

That idea I’d have dismissed because it was too costly to implement? Well not anymore! And that’s wonderful. The way I see it, the cost to go from prototype to production hasn’t changed much, at least in my line of business, and that is in part because I haven’t changed. But the cost of trying seven different ideas and dismissing all of them? That’s priceless.

I am stricter with the output

In a certain sense, the traditional (read: deterministic) tools are incredibly useful. I treat my attention as the scarcest resource and for code to even warrant a look, it needs to pass every linter in existence. In other words, I verify quite aggressively and dismiss everything that doesn’t outright pass surface-level verification.

I use them for porting

Whether we software engineers want to admit it or not, we all like languages for reasons that are far from objective. But guess what? Translation is exactly what LLMs are very good at. Granted the produced code is not always the most idiomatic but guess what? It doesn’t really matter if the outcome is that you get to write in your favorite language. One of the practical examples would be writing something with the shape I want in, say, Python. Then I ask the LLM to draw the rest of the owl that can be in another language like C++ or Rust but from that point on I have at least more confidence that it is heading in a reasonably good direction.

I am not a meat proxy

I work with real people, and as such the least I can do is demonstrate human effort. I don’t forward LLM output to colleagues as if it were my own thinking.

I am having fun

I don’t think I have had this much fun with computers in a long time. Instead of the death of software I think we are witnessing the birth of highly personal software.