▲ | Typed languages are better suited for vibecoding(solmaz.io) | |||||||||||||||||||||||||||||||||||||
73 points by hosolmaz 3 hours ago | 63 comments | ||||||||||||||||||||||||||||||||||||||
▲ | woodruffw 23 minutes ago | parent | next [-] | |||||||||||||||||||||||||||||||||||||
> I am managing projects in languages I am not fluent in—TypeScript, Rust and Go—and seem to be doing pretty well. This framing reminds me of the classic problem in media literacy: people know when a journalistic source is poor when they’re a subject matter expert, but tend to assume that the same source is at least passably good when less familiar with the subject. I’ve had the same experience as the author when doing web development with LLMs: it seems to be doing a pretty good job, at least compared to the mess I would make. But I’m not actually qualified to make that determination, and I think a nontrivial amount of AI value is derived from engineers thinking that they are qualified as such. | ||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||
▲ | timuckun an hour ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
It's been my experience that strongly opinionated frameworks are better for vibe coding regardless of the type system. For example if you are using rails vibe coding is great because there is an MCP, there are published prompts, and there is basically only one way to do things in rails. You know how files are to be named, where they go, what format they should take etc. Try the same thing in go and you end up with a very different result despite the fact that go has stronger typing. Both Claude and Gemini have struggled with one shotting simple apps in go but succeed with rails. | ||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||
▲ | jbellis 16 minutes ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
I'm really shocked at how slow people are to realize this, because it's blindingly obvious. I guess that just shows how much the early adopter crowed is dominated by python and javascript. (BTW the answer is Go, not Rust, because the other thing that makes a language well suited for AI development is fast compile times.) | ||||||||||||||||||||||||||||||||||||||
▲ | jjcm 8 minutes ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
I've noticed a fairly similar pattern. I particularly like vibecoding with golang. Go is extremely verbose, which makes it almost like an opposite perl - writing go is a bad experience, but reading go is delightful. The verbosity of golang makes it so you're able to always jump in and understand context, often from just a single file. Pre-llms, this was an up front cost when writing golang, which made the cost/benefit tradeoff often not worth it. With LLMs, the cost of writing verbose code not only goes down, it forces the LLM to be strict with what it's writing and keeps it on track. The cost/benefit tradeoff has increased greatly in go's favor as a result. | ||||||||||||||||||||||||||||||||||||||
▲ | lukev an hour ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
As has been said, actual evals are needed here. Anecdotally, the worst and most common failure mode of an agent is when an agent starts spinning its wheels and unproductively trying to fix some error and failing, iterating wildly, eventually landing on a bullshit (if any) “solution”. In my experience, in Typescript, these “spin out” situations are almost always type-related and often involve a lot of really horrible “any” casts. | ||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||
▲ | anupshinde 10 minutes ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
I am comfortable with both Python and Go. I prefer Go for performance; however, the earlier issue was verbosity. It is easier to write things using a Python dict than to create a struct in Go or use the weird `map[string]interface{}` and then deal with the resulting typecast code. After I started using GitHub Copilot (before the Agents), that pain went away. It would auto-create the field names, just by looking at the intent or a couple of fields. It was just a matter of TAB, TAB, TAB... and of course I had to read and verify - the typing headache was done with. I could refactor the code easily. The autocomplete is very productive. Type conversion was just a TAB. The loops are just a TAB. With Agents, things have become even better - but also riskier, because I can't keep up with the code review now - it's overwhelming. | ||||||||||||||||||||||||||||||||||||||
▲ | herrington_d an hour ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
The logic above can support exactly the opposite conclusion: LLM can do dynamic typed language better since it does not need to solve type errors and save several context tokens. Practically, it was reported that LLM-backed coding agents just worked around type errors by using `any` in a gradually typed language like TypeScript. I also personally observed such usage multiple times. I also tried using LLM agents with stronger languages like Rust. When complex type errors occured, the agents struggled to fix them and eventually just used `todo!()` The experience above can be caused by insufficient training data. But it illustrates the importance of eval instead of ideological speculation. | ||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||
▲ | linkage an hour ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
This claim needs to be backed up by evals. I could just as well argue the opposite, that LLMs are best at coding Python because there are two orders of magnitude more Python in their training sets than C++ or Rust. In any case, you can easily get most of the benefits of typed languages by adding a rule that requires the LLM to always output Python code with type annotations and validate its output by running ruff and ty. | ||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||
▲ | OutOfHere a minute ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
The argument against Python is weak because Python can be written with types. Moreover, the types can be checked for correctness as well by various type checkers. The issue is those who don't use type checkers religiously with Python - they give Python a bad name. | ||||||||||||||||||||||||||||||||||||||
▲ | poink 13 minutes ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
Typed languages are also better suited to IDE assistance and static analysis I'm a relatively old school lisp fan, but it's hard to do this job for a long time without eventually realizing helping your tools is more valuable than helping yourself | ||||||||||||||||||||||||||||||||||||||
▲ | exclipy an hour ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
The closest we got to vibe coding pre-LLMs was using a language with a very good strong type system in a good IDE and hitting Ctrl-Space to autocomplete your way to a working program. I wonder if LLMs can use the type information more like a human with an IDE. eg. It generates "(blah blah...); foo." and at that point it is constrained to only generate tokens corresponding to public members of foo's type. Just like how current gen LLMs can reliably generate JSON that satisfies a schema, the next gen will be guaranteed to natively generate syntactically and type- correct code. | ||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||
▲ | chrisjharris an hour ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
I've been wondering about this for some time. My initial assumption was that would be that LLMs will ultimately be the death of typed languages, because type systems are there to help programmers not make obvious mistakes, and near-perfect LLMs would almost never make obvious mistakes. So in a world of near-perfect LLMs, a type system is just adding pointless overhead. In this current world of quite imperfect LLMs, I agree with the OP, though. I also wonder whether, even if LLMs improve, we will be able to use type systems not exactly for their original purpose but more as a way of establishing that the generated code is really doing what we want it to, something similar to formal verification. | ||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||
▲ | nu11ptr an hour ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
Everything said is true without AI as well, at least for me. I don't hate Python, and I like it for very small scripts, but for large programs the lack of static type makes it much to brittle IMO. Static typing gives the confidence that not every single line needs testing, which reduces friction during the lifecycle of the code. | ||||||||||||||||||||||||||||||||||||||
▲ | J_Shelby_J an hour ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
Writing rust and the LLM almost never gets function signatures and returns types wrong. That just leaves the business logic to sort out. I can only imagine that IDEs will eventually pair directly with the compiler for instant feedback to fix generations. But rust also has traits, lifetimes, async, and other type flavors that multiples complexity and causes issues. It also an in progress language… im about to add a “don’t use once cell.. it’s part of std now “ to my system prompt. So it’s not all sunshine, and I’m deeply curious how a pure vibe coded rust app would turn out. | ||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||
▲ | brikym 18 minutes ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
You could just leave it at "Typed languages are better." | ||||||||||||||||||||||||||||||||||||||
▲ | NischalM 2 hours ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
I have found this to be true as well. Although I exclusively used python and R at work and tried CC several times for small side projects, it always seemed to have problems and ended up in a loop trying to fix its own errors. CC seems much better at vibe coding with typescript. I went from no knowledge of node.js development to deploying reasonable web app on vercel in a few days. Asking CC to run tsc after changes helps it fix any errors because of the faster feedback from the type system compared to python. Granted this was only for a personal side project and may not be true for production systems that might be much larger, I was pleasantly surprised how easy it was in typescript compared to python | ||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||
▲ | SteveJS an hour ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
I think this is true -- especially for new code. I did this not knowing any rust: https://github.com/KnowSeams/KnowSeams and rust felt like a very easy to use a scripting language. | ||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||
▲ | fluxkernel an hour ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
All existing programming languages are designed for human beings. Is it the right time to design something that is specifically for vibe coding? For example, ease of read/understanding is probably much more important than all the syntactic sugars to reduce typing. Creating ten ways to accomplish the same task is not useful for LLMs. | ||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||
▲ | warrenmiller 27 minutes ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
it aint great at c# i can tell you. this from grok yesterday: foreach (string enumName in Enum.GetNames(typeof(Pair))) {
| ||||||||||||||||||||||||||||||||||||||
▲ | itsafarqueue 35 minutes ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
This generalises to “Agents respond well to red/green feedback loops”. | ||||||||||||||||||||||||||||||||||||||
▲ | lvl155 an hour ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
I can say with 100% certainty that they all stink at Rust. It’s laughably bad. Python, on the other hand, is surprisingly good. | ||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||
▲ | gompertz 2 hours ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
Curious, has it been proven that typed languages are easier for LLMs to work with as they dont have to infer types? | ||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||
▲ | adamnemecek 35 minutes ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
They are also better suited for being ported to other languages, also unsurprisingly | ||||||||||||||||||||||||||||||||||||||
▲ | rvz an hour ago | parent | prev | next [-] | |||||||||||||||||||||||||||||||||||||
Such extraordinary claims, require extraordinary evidence. Not "vibes" > It seems that typed, compiled, etc. languages are better suited for vibecoding, because of the safety guarantees. There are no "safety guarantees" with typed, compiled languages such as C, C++, and the like. Even with Go, Rust and others, if you don't know the language well enough, you won't find the "logic bugs" and race conditions in your own code that the LLM creates; even with the claims of "safety guarantees". Additionally, the author is slightly confusing the meaning of "safety guarantees" which refers to memory safety. What they really mean is "reasoning with the language's types" which is easier to do with Rust, Go, etc and harder with Python (without types) and Javascript. Again we will see more of LLM written code like this example: [0] [0] https://sketch.dev/blog/our-first-outage-from-llm-written-co... | ||||||||||||||||||||||||||||||||||||||
▲ | Mistletoe an hour ago | parent | prev [-] | |||||||||||||||||||||||||||||||||||||
I don't know what vibecoding is, and at this point I'm too afraid to ask. | ||||||||||||||||||||||||||||||||||||||
|