Why write code in 2026
softwaredoug.com
softwaredoug.com
I'm as hateful of LLMs hollowing out the job market as the next guy, but the reality is the frontier LLMs are really good at writing anything that's been done and documented on the Internet a million times and unfortunately most of what software devs have been doing the last couple decades is shitting out cookie cutter CRUD apps.
I have my doubts about whether the state of the industry is going to advance as long as we're having LLMs do all the creation, but that's another diatribe.
Without a revolutionary new platform to build apps on that no one has ever developed for before, there is basically no reason to believe there is any software left that has some business or economic value that hasn't already been written.
We’ve created software for virtually every place we can put software. There’s nothing new.
It’s like bridges. We’ve seen all the ways bridges can be built by now. There’s nothing new left to discover.
It’s also a bit ironic to imagine that we’re at the end of new software ideas on a site owned(?) by YC.
Personally, I think we've already reached that point.
Even at YC, I have not really seen any startup doing anything interesting where their main value prop is enabled by new proprietary code that does stuff no one else can already do.
It's the end of history. What could we possibly discover about a series of technologies that are already nearly 100 years old now?
I've heard people say that various things are "solved" now because of LLMs too -- programming included. This implies we've "solved" thinking. I'm worried about these sentiments.
With the current ongoing revolution in home manufacturing (starting with 3D printing; currently there is a lot of work done in home CNC machining), it would be easily possible to get a huge leap towards "print your own car".
The reason why you see nothing of this is basically red tape.
This is a really good idea for completely different reasons. :-)
I'm disputing this. You can have a training corpus in assembly as big as any other language: just feed the compiled result(in assembly) of the CRUD apps to the LLMs.
I suspect that despite its translation abilities, this is true, but I'd like to see it do things in languages that are more or less appropriate for tasks to see how much the training corpus matters vs. its ability to translate. Assembly is a bit of an extreme example because you're either writing it as close to C as possible (C is essentially portable assembly) or you're writing complex, unreviewable code that happens to work. And who know if it's been trained on register allocation, or resorts to doing everything on the stack because it works.
Not really, assembly shows you what the machine instructions actually are. In C you have loops, functions structs. All things that make no sense in assembly.
Then you don't have to litter all of your if/else clauses with hundreds of memory frees and cleanups - you just "goto"
The fact that this is controversial to some people just shows how rules like "Dont use goto" become stupid - if one is trying to make code simpler then there are cases were not using it is the more confusing and error prone choice.
As for "can we now do anything" well if you don't ever need to debug "anything" then yes and if you have any small doubts about your LLM then no.
> In C you have loops, functions structs. All things that make no sense in assembly.
One can reasonably infer that a loop will roughly translate to some type of conditional jump instruction. Function structs are just pointers and call instructions. The former point was that there is little runtime getting in the way of how the constructs could be expressed, and a long time ago it may have been the truth, but not for modern compilers.
WebAssembly is slightly easier than real assembly, but here Fable used WASM GC extensions, which are poorly documented and not yet super common.
Fable didn't even need to debug it; I believe essentially all the assembly worked correctly on the first try.
I have feelings about this, but I'm not pretending it isn't real.
At first blush, it seems achingly obvious that position 1 is true, whilst position 0 is a false play by con artists.
Well, at first blush I agree! But first blushes are notorious for being famous last words (blushes).
You see, we always knew that the tool shapes the hand. That is, as we use computational (discrete) devices, we ourselves become more computational, discrete.
But what we did not anticipate is that the tool would fool others as the ACTUAL HAND. I am so fooled. Daily.
My friends. Does technique encompass being? Answer me this!
Much cheaper than a human software engineer. But comparable to the wages for some human workers.
ROI won't make itself up.
Chinese models will be enlisted in NATS - the National Terrorism Advisory System.
Can't have the fat, rich big boys who give the campaign contributions fail.
i've been curious about the feasibility of this concept for quite some time and now i have an actual example to study and measure and hack on, for a fraction of the cost of my pro sub. it wasn’t trivial, i doubt a non-swe could get it done in that time, but i'm a pretty happy customer overall.
so you don't know if it works properly or not
As I understand it, there's post-training step that does exactly that, they get real developers to select good and bad code and help the AI figure that out. AFAIK it's the reason why Claude was able to leap-frog OpenAI in coding last year, they did this refinement step a lot better.
And now they've taught the older models this, they can use existing models to bootstrap the newer models without humans involved, and bring humans in to just assess the trickier stuff.
I am honestly not happy about the way that models can now just take what should have be a fun multi-weekend project and knock out in a couple of hours. But I'm not going to pretend that Fable is stupid, or that it did a bad job on any of the test projects I gave it. It struggles more on big, messy real-world code bases, absolutely.
But it's not that much simpler. And once you add the WASM GC stuff, WebAssembly gets weird. It's a Harvard architecture with separate value memory, linear memory, GC memory and "tables", all accessible in completely different ways, with a weird mandatory type system (especially for the GC stuff). And the docs are often terrible. And yes, I've also written WebAssembly by hand.
So yes, I would, overall, classify WebAssembly as "slightly easier". But not dramatically so. And the training data for actually writing non-trivial things by hand isn't that great, not compared to something like Intel assembly.
(Don't talk to me about TI320C40 assembly. If Fable can one-shot a Prolog interpreter written using that without finding a reference manual, it's time to hang up my hat and learn to make goat cheese.)
I wonder about this: Does LLM write better code in a better language?
Humans often have more difficulty fixing existing code than reqriting it from scratch, and un-structured un-constrained code would be a big reason for that.
But maybe it doesn't apply to an LLM if it always rewrites all code from scratch?
The whole point is to rewrite everything in a language you don't understand and then ignore whether it's better because you can't tell.
That language, of course, must be Rust.
One time, something didn't work as expected - its the first time it happened with this project. I read through the section of code and it was perfectly readable and well-written.
Turned out a plugin wasn't effecting the audio, so i just got it to pad some blank audio onto the beginning before processing it, then remove it at the end of the process. That fixed the issue, there was nothing wrong with the code but my ability to think laterally is what made it work.
We're getting to the stage where you can just ask them to write code and they will do what you want, and it writes good code. Its up to you to test everything beyond the internal tests it writes.
Some people find code easier to read than the English description. It’s more precise and many experienced devs can scan it and know what’s happening
Many other people can’t read code. Or they find English easier to read than code.
Thats not a knock on anyone. Maybe the latter will rule the world because the former focuses too much on irrelevant details. Or maybe me there are just different types of problems that need differing levels of attention to detail.
How can you be sure that's what the code the LLM wrote actually does?
Yet...
Less about “trusting” the llm and more about how complex it is to work with binaries due to machine code being different per machine and hard to interpret the context of the code as well as offsets.
In that sense because high level languages come with the ability to add context to what code does. It’s like the understanding a human has when given decompiled C code ghidra gives you vs C source code a developer wrote.
Also the compiler helps the llm write “compiled / working code”, if it just spat out machine code it most likely not even run at all.
But yea generally if you can’t write code at all, reviewing it is even harder.
However I do think there is reason to use Java or Python (as much as I loathe both) they have GC, and it'd be a lot easier for AI to fuck up memory safety in something like assembly or C.
One has to program computers to be a computer programmer. If one just prompts LLMs, they are a software prompter. I think both can fit under the title of a software developer or perhaps even software engineer.
There's more to it than that: writing is thinking. If you stop writing code, you aren't thinking anymore.
Many argue that they're now thinking at a higher level (maybe they weren't before?), but, guess what, that high-level design can be done better by the LLM than by you anyway. It's only temporary.
Humans have been thinking long before writing was invented. Why is code special?
And look how poorly they did it until they invented writing.
> Why is code special?
You don't get better at thinking without doing. With code the "doing" part is writing.
In your view, it is reasonable to expect HS students to thoroughly read a book on trigonometry and then ace the exam? We know, from experience, that only by doing problems does the student actually learn. We also know that when you stop doing problems the facility atrophys.
Why is code different?
>And look how poorly they did it until they invented writing.
Yeah, look how poorly they did it until they invented writing.
[peers into the dim ancient past]
Sorry, my time-machine spectacles are on leave or on strike today.
And congrats on being a multi-millen(ium)arian, and a mind reader, who could both 1) exist so far back in the past, and 2) be able to know the thoughts of people who didn't write them down, because they didn't know writing.
/s
How can you know how poorly they did it?
Their lack of progress. Humans existed in the same basic form for around 100k years before they finally invented agriculture, which led to some improvements, and then rapid progress once writing was invented.
While I mostly agree with this notion, given that all of our understanding of human progress historically comes from writing, there's a selection effect happening here.
Like, why do we talk about the Dark Ages? Because there was less writing, so obviously things were terrible.
There's a bit of a selection bias there, because writing itself is used as a measurement of progress.
But, ignoring writing as a measurement of progress, we can pretty much see that for about 100k years the only tech were primitive tools.
Even after the domestication of wolves (about 40k years ago) there were no visible improvement in tech. After agriculture (10k-12k years ago, maybe?), there's visible progress in tech (tools), but not by much, and visible improvement in societies (also, not by much).
Enter writing - those civilisations that had more advanced writing progressed rapidly, and those that did not barely progressed at all, tech-wise.
Because not all civilisations progressed at the same rate, we can see quite clearly that writing is highly correlated[1] with progress.
---------------------
[1] While correlation does not imply causation, as the data mounts it lends more and more weight to the causation bit.
That's a big "If". The observation we have is that civilisations that never invented writing simply died out with no tech-tree advancement; and this happened for 100k years at least.
We've got 100k years of "no writing, no tech". We've got around 5k years of "with writing came tech".
The actual tech to write was there for much of the 100k years (cave art), but without writing, the tech never improved.
IOW, hunter-gatherers follow the best habitat, so controlling for habitat is always going to have the conclusion this paper reached.
I'd be very interested in other studies that support this conclusion; after all, that's how science works - a single study proves nothing if many studies conclude the opposite.
> How can you know how poorly they did it?
You could probably get some sense by comparing illiterate people to literate people.
Each last for a different amount of time and you generally can’t write or even read anything. But in my personal experience, all three lead to solving the most difficult software problems.
When writing, thoughts become forced and linear in my view as opposed to floating in a specific way from point to point. Like I lose the natural creativity.
Writing is about remembering or communicating, so it is summarizing the thoughts, but it is not thinking itself, it is more so thinking about how to communicate efficiently or how to make a note so you don't forget. It is not creativity for me.
Kind of imagine building an idea in your head while running and then you write down the summary of it.
When I sit down to try and write them down, I blank out. Or the thoughts that I thought were good/useful, I second guess when writing them down. Perhaps it's just lack of practice on writing them down (I'm trying to use a typewriter to do so recently).
I am skeptical that you were able to get any good at Maths or Physics without drilling problems.
A lot of people observe that their thoughts get better when they do the work to write them out. It's not just a straightforward encoding process (as maybe a software engineer would conceive of it).
E.g. I iterate and see the architecture or the system work out, or I get other ideas because of something I don't like, etc.
This is a poor argument. The trial and error is the LLMs trial and error of your intention (ironically driven by you), not your trial and error.
It's like saying "It wouldn't matter if I instructed an LLM to solve my trigonometry problem or if I wrote the the solution myself; either way I'm learning trig".
> E.g. I iterate and see the architecture or the system work out, or I get other ideas because of something I don't like, etc.
What exactly are you needed for in this scenario, other than saying "make me $PRODUCT"? The LLm is going to be a lot better at architecture than you are. Your role is limited to A/B testing the result for human use.
I kinda [wrote about this before](https://dielsonsales.github.io/2023/05/11/starting-a-new-blo...) but the takeaway is that writing forces you to structure your thoughts, giving them a final shape and enables you to notice flaws or gaps in your own thinking process. It’s impossible to do this without writing.
As to your post, I think rather than writing it's the act of pressuring yourself to figure the thing out that is making you more knowledgeable about the thing.
You are putting it out publicly out there so you really want to be certain that you are correct, and therefore you do a lot of research.
If you wanted to be accurate and prove a point, the motivation mechanism could vary, but also the eventual communication mechanism could vary. It doesn't necessarily have to be in writing, it could be a live debate or simply something else you built. The writing or the product are end product, but the process of wanting to produce something is what made you research and to understand.
You could be writing to yourself into a Google Docs, and not care and you would not go deep to research since there's no incentive to be accurate.
E.g. I could be doing a home project whether hardware, software or DIY, that in order to produce this output I have to learn and think. Similar to as good set of words to communicate some idea. But also I could build some slop without thinking and I could produce slop writing without thinking, and about nothing special.
by writing code by hand - you're the author & editor at the same time.
if you're skilled enough - you quickly get to the desired state vs the llm which while might produce a lot of code - but it likely won't give the end state you desire.
an analogy - Jason Fried gave - producing software by llm's is like bragging you're a photographer by pressing the shutter button on an automatic camera.
while the art of photography - is about producing the single perfect photo - that communicates the photographers intent (what they want the world to see & experience).
likewise in software - what we make should be deliberate.
Where will you put a line between photography and pressing button?
My point being - tools change with time.
I don't write code anymore and I doubt I ever will ever again.
On the flipside I review exponentially more code than ever before.
>Just ask Claude to dump out assembly, or a compiled binary, but no, they don't trust the LLM that much
It's not "not trusting" the llm its that the llm has been undergoing reinforcement learning is on coding. Plus generating assembly is extremely token inefficient.
However, that would just make the difference in productivity between junior and senior developers even more pronounced! It’s really difficult to see how things will play out in the future without junior developers disappearing, causing a slow death of the profession. LLMs will probably never be good enough to do everything a developer needs to do: understand and improve or clean up requirements, consider future needs, test outside the box, evaluate performance and decide where and when to improve it…
aargh! haalp!
Which rock are you living under these days.
Nowadays everything is IR or MLIR ... or AIR ...
whoops, i may have skipped a few generations. hard to keep up with the dynamic pace these days. got a job to save. sorry suh.
mumble javascript mumble framework of the half-week ...
walks off muttering
I'll byte the bullet.
Hang on a bit while I register that in my memory.
>generate x86 and ARM
So that hardly anyone can review the machine language output, I guess.
HN users' minds be like:
87.654321 %: JS? yeah. mainhipsterstream. gotta be a part. heart.
smaller %: Rust? wannabe. donno how, u c.
much smaller %: C? oh no ... numeric underflow.
Congrats on moving over to the light side.
bobby tables, for another.
No, people do advocate for this. It may simply not be as portable however as something that is high level able to be compiled to assembly for many machines.
Why review it at all? The trend is to vibe code everything with agent harnesses and tokenmaxxxing.
Not all software is mission critical. But some software is.
Thirdly, compilers also do type checking and other static analysis and dynamic checks (array length etc). So it's not only got more guardrails against "mistakes" by the LLM, but it's also most likely "easier" for the LLM to "reason" about (in the sense that LLMs can reason).
There's no intrinsic value to having humans read the code, so as soon as LLMs are good enough to work on their own, companies will no longer need to keep developers who can read code as a backup solution.
Code. It’s called code.”
- CommitStrip (https://www.reddit.com/r/ProgrammerHumor/comments/1p70bk8/sp...)
I think if you’re doing it right, the core of your code should be the simplest expression of the underlying business logic. Of course there’s always going to be supporting layers, and maybe those don’t need to be reviewed. But if you haven’t read the code, there’s an extent to which you don’t know the business logic.
It’s ok to talk to the agent in code. Or create examples for it to follow.
https://softwaredoug.com/blog/2026/07/04/write-code-not-spec...
If you're doing this, then why not just write the effing code?
Code is executable. Specs are not.
"Please print 'hello world'"
It's IRP.
First you write a programming language in which the language primatives are the business logic primatives, then you write a trivial program that describes what the business does in the new language.
I guess the funny answer that is behind this sentence is: You have to train your own mental model. We always argue about code in a very abstract and logical manner. But when coding the subconsciousness makes most of the decision ("this just feels right"). But for this to work you have to train it. And this does only work in a very limited way with code reviews or reading documentation. It requires repetition and deep focus.
When there is an issue in production with this mental model you will be able to point to the cause of an error message instantly. With generated code you'll search for a long time with your slow, conscious part of the brain.
For LLMs to be really helpful, they have to take over complete maintenance of the code. So you can treat them like an external library: Just assume it works. Otherwise this will always be problematic.
The observability people will claim that if the dynamic runtime behaviour of your system makes it hard to find the source of a behaviour, your system must be made more transparent and observable. They would also claim this was always the case -- we should never have relied on people's mental models being amazing because people move around.
(I don't know yet where I stand on this but I'm trying to learn more.)
But currently e.g. I am working on an MES/Scada layer that integrates data from a load of different machines in a factory. These machines are from China, Korea, Germany, Sweden ... Upwards there is an ERP integration (and some other systems).
Sometimes machines are updated and suddenly behave differently. Giving error messages in Chinese.
The ERP has the nasty behavior of returning error messages where it is not clear whether the actual processing actually happened or not. There are some heuristics on parsing the error messages, but these also change with new versions.
Sometimes one machine overloads cloud infrastructure and completely unrelated functionality fails.
Sometimes the on-premise network stops working for whatever reason and data is lost.
Sometimes operators do not understand a perfectly valid error message like: "The batch you loaded into input position XY has expired on XZ and cannot be used for production": "But we have been told to use it..."
So when you get called out at night, because the production line stopped and "MES is displaying an error message", it is mostly about finding out what integration failed and who else to wake up. Getting this right is very much appreciated by your colleagues.
And this is where you need a mental model of how things are connected, what error message happens because of what external causes etc.
Observability can only work perfectly for known problems. In a complex system for unexpected problem you can either provide too much data, so analyzing it and finding the relevant part becomes really hard, or too little data which makes finding the issue impossible.
There are so many companies claiming to provide the perfect observability solution and there are certainly solutions that help. But it is all very far from perfect.
Not relying on people is managers wet dream. And for a lot of people it might be true that they can be easily replaced. But for complex systems there are always some key people that you cannot replace without causing issues.
By having an understanding built during their entire career.
Right now we live in a fairly-land of mixed capacity. LLMs being used in parallel with skilled people. But as time progresses, there will be no more skilled people, because no one will learn and develop those skills.
If you're in the world of LLMs now, you are basically completely stalled in your personal growth in this field. You will never improve, and some seem to say they lose capabilities as they rely upon LLMs.
The world always changes. But the decisions being made today, are being made by skilled people.
What will the world look like, when it's just all "bro, lol, just tell it to make your thing" and then done?
We already tried this with humans. It works so poorly that it got the derogatory name “ivory tower architect”. It usually results in theoretical designs that are unworkable in the actual system, implementation teams (or LLMs) that work around the architecture and a lot of slowing down of velocity as the architect and implementers argue past each other.
Most code out there isn't all that great. I've been in this industry since the nineties. There are a lot of not so great software engineers doing mediocre work. People are romanticizing how great and magnificent their code is (or used to be). The reality of manually crafted code is of course a lot less flattering. Many code bases become hard to maintain over time and are riddled with bugs. And it's not like sloppy code is a new thing. Poorly executed software projects have been very common for a long time. That's not going to go away.
Yeah, and they are all producing 10x as much mediocre work now.
Hopefully companies in the industries where software quality matters and is regulated, e.g.: medicine, aviation, nuclear, etc.
Although this market is relatively small.
I actually think AI based automation is going to be a key enabler in those kinds of strict environments as well. Recent work on identifying e.g. security bugs seems to be resulting in a lot of improvement that has somehow escaped decades of human scrutiny. With good quality harnesses (manual or automated), I don't see any big objection against using generated code here.
Writing some code with the whole context in your head is the human advantage.
I’m not precious about that code. Maybe it needs to be rewritten by an agent. Or we could build good abstractions so it’s trivial to see the system. We could also use systems that by their design force us + agents away from security, performance, etc
Spending a day manually reworking the architecture in my experience can save you $1000s in tokens and weeks of headaches.
We’re trying to build a software factory with hands tied behind our back
I second that and I can give an example that happened to me yesterday with a totally SOTA model (a US, not Chinese model).
I needed to display an information on the client-side. Something trivial. I ask the LLM to do it. The thing went onto a rampage: it somehow found a way to pass the information from the server to the client during the initial handshake (already: why, just why?). Modifying both server-side code and client-side code. And it worked.
To an unsuspecting programmer/tester (or automated test)/user: the info is there, what was asked has been done. So it's perfect, flawless LLM victory right?
Except none of that sloppy-pasta was necessary: the info was already available on the client-side and was a one-line change, purely client-side.
These thing shall definitely, as of 2026, write way too much code.
And btw the companies selling metered tokens have a very serious incentive to produce the most complicated, rube-goldberg, solutions that use as many tokens as possible, while still kinda solving the problem.
That way not only you consume tokens to produce the code, but later on you consume tokens when working on that code (which btw is a guaranteed thing: for the LLM just introduced new bugs in that gargantic amount of crap it output).
Funnily enough the very same people who made fun of copy-pasta happen to be in love with sloppy-pasta. Go figure.
A human coder might OTOH follow the Boy Scout rule and clean up as they go.
Peter Naur explained this decades ago
>Peter Naur argues that programming is fundamentally a human activity of building a mental "theory" - a deep conceptual insight into how a system's parts match the real-world problem it solves. He rejects the prevailing view that programming is merely the mechanical production of source code, specifications, and documentation. Instead, Naur posits that the true product of programming is the shared mental model held in the minds of the developers who built it.
As a human you're the one with the problem you want code to solve, so it's worth having an understanding the problem. Otherwise you risk an X/Y situation, where the LLM ends up solving a problem that may not actually satisfy what you need.
I think what LLMs allow you to do is better abstract away everything that's _not_ essential to the problem you care about, in the same way that libraries or any higher-level programming language does. Ultimately there's still a "core" of the problem that needs to be expressed formally though. When you see people "vibe coding" by prompting the LLM to add constraints at a time until they reach their desired end-goal, this is ultimately "programming" in a sloppy, non-formal way. Better to get the LLM to write everything else _surrounding_ the problem, so you can write and understand the core yourself.
As an example, if you chat with an LLM it can sort of explain concepts it learned in its training, because it created some internal representation of them. However it’ll never be able to explain things about your project unless you tell it (then it can simply repeat it, which is the same RAG does, the LLM is just spitting it out without any deep understanding of it).
You can try to cram as much context to it as possible and overload it with extra information, or you can understand this difference and separate a task that you know the LLM can handle because you’ll be able to leverage its knowledge and judge the final work yourself.
But this distinction needs to be more clear, I think. The LLM doesn’t have any deep understanding of anything you’re creaming into the context window the same way it does with concepts it learned during training from millions of examples and building some internal model of the concepts and their relationships.
Yes, it's in the rules; run profiles, check code coverage, do a critical review, post the report and follow up tasks. 90% of people I've worked with did not follow these boy scout rules nearly as well as today's frontier LLMs.
Is the author implying this is bad?
> Agents bias to making the current change as safely as possible. I had a situation in a previous codebase where one morning, pre-caffeinated, my meat brain mentioned using browser local storage. So some random state was managed in local storage. Everything else through a backend database. When I looked at the code, the amount of wrapping and indirection to preserve this idiotic human mistake probably tripled the LoC. Agents can amplify our one-off bad decisions by being so conservative.
You can of course solve this many ways. And many of boils down to just how a particular humans brain works. Some will solve this by not reading code. Some will read / write code.
Whatever works for you is great. But many there is upside to the precision of not having code intermediated through the LLM for many.
I'm sure plenty of meat humans out there would make the same mistake (sorry, you said to use local storage boss!). You might give them a scolding. And maybe document that policy. Maybe in a markdown file for the next person. IME the latest models are significantly better than the median engineer at following this feedback.
I don't think it's fruitful to blame the LLM any more than it is to blame someone working under you.
In fact I would say this is an excellent example of how engineering does NOT fundamentally change in the era of AI.
In this case things mostly sorta worked and the simplest way to see the problem was look at the code. And try to take it apart a bit to see where the problem was.
I felt I arrived at a better pattern I could trust that the agent could use much more efficiently this way than asking the agent to do it. I could then test that the pattern was being adhered to and therefore better trust the agent not to go off the rails.
I personally internalized the details a lot better by doing this writing. I wouldn’t have internalized it - or more likely played whack-a-mole - by guiding an agent.
How do I arrive at the patterns to check for without exploring the code? And capturing a real failure case?
You don't!
Have you tried adding rules/automations that make it explicit to review and fix the code for bloat (per your taste, with examples if needed)?
With this setup + a good frontier model you will never have to be on the lookout for code bloat. You can even get the agent to send you text message with the LOC-- if it makes you feel better.
I think I understand where you're coming from, that it's hard to "let go" (I've been coding for 30 years and it was hard for me). That's why I'm recommending to have agents write verifiable quantified reports of the things you care about, so you can build up some trust in the agent's work and you don't have to do things by faith.
How do you establish sane patterns when you’re in an exploratory /architectural mode? You could do this in English, sure, but many of us do this more efficiently and precisely in code in a way that lets us be careful, internalize details, and add measurement + QA to ensure it’s adhered to by agents or humans.
I’m not saying to write all the code. I’m saying it’s useful to write 5% of it. Then let an Agent stamp out / rewrite the rest
100% agreed. And it leads to far better LLM output and lower token usage, too, I find.
I noticed this phenomenon way before LLMs came along. Some people would put a halo around a particular technology and blame everything around it when something went wrong.
Why are you building a software factory though, and why weren't you immediately adding CI to every project?
> It’s our job to build the software factory - not just the software. Software engineers maintain the assembly line allowing anyone to prompt for a change and ship immediately.
Again, why? Where are you working where this is considered a good idea? This would mean that the software engineers are not just being completely kicked out of all business decisions, but asked to build a moat that ensures they stay on the other side of it.
Any business that intentionally devalues the insights gained through implementation will eventually starve itself to death by making too many passive thoughtless moves. No insight will ever be gained just spot checking AI. Is their intention really just to make tiny amounts of profit while riding the thing into the ground? Crabs in a bucket, man.
And I'm not saying this as some sort of AI maximalist. If progress keeps up, I seriously doubt software engineering and development will, as we know it today, will be a thing in the next 5-10 years. Maybe humans will be left with designing the UI, but everything else will be abstracted away and AI will be doing all the actual work behind the scenes.
But then you realize software is the accumulation of 1000s of wishes. And you want this but not that. Many little micro decisions of exactly what you want in every nook and cranny.
In the current paradigm (LLMs) we still have to manage all this. But maybe in the future we have something impossible to imagine.
& I think it’s fairly demonstrated that the industry isn’t profitable for training ever increasingly huge models, which get exponentially more expensive each iteration
And maybe we'll get something like a Mad Cow Disease, when AI "eats its own brains". To avoid that from happening we will need continued human inputs, and review.
This isn't really the point of your comment, and for that I apologise, but: not all of us did that. For many good reasons, too.
This isn't really the point of your comment, and for that I apologise, but I still haven't gotten used to speaking about what we "used to do" in the past tense, as if we are in a post-programming world...
We are already starting to speak of the habits we used to have (or not have), how things used to be done back in the day (1-2 years ago).
I don't think you're wrong to do so. I find myself saying it sometimes too. Just an observation about the weird world we find ourselves in.
I would argue that SO is basically “done”, though. For better or worse.
I still write code by hand. I use LLMs too. Weird world for sure.
I mean you're basically saying it is a good thing if the LLM messes up so you have a reason to debug the code.
It's even got a name: sloppy-pasta.
Speak for yourself. A lot of people have great abilities at designing "dynamic architectures" and anything else an LLM is used for. It sounds like you don't realize that an LLM is only capable of what it does because it was trained on human-written code.
I feel this statement these days during code reviews. I know some amazing engineers whose output lately just isn't the same.
Same.
My difficulty is that for the past 8 years I've been working for (tiiiiny) SaaS business where I don't have anyone I can simply ask in-person "hey, can you show me how to 'do' all this newfangled AI agentic team coding?"; so my only direct-exposure is with the painful Copilot sidebar chat, which I now find myself allergic to.
So let's see elsewhere: while searching online for some (reputable) "agentic coding courses" my results are for the same kind of people who used to run those dodgy coding-camps from 10 years ago. I'm having difficulty finding resources for practicing SWEs like myself wanting a continuing-professional-development course experience, not a get-rich-by-buying-my-course video library from a contemptable AI booster
Even more surprisingly, my local major university (UW.edu) doesn't seem to offer any certificate courses for getting into agentic development either[1] despite offering courses on C++, Six Sigma, and actual ML/AI courses. It's maddening. I can't be the only one with this problem...
[1] https://www.pce.uw.edu/search?type=certificate&programType=c...
See how it fails or succeeds. Look at the supported features, try them out, think about how you might use them in your workflow.
Before you know it, you'll be proficient.
You have to learn how to self-teach.
Doesn't have to be stressful. Plan to throw away whatever happens. Do it in a VM if your nerves demand it. No reason it can't be fun.
...so I've been avoidant of the whole thing ever since 2023, burying my head in the sand to avoid those feelings of anxiety and uncertainty-about-the-future, and it now makes it difficult for me to engage with the topic head-on.
I dove in in ~2023, and I'm about as deep in it as one can be. The better I get at it, and the better the agents get, the less time I spend even doing what I do - one prompt will often take 3+ hours. I often keep 8+ agents churning for the whole workday (and leave them running when I leave, too, and it's very often that they'll work from 4pm to midnight or later). I was responsible for 499 commits last week (very little new functionality, though), and I felt pretty useless at the end of it. I keep thinking I should code something, because coding feels productive in comparison, but going by results, it's pretty far from economical to write code by hand, and quickly approaching as bad as shipping goods by foot.
So far in the LLM coding revolution I still feel like it's software development. I just work with systems on the level of features and architecture instead of flow control statements. Some day we might lose that too, but I think it will take a while.
That's kinda at the level I enjoy though - where I get to think-through things when figuring out exhaustiveness and correctness; introducing refinement-types into a codebase that's previously nothing but ints-and-strings; and trying out new and cutting-edge language-features directly.
I know I can prompt Claude etc into trying to do those things, but from what I've seen from other people doing it the result is somewhat of a mess - or just plain inelegant.
-----
May I ask how well Claude/Copilot/etc works with FP languages instead? So far - and back in early 2024 - I've only messed-around with asking ChatGPT to generate Haskell programs and the results were hallucinated gibberish.
Anyway I can say this - the free web interface to ChatGPT in 2024 vs what you get with agent harnesses and the latest large models now is like comparing a wombat fetus to a college graduate.
Get one of the 20 or so dollar subscriptions, install Claude code, codex or similar and start by explaining what program you want to make and which language you want to do it in. Have it make a plan first, and do some back-and-forth to refine it until you're ready to let it implement.
If your experience is from ChatGPT two years ago I think you will be floored by the results, even in Haskell.
And then it feels like a chore slogging through whatever it produced to verify it is correct.
Only that businesses have decided it is OK as long as they are benefitting to steal from everyone else, and basically force us to be the acting hand in all of it, or threaten us with starvation (no job, no income).
Maybe that's "enough" for the business to survive. But it surely won't be the reason it succeeds. It can still succeed for other factors though, but the business has given up on one path to success, which is making better software than the competition.
The job of the software engineer increasingly becomes to make himself unnecessary: to empower the nontechnical business users to do as much as reasonably possible, without his/her intervention.
This has, of course, been the dream of computing, since its inception! And the true aim of every "high level" or "beginner friendly" (looking at you javascript!) language.
But finally, now that the computer actually speaks English (and is beginning to stop making completely insane errors), it gradually becomes feasible.
Freeing the masses from the tyranny of the nerds!
A specification detailed enough to control every aspect of the resulting product is called a program. Compilers are AI. The prevalence of compilers hasn't harmed the programming industry at all, quite the opposite.
Because AI generated code is STILL complete ass. Even Fable, even whatever custom Pi/opencode leet code harness you have, the output is awful, and, if you cannot distinguish the quality of your code vs the AI's, I've got some bad news for you.
My brain feels equally as exercised (in fact more so as I am not as good at agentic coding as I was at real coding)
But now I'm making highly polished Mac OS apps and I really like that move from JS.
I feel... conflicted.
So, making a real time collaborative tool from scratch there was a lot of deep work in things like sockets, queues, memory structures, etc. That's just what needed attention.
Right now I'm building a memory app for AI.
So far I haven't spent much time looking at code on the swift side of things. But I have spent a lot of time up front working on domain driven design, screaming architecture, and module based design.
I think with AI the polish is in deep QA, design taste, running trace logs and constantly asking it to do html diagrams of the architecture and such.
ngl I miss "knowing what's going on" at the code level, but it feels like not a good use of my time to go into those weeds.
When I look at the code it seems well structured due to screaming architecture, and module based design.
fwiw I think the rationale behind it is counterproductive because the only difference between a OP submitting their article link and someone else submitting their article link is internet points.
This was actually my original submission last week. There was a front page submission last night from someone else (hence the comments). Then my old post got re-upped just now (1 hr ago)
In my personal life, I cannot justify more than a $20 sub per month. I only use the Web Chat anyway. Shelling out $100-$200 a month for a sub in which I would get little to no ROI is a poor choice. Besides, I've never hit the limit on my $20 a month plan either.
The day I am forced to prompt LLMs all day, every day is the day I am cashing out of programming as a career. Though to be clear, I have no opposition towards anyone that uses LLMs, and think they are fantastic tools when used appropriately. (I love them as a StackOverflow replacement, and have learned a lot from going back and forth with LLMs).
Writing code helps me think.
Every time I read some take about keeping up one's skills when using agents people get so tantalisingly close to the obvious answer, and then fall short.If the tools are making you worse, don't use the tools.
Even without AI I barely write code. 95% of time are spend setting up integrations, configs, copying & adjusting code from previous projects.
So I took over an open source project called Omnivore. It's a reading app in the vein of Pocket. The hosted version used pdf-lib to inject some functionality into the pdf viewer. Namely, highlighting, note taking, and storing location. pdf-lib is a licensed application, so when taking it to fully self-hosted this needed to change.
I migrated it over to pdf.js. And I went through the entire process. I added all the functionality bit by bit. It didn't take exceptionally long, maybe 1-3 days. But that process was really satisfying. I found a bug, fixed it, and then found a stackoverflow issue where someone was also experiencing the same issue and suggested the fix. https://stackoverflow.com/questions/59151218/pdfjs-error-on-...
I'm pretty sure an ai could have done all of this. And therein lies my fear and my upset with AI. Not only would it have robbed me of that experience, but it shows that I have in a way been devalued. Because I do think that took a level of skill. And now that's gone...
I’ll be very curious how / if the Bun port to Rust works out.
Every time you work in a complex software project, you have all the context in your head about what you must take into consideration. LLMs don’t, you have to explain every little detail to them, but there’s no telling where it stops: do you have to explain X to it or is it in the training already?
When you try to shape how a LLM should behave and what it should know, you end up writing a Bible of relevant context that’s increasingly difficult to maintain as well, often with outdated or contradictory information, and it is still free to ignore things you have written and proceed however it wants.
That’s why so many people only feel comfortable giving the LLM some limited task to do, because you can judge if that specific task needs just enough context that it can handle by itself.
Then there's the mass. I don't need that anymore. The mountains of boilerplate, etc.
I write little islands which need high judgement that are then connected by the obvious goo.
Generating boilerplate is strictly inferior than something already written and tested by the authors of the tools. You will eventually have to make slight adjustments to it, and those decisions can be just as impactful as your "high judgment" code. Those decisions are what actually enable your high judgment code to stay clean and straightforward.
Poor decisions in code architecture are some of the biggest blunders of all. Once you have begun to fill in the blanks on some boilerplate code, it ceases to remain boilerplate code. If you let AI make those adjustments, you will eventually blunder the codebase in precisely this way. You'll first recognize it when your high judgment code seems too verbose. You'll then soon realize some things are impossible without adjusting the boilerplate you started off with. Then the AI will fail to grasp what you want and you'll have to manually untangle a lot of the slop that you let grow out of control. Good luck with that.
Recently I am seriously thinking the time when agent do the work and I was waiting for it's output, I got a bit lost given it really can do a lot but it make me feel some crisis as a human, even it still can provide me a sort of Joy because some task I long want to do but no time to start can be finally take shape, but the Joy is actually not comparable with the Joy when I read the code and hack with it
Concretely, I am letting agent to write some serious part of code to rust and I will consider only let Agent to handle the UI and integration stuffs, and I will take the rust part and rust is a language that I want to learn and be professional given I was do lots of C coding
I spend time building AI Agentic guides and skills, then review the code myself. I really miss the old days when you put your headphones on and focus for 3-4 hours
Why write code in 2026? Because it’s fun.
Also, if you use AI to write your code, you are not a developer either.
Let's say AI completely disappears right now, many of the so called "developers" are unable to write code, are unable to fix code, they cannot code.
There are two kind of developers:
1. Non-developers: Use AI for everything, to write code, to test the code, you name it.
2. Real developers: Search engines are broken right now, they use AI as a tool, as replacement for Google to ASSIST you, not to do the task for you.
As AI is falling apart and companies are hiring people back, these non-developers will find themselves out of work.
The problem is IT professionals who depend on AI for everything. That is crashing down and won't be pretty.
One way to "stay relevant" would be to admit that.
And that is a far stronger abstraction than LLMs :)
It was a great read.
Recent HN Discussion: https://news.ycombinator.com/item?id=48873855
The selling point is that you know have a quality Vs time tradeoff that is a lot better than you used to have.
I can spend 10 seconds typing out a prompt that will generate ok code.
Before a couple of years ago, it might have taken me an hour to type out and debug that code.
> Before a couple of years ago, it might have taken me an hour to type out and debug that code.
Are you not running and testing your code?
> Are you not running and testing your code?
Why would you think that?
Because you’re claiming to not debug, and that you’ve gone from 1 hour to 10 seconds. I can only go off of what you tell me here.
Can I use agents to code a SWE project? yes, with nuances.
Can I write code for a SWE project? yes, with nuances.
Its more options now, I'll write code about projects I deeply care and will use llm at work where its shared slop and forced usage.
And then the whole article shows tangible reasons where the agents are truly worse at code than humans. Code never is just the text. If intelligence you have is not truly general, you cannot expect things like clarifying wider context, hierarchically ordering knowledge based on criteria and producing consistent results despite transfer learning and retraining.
And no, we are not even close to the multimodal capabilities of human brain to hierarchy encode and reproduce knowledge. Otherwise the correct "reasonable" economic action would be genociding all humans, and I'm pretty sure that this is what billionaires effectively want out of AI.
Interesting article btw
If you think that everyone agrees on the "correct" way to use it, you're mistaken. If you think that your way is the best possible way to use it, you're arrogant. And if you think that the way you think is correct is obvious and that everyone should already know that's the right way, you're delusional.
Usually, when people say AI code is terrible, it's because they either don't understand the theory well but have grown through hands-on experience and can't explain things properly to the AI, or they don't know what they don't know. Or there are the very few who are just far better coders than AI. Some people will say they're among the rare few who can write better code than AI, and for some that may be true. But in my experience, the vast majority are not. Even from my perspective as a beginner, I could see flaws when I looked at their git code. It's a metacognition problem.
Realistically speaking, at the script level, it's quite common to see AI surpass human programmers as you increase the input level. You might disagree, but that's probably because you're a specialist in that field, deeply immersed in a very narrow area—it only holds true in that limited scope. In the general domain, most people would agree that AI writes code well.
Human programmers don't know much outside their own domain. But AI, while it loses in very narrow specialist areas, writes better code than humans across the broader range. It loses in the 1% zone (the expert's domain), but wins in the other 99%. Usually, when that's the case, you have two choices: become the 1%, or learn how to use AI.
Since I'm a non-native English speaker, I'm already at a disadvantage compared to native speakers in programming skills, so I chose the latter. But I still code. Not for any other reason—if I don't maintain at least some typing muscle, I won't be able to review AI code properly.
That's why I think coding is essential. Even if I can't understand the entirety of AI's output, I still need to understand the core business logic. At the very least, the core logic requires human understanding, so coding is necessary.
.... and in the and you end up with a very deep prompt that exactly specifies the behavior. This is what a programming language is.
I'd rather describe a data structure in a language designed for this task, than a prompt the might be interpreted in many different ways.
And I should mention that I have 30+ years of programming experience.
Usually, it produces code that would take three or four humans days to figure out—in just 20 minutes.
Even the professors and PhDs who hire me all use AI. Honestly, they hold PhDs and professorships, which puts them in a league I can't even touch—and even they use it. AI just does it really well.
Honestly, I learned from your book, 'rossant'—I never expected a programmer like you to say something like that. I thought my perspective was because I'm only an intermediate-level programmer. But you're in the 1% expert category I mentioned
I’ve stopped using llms to generate architecture, which i design and write myself and let the machine pattern match the gaps. I also use it to review issues which I lot of the times push back against.
I’m working on a stateful application sitting on top of a data warehouse and have to implement a stream of messy half defined feature requests and navigate on top of an ever changing infrastructure layer. LLMs rarely get the infra layer even if it is written as code and have hard time grasping how to deal with tech debt, when and how to re-architecture parts of the stack or even implement stuff based on a detailed openspec design.
I imagine at competitive coding the goal is quite clear, but in a real world project, the goal is not always so clear, and especially in hobby projects the ideas and goals are not that clear. I get inspiration on how to improve my project or its usability, not the LLM. I instruct it to do something a specific way, because it doesn't do anything on its own, and I need to tell it what to generalize, which it failed to see, because it didn't consider a simplification which is technically less precise, but due to user context and human nature doesn't matter (in this case it was interpreting "now" to mean the current second, which is a small time range, instead of a mere point in time).
So it still takes a ton of hand holding in a more open project. I imagine, one could also code it up in the same amount of time. But it is good for generating tons of test cases. Though one will have to review those, and impose a test style on them, give examples and so on.
Beyond hobby projects, most clients often don't really know what they want. And that's generally what we call domain modeling. This is definitely an area where AI is weak. As you know, it mainly pulls from generic patterns.
When there are specific constraints, AI struggles with core business logic. And as you said, it's also weak at choosing the right direction or the goal to pursue. But as you also know, 80% of programming is built on what others have already created. Originality is only about 20%. And in that 80%, AI is absolutely dominant. I agree with you and I've upvoted your comment.
I really like your perspective
I've seen so many of these already. It would be hilarious to see Brooks proving right once again.