Use Boring Languages with LLMs
47 points
3 days ago
| 12 comments
| jry.io
| HN
quietbritishjim
40 minutes ago
[-]
> Python is the same story but sung in a different key. Asking a simple question like “which package manager are you using?”

This is annoying but only needs to be solved once at the start, either by the LLM or the human guiding it. A single prompt of "Set up a uv project in this directory with Python 3.13" is enough that it's never an issue again for that repo.

> Goroutines are a far more tractable primitive for coding agents than threads, callbacks, async/await, or any of the colored-function regimes that dominate elsewhere.

I disagree with this. Goroutines, along with threads, callbacks, and traditional async, are all in the same category: spaghetti of unbounded background tasks. Structured concurrency [1] on the other hand is dramatically easier to reason about. Python has support for this (in Trio and asyncio.TaskGroup) as do other languages like Kotlin and Swift. Function colouring a red herring; if anything, it's useful because it highlights the scheduling/cancellation points in your code.

[1] https://vorpus.org/blog/notes-on-structured-concurrency-or-g...

-----

This really does read as "Go is my favourite language". In fairness, that's a good reason to choose a language to use with an LLM (so long as it's powerful enough and not too obscure). But let's not pretend it's the best language for everyone.

reply
kibwen
2 minutes ago
[-]
> Function colouring a red herring

Any time you see anyone overly fixating on "function coloring" for any context other than ancient versions of Javascript it's a clue that the speaker has no idea what they're talking about.

reply
dminik
21 minutes ago
[-]
> Goroutines are a far more tractable primitive for coding agents than threads

Goroutines are literally threads. Yeah, this really is a "go is my fav" article.

reply
bfivyvysj
12 minutes ago
[-]
I use both go and python in my day job. The code that Sonnet produces for Go is much better than the Python it creates.

This could be because our go code is typically smaller more defined services but I don't really believe that since even the isolated python services are pretty spaghetti looking.

reply
Retr0id
16 minutes ago
[-]
Goroutines are not directly equivalent to threads.
reply
keepamovin
1 hour ago
[-]
I agree with the idea that boringly predictable should be what is preferred but anecdotally my experience in using Go with LLMs is that they trip up a lot on the races and locking from go’s thread model. I haven’t seen the same problem in rust which is now why I’m doing all my LLM work for tooling in rust.

The parallelism issue in particular was also not something I noticed agent struggling with in JavaScript, although JavaScript concurrency model is clearly fundamentally different.

The concurrency issues that I saw LMM‘s face was one reason why I created freelang which uses a very boring and audible concurrency model of OS processes that use the file system to talk instead of IPC, shared state, or anything like that. Higher overhead, lower throughput, but more boring and hopefully less bugs: https://github.com/DO-SAY-GO/freelang

reply
nathannaveen
41 minutes ago
[-]
Personally I generally try to avoid concurrency when writing code with AI since I feel AI makes concurrency unnecessary complex in Golang.
reply
keepamovin
24 minutes ago
[-]
Right. But for things like GUI or orchestration tooling it’s unavoidable
reply
lmm
1 hour ago
[-]
Rather than "boring", this seems to be reaching for something like the concept of a "pit of success", or https://haskellforall.com/2016/04/worst-practices-should-be-... . I don't think the fact that the most common pitfalls in Go are well known should be taken as a sign that it doesn't have more esoteric pitfalls as well; it's just that the common cases (like nil) are the ones that everyone sees all the time.
reply
sheepianka
1 hour ago
[-]
I disagree. "Boring" languages leave a lot of assumptions in code, which will start to compound the more changes model (and programmers) make to the code.

The more assumptions I can move to compile time the better models are at dealing with emerging complexity.

I would go the other way with LLMs and I wish for liquid types and effects in Rust to make type specifications even more strict.

P.S. effects and liquid types and type specifications in general add a lot of busywork, but models have higher level of tolerance to busywork compared to developers.

