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.