El sistema de valores

Los desarrolladores de código limpio tienen un Sistema de valores. Consta de los cuatro valores que se describen a continuación:

  • Cambiabilidad
  • Corrección
  • Eficacia de la producción
  • Mejora continua

Índice

Cambiabilidad

Nos gustaría comenzar esta sección con una tesis aparentemente provocadora:

No hay mantenimiento de software.

El mantenimiento es un proceso proactivo. En los sistemas de producción, las piezas se sustituyen periódicamente antes de que se rompan. Se sustituyen porque la experiencia ha demostrado que la fiabilidad caería por debajo de un valor crítico si continuara el funcionamiento. Así, antes de que todo el sistema se detenga, las piezas críticas se sustituyen a tiempo. Todo automovilista sabe que debe cambiar el aceite con regularidad. No porque el aceite se haya gastado en ese momento, ni siquiera porque el aceite ya sea completamente ineficaz en ese momento. No, se cambia porque la experiencia del fabricante demuestra que el motor está protegido cambiando el aceite a tiempo y, por tanto, dura más.

Nada de esto existe con el software. El software es lo que es. Suele contener errores. Pero incluso estos errores son como son. No se puede hacer nada de forma proactiva para mejorar el estado del software.

Por supuesto, hay acciones proactivas cuando se opera el software. Por ejemplo, puede ser necesario comprobar periódicamente si los archivos de registro aún tienen suficiente espacio libre en el disco duro, si una base de datos está desbordada o si la memoria se está llenando. Pero el propio software no se puede mantener de forma proactiva. Cada cambio o ampliación se hace para eliminar un error o aplicar requisitos nuevos o modificados.

Para que los cambios sean posibles, el software debe tener una estructura interna que favorezca dichos cambios. Es lo que llamamos "capacidad de cambio". Los programas informáticos suelen utilizarse durante largos periodos de tiempo. Durante este tiempo, las condiciones marco cambian y es necesario añadir características. Lo ideal es que la implementación de una función cueste una cantidad fija que sea independiente del momento en que se realice la función.

En la práctica, sin embargo, el precio de una característica aumenta cuanto más tarde se realiza. Al principio, las funciones son baratas, pero al final ya no es posible añadirlas porque nadie puede verlas. El software se tira y se vuelve a desarrollar. Hasta llegar a este punto, los costes aumentan exponencialmente. Hay dos cosas comunes en el crecimiento exponencial: 1) Al principio, apenas se reconoce que los costes aumentan. Los aumentos son moderados. 2) Cuando te das cuenta de que los costes están aumentando, ya es demasiado tarde. De repente, el aumento avanza tan rápido que ya no es posible contrarrestarlo.

Cuanto más fácil sea adaptar el software a las condiciones cambiantes, mayor será su adaptabilidad. Pero la adaptabilidad no puede lograrse a posteriori. Hay que tenerla en cuenta desde el principio. El software debe diseñarse para ello.

He aquí un ejemplo: las clases deben tener exactamente una responsabilidad. Si una clase es responsable de más de una cosa, es más difícil seguirle la pista. Esto dificulta los cambios, ya que requieren una comprensión del código fuente que se va a modificar. Además, aumenta el acoplamiento entre las clases. De repente, todo está conectado con todo lo demás. Esto sólo puede evitarse si las unidades funcionales tienen responsabilidades claramente definidas y el acoplamiento se mantiene a la vista. Si en un sistema de software se han acumulado varias clases, cada una de las cuales es responsable de varias cosas, es difícil eliminar esta situación a posteriori. El acoplamiento es tan grande que resulta difícil separar las unidades funcionales individuales. Si hay que realizar nuevas funciones en esta espesura, se tarda mucho tiempo. Si no se empieza a tiempo a despejar la espesura, la situación empeora cada vez más. Llega un momento en que resulta casi imposible añadir nuevas funciones. El super-GAU del desarrollo de software.

Creemos que no tiene por qué ser así. Si se tiene en cuenta la capacidad de cambio desde el principio, el software puede seguir desarrollándose durante largos periodos de tiempo. Los costes por función pueden aumentar ligeramente con el tiempo. Pero en ningún caso exponencialmente.

Corrección

El software debe ser funcionalmente correcto. Un programa de contabilidad debe contabilizar los asientos correctamente, una hoja de cálculo debe calcular correctamente. Y también deben cumplirse los requisitos no funcionales. El programa debe utilizar recursos como memoria, tiempo de procesador, espacio en disco, etc. con moderación y los tiempos de respuesta deben estar dentro de un rango definido. Sólo cuando se cumplen todos los requisitos el software creado es correcto.

