Typed languages are better suited for vibecoding
Evidence vs. anecdotes
- Many commenters say the “typed languages are better for vibecoding” claim is currently based mostly on anecdotes.
- Several insist on proper evals/benchmarks; type systems, training data, and tooling all confound one another.
- Papers are cited where type systems or static analyzers constrain LLM output or build better prompts, but they don’t prove that “typed > dynamic” in general without tools.
Training data & language popularity
- A recurring counter‑argument: LLMs are strongest in languages with the most training data (Python, JavaScript, maybe Go/Rails), regardless of typing discipline.
- Some report LLMs are “shockingly good” with Python, others with Rails, Go, TypeScript, or Rust; others find Rust/Scala/Haskell/TS output weak or non‑idiomatic.
- Several note that Python likely dominates training corpora; one study on Gemini + Advent of Code suggests performance tracks language popularity.
Types, tooling, and feedback loops
- Strong types + fast compilers are seen as ideal for agent loops:
tsc,cargo check, Go’s compiler, etc. provide structured, immediate error feedback the agent can fix. - Commenters emphasize that “types help” is mostly about feedback quality: compilers, static analyzers, and linters (mypy/pyright/ruff/ty, ESLint, clippy, etc.) give machine‑readable signals.
- Agents often misuse escape hatches like
anyin TypeScript orunwrapin Rust unless lint rules forbid them; some agents even try to bypass pre‑commit checks.
Dynamic vs. static & the Python question
- Several point out that “dynamic” ≠ “untyped”; static analysis and type‑constrained generation can exist for dynamic languages too.
- Others argue you can get most of the “typed language” benefits by requiring type‑annotated Python plus strict type checking in the loop.
- Disagreement on how widely Python typing is actually used in major libraries, but stubs and type checkers are common.
Frameworks, conventions, and vibecoding practice
- Strongly opinionated ecosystems (Rails, some TS/React stacks) are seen as very friendly to vibecoding because there’s “one obvious way” to structure things.
- Less opinionated frameworks (FastAPI, some Go stacks, Hotwire/HTMX patterns) can confuse agents due to multiple ways to do the same thing.
- “Vibecoding” is variously defined from “LLM‑assisted coding” to “never reading diffs, just poking until it runs.” Many consider the strict version irresponsible for anything non‑throwaway.
Language‑specific experiences
- Rust: split reports—some say LLMs are terrible; others get good results with compiler integration, MCP/LSP tools, and strong rulesets.
- TypeScript/Go: frequently praised for vibecoding due to types + fast feedback; Go’s verbosity is framed as a feature when LLMs write the boilerplate.
- JavaScript and Ruby/Rails: good results for some, especially with clean existing codebases; others complain about context confusion and non‑idiomatic output.
- C/C++/C#/Scala/Haskell/etc.: mixed results, often attributed to smaller or messier training sets and language complexity.
Maintainability, safety, and limits
- Many are uneasy about massive 3–5k‑line LLM diffs and doubt long‑term quality, even with types.
- Types don’t prevent logic bugs, races, or outages from LLM‑written code; “safety guarantees” often get conflated with memory safety.
- Several argue vibecoding without strong tests, linting, and human review is simply bad engineering, regardless of language.