Beauty, Infinite Software

I wrote around three thousand lines of code yesterday, by hand, knowing the entire time that the agent could have done most of it, and I did not stop, and I want to write about why I did not stop, because I think the reason is embarrassing and also instructive, and I think a lot of engineers are about to have, or have already had, a version of the day I had yesterday, and I want to try to say what it was like from the inside.

I sat down in the morning with the problem in front of me. It was not a hard problem. It was the kind of problem I have solved a hundred times in slightly different shapes. If I had written a decent paragraph describing what I wanted, the agent would have produced something close to it, and I could have spent the rest of the day refining the output, checking the edges, catching the places where the machine’s taste diverged from mine. That is the shape of the day I think I was supposed to have. That is the shape of the day I will eventually have more often than not. That is the shape of the day my whole argument, in public, about where this is going, predicts that I will have.

I had a different day.

I opened the editor and I started typing. I named a file. I named a function. I named the parameters. I wrote the signature before I wrote the body, the way I was taught, the way I have taught others. I let the shape of the thing come up out of my hands, slowly, a line at a time, and when the shape began to feel right I kept going, because stopping once the shape was right felt like a kind of betrayal of the shape, and I did not want to betray the shape, and the agent was there the whole time, waiting, a panel I could have opened in about one second, and I did not open it.

I want to be honest about why. I did not open it because opening it would have changed what the day felt like. I wanted the day to feel the way it used to feel. I wanted the intimacy. I wanted the grain under the plane. I wanted the moment the names became honest and the boundaries held and the system stopped resisting me and started agreeing with me, and I knew, without being willing to say it out loud, that the agent would not give me that feeling, because that feeling lives in my own hands, not in my ability to direct someone else’s hands, and my hands are the thing I have been developing for five years, and I am not yet ready to relate to them as a thing I have developed past.

By the end of the day I had three thousand lines. They were clean. The names were right. The logic was tight. I liked them the way a person likes something they made with their hands. I liked them in a way I have never, not once, liked anything the agent has produced for me, however good the output was, however close to what I would have written. And I also knew, sitting at the desk at nine in the evening, that the three thousand lines represented a day I could have spent on something else, a day I could have spent at the layer above the typing, asking harder questions about what to build and why and for whom, and I had not spent the day there, I had spent it in the pleasure of my own hands, and the pleasure was real, and the pleasure was also, in some way I am still learning to admit, a hiding place.

I think those two things are both true. The pleasure is real. The pleasure is also a hiding place. And I think a lot of engineers, including most of my friends, including me, are about to spend the next several years figuring out what to do with the fact that both are true at the same time, and the work is not in picking one, the work is in holding both without letting either of them win.

I want to say what I think is happening, and I want to say it plainly, because the plainness is where the honesty lives.

Software is becoming free. Not free as in no cost. Free as in no friction. The thing that used to take a week takes an afternoon, and the afternoon is mostly thinking about the problem, not typing at the problem. The typing part, the implementation part, the thing I spent five years becoming good at, is collapsing toward zero. Not all the way. Not tomorrow. But far enough, already, that I can feel the ground moving under the rung I have been standing on, and my body knows the ground is moving even when my mind is busy producing reasons it is not.

I want to be careful about what is being lost here, because I think people are getting this wrong in both directions. What is being lost is not software. What is being lost is the scarcity of making software. The fact that it used to be hard to build, that it used to take specialized skill and time and attention, and that the difficulty was part of what made the people who could do it feel valuable. The difficulty is leaving. The valuing-ourselves-by-the-difficulty has to leave with it, and the leaving is going to be hard, because a lot of what I thought were principles turn out, on closer inspection, to have been scarcity wearing a costume.

We used to argue about beautiful code. We had long debates about naming and abstraction and the right level of indirection, and those debates were not stupid. Some of them were craft. Some of them were real. But some of them, more than I was willing to see at the time, were weighted by the fact that every line cost time, and time was the currency we were paying with, and the weight of the time made every decision feel important, and the feeling-important was partly craft and partly the cost of slowness masquerading as the point of slowness. The slowness was not the point. The slowness was the circumstance in which the point had to be developed, and I mistook the circumstance for the thing itself, and now that the circumstance is changing, the mistake is becoming visible in a way it never had to be before.

I want to describe what I actually feel when I use the agent, because I think the feelings are the part no one is being honest about.

When I write code by hand there is an intimacy. I do not have a better word. It is the moment a diff becomes clean. The moment the names feel honest. The moment the system stops resisting and starts agreeing, the way a piece of wood stops fighting the plane when the grain is finally found. That feeling is real. It is closer to why I got into this than any of the reasons I would give in an interview. It is the thing I would not give up if I had to choose between it and a raise, and I have, more than once, quietly chosen it over a raise without telling anyone.

And the feeling is becoming optional. That is the sentence I have been trying to write for weeks, and every time I write it I want to add a qualifier to soften it, and I am going to resist the qualifier and let the sentence stand. The feeling is becoming optional. The machine will do the thing. It will often do it cleaner than I would, because it does not pay the costs I pay. It does not ration its attention. It does not get attached to a decision it made ten minutes ago. It does not flinch when it needs to delete a hundred lines. I flinch every time. I wrote those lines. They are mine. The machine deletes and moves on, without any visible grief about what was removed, and I cannot tell, some days, whether the absence of grief in the machine is something I should learn from or something I should guard against, and I suspect the answer is both, and I suspect the navigating-of-both is going to be most of the emotional work of the next decade for people like me.

