Back to Blog
#ai

On Coding With AI

My thoughts on being a developer in the age of AI

Programming with AI, at its best, is something like a gracefully coordinated dance between the human and the machine. The human, while having a shower, thinks up an amazing new idea for an app: Uber for Horses! The human writes up a prompt and hands off a task to the model: build this app! While waiting for a response, the human comes up with plans for new features and edge cases that will need to be handled. They ask a sub-agent to draft a letter to investors to secure their first $20 million funding round. The coding model returns an artifact for the human coder to test (far faster than the human could ever have written it themselves). The human passes off their newfound insights and steers the AI in the direction they want to go, then reviews the artifact. The human learns something new about what they are building, decides that a) yes, that is what they wanted to build, or b) that is not at all what they wanted, go back to the AI. And the process continues, building layer on top of layer of new software. Gone are the days of looking up obscure IDE macros or trying to remember how to parse a CSV in an unfamiliar language. An LLM can generate a full-featured CRUD app faster than an experienced programmer can write FizzBuzz. AI has become a true force multiplier for us all.

Whether the human ever gets to any satisfying conclusion or closure with their project is less a function of the specific AI model that human is using, and more a function of that human coder's individual coding habits and taste.

LLMs mirror their users. If you ask a model to write a naive abstraction, it will happily write that abstraction for you. It will rapidly write a 10,000-line function of Python code for your self-driving car that ends up driving the passenger off a cliff. It might even gaslight you into thinking that its mistakes are your own. It all depends on how you interface with the model. The more thought, insight, and creativity you bring to the model, the more of each of those qualities it responds with.

It is an exciting (perhaps unnerving) time to be a developer. It is thrilling how much easier it is to create massive amounts of code, to move fast and break things, to conjure new apps and features out of thin air. Gone are the days of precise specifications and laborious formal proofs. Software now feels more like alchemy than engineering. Perhaps this is the price one must pay to reach higher levels of control and abstraction over the machine.

You pour in massive amounts of code and context, you stir things up, you revise as you go, and you hope that you eventually get something resembling the outcome you wanted. Because the gap between what you want the code to do and the code itself is now so wide (one natural language prompt can generate 1,000 lines), the slightest changes to your prompt can have massive impacts on the result you get. The prompts are now the specifications, and the specifications keep changing.

The intelligence you can now harness with a simple natural language prompt is greater than it ever has been. The question is how to put that harnessed intelligence to good use. Intelligence on its own is not a virtue. How many highly intelligent people have built bridges that collapsed? Or constructed houses with bad foundations? Or built companies that could not last? Clearly intelligence is not enough: you need equal parts discretion, foresight, and luck if you want to build anything that survives in the AI age.

Coding with an AI agent does not automatically make you a good programmer. You still have to understand the value of good abstractions and careful code design. If you have a habit of writing code without tests, AI will generate thousands of lines of untested code for you faster than you can read it. If you shirked thorough code review and testing before AI, now you have 10x as much code to review as before. The difficulties of this new productivity compound as fast as the efficiency gains.

What if we just remove the human from the loop entirely? That appears to be what the frontier labs are hoping is possible. And with recent advances, it isn't hard to see why.

But just because you burn $1,000 worth of tokens does not mean you are producing $1,000 worth of value. I suspect a vast majority of AI-generated code will end up collecting dust in unread GitHub repositories (guilty as charged). You can be 100x more efficient at pumping out features that no one wants and that have no return on investment, but where does that get you? At the end of the day, for any of this to make sense, this new productivity has to add value to people's lives. It has to deliver value for humans, and that might be difficult if we take humans out of the equation.

That brings us to the interesting economic problem for AI token peddlers of the world: how do they actually make money selling their AI products? Investors do not like throwing away money, and currently vast amounts of tokens are being sold at pennies on the dollar. If most of the cost of selling these models is subsidized by VCs, and customers do not see any return on their investment, how does any of this last? If the sellers of these foundation models cannot profit from their creations, what happens to everyone who has built on top of them?

It's debatable whether any of this makes the craft of software easier, but it certainly raises the stakes. A thoughtful developer with good instincts has more leverage than ever. An undisciplined one generates more mess, faster, at greater cost. The mirror does not lie.

Whether the economics of all this shake out remains to be seen. But whatever happens to the token peddlers, I suspect the developers who bring real judgment to the table will still have a seat there.