Building at the speed of thought
LLMs are far from perfect, but right now I'm having more fun building and iterating on ideas than I ever have.
I took my first college programming class in 2007, and had been dabbling with programming long before that.
As I was learning the ins and outs of Visual Basic (lol)11 One of the first programs I ever wrote was a voting app in Visual Basic, in the wake of the “hanging chad” election coverage in 2000. I thought that recording votes electronically would be a good solution to the problem (I was nine)., it was impossible to imagine the changes that would come to the technology landscape in a relatively short time. A year later I was learning Objective-C to write apps for the new iPhone, and eighteen years later I’m using an iPhone from 30k feet to instruct an LLM on my computer at home to fix a visual bug in my sports app Trophy22 I’m going to write more about Trophy soon. If you’re a sports fan and want an early look, I added 50 spots to the beta.. I didn’t bring my laptop on this trip, but my computer thousands of miles away is sending me screenshots as it works on the layout fix.
That isn’t a very long time, and we’ve gone from “there’s a real web browser on it” to “you can create apps from thousands of miles away by writing normal sentences instead of fixing missing semicolons.”
Okay, enough marveling, quick disclaimer: this isn’t my grand unified take on AI. I don’t have one.
LLMs clearly aren’t perfect. There are plenty of unanswered questions about the impact on humanity and the environment, copyright/ownership questions, and a whole bunch of other things we’ll need to figure out.
In spite of those thoughts in the back of my head, building with LLMs right now feels pretty good in ways I didn’t really expect.
One of the things I keep thinking is how much of programming used to be waiting for my hands to catch up with my head.
I don’t mean that in a “typing is the hard part” way. Typing has never really been the hard part. But so much of building software is surrounded by little bits of friction (yak shaving, if you’ve been around here a while): remembering exactly how an API works, wiring up boilerplate, finding the right file, fixing the CSS thing that should take thirty seconds but somehow eats an hour, getting a local environment into the correct state, or fixing build issues while the idea in your head slowly loses momentum.
At least for me, there are a lot of small ideas that never make it past the “that would be neat” phase. Not because they’re impossible, or even difficult, but because the startup cost is just a little too high or the potential return isn’t there. At work this has resulted in lots of small debug tools, like a macOS app that pulls the tracking code out of a shipping label. On this site it’s led to automating the deployment process, which I never bothered to spend time doing before.
Instead of an idea going into the notebook graveyard, I can try it (probably badly at first). I can ask the LLM for a rough version or ask for some explorations, look at it, recoil a little, explain what feels wrong, try another direction, delete half of it, tighten the layout, rename the confusing thing, and keep going. The first answer is rarely the final answer33 Are you as tired as I am of seeing things that were “one-shot” by LLMs on social media? Some of the examples aren’t particularly good, and the ones that are usually involve a really detailed prompt/plan that the LLM iterated on for ~hours, sometimes with another thread acting as the “judge” to send the work back when it doesn’t pass. Like so many things online, it’s mostly theater., but that’s ok. That first pass helps me decide if it’s worth doing more on.
When the distance between “I wonder if…” and “huh, there it is” gets shorter, I try more things, throw more away, and polish little corners that I probably would have left alone. I chase ideas further than I used to, because each step costs a little less than it did before.
This doesn’t mean the machine is magically doing the important part. If anything, using LLMs has made the importance of taste and judgment more obvious. The model can produce code. Lots of code. So much code. More code than anyone asked for, and often with the confidence of someone who has never once had to maintain anything.
The hard part is knowing when the thing is overbuilt, or the interface feels wrong, or a function is too clever, or a layout is almost-but-not-quite there. Or when something solves the stated problem technically while completely missing the point. You still have to know what you’re trying to make. You still have to care whether it feels good.
I spend less time remembering how to express an idea to the computer, and more time deciding whether the idea is any good in the first place.
It’s easier than ever to start something, but it’s still hard to ship it44 Nine months passed between showing a little teaser of Albums and writing the announcement post after shipping v1.1. Yes, some of that is my perfectionism, but I still believe the last 10-20% of building is the hardest.. Maybe harder in some ways, because now you can get to the messy middle so quickly. The first 80% of a project has always been more fun than the last 20%, and now the first 80% shows up fast enough that you can almost trick yourself into thinking the hard part is gone.
But it isn’t gone. Once the idea starts to take shape, I can see what was wrong about my initial assumptions. I can notice the awkward parts, the missing pieces, the places where the idea didn’t account for the edge cases. Coding used to take long enough that I could keep noodling while I worked. Now I get to the next thinking checkpoint so quickly that I have to stop and think again.
As I’ve been building Trophy I’ve tried at least a dozen navigation paradigms. Iterating on it with LLMs has allowed me to move big chunks of code around just to play around and see if it works as well as I think it will before I worry about the architecture.
I don’t know where all of this goes, or how much of my excitement will last once the novelty wears off.
For now, I’m building more, abandoning fewer ideas, and having a ridiculous amount of fun while doing it. Oh, and the bug fix from the plane? My computer fell asleep and I had to wait until I got home to actually fix it.
-
One of the first programs I ever wrote was a voting app in Visual Basic, in the wake of the “hanging chad” election coverage in 2000. I thought that recording votes electronically would be a good solution to the problem (I was nine). ↩︎
-
I’m going to write more about Trophy soon. If you’re a sports fan and want an early look, I added 50 spots to the beta. ↩︎
-
Are you as tired as I am of seeing things that were “one-shot” by LLMs on social media? Some of the examples aren’t particularly good, and the ones that are usually involve a really detailed prompt/plan that the LLM iterated on for ~hours, sometimes with another thread acting as the “judge” to send the work back when it doesn’t pass. Like so many things online, it’s mostly theater. ↩︎
-
Nine months passed between showing a little teaser of Albums and writing the announcement post after shipping v1.1. Yes, some of that is my perfectionism, but I still believe the last 10-20% of building is the hardest. ↩︎