Prefiere la duplicación sobre la abstracción incorrecta (2016)

Alcance del debate: duplicación vs. abstracción

  • Muchos están de acuerdo con la idea central: las abstracciones prematuras o “incorrectas” pueden ser más perjudiciales que una pequeña duplicación local.
  • Otros objetan que la duplicación a gran escala puede volverse catastrófica, especialmente en sistemas de larga vida, multi‑cliente o de varios equipos.
  • Varios argumentan que el eslogan a menudo se malinterpreta; se trata de evitar abstracciones prematuras o accidentales, no de una licencia para copiar y pegar para siempre.

Cuándo la duplicación es útil

  • Las implementaciones repetidas pueden ser una herramienta para descubrir la abstracción correcta: “escríbelo dos o tres veces, luego refactoriza” (regla de tres / WET).
  • La duplicación se ve como más barata y segura al principio, especialmente cuando los requisitos de negocio y los límites del dominio aún no están claros.
  • Algunos prefieren flujos aislados, ligeramente duplicados, en lugar de una frágil “abstracción dios” con muchos flags y condicionales.

Cuándo las abstracciones salen mal

  • Ejemplos: frameworks sobregeneralizados, polimorfismo forzado, frontends pesados en Redux, y la DRY llevada al extremo.
  • Las abstracciones incorrectas tienden a:
    • Codificar similitudes accidentales en lugar de conceptos compartidos reales.
    • Propagar un acoplamiento oculto, haciendo que cada cambio sea arriesgado y global.
    • Acumular parámetros booleanos/de configuración y cadenas de llamadas complejas.
  • Algunos sostienen que cualquier abstracción mantenible es mejor que una duplicación generalizada más allá de una escala “de minimis”; otros discrepan fuertemente.

Heurísticas y reglas prácticas

  • Heurísticas comunes:
    • No abstraer tras una sola ocurrencia; considerarlo tras dos; actuar tras tres, si realmente representan el mismo concepto y cambian por las mismas razones.
    • Preferir abstracciones obvias y autojustificadas desde su propia interfaz, no solo desde el conocimiento de los llamadores.
    • Favorecer el acoplamiento débil y las bibliotecas de soporte simples por encima de frameworks profundos, centralizados y “ingeniosos”.
    • Abstraer para facilitar el reemplazo futuro, no una reutilización especulativa.

LLMs y la curva de costos

  • Algunos señalan que los LLMs hacen que la duplicación sea más barata de crear y refactorizar, desplazando potencialmente el equilibrio hacia código más simple y más duplicado.
  • Otros informan que los LLMs introducen más duplicación y pueden omitir todas las instancias al refactorizar, por lo que las abstracciones siguen importando.
  • La visión general: la IA cambia la economía, pero no elimina la necesidad de razonar sobre abstracción frente a duplicación.