La calidad de software engloba muchos y diferentes aspectos sobre el desarrollo de aplicaciones, que pasan desde el estudio de la arquitectura, hasta utilización de diferentes herramientas, la aplicación de diferentes técnicas y metodologías de trabajo. Creo que todavía hoy en día, existe mucha gente reticente a apostar por la calidad de código, debido a que piensan que el coste que tiene es mayor que su beneficio.
Cuando empecé a trabajar en equipo, surgieron una serie de problemas de difícil solución, en seguida me di cuenta de que los programadores escribimos código de forma muy diferente que realiza las mismas cosas, generalmente algunos, los más experimentados solían escribir un código mas legible, mejor documentado, necesitaban menos líneas para llegar a la misma solución, ya que sus conocimientos eran mayores, esto originaba muchos problemas cuando tenias que modificar o entender el código de los demás y es aquí cuando empecé a interesarme por las reglas de estilo, fxcop y otras herramientas que de alguna forma nos permitían establecer reglas para que todos los integrantes de un equipo pudiéramos “entendernos”. Cuando oí hablar de calidad de software me asuste bastante, lo relacionaba directamente con calidad = burocracia, “creo que fue debido a mi trabajo con la norma ISO 9001”, en seguida me di cuenta de que era mucho menos costoso detectar y corregir un error en una fase temprana que hacerlo posteriormente.
Para poder llegar a entender el trabajo de los otros programadores se hizo necesario establecer ciertas reglas que fueron utilizadas por todo el equipo de desarrollo, desde reglas de estilo, documentación, desarrollo de pruebas unitarias, aplicación de patrones de diseño, reglas de base de datos y un largo etc. de normas. Esto empezó a facilitarnos la compresión y la modificación de programas por otros miembros del equipo. Muchas de estas técnicas aplicadas en conjunto comenzaron en poco tiempo a darnos una visión muy diferente del proyecto, nos aporto más claridad y conocimiento del trabajo de los demás y nos ayudo a detectar una gran parte de errores en una fase temprana del desarrollo.
Algunos de los beneficios más importantes de la utilización de estas técnicas son las siguientes:
- La aplicación de patrones de diseño suponen la solución más adecuada para resolver un problema determinado. Esta ha sido elaborada en base al entendimiento y posibles soluciones del problema.
- La adopción de herramientas como fxcop, stylecop, resharper, coderush, refactor y otras, permiten minimizar algunos errores en la fase de desarrollo además de obligar a cumplir ciertas reglas de calidad y estilo que de no utilizar provocan si el desarrollador no es un experto a cometer errores de difícil detección como fugas de memoria, aprovechamiento óptimo de los recursos, localización de código no utilizado, y un largo etc. Por otra parte si todo el equipo utiliza estas herramientas nos habituamos a escribir código de una manera similar, con lo que nos será más fácil comprender el trabajo de los demás. De la información de los errores que nos proporcionan estas herramientas aprendemos a programar mejor, a liberar recursos y utilizarlos adecuadamente, con lo que nuestro conocimiento aumenta. Algunas de estas herramientas cuentan con utilidades para ayudarnos a escribir el código y refactorizar de una forma mucho más rápida.
- El uso de profiles nos permite detectar cuellos de botella y otros problemas que de otra forma serian prácticamente imposible de conocer.
- La utilización de pruebas unitarias y otras técnicas de testeo, nos permiten detectar errores en una fase temprana, si no detectamos estos a tiempo a veces puede implicar que tengamos que modificar más de un módulo relacionado con este, con lo que el coste se incrementa aún más. Como dice la frase, “más vale prevenir que curar”.
La ventaja de tener pruebas unitarias de un módulo que no hemos desarrollado nosotros nos permite entender mejor el comportamiento del programa.
La aplicación es más fácil de modificar ya que si alguien altera el programa, por ejemplo cambiando el nombre de un campo de un procedimiento almacenado o alterando alguna función como el cálculo de totales de una factura, detectaríamos el error mucho antes de ponerlo en producción y evitando mayores consecuencias.
- La calidad de código disminuye la dependencia del equipo de desarrollo: Si el día mañana alguno de los desarrolladores no está o la empresa de desarrollo cierra, será mucho más fácil encontrar a alguien que entienda el código que cumple unas determinadas reglas. Si otra persona o una empresa externa cumple nuestros requisitos de calidad esto permite que pueda comprender y extender la aplicación más fácilmente.
La calidad de código no es opcional, de no aplicarla el coste de nuestros proyectos con seguridad será mayor.
Pero no todo es de color de rosa, utilizar estas herramientas es complejo y difícil, por ejemplo, realizar pruebas unitarias además de ser costoso requiere mucha disciplina y un alto nivel, no solamente debemos preocuparnos de tener una cobertura de nuestro código, si no que debemos intentar probar todos los extremos, valores nulos y otros factores que de no realizarse bien disminuyen los beneficios de estas. De igual forma aprender a utilizar profiles y otras herramientas conllevan mucho tiempo en formación y desde luego tiene su coste.
No quiero decir que debamos hacer pruebas unitarias y cumplir con el 85 % de cobertura en todo nuestro proyecto o cumplir a raja tabla todas las reglas que propone fxcop, resharper, coderush, utilizar reglas de estilo, realizar pruebas de carga, utilizar mock objects para crear independencia con nuestro entorno de datos, utilizar profiles para analizar hasta la más mínima señal de que algo va mal, etc, Esto sería lo ideal, pero si nos habituamos a utilizarlas e invertimos un poco de tiempo en aprender a sacarles partido, os puedo asegurar que la mayoría de ellas se harán indispensables en vuestro trabajo.
Recuerdo que la primera vez que pusimos en marcha fxcopy en uno de los proyectos aparecieron miles de errores, os aseguro que fue un autentico coñazo eliminarlos, ya que lo aplicamos en una fase media del desarrollo, nos costó bastante tiempo poner la aplicación en orden, pero aprendimos un motón de cosas sobre programación, algunas que nunca hubiéramos conocido si no llega a ser por este tipo de herramientas. Ahora no podemos vivir sin él y cuando vemos una aplicación que no lo utiliza en seguida nos damos cuenta de los errores que se cometen.
No debemos obsesionarnos con la calidad, nunca seremos capaces de desarrollar el sistema perfecto, los cambios casi diarios en la tecnología hacen que esto sea prácticamente imposible, cada vez aparecen más técnicas y actualizaciones que hacen que obsesionarse por la calidad al igual que con la seguridad solo nos llevara a caer en un abismo sin fin.
Las ventajas que nos ofrecen todas estas técnicas en conjunto nos facilitan la detección precoz de errores y nos permiten anticiparnos y corregirlos antes de poner el sistema en producción evitando tener que rehacer gran parte de las aplicaciones.
Estas técnicas y utilidades nacen con el objetivo de permitirnos mejorar en nuestros desarrollos, no quiere decir que nuestra aplicación vaya a estar libre de errores. Pero si que será mejor, que aprovechara mejor los recursos y por supuesto, que tendrá menos errores. Nos ofrecen mayor seguridad a la hora de tener que modificar un determinado programa y permiten trabajar con ciertas reglas de trabajo en equipo que de otra forma serian muy difícil de establecer y controlar. Algunas nos facilitan la escritura de código y la detección visual de errores en tiempo de escritura, ahorrando mucho tiempo a la hora de depurar la aplicación.
El esfuerzo que debemos realizar para trabajar con calidad de código es muy grande, pero marcara la diferencia y en poco tiempo nos permitirá recuperar la inversión con creces, así que animaros, el esfuerzo merecerá la pena.