Finding Joy in AI-Assisted Coding
You know how everyone’s mad that AI writes the code now? They call it slop and want to rewrite it by hand. I never had that feeling. I work with a stack I don’t even like, and Claude carries me through it.
But slop is code that looks finished and isn’t: it hides a bug nobody caught, a misfit nobody flagged, fragility nobody checked. It was never a synonym for “written with AI.” Cheap code that actually works isn’t slop, whatever typed it. So the real question isn’t whether AI writes slop. It’s what people are defending when they insist on writing it by hand.
You used to spend years turning yourself into an engineer before you could ship a feature. Now you write a prompt. The qualification bar dropped, and I don’t see it climbing back. Writing code got cheap.
The usual defense is verification: reading AI output and checking it is slower than writing it yourself, and you trust your own code more. What you’re really defending is the flow of writing code: sitting with a problem until a clean solution surfaces. That never came from the typing. It came from the search.
The search is for a solution that covers more than the case in front of you. The cheap version is tailored: it solves the case you described and stops there. The one worth hunting for tracks the structure of the problem itself, so case N+1 falls out of the same artifact for free. That’s what I mean by elegant. And tailored is exactly what a model hands you when you prompt at the case level. It matches the level you set. Describe the case in front of you, and it solves the case in front of you. The shape doesn’t surface unless your prompt reaches for it.
Take form validation. The tailored version writes a check per field: the email looks like an email, the password is long enough, the date parses. Add a field and you add a check, plus the type, plus the form binding, plus the API contract. The elegant version declares the shape of the data once, as a schema, and the rest falls out of it: the validator, the types, the form, the docs. Adding a field is one row. It works because the shape is the same across cases, including the ones nobody has asked about yet.
Left to my own hands, I write the shape I already know, the per-field version, because that’s the one in my head. The model isn’t anchored to my habits. So when I ask for three or four takes on the same problem and read them side by side, the spread includes shapes I wouldn’t have typed first: the schema reframe, a state machine, a transform pipeline. One of them is often the elegant one, and I recognize it the moment I see it, even though I’d never have reached for it cold. That’s the leverage, and it’s breadth. The model has worked in corners I haven’t. By hand I search the basin of what I already do. With the model I search wider, for the cost of reading.
So it comes down to how you use it. Use it as a keyboard and you take the first tailored answer and ship it. You get volume and you miss the search entirely. Use it as reconnaissance and you treat the output as material to read across: generate several attempts, ask it to criticize what it just wrote, strip the case-specific framing out of the prompt and see what comes back. The elegant version surfaces in that work.
There’s a catch. You have to recognize the elegant version when it shows up. The bar to ship a feature dropped. The bar to tell which of four attempts travels furthest did not. That judgment is what years at the keyboard were quietly building, and it stayed expensive while everything around it got cheap. The leverage is on generating the candidates. Picking the one that tracks the real problem is still yours.
So the joy didn’t leave, it moved off the keys. The click is the same as it ever was: a shape snaps into place, and you see it cover cases nobody asked about. It just happens now while reading across four attempts instead of while typing one. That’s the part I thought AI would take. It’s the part that carried over.
P.S. The soundtrack came out of the same place. Made it with Claude and Suno.