Get AI summaries of any video or article — Sign up free
Why LSPs AND Package Managers Are Bad thumbnail

Why LSPs AND Package Managers Are Bad

The PrimeTime·
5 min read

Based on The PrimeTime's video on YouTube. If you like this content, support the original creators by watching, liking and subscribing to their content.

TL;DR

Ginger Bill says LSP autocomplete can reduce productivity by encouraging developers to rely on editor suggestions instead of internalizing code structure and idioms.

Briefing

Odin language creator Ginger Bill argues that both language server protocol (LSP) tooling and package managers can quietly harm developer habits—slowing learning, encouraging dependency sprawl, and masking the real costs of complexity. His core claim on LSPs is personal but pointed: heavy autocomplete and “IntelliSense-like” behavior can reduce the need to read code and documentation, making developers less attentive to the actual structure and idioms of a codebase. He’s not anti-LSP in principle; he cites an unofficial Odin language server (“OS” by Daniel Gavin) as a solid option. Still, he says productivity rose when he stopped relying on richer editor intelligence, keeping only basic completion (like Sublime Text’s rudimentary buffer completion) plus go-to-definition.

That stance extends beyond autocomplete. Ginger Bill treats inline documentation and hover tooltips as part of the same convenience umbrella—useful for some workflows, but not essential for building understanding. He also contrasts this with how he works across large screens: documentation in a separate pane is manageable, and he often finds that knowing parameter types and basic signatures is enough without constant context switching. He adds that he doesn’t use LSP-style tooling even for C++ and finds it “really slow,” reinforcing the idea that tool latency and cognitive friction can matter as much as feature richness.

The conversation then turns to package managers, where the critique becomes more systemic. Ginger Bill’s “spicy take” is that package managers make it easier to fall into dependency hell by automating the acquisition of third-party code—raising compile-time, complexity, bug surface area, and security risk. He argues that when dependencies are easy to download, developers stop thinking about what they’re pulling in, version conflicts, and licensing landmines (including the risk of accidentally bringing in GPL code that can break commercial distribution). He also challenges the common assumption that package managers exist because hand-rolling dependencies is too hard; instead, he says teams should understand and control what they depend on, especially for shipped products.

In Odin’s ecosystem, the alternative is “batteries included” plus vendoring. Ginger Bill describes Odin’s standard library split into Base, Core, and Vendor collections, with vendor code shipped alongside the compiler distribution. Vendoring, he says, avoids the “magical” updating behavior of package managers: teams can keep a known-good copy, patch it directly when needed, and rely on the project’s quality bar. He also argues that Odin’s module model—where packages can be directories of files—reduces the “diamond import problem” that arises when file-level modules force extra wrapper files to avoid cyclic dependencies. In his view, using the filesystem hierarchy as the package boundary is a pragmatic way to scale organization without inventing new abstractions.

The discussion closes with Odin design inspirations and tradeoffs: swizzling/shuffling for vectors (mapped to hardware instructions), pragmatic language features like embedding via “using” on struct fields, and a willingness to borrow ideas from languages such as Swift, Go, Plan 9, Jonathan Blow’s work, and Dart. Across it all, the throughline is restraint: make the language help with hardware-aligned productivity, but avoid tooling and dependency mechanisms that reduce understanding or inflate complexity beyond what teams can reason about.

Cornell Notes

Ginger Bill argues that LSPs and package managers can reduce developer understanding by replacing reading and reasoning with automation. On LSPs, he says richer autocomplete and hover documentation can make people less productive long-term because they stop internalizing code structure and idioms; he keeps only basic completion and go-to-definition. On package managers, he claims they accelerate “dependency hell” by making it too easy to pull in large dependency graphs, increasing compile time, bug surface area, security risk, and even licensing exposure (e.g., accidental GPL inclusion). Odin’s counter-approach emphasizes batteries-included standard libraries (Base/Core/Vendor) and vendoring, where teams keep and can modify a known copy of dependencies. He also defends Odin’s directory-based package/module model as a practical fix for cyclic-import and organization problems.

Why does Ginger Bill prefer not to rely on LSP autocomplete and similar editor intelligence?

