Prefer duplication over the wrong abstraction (2016)

Scope of the Debate: Duplication vs. Abstraction

  • Many agree with the core idea: premature or “wrong” abstractions can be more damaging than small, local duplication.
  • Others push back that large-scale duplication can become catastrophic, especially in long‑lived, multi‑customer or multi‑team systems.
  • Several argue the slogan is often misread; it’s about avoiding premature or coincidental abstractions, not a license to copy‑paste forever.

When Duplication Is Useful

  • Repeated implementations can be a tool to discover the right abstraction: “write it twice or thrice, then refactor” (rule of three / WET).
  • Duplication is seen as cheaper and safer early, especially when business requirements and domain boundaries are still unclear.
  • Some prefer isolated, slightly duplicated flows over a brittle “god abstraction” with many flags and conditionals.

When Abstractions Go Wrong

  • Examples: over‑generic frameworks, forced polymorphism, microservice “distributed monoliths,” Redux-heavy frontends, and DRY taken to extremes.
  • Wrong abstractions tend to:
    • Encode accidental similarities rather than true shared concepts.
    • Spread hidden coupling, making every change risky and global.
    • Accumulate boolean/config parameters and complex call chains.
  • Some contend that any maintainable abstraction is better than widespread duplication past a “de minimis” scale; others strongly disagree.

Heuristics and Rules of Thumb

  • Common heuristics:
    • Don’t abstract after one occurrence; consider it after two; act after three, if they truly represent the same concept and change for the same reasons.
    • Prefer abstractions that are obvious and self‑justifying from their own interface, not only from knowledge of callers.
    • Favor loose coupling and simple support libraries over deep, centralized “clever” frameworks.
    • Abstract for ease of future replacement, not speculative reuse.

LLMs and the Cost Curve

  • Some note LLMs make duplication cheaper to create and refactor, potentially shifting the tradeoff toward simpler, more duplicated code.
  • Others report LLMs introduce more duplication and can miss all instances when refactoring, so abstractions still matter.
  • General view: AI changes the economics but doesn’t remove the need to reason about abstraction vs. duplication.