upvote
The upper bound on program complexity used to be the power of the human mind. "Vibe coding" can break through that barrier. But not because the problem being solved needs that complexity. Because the process does not drive itself towards compact abstractions. It's the AI-powered version of the scaling problem Brooks described back in "The Mythical Man-Month". The combinatoric problems get worse with scale. Concretely, multiple similar implementations of roughly the same thing appear in different parts of the project. This is a known problem of vibe coding now.

We need some way to make AI-driven coding strive for parsimony.

reply
Why would it? It has optimized what it was built to optimize: this is the token-selling industry. Take note that the people hawking the dream of a gold rush are not actually mining but selling shovels
reply
Same issue happens in models trained by organizations who aren’t selling tokens. I believe it’s because being parsimonious is simply harder. Achieving the task at hand independently and declaring the job done is easier than building an abstraction and reconciling between every use case.
reply
Labs are trying to make long-horizon work. Even if you're a coding agent, adding more and more surface area is distracting to that goal. There is reason that RL over long traces should, at least in principle, optimize for building in ways that help the result fit in the model's context window.

A meaningful risk of course is that the tools available to the model (ripgrep + fancier semantic approaches) allow it to do a good job of reasoning over things much larger than its context window, and so it doesn't pay the penalty sufficiently to fix it.

reply
Does that not sound a little silly to you when you say it? Should I invest in becoming a memory athlete as a way of becoming a better software engineer? ...or should I learn how to build and use tools?
reply
While I don't disagree, memory certainly was more of a restrictions on us humans than it is on llms. Therefore, the answer may not be as obvious as it seems. We build abstractions to reduce (memory) footprint of features, right?
reply
All the open weight models, that are given away for free, across orgs and even nations, are using the same methods to achieve high performance.

What's more profitable, optimizing for inference time or optimizing to increase inference time by increasing token count?

reply
> The upper bound on program complexity used to be the power of the human mind.

Maybe for simple one-person projects. We've long since developed methods and models to allow us to make things bigger than ourselves. Linux, SAP, etc. These software projects are not held in the mind of a single developer. But we use structure, rules, and other tools so that the pieces still fit together.

reply
> "Vibe coding" can break through that barrier. But not because the problem being solved needs that complexity. Because the process does not drive itself towards compact abstractions.

It's the infinite AI monkeys at a computer keyboard phenomenon.

Or the car on the highway that bumps left and right on the guardrails until, eventually, it arrives at its destination and nearly everybody is amazed at that great success.

The AI kool-aid drinkers are going to answer: "but that's how human code too".

And I'm really not sure about that.

reply
It's perhaps how some humans code but frankly if you have those people employed to build software for you, you have big problems
reply
That's some idealistic nostalgia. Software is generally poorly built today, and it's evidently not big enough a problem to fix.
reply
Large companies that can keep themselves alive with regulatory capture - absolutely. For smaller companies that need to compete the software quality and ongoing cost of maintaining that software is a real consideration.

That isn't to say software is perfectly built, but it's usually pragmatically built to balance costs of development and correctness - well chosen abstractions let us push up both qualities at once.

reply
I think every type of company has ways to workaround software quality. B2B can tend to define the bug as the feature or too low priority.. B2C can often decide backwards compatibility simply doesn't matter and just replace things with other things with only some actual feature overlap, etc.
reply
I think part of the problem is the context windows for humans are actually much smaller than what an LLM can keep track of today. The small context window of humans is a feature that forces modularity and abstraction in software engineering so that you can decompose what you're working on into something that can fit into your head. But since LLMs can fit so much more in their head, so to speak, they don't have this same incentive, and you get the unorganized mess of spaghetti code that current agents often produce.
reply
Hah Tetris that really matches my "everyone has to draw their own line constantly".
reply
Isn't this just an effect of what the LLMs are RL'ed for? Solving short-horizon tasks.

I assume one can't benchmaxx multi-year long efforts, clean architecture, taste etc as easily as these "make tests pass" tasks

reply
> the lines have to clear.

Sorry, the lines have to clear what? Surely there must be some kind of constraint on "lines" that they have to overcome.

reply
The lines (rows) in Tetris have to become complete and then disappear to make room for the new falling pieces.

In code the thing has to become stable, can't just keep packing more and more noise onto it.

reply
Absolutely this: and it needs to ideally become the kind of set of abstractions that mean that every new thing added uses less net-new surface area than it would without them.
reply
deleted
reply
I mean that at the bottom of the Tetris board, the lines need to vanish so that the Tetris board keeps moving downward and doesn't grow unbounded.
reply
Do you believe "micro services" can make a comeback? local daemons with an exposed API, each daemon vibe coded?
reply
Microservices don’t reduce complexity, they just move it to the interactions between services. You have the same fundamental design problem.

In other words, if you can’t design a modular monolith, you can’t design a set of microservices.

reply
Unless we are planning to deploy them all individually to an expensive serverless platform like Lambda, the coordination challenges and overprovisioning are going to more than outweigh whatever architectural benefit you reap (in human-centred development, micro services are solving an entirely different problem - Conway's Law)
reply
What problem would it solve? They're still part of a larger system ultimately. Sure, smaller codebases with more focused scope can be good for e.g. human individuals and LLMs, but there's multiple ways to achieve that that don't require a network boundary.
reply
Microservices are about separate deployment. Regarding separating the development/maintenance of components, you can achieve that in a monolith by composing it out of corresponding modules/libraries with defined APIs. That’s good practice anyway.
reply
Sure, why not? The same reasons they succeeded originally will work just as fine now.
reply
Please no.
reply
Lemme guess, you were in favour of monolithic systemd too?
reply
Agreed, and ever since LLMs started being able to write competent code, I've noticed a massive difference in quality on codebases where I knew the technology, and ones I didn't. This is because I can much more efficiently steer the LLM on e.g. backend code, which is my expertise, vs yoloing everything on mobile, where I have no idea.

The codebases using technologies I have no idea about tend to quickly become unmaintainable and buggy, because the LLM still doesn't make good architectural choices, but the codebases that use technologies I'm familiar with basically never devolve into unmaintainability.

The difference between the two is massive, and that's why I think that a competent engineer steering an LLM in their area of expertise gets two orders of magnitude more productive, whereas someone steering an LLM in an area they know nothing about are basically producing tech debt at the speed of thought.

reply
> two orders of magnitude more productive

Shipping 100x more features per day?

reply
100x faster towards becoming an email client
reply
Yes.
reply
Do you have specifics? It would be interesting to see what kind of improvements are possible.
reply
I just see in my usage that I can release tens of features a day, whereas I'd be able to release one or two a day usually. I don't know if it's 100x, but it's definitely more than 10x.

I've written up my process here:

https://www.stavros.io/posts/how-i-write-software-with-llms/

The biggest thing to get right is to let the LLMs do what they're great at (code implementation from very detailed specs, and code review), and you do what humans are great (architecture and making sure the high level of the implementation is sane). That way, you get the best of both worlds, and a lot of speed at high quality.

reply
I have a theory (armchair take here lmao) that AIs are trained on public code, but the biggest codebases are not public.

Although I suspect models from Google, Facebook and Microsoft can be trained on their massive internal codebases. Whether they are is another question.

reply
I’m not sure you’d see that big of a difference in quality. There is quite a bit of cruft that can accumulate when you know the code will never be public.

But, you would probably see a difference of scale and architecture. Larger projects that need better organization are probably more likely to be in private codebases (Linux excluded). So you might be right about the lack of private code in LLM being an issue.

reply