In my experience, AI really lowered the bar for bad code in the name of delivering faster.
I have seen people write highly complex code where all the complexity was not necessary. Think: deep unnecessary branching, pointless error handling and retries which make no sense in our context, hand-coded parsing using regexps, haphazard data flow, functions which seem purely computational but slyly make API calls, pointlessly nullable model fields, verbose doc comments which describe the implementation instead of the contract. I could go on.
The worst part is, even when "prompted" by bad coders, it works in the end. Even has tests (ostensibly mock-ridden, a pet peeve of mine which always falls on deaf ears). So I cannot reject the PR without being an asshole.
I am no luddite. I make heavy use of AI, with all the skills / AGENTS.md / style guides and clear specs, then review every line of code, prefer testing with minimal mocking. I'd even say with right prompting, it can write better low level code than me (eg: anticipating common error conditions).
But my biggest fear about AI is how it enables normies with little to no understanding of CS principles to produce code faster which looks correct but slowly poisons the codebase.
I have a friend, smart guy, who is writing web services and “connecting them together” for a large firm; he has absolutely no programming experience.
Talking to him, he told me he couldn’t even reverse a string. He is at once many times more valuable than ever before to his company, but also far more dangerous than ever before.
This is what fascinates me. I have a friend, also a smart guy, who has made it to the point he’s at by being a kind of solutions expert. He’s an IT guy, basically. He’s very technical but has never claimed to be a software engineer. He’s writing software with Claude now. The other day he sent me a screenshot of some other team at his work asking him to shut off something he made that was brutalizing an API of theirs. I asked him if he had ever heard of a 429 or exponential back offs. He said no. How do you meta-prompt for that without knowledge?
You can create an agent in Claude with the role of Technical Lead / Architect and have it review your code. That depends on your agent specification. Just have ChatGPT generate that first.
If you get the logs you can feed them in and ask for improvements, that sometimes helps.
He's "smart" but he chooses to be in a business where he's presumptively willfully ignorant of the fundamentals (since he surely should be able to learn to reverse a string if he wanted to learn)? He doesn't have a more lucrative opportunity available? Or does he somehow have a skillset that makes him able to "connect web services together" by prompting AIs in ways that other people (including ones who can reverse strings, etc.) couldn't?
This form of being "smart" is a bit difficult for me to comprehend, I must admit.
> This form of being "smart" is a bit difficult for me to comprehend, I must admit.
I strongly agree with this. Suddenly with the mass adoption of LLMs there are so many smart, yet naive people out there willing to toe the line. Why these smart people couldn't bring value in a million different other ways is, of course, left unsaid.
They're not even trying to dress up these bullshit stories anymore. In truth it doesn't matter if you believe it. So much buzz is people just talking to themselves out loud.
Well that’s not his primary job. It’s an extra task he’s doing at his job. At a non-tech company with small/horrific engineering components, someone in the business who can do any programming (or vibeing) is indistinguishable from magic.
So many fallbacks. So many function_exists. So much pointless type casting. I swear it’s like the system prompt is designed to waste as many tokens as possible.
I agree 100%. At work I'm teaching software engineering principles to system administrators and they, too, often use AI without thinking. Then it's on me to provide feedback on the PRs they barely read themselves. Not a lot of fun but slowly but surely they're learning.
> The worst part is, even when "prompted" by bad coders, it works in the end. Even has tests (ostensibly mock-ridden, a pet peeve of mine which always falls on deaf ears). So I cannot reject the PR without being an asshole.
Yes, you absolutely can. And you should. Try to teach them lessons and what patterns to watch out for, then tell them to put those insights in their CLAUDE.md, so that their agent becomes better, too. You can also tell them to just copy your own CLAUDE.md, like I did: https://github.com/codethief/ENGINEERING_PRINCIPLES.md
> it works in the end. Even has tests (ostensibly mock-ridden, a pet peeve of mine which always falls on deaf ears). So I cannot reject the PR without being an asshole.
This is a social problem that I had thought the industry had solved a long time ago.
When I read the discussions about AI making code worse I keep bringing the same argument: people made bad code even before AI. Average coder is barely functioning and that's a fact.
And we were safe from them because they couldn’t produce a mountain of code every day. But soon many places will be buried under a planet of unmaintainable code. It’s adding friction and operational cost and often not adding value.
People could, however, learn to not make bad code. LLMs are incapable of that feat because they do not have any understanding or ability to reason. They are strictly worse than a human.
As others have elaborated, the problem is empowering them to ship mountains of bad code;
And yeah, many semi-technical M2s or even M1s can't distinguish bad code from good code, or worse bad architecture from good; this is golden time for those who are willing to sacrifice the future for present. Just burnnn'em tokenzzz.
> In my experience, AI really lowered the bar for bad code in the name of delivering faster.
I would've believed that 6 months ago, but not now.
If you have a good codebase with proper rails, hygiene and architecture, AI will produce better code than most engineers out there.
People forget that 90% of the field has always been charlatans barely able to implement a fizz buzz or go much beyond trial and error googling.
I'll say even more. I'm in the 10%, and it's increasingly clear to me that AI writes in minutes code that's better than mine.
Even stellar and respected OSS engineers are nowadays leveraging AI and guiding it less and less everyday beyond giving indications of what kind of data structure they may want for a complex problem or the kind of architecture they are looking for.
In any case, I don't like this field anymore, I have no joy from it, way too much work, way too many changes a human can cope with both on product and technological level (not even counting AI and its tooling itself). The interesting parts of thinking an entire afternoon or week experimenting to get that design right disassembling the pros and cons are gone.
Even if you want to do that, it's just faster to launch 6/7 worktrees with the different ideas and judge the results. But you don't get as intimate with the problem and the amount of information is way more than you can process.
I'm hand rolling a project right now because even frontier models I use bloat things beyond comprehension. Because I'm intimately familiar with the domain, I know the shape of things, how the data should flow, and so on, and if l even if I spec it clearly AI will write 2x to 5x the amount of code necessary to make something work.
"beyond comprehension" is a good way of putting it. I've been genuinely baffled by some of these AI designs - why any intelligent thing would write >10 lines of bloat for what should be a one-liner.
> "beyond comprehension" is a good way of putting it. I've been genuinely baffled by some of these AI designs - why any intelligent thing would write >10 lines of bloat for what should be a one-liner.
As Anthropic's drones say: treat Claude as your genius coworker. Don't think yourself, don't judge, the machine must know better than you. It is the genius, after all, not you.
Forgive my ignorance, but if the corpus of coding data was always 90% bad, isn't that the same data being used for training LLMs? How are they magically any better than that average?
Proper rails, hygiene and architecture need to be actively maintained, they don’t just continue to exist in a developing codebase. Historically, a small proportion (the 10% as you say) had a disproportionate amount of influence on coding standards. When they can no longer keep up with that ongoing maintenance, which we’re seeing with the increased pressure to ship code, the hygiene will regress. We’re riding the tail of all the engineering practices we’ve developed as an industry.
This is what I’m seeing, anyways. Junior engineers are being rewarded for shipping so much code, it’s impossible to evaluate it all, and subtle changes in existing patterns are slipping through. Eventually all those subtle changes transform the rails.
I have seen people write highly complex code where all the complexity was not necessary. Think: deep unnecessary branching, pointless error handling and retries which make no sense in our context, hand-coded parsing using regexps, haphazard data flow, functions which seem purely computational but slyly make API calls, pointlessly nullable model fields, verbose doc comments which describe the implementation instead of the contract. I could go on.
The worst part is, even when "prompted" by bad coders, it works in the end. Even has tests (ostensibly mock-ridden, a pet peeve of mine which always falls on deaf ears). So I cannot reject the PR without being an asshole.
I am no luddite. I make heavy use of AI, with all the skills / AGENTS.md / style guides and clear specs, then review every line of code, prefer testing with minimal mocking. I'd even say with right prompting, it can write better low level code than me (eg: anticipating common error conditions).
But my biggest fear about AI is how it enables normies with little to no understanding of CS principles to produce code faster which looks correct but slowly poisons the codebase.