He reports higher productivity when he stopped depending on IntelliSense-style autocomplete. Without auto-complete suggestions, he says he began remembering the codebase and focusing on the code itself rather than waiting for editor prompts. He still uses basic completion (e.g., Sublime Text’s buffer completion) and relies on go-to-definition, which he considers sufficient because syntax highlighting already identifies most symbols.

What’s his stance on LSP documentation features like hover tooltips and signature help?

He groups hover documentation and argument/type hints under the same convenience umbrella as autocomplete. While he acknowledges many people find these tools valuable, he says they didn’t improve his own productivity. His workflow already supports documentation via separate panes and external references (like MSDN), and he often finds parameter lists and basic signatures are the most useful parts.

What is the main harm Ginger Bill attributes to package managers?

He argues package managers make it easier to enter dependency hell by automating dependency acquisition. That automation can hide what’s being downloaded, increase compile-time and complexity, introduce bugs and security vulnerabilities from transitive dependencies, and create versioning conflicts. He also highlights licensing risk: pulling in the wrong license (including GPL code) can undermine commercial use.

How does Odin’s “vendoring” approach aim to avoid those package-manager risks?

Vendoring ships dependencies as part of the compiler distribution (organized into Base, Core, and Vendor). Ginger Bill claims this reduces “magical” updates and makes dependency sets explicit and stable. Teams can keep a vendored version, patch it directly when needed, and rely on the project’s quality control rather than random third-party releases.

Why does directory-based packaging matter to him compared with file-level modules?

He argues file-level module systems often create the “diamond import problem,” where two files need shared code and cyclic dependencies force extra wrapper modules. Odin’s directory-based approach treats the directory as the package boundary, letting files within the same directory see each other and reducing the need for extra indirection. He also notes Odin disallows cyclic imports, which makes the directory/package model a practical way to structure shared code.

What design principle does he use to decide which language features are worth adding?

He emphasizes pragmatism and hardware alignment. For example, Odin’s vector swizzling/shuffling is justified because it maps directly to hardware instructions (from GLSL shader practice), so the abstraction matches something real and efficient. He contrasts this with features he considers harmful when used incorrectly, such as “using” as a statement (which he says can create unreadable spaghetti code), while endorsing “using” on struct fields for explicit embedding.

Review Questions

  1. How does Ginger Bill connect the convenience of LSP autocomplete to long-term learning and code comprehension?
  2. List at least three concrete risks Ginger Bill associates with package managers, and explain how vendoring is meant to address them.
  3. What problem does he associate with file-level module packaging (the “diamond import problem”), and how does directory-based packaging avoid it?

Key Points

  1. 1

    Ginger Bill says LSP autocomplete can reduce productivity by encouraging developers to rely on editor suggestions instead of internalizing code structure and idioms.

  2. 2

    He keeps only minimal completion and go-to-definition, arguing that syntax highlighting and definition jumps provide enough navigation without constant autocomplete prompts.

  3. 3

    He frames package managers as a driver of dependency hell by making it easy to pull in large transitive graphs that increase complexity, bugs, security risk, and licensing exposure.

  4. 4

    He highlights licensing risk as a practical failure mode: accidental inclusion of GPL code can jeopardize commercial software distribution.

  5. 5

    Odin’s standard library is organized into Base, Core, and Vendor collections, aiming for “batteries included” so most programs don’t need external downloads.

  6. 6

    Vendoring is presented as a stability mechanism: teams keep a known dependency snapshot and can modify it directly without surprise updates.

  7. 7

    Directory-based packaging is defended as a pragmatic solution to cyclic-import and organization problems that arise in file-level module systems.

Highlights

He reports that productivity improved after turning off richer LSP-style autocomplete, because it forced him to remember the codebase and focus on the code rather than editor prompts.
His package-manager critique centers on automation: easy dependency downloads can hide what’s being pulled in, inflate compile-time and complexity, and create security and licensing risks.
Odin’s Base/Core/Vendor split and vendoring model are positioned as an alternative to package managers—explicit, stable dependencies that can be patched directly.
Directory-based module packaging is defended as a way to avoid the “diamond import problem” and reduce wrapper-file churn caused by file-level module boundaries.

Topics

  • LSPs
  • Package Managers
  • Vendoring
  • Odin Modules
  • Vector Swizzling

Mentioned