Nadie negará que la corrección es necesaria. Pero la cuestión es qué se hace realmente para conseguirlo. En nuestra opinión, no basta con pasar el software por un departamento de pruebas una vez creado, cuyo trabajo es encontrar errores. Creemos que la corrección debe tenerse en cuenta ya durante el desarrollo. Incluso los desarrolladores tienen que ocuparse de la cuestión de la corrección. Y para que puedan hacerlo, tienen que tener claro cuáles son los requisitos. Con demasiada frecuencia no es así. Los desarrolladores reciben el encargo de implementar una función sin que se les explique con precisión cuáles son los criterios de aceptación de la misma. Pero no se trata de pasar la pelota y buscar culpables fuera de los departamentos de desarrollo. Al fin y al cabo, el trabajo de los desarrolladores es hacer preguntas cuando los requisitos no están claros, en lugar de mirar en su bola de cristal.

En comparación con la ingeniería automovilística, el desarrollo de software tiene un pobre historial en lo que respecta a la corrección. Un coche consta de muchas piezas, cuya corrección puede verificarse y comprobarse individualmente. Imagínese que tuviera que sentarse en el capó del coche con un aparato de medición en la mano para comprobar lo que ocurre en el motor. A 200 km/h por la autopista. ¿Le parece extraño? Un depurador se utiliza exactamente igual en muchos casos. Creemos que eso está mal.

Eficacia de la producción

Al final, por supuesto, también influyen el tiempo de desarrollo y el precio del software. Y este es mayor si el software no se produce de forma eficiente. Esto empieza con pasos de trabajo manuales que no están automatizados y termina con altas tasas de error que requieren repetidos repasos. En última instancia, la eficiencia de la producción significa que el software puede seguir desarrollándose durante años o incluso décadas en lugar de tener que empezar de nuevo en algún momento. Al mismo tiempo, una alta eficiencia de producción reduce la susceptibilidad a los errores.

La eficacia de la producción como valor también es importante para mantener los demás valores en proporción. Si se hacen esfuerzos interminables para garantizar la corrección, se acabará haciendo algo mal.

Mejora continua

No es posible seguir avanzando sin mirar atrás. Sólo quien reflexiona sobre cómo ha resuelto una tarea puede determinar si el camino elegido era fácil o difícil. El aprendizaje se basa en la reflexión.

En una ciencia joven como la informática, es importante tener constantemente en cuenta los nuevos descubrimientos. Para ello es necesario reflexionar a todos los niveles. Empezando por la reflexión sobre la aplicación durante la programación por parejas o la revisión del código, la reflexión diaria del equipo, la reflexión después de cada iteración, hasta la reflexión de todo el sector sobre sus acciones. No hay desarrollo sin reflexión.

Principios y prácticas

El sistema de valores guía a los desarrolladores de Clean Code en su trabajo diario. No contiene soluciones a los problemas, sino que define las condiciones marco para resolverlos. Sin embargo, los cuatro valores son demasiado abstractos para su aplicación concreta en el día a día. Por ello, hemos recopilado bloques de construcción que promueven al menos uno de los valores. Dividimos estos bloques de construcción concretos en dos categorías: Principios y Prácticas.

Principios

Los Principios del Desarrollador de Código Limpio son los principios fundamentales para estructurar el software. Son ortogonales a otras condiciones marco o superiores a ellas. El código debe ajustarse siempre a un número máximo de principios. Por supuesto, no tienen "el poder" de las leyes de la naturaleza, que nadie puede contradecir. Pero están al mismo nivel que ellas en cuanto a su carácter fundamental para el desarrollo de software. Cuando no se respeta un principio, no necesariamente se produce un efecto negativo inmediato, pero a corto y medio plazo, las violaciones no dejan de ser dolorosas. Esto se manifiesta en el esfuerzo necesario para comprender el código o en el elevado coste de introducir cambios. Es definitivo cuando el software ya no puede evolucionar. Siempre se puede saber por el código si se ha respetado un principio.

Prácticas

Las prácticas son técnicas y métodos que se utilizan constantemente. Describen lo que los desarrolladores de código limpio hacen en la práctica. Lema de las prácticas: "Hazlo siempre así. Cada día, cada vez". Son instrucciones tangibles que a veces requieren el uso de herramientas. No siempre se puede saber por el código si se sigue una práctica.

es_ESEspañol