reply
wryoak
3 days ago
[-]
Contradictory anecdote: there’s basically only one way to write Elm, as it is a very trend-resistant language with minimal updates over long timespans, but most agents in my experience will throw Haskell syntax and Prelude functions into their Elm output. Compiler or LSP will often set them right but they still try it initially
reply
gampleman
59 minutes ago
[-]
I do agentic Elm development every day (it's my job). I feel like what you describe was a problem with models perhaps two years ago. Today's models don't seem to struggle with it at all and in fact do seem to benefit from what the author describes.
reply
BoumTAC
1 hour ago
[-]
I’ve just started a new app with an Elm frontend. I’m using Grok Build, and it integrates really well.

The compiler is incredibly helpful because it catches errors and gives clear explanations and the LLM can iterate over it. I’ve also added the elm-review package with the default configuration, which is fantastic for ensuring code quality.

reply
djohnmustard
2 hours ago
[-]
Interesting, what models are you using? My use with sonnet 4.6 has been a breeze for the most part
reply
epolanski
2 hours ago
[-]
Interesting, I have a different experience.

I have worked extending the Elm compiler and both Opus 4.6, GPT 5.4 and GLM 5 had no issues both with the Elm compiler (written in Haskell) and my extended Elm.

I didn't see them hallucinate much, not more than on mainstream languages.

reply
ChrisMarshallNY
54 minutes ago
[-]
I program in two languages: Swift (my main language), for client work, and PHP, for backend work. It’s overwhelmingly Swift.

In the last year or so, I have been using LLMs, to assist my work, with generally, excellent results.

I have noticed that the LLM delivers much better PHP, than Swift. I seldom need to rewrite or correct, the PHP code I get from it, and am constantly correcting the Swift. Part of the reason, may be that I am a much better Swift programmer, than PHP programmer, and there’s just a lot more Swift code. I haven’t really taken the time to analyze it.

I have my theories, as to why, but it’s not something I’m really into researching. I’ve just noted the trend.

reply
sleepy_keita
51 minutes ago
[-]
I think it's pretty simple - there's just so much more open source PHP code out there in the LLM's training dataset. Swift has been around for much less, and most Swift is closed-source - not that many years have passed since Swift has been able to run on non-Apple platforms, too.
reply
iamcalledrob
35 minutes ago
[-]
I would also bet that 90% of Swift training data is UI code.

And UI code quality tends to be technically pretty crummy/low-discipline. Your UI code doesn't need much consideration around data races, for example.

reply
dust-jacket
49 minutes ago
[-]
> Part of the reason, may be that I am a much better Swift programmer, than PHP programmer

Hard not to think that's a major part of it. IME you make loads more corrections in languages you're more opinionated about (and opinionated usually follows more experience & confidence).

I correct AI Python all the time. When it cranks out TypeScript I just check it works.

reply
sd9
57 minutes ago
[-]
I wonder if the training data for some languages has higher quality code. I can imagine some niche languages having a higher standard than, for example Python, which surely has a bunch of random buggy scripts in the mix.

On the other hand, even if that were true, I don’t know how important it would actually be since LLMs can generalise across languages well.

It might be best to pick languages where it’s just harder to screw up, the canonical example being to prefer typescript over JavaScript.

reply
citbl
28 minutes ago
[-]
We are the point now where we let LLM dictate the language?
reply
badgersnake
15 minutes ago
[-]
Yeah, but then generally you pick the language your dev team are most familiar with.

Or you hire a team of specialists for the language you want. Perhaps niche languages should have fine-tuned LLMs in the same way.

reply
Yokohiii
1 hour ago
[-]
> Languages and ecosystems with low variance in their training corpus are represented better and executed more reliably by coding agents.

So I think the author is saying that go is a simple language that tends to have less solutions to the same problem. I personally agree to that to a degree.

What I don't agree on is that we can choose what "low variance" is. There is a lot of go code out there, it's shape may have little "noise", but the variance is massive.

reply
zitterbewegung
1 hour ago
[-]
I haven’t had an issue using Python with LLMs where I have to decide “Should one use pip, poetry, or uv?” Since there is enough training data using pip or just choose that since it is the most boring solution and many of the commands map to uv since uv has a superset of features. Not that go is a bad solution honestly I would just say use what you know best.
reply
Havoc
1 hour ago
[-]
> From a model’s standpoint, there are simply too many ways to write any of this

They seem quite good at figuring this out in my experience

reply
wewewedxfgdf
1 hour ago
[-]
Has Go become a "boring language"?
reply
pjmlp
1 hour ago
[-]
It has been boring from the start.

It would be an interesting language, had it been released at the time of any of its influences, Oberon in 1987, Limbo in 1995.

Back when the type system ideas from CLU, Standard ML, Cedar were still taking off among industrial programming languages.

reply
ncruces
1 hour ago
[-]
The most non boring thing you can say about it is that it's terrible for ignoring most of what we've learned in the past couple decades of programming language design.

That generates plenty of excitement.

reply
dist-epoch
1 hour ago
[-]
Become? Always has been.

It was intentionally designed for programmers with limited skill.

Go language creator Rob Pike:

> The key point here is our programmers are Googlers, they’re not researchers. They’re typically, fairly young, fresh out of school, probably learned Java, maybe learned C or C++, probably learned Python. They’re not capable of understanding a brilliant language but we want to use them to build good software. So, the language that we give them has to be easy for them to understand and easy to adopt.

reply
antonvs
57 minutes ago
[-]
> They’re not capable of understanding a brilliant language

What a coincidence, since Rob Pike wasn't capable of designing a brilliant language.

reply
boxed
37 minutes ago
[-]
Such a weird take from him since Go has a bunch of pit falls that are not needed at all.
reply