Language Servers Are a Lie. Here’s the Truth.

You’ve probably noticed it. That little spinning wheel in your editor. The agonizing wait while the language server wakes up, indexes your project, and starts telling you what to type.

We’ve been sold the idea that Language Server Protocols (LSPs) are the pinnacle of developer intelligence. They promise safety. They promise to catch your bugs before you even run the code. But there’s a dark secret hiding in that JSON-RPC middle layer.

We’ve traded the raw, electric pulse of a living machine for a backseat driver that guesses our intent.

Language servers aren’t making us smarter. They are effectively rebuilding the Lisp and Smalltalk interactive environments of the 1980s—but without the unified live image that made those systems actually work.

Take it from a curmudgeon who finally bit the bullet and tried modern tooling. The experience is jarring. You get autocomplete. You get hover tooltips. You get the illusion of total systemic awareness. But when the rubber meets the road, the language server doesn’t know what your code is *doing*. It only knows what it *might* do based on static analysis.

This is the collision of two feedback-loop philosophies. On one side, you have the compile-time verification crowd—the Haskell and .NET developers who want the compiler to obliterate structural errors before runtime. On the other side, you have the runtime explorers—the Common Lisp and R developers who live in a REPL, changing the system while it breathes.

Language servers try to bridge this gap and fail spectacularly.

A language server gives you the illusion of understanding without the burden of actual execution.

When you rely on an LSP, you are interacting with a ghost. It’s a layer of abstraction that separates you from direct execution—the exact problem image-based systems solved decades ago. You aren’t talking to your program; you’re talking to a static analyzer that is constantly playing catch-up.

I saw this firsthand in the trenches of the editor wars. Programmers proudly declare they don’t need an IDE, while others can’t write a line of Python without an AI whispering in their ear. The fear is real. The programmer’s self-image as a craftsperson who understands the machine is threatened by tooling that claims to know the code better than they do.

But here’s the twist: the tool doesn’t know your code better than you. It just has better autocomplete.

When you check things at runtime, you’re dealing with an ever-moving target. Change a function, and the whole system adapts. That’s terrifying if you’re used to the compile-time safety of GHC obliterating your code. But it’s also how living software actually works.

Language servers promise incremental feedback without true runtime awareness. The result? More tooling, less direct understanding. You aren’t exploring a living system; you’re navigating a static map of a dead one.

The real question isn’t which tool is better. It’s whether you still have the courage to run your code, or if you’d rather let a static analyzer tell you it’s safe.

Stop worshipping the language server. It’s a crutch. A janky, JSON-spewing middleman pretending to be a Lisp machine. If you want true intelligence, drop the abstraction layer, open a REPL, and talk to your machine directly. Before you forget how.

FAQ

Q: Aren't language servers necessary for navigating massive modern codebases?

A: They are a band-aid for poorly structured codebases. If you need a massive JSON-RPC server to understand your project, your project is too complex. A REPL scales better because it understands the actual runtime state, not just static types.

Q: What's the practical implication of this for my daily workflow?

A: Stop trusting the green checkmarks. Static analysis doesn't prove your code works; it only proves it type-checks. You still have to run it. Treat your IDE as a convenience, not an oracle.

Q: So we should all abandon our IDEs and go back to Lisp?

A: Not necessarily Lisp, but the philosophy of live imaging. The future of AI-assisted coding shouldn't be better autocomplete; it should be an AI that can manipulate a live runtime image, not just predict the next token.

📎 Source: View Source