así que algunos desarrolladores / gerentes ven el valor de escribir menos código para hacer las cosas y así tener menos código para mantener
Se trata de perder de vista el objetivo real.
Lo que importa es reducir las horas dedicadas al desarrollo . Eso se mide en tiempo (o esfuerzo equivalente), no en líneas de código.
Esto es como decir que los fabricantes de automóviles deberían construir sus automóviles con menos tornillos, porque lleva una cantidad de tiempo distinta de cero colocar cada tornillo. o no tiene Por encima de todo lo demás, un automóvil debe ser eficiente, seguro y fácil de mantener.
El resto de la respuesta son ejemplos de cómo un código limpio puede generar ganancias de tiempo.
Inicio sesión
Tome una aplicación (A) que no tiene registro. Ahora cree la aplicación B, que es la misma aplicación A pero con registro. B siempre tendrá más líneas de código y, por lo tanto, debe escribir más código.
Pero mucho tiempo se dedicará a investigar problemas y errores, y descubrir qué salió mal.
Para la aplicación A, los desarrolladores se quedarán atrapados leyendo el código y teniendo que reproducir continuamente el problema y recorrer el código para encontrar la fuente del problema. Esto significa que el desarrollador tiene que probar desde el principio de la ejecución hasta el final, en cada capa usada, y necesita observar cada pieza lógica utilizada.
Tal vez tenga suerte de encontrarlo de inmediato, pero tal vez la respuesta estará en el último lugar en el que piense en buscar.
Para la aplicación B, suponiendo un registro perfecto, un desarrollador observa los registros, puede identificar inmediatamente el componente defectuoso y ahora sabe dónde buscar.
Esto puede ser cuestión de minutos, horas o días guardados; dependiendo del tamaño y la complejidad de la base de código.
Regresiones
Tome la aplicación A, que no es SECA en absoluto.
Tome la aplicación B, que es SECA, pero terminó necesitando más líneas debido a las abstracciones adicionales.
Se presenta una solicitud de cambio, que requiere un cambio en la lógica.
Para la aplicación B, el desarrollador cambia la lógica (única, compartida) de acuerdo con la solicitud de cambio.
Para la aplicación A, el desarrollador tiene que cambiar todas las instancias de esta lógica donde recuerda que se está utilizando.
- Si logra recordar todas las instancias, deberá implementar el mismo cambio varias veces.
- Si no logra recordar todas las instancias, ahora está lidiando con una base de código inconsistente que se contradice. Si el desarrollador olvidó un fragmento de código poco utilizado, este error puede no ser evidente para los usuarios finales hasta bien avanzado el futuro. En ese momento, ¿los usuarios finales van a identificar cuál es la fuente del problema? Incluso si es así, el desarrollador puede no recordar qué implica el cambio y tendrá que descubrir cómo cambiar esta lógica olvidada. Tal vez el desarrollador ni siquiera trabaja en la compañía para entonces, y luego alguien más tiene que resolverlo todo desde cero.
Esto puede conducir a una enorme pérdida de tiempo. No solo en desarrollo, sino también en la caza y búsqueda del error. La aplicación puede comenzar a comportarse de manera errática de una manera que los desarrolladores no pueden comprender fácilmente. Y eso conducirá a largas sesiones de depuración.
Intercambiabilidad del desarrollador
El desarrollador A creó la aplicación A. El código no es limpio ni legible, pero funciona de maravilla y se ha estado ejecutando en producción. Como era de esperar, tampoco hay documentación.
El desarrollador A está ausente durante un mes debido a vacaciones. Se presenta una solicitud de cambio de emergencia. No puede esperar otras tres semanas para que Dev A regrese.
El desarrollador B tiene que ejecutar este cambio. Ahora necesita leer toda la base de código, comprender cómo funciona todo, por qué funciona y qué intenta lograr. Esto lleva años, pero digamos que puede hacerlo dentro de tres semanas.
Al mismo tiempo, la aplicación B (que creó el desarrollador B) tiene una emergencia. Dev B está ocupado, pero Dev C está disponible, aunque no conoce la base de código. qué hacemos?
- Si mantenemos a B trabajando en A y ponemos a C a trabajar en B, entonces tenemos dos desarrolladores que no saben lo que están haciendo, y el trabajo se realiza de manera subóptima.
- Si alejamos a B de A y hacemos que B haga B, y ahora ponemos C en A, entonces todo el trabajo del desarrollador B (o una parte significativa de él) puede terminar siendo descartado. Esto es potencialmente días / semanas de esfuerzo desperdiciado.
Dev A regresa de sus vacaciones y ve que B no entendió el código y, por lo tanto, lo implementó mal. No es culpa de B, porque usó todos los recursos disponibles, el código fuente simplemente no era legible adecuadamente. ¿A ahora tiene que pasar tiempo arreglando la legibilidad del código?
Todos estos problemas, y muchos más, terminan perdiendo el tiempo . Sí, a corto plazo, el código limpio requiere más esfuerzo ahora , pero terminará pagando dividendos en el futuro cuando se deban abordar errores / cambios inevitables.
La gerencia necesita comprender que una tarea corta ahora le ahorrará varias tareas largas en el futuro. No planificar es planificar el fracaso.
Si es así, ¿cuáles son algunos argumentos que puedo usar para justificar el hecho de que se han escrito más LOC?
Mi explicación general es preguntarle a la gerencia qué preferirían: una aplicación con una base de código 100KLOC que se pueda desarrollar en tres meses, o una base de código 50KLOC que se pueda desarrollar en seis meses.
Obviamente elegirán el tiempo de desarrollo más corto, porque la administración no se preocupa por KLOC . Los gerentes que se enfocan en KLOC están microgestionando mientras no están informados sobre lo que están tratando de manejar.