Sometimes when I am halfway through writing something by hand, and I realize I could have just prompted for it, a feeling arrives that I was not expecting this early in my career. It is not shame exactly. It is more like I can feel, in my body, that I am spending my best resource, which is my actual thinking, on the cheapest part of the work. The feeling is not moral. It is ergonomic. It is the feeling of wearing a winter coat in July. Misallocated. Suited for a climate that is no longer the climate I am in.

Here is what I think this means, and I want to be careful, because the conclusion is easy to state and easier to state wrong.

When implementation becomes cheap, when you can generate ten versions of a thing before lunch, the bottleneck moves. It moves from can you build it to can you tell which one is good. And not good as in it compiles. Good as in it will make sense six months from now when you are tired and have forgotten why you made half of the decisions. Good as in the next person can inherit it without inheriting your confusion. Good as in it belongs in the world, not only in the codebase.

The word for this is taste, and I have a complicated relationship with the word, because it sounds soft, and subjective, and like something a designer says rather than something an engineer says. I was trained, explicitly and implicitly, to be suspicious of anything that cannot be benchmarked. I am still suspicious. I am working on it. But I think taste is the thing. I think it has been the thing for longer than I realized, and scarcity was obscuring it, and the scarcity is leaving, and what is left is what was always there, visible now in a way it did not have to be before.

Think about houses for a minute. Houses got dramatically easier and cheaper to build over the last century. We figured out mass production, prefab, power tools. The result was not that all houses became beautiful. The result was that there are a lot of houses, and most of them are fine, and you can live in them, and they do what they are supposed to do. And the houses people actually love, the ones people seek out and pay premiums for and feel something when they walk into, those are the ones where someone made decisions with taste. Someone thought about how light moves through a room. Someone cared about proportions. Someone chose restraint over more. Most people cannot articulate what taste is. But everyone, without exception, can feel its absence. You have been in a house that had it and a house that did not, and you knew the difference before you could name it.

Software is going the same direction. We are about to have infinite software. Infinite almost-right. Infinite it-works. Infinite output that looks competent until you have to live with it. And the thing that will separate the software people tolerate from the software people love will not be whether it functions. Everything will function. The separator will be taste. Coherence. Restraint. The choice of the right simplicity, not the fastest one. The willingness to say no to a feature that would have tested well and kept the product whole instead.

I think this is going to be hard for engineers, harder than most of us are admitting, because we built our value system around the implementation, around the making, and the making is becoming commodity, and what is left is judgment. What is left is should we build this, and how should it feel when it exists, and those questions do not have test suites. You cannot write an assertion for taste. You have to develop it slowly, by paying attention to what works and what does not, by building up an internal library of yes, that and no, not that, and you cannot fully explain the library to yourself, let alone to anyone else, and the explaining is not the point, the having-developed-it is the point, and the developing takes time, and the time is not reducible by any tool I have met.

Beauty was never just the interface. I want to say this because I think people hear taste and imagine I mean making things pretty, and I do not mean that. Code has beauty. Structure has beauty. Restraint has beauty. The way a boundary holds. The way a name tells the truth. The way a system refuses, quietly, to surprise you in the ways that would cost you later. That beauty has always mattered. It is just that when implementation was expensive, the beauty was tangled up with the difficulty, and it was hard to tell which one I was actually valuing. I could tell myself I valued the beauty and I could also be valuing the scarcity, and as long as the scarcity was there, I did not have to find out which of the two was mine.

Now I can find out. Now the difficulty is leaving, and I get to discover whether I loved the craft or the scarcity, and I am finding out in real time, and I do not have a clean answer yet. Some days I think it was the craft. Some days I think it was the scarcity. Most days I think it was both, braided together, in a way I cannot fully separate, and the separating is going to be some of the private work of the next few years.

Hand-written code is not going to vanish. But it is going to become deliberate. It is going to be the thing I choose when I can feel the abstraction cracking, when the machine is guessing and I can tell it is guessing, when the problem has a grain only a human can feel. Those moments will still exist. They will just be rarer. And they will mean more, because they are chosen rather than required, and chosen things always mean more than required ones, once you get used to the weight of having chosen.

What I think I am grieving, if I am being honest, is not that the work disappears. The work is not disappearing. What I am grieving is that the meaning has moved. The thing I used to do to feel close to the system, the hand-building, the line-by-line intimacy, that activity is becoming disconnected from the act of shipping the system. I can still do it. But I do not have to. And do not have to changes the entire emotional weight of the activity. It moves from necessity to hobby, and something about that transition hurts even though I know it should not, and the hurting is part of the data I am trying to take seriously, because I do not want to build a future on a grief I refused to notice.

The future is not the machines writing the code. The future is humans deciding what is worth building and what it should feel like when it exists. The future is taste applied to infinite possibility, which is, if I can get out of my own way about it, a better world, a more generous world, a world in which more people can make things and the creative surface expands and the things that emerge from the expansion are things none of us would have predicted alone.

But I am going to miss the three thousand lines I wrote yesterday. The ones I did not need to write. The ones that were, in strict economic terms, a waste of a day, and in some older and harder-to-measure sense, the closest I came, all week, to the thing I started doing this for. I do not think I will keep having days like that. I do not think I should keep having days like that, not regularly, not as a working posture, not as an identity. But I am going to let myself miss them, because the missing is honest, and I would rather be a person who misses something honestly than a person who pretends, for the sake of a clean essay, that the missing was never there.

I will get over it. Probably. I will let you know.

— Dallen Pyrah