Tiene razón: copiar y pegar funciona muy bien, y DRY no tiene sentido cuando su tarea es producir un programa para el cual la plantilla copiada o la copia no tendrán que mantenerse o evolucionar en el futuro. Cuando esos dos componentes de software tienen un ciclo de vida completamente diferente, acoplarlos juntos refactorizando un código común en una biblioteca común que está en desarrollo puede tener efectos impredecibles para el esfuerzo. Por otro lado, al copiar secciones de código dentro de un programa o sistema de programas, todas estas partes generalmente tendrán el mismo ciclo de vida. A continuación ilustraré lo que esto significa para DRY y la gestión de proyectos.
En serio, existen muchos programas de este tipo: por ejemplo, la industria de los juegos de computadora produce muchos programas que deben mantenerse durante un período corto de algunos meses o un año como máximo, y cuando ese tiempo termina, copie y pegue el código antiguo de un juego anterior donde se excede el período de mantenimiento, en la base de código de un juego nuevo está perfectamente bien y podría acelerar las cosas.
Desafortunadamente, el ciclo de vida de la mayoría de los programas con los que tuve que lidiar en los últimos años es muy diferente. El 98% de los requisitos o solicitudes de corrección de errores que me llegaron fueron solicitudes de cambiopara programas existentes. Y cada vez que necesite cambiar algo en una pieza de software existente, la "gestión de proyectos" o la planificación funcionan mejor cuando sus esfuerzos de prueba y depuración son bastante bajos, lo que no será el caso si cambia algo en un lugar, pero debido a la copia lógica empresarial pegada, olvida fácilmente que también necesita cambiar una docena de otros lugares en la base del código. E incluso si logra encontrar todos esos lugares, el tiempo para cambiarlos todos (y probar los cambios) es probablemente mucho mayor, como si solo tuviera un lugar para cambiar. Entonces, incluso podría hacer una estimación precisa del cambio, ya que los costos una docena de veces más altos de lo necesario pueden colisionar fácilmente con el presupuesto del proyecto.
TLDR: siempre que desarrolle un programa en el que no sea necesaria ni responsable la corrección de errores y el mantenimiento del original o la copia, no dude en copiar. Pero si usted, su equipo o su empresa son o podrían ser responsables, aplique DRY siempre que pueda.
Ejemplo
Como anexo, permítanme explicar qué significa "corrección de errores y mantenimiento", y cómo esto conduce a la imprevisibilidad en la planificación, especialmente dentro de un producto, por un ejemplo del mundo real. De hecho, he visto que este tipo de cosas suceden en realidad, probablemente no con 100 instancias, pero los problemas incluso pueden comenzar cuando solo tienes una instancia duplicada.
La tarea: crear 100 informes diferentes para una aplicación, cada informe se ve muy similar, algunas diferencias de requisitos entre los informes, alguna lógica diferente, pero en general, no hay muchas diferencias.
El desarrollador que obtiene esta tarea crea la primera (digamos que toma 3 días), después de algunos cambios o correcciones de errores menores debido al control de calidad y la inspección del cliente está terminada, parece funcionar bien. Luego comenzó a crear el siguiente informe copiando y modificando todo, luego el siguiente, y para cada nuevo informe necesita ~ 1 día en promedio. Muy predecible, a primera vista ...
Ahora, después de que los 100 informes estén "listos", el programa pasa a producción real y ocurren algunos problemas que se pasaron por alto durante el control de calidad. Tal vez haya problemas de rendimiento, tal vez los informes se bloqueen de forma regular, tal vez otras cosas no funcionen según lo previsto. Ahora, cuando se aplicó el principio DRY, el 90% de esos problemas podrían resolverse cambiando la base del código en un solo lugar. Pero debido al enfoque de copiar y pegar, el problema debe resolverse 100 veces en lugar de una vez. Y debido a los cambios ya aplicados de un informe a otro, el desarrollador no puede copiar y pegar rápidamente la corrección para el primer informe en el otro 99. Tiene que buscar en los 100 informes, leerlos, traducir el cambio al modificado informe, pruébelo y quizás depure cada uno individualmente. Para la tarde, esto comienza a ponerse realmente difícil: por supuesto, puede tomarse el tiempo para una corrección de errores "regular" (digamos, 3 horas) y multiplicar esto por 100, pero en realidad, esta es probablemente una estimación incorrecta, algunas de las soluciones podrían ser más fácil de hacer que otros, otros podrían ser más difíciles. E incluso si esta estimación es correcta, hacer que la depuración cueste 100 veces más de lo necesario, le costará mucho dinero a la empresa.
Lo mismo sucederá la próxima vez cuando el cliente solicite cambiar el color del emblema de su empresa en todos esos informes, para hacer que el tamaño de página sea configurable o por algún otro requisito nuevo que afecte a todos los informes de manera similar. Entonces, si eso sucede, puede hacer una estimación de los costos y facturar al cliente 100 veces el precio que tendría que pagar cuando el código hubiera estado SECO. Sin embargo, intente esto varias veces y luego el cliente cancelará el proyecto porque probablemente no estará dispuesto a pagar sus costos de evolución exorbitantes. Y quizás en ese momento alguien haga la pregunta de por qué sucedió esto y señale con el dedo a la persona que tomó la decisión de esta programación de copiar y pegar.
Mi punto es: cuando produce software para otros, siempre tiene al menos durante un corto período de tiempo la responsabilidad de hacer que funcione, corregir errores, adaptar el programa a los requisitos cambiantes, etc. Incluso en un proyecto de campo verde, estos las piezas pueden sumar rápidamente mucho más que el esfuerzo de desarrollo inicialmente planificado. Y especialmente cuando todo su código copiado está dentro de un producto, el período de responsabilidad es para todas las partes iguales, lo cual es bastante diferente de la situación en la que copió un código antiguo de un proyecto muerto que ya no es bajo mantenimiento activo.