← Notes

When Coding With AI Feels Like Making Art

I’ve been a software engineer for decades, but I’ve never particularly enjoyed writing code line by line. I’ve always been happier debugging, figuring out how a complex system works, fixing something that doesn’t work, or refining something that almost does.

Recently, working with AI coding agents on personal projects, I’ve found myself enjoying making software in a different way. I can get something into existence quickly and then begin to shape it. This part is interesting. That’s wrong. Try slowing this animation down. Speed this piece of music up. The idea sounded good, but now that I see it, I hate it. What if we did something else entirely?

Sometimes I know what I’m trying to achieve. Often the attempt changes what I want.

The closest comparison I have is to making art, in my case pottery.

No pot I ever made came out exactly as I imagined it. I was always trying to achieve some ideal I couldn’t quite reach, even when I was happy with the result. Occasionally I made something I really loved. Those were often the pieces I found hardest to reproduce. I could recognize what was right about them without quite knowing how to make it happen again.

Making a pot involved an intention, but also a succession of responses to what was in front of me. The finished object carried decisions I probably couldn’t have explained afterward.

AI-assisted development has begun to feel something like that, especially in a project I call Tiny Worlds.

Tiny Worlds lets you take a short journey through words. You choose a word, then another from a new set of possibilities. Drawings and sound accompany the choices. Eventually you have a small composition: words, an image, music, and a brief reading of the path you took. I want someone to feel like they’ve visited a place for a few minutes, even if they’ve never actually been there.

That description sounds more settled than the process that produced it.

I began experimenting in Replit, before moving to Codex and Claude Code. Early versions used heavily curated words that could make pleasing little poems. They felt lovely and sort of magical, but limited. Finding words by similarity of meaning opened up possibilities without necessarily taking you anywhere. Moving from “stream” to “water” made semantic sense, but very little seemed to happen.

We (myself and the model) also tried connected habitats, where choosing words aligned with another place would gradually move you there. I imagined a hike, with your attention determining the route. Playing it was confusing, though. I couldn’t get a satisfying sense of the rules. Something I had liked in the simpler experiments had gone missing.

Much of the exploration happened in conversation. The model would offer three words. I would choose one, or interrupt because the choices felt wrong.

At one point it offered “silence” after “bell.”

“Sorry to interrupt,” I wrote, “but how does silence follow bell?”

“Because I was still sneaking in a poetic relationship,” it answered.

It felt like someone reaching for a poetic contrast. “Distance” worked better for me. It suggested listening to a bell somewhere in the landscape.

When we were pruning the vocabulary for Limestone, the model wanted to remove “buttercup.” I remembered one or two of these small yellow flowers among the rocks in the Dolomites. To me, buttercup belonged there.

One of the journeys I liked most became:

boulder → weathered → lichen → rust → scar → absence → flowers → buttercup

We hadn’t started by writing that sequence. It came out of editing the possibilities and then choosing among them.

Getting a program to offer good choices was another problem. Limestone ended up using twelve deliberately chosen dimensions, including scale, openness, life, intimacy, and traces of loss. Each word has a position in that space. The program looks for interesting movements between them. Deciding what those relationships should be felt as much like artistic judgment as engineering.

The drawings and sound developed through similar experiments. I don’t remember a moment when the complete idea arrived. I do remember complaining that the audio sounded like a hearing test. Eventually the music began to feel more like something that could evolve with the journey.

My wife suggested adding the brief, cryptic reading at the end, a little like a horoscope. I expected bad AI-generated poetry. When I saw it implemented, I liked it much more than I expected. The readings assemble prepared phrases according to the journey. Perhaps that restraint helps. I tried something I didn’t think I would like and changed my mind.

Producing possibilities quickly hasn’t made it easy to produce something I want to keep.

I like Limestone and Tideline, the two Tiny Worlds I consider finished. I’m not completely happy with their music or word journeys. I could revise the vocabularies, dimensions, and vectors, but that might change qualities I like and don’t fully understand.

I’m inclined to let them stand and take what I learned into the next world.

I tried making another world, Meadow, with some simple animation, and became frustrated with it. It’s hard to make something that feels artistic. It’s very easy to make AI-generated kitsch.

I haven’t yet felt exactly the way I did about my best pots. But Tiny Worlds feels more like a work of art than the other software I’ve made. The pleasure is different from fixing a difficult bug. I’m making something expressive that I’m excited to share.

There is something unsettling about the collaboration, too. Did I propose an idea and the model refine it? Did the model propose it and I recognize something worth developing? Finding who first typed a phrase doesn’t always settle whose idea it feels like.

The model isn’t a person, but after enough conversation it becomes easy to forget that. Apparently I apologize for interrupting it. And it confesses to sneaking things into my game. I know it’s modeled behavior. That doesn’t stop me from laughing.

Many programmers love writing code. The activity I’m relieved to spend less time doing may be the part of the craft they value most. For me, these projects have opened up room for creative expression that I’ve often missed at work.

The systems we work on are complex and hard to reason about. Even small changes can require review by several teams. There are reasons for that, but the joy of creation can get lost along the way. AI won’t make those constraints disappear.

I want more than faster implementation. I want room to try things, be surprised, and enjoy what we’re making. Some of the software I most enjoy has a sense of playfulness, even when it’s helping me get through my workday. There can be pleasure in an interaction that feels right, or a small detail someone clearly cared about.

Companies try to create that feeling. It’s hard to fake. If we can’t find delight in what we’re building, what are we expecting our customers to feel?