Lo que hay detrás de las pruebas unitarias
Leo en el blog de David Salgado una entrada acerca de pruebas unitarias que no tiene desperdicio, y leo aún con más interés si cabe los comentarios que dejan los lectores de su blog y de los que siempre se aprende algo.
Tentado me he visto desde el principio para escribir un comentario en su blog, de hecho, después de escribirlo y apunto de darle al botón de publicar he pensado que qué mejor sitio que mi propio blog para comentar algo con lo que me he "pegado" no una, sino mil veces, y que dada la extensión que puede tomar el tema, mejor abrir un nuevo hilo.
Paulovila hace unos comentarios acerca de si las pruebas unitarias no tienen sentido sino hay dinero para hacerlas, y no puedo estar más de acuerdo... con matices, matices que van a favor del comentario pero que ahora trataré de expresar de la mejor forma posible (espero que se me entienda perfectamente).
A niveles de coste, un proyecto debe ser iniciado solo si el coste del proyecto va a devolver un beneficio mayor que el propio coste, y siempre si ese beneficio está dentro de unos ratios marcados. El ROI o retorno de inversión es la mejor explicación para entender esto.
Para explicarlo de una forma más práctica, un proyecto debe ser iniciado si vamos a recuperar lo que hemos invertido y si tenemos claro que nos va a revertir un beneficio adicional al propio gasto, es decir, que no vamos a vender únicamente para cubrir los gastos porque entonces habremos perdido realmente tiempo con respecto a nuestra competencia y nuestra empresa no habrá crecido. Es lo que en castellano se diría la frase de comidos por servidos.
Dicho esto que es obvio, el problema fundamental de las empresas reside en lo que esas empresas contabilizan como gastos y partidas presupuestarias.
Evidentemente, y tampoco querría extenderme con muchísimo detalle, existen gastos directos y gastos indirectos. Los directos son muy claros y evidentes, mientras que los indirectos son más estimativos que los directos. Y no entro en valorar lo que se entiende por estimaciones porque daría para otra entrada mucho más larga que esta.
El caso es que muchas personas y empresas olvidan detallar gastos como por ejemplo la tinta y el papel de impresora, los bolígrafos, las libretas, los rotuladores para las pizarras, los cafés o incluso la luz por citar algunos pequeños ejemplos. Por eso muchas empresas deciden poner una partida presupuestaria de gastos generales.
Otro gasto son los sueldos del personal que va a trabajar en el proyecto, y ahí se prorratea siempre, ya que a lo mejor es necesario disponer de un Arquitecto de Software, pero ese Arquitecto estará en el proyecto durante un 7% del proyecto, por lo que los gastos a imputar se prorratean, y así hasta un largo etcétera que tampoco es cuestión de comentar ahora.
Tampoco trataríamos los gastos derivados de las licencias de Software y partida a través de su amortización. Y así podría seguir nombrando aspectos que muchas veces pasan desapercibidos... por lo menos en primera instancia.
Sin embargo, aún no he nombrado la base principal de esta entrada, de uno de esos "gastos", me refiero como no al gasto de las pruebas unitarias.
Aquí es donde quiero detenerme con más precisión para comentar algunas cosas que considero importantes y que cuando hablo con algunas personas veo que no quedan del todo claras.
Muchas empresas ven las pruebas unitarias como gasto que tendrían que salir de sus presupuestos. Algo que a todas luces es más que evidente.
El problema es que muchas empresas ven en ese gasto una pérdida y no una inversión. Ahí es donde se comienza a liar el asunto y donde debemos abrir bien los ojos.
Aquí podríamos definir que el gasto inicial de las pruebas unitarias y siempre y cuando las pruebas unitarias estén bien hechas (que no haya que repetirlas más de una vez porque están mal enfocadas o diseñadas), tendrá un retorno de inversión en modo de menos errores (nadie asegura que las pruebas unitarias resuelvan todos los males), mejor aspecto funcional, mejor experiencia y mayor satisfacción por parte del usuario, más seguridad y más convencimiento de que el Software hace lo que tiene que hacer, y por lo tanto, mayores posibilidades de que nuestro Software sea vendido a más usuarios o empresas que estarían satisfechos con la inversión (a modo de licencia) que han realizado por nuestro Software.
Evidentemente, cuanto mayor cualificado esté el equipo de desarrollo en
hacer esas pruebas unitarias, menor será el coste asociado a la
elaboración de esas pruebas unitarias, sin embargo, siempre habrá un
coste fijo asociado a la creación del propio conjunto de pruebas unitarias, y a medida que el proyecto avance, se irán cumplimentando y creando más pruebas unitarias. Porque otra cosa que no quiero tampoco discutir ahora, es que las pruebas unitarias deben hacerse al mismo tiempo que el desarrollo, porque sino luego, el coste para hacerlas es excesivamente elevado (no me acuerdo bien como estaba hecho, se me olvidan pasar pruebas que antes tenía claras, etc).
En todo esto siempre surge la misma pregunta: "¿para qué hacer pruebas unitarias?. Yo lo que quiero es tener mi Software ya hecho.".
A veces el tiempo apremia y muchas empresas están dispuestas a sacrificar parte de ese tiempo tan escaso a partes del desarrollo, y una de esas partes son las pruebas unitarias.
¿Con qué choca todo esto?. Con una sola cosa, la mentalidad de que las pruebas unitarias no revierten ningún beneficio ni afecta al ROI en nada más que los costes, cuando esto no es así.
Otra cosa es hacérselo ver a quienes tienen que tomar las decisiones, que ese es otro cantar.
En muy muy pocas empresas en las que he trabajado directa o indirectamente (y son unas cuantas), he podido ver a personas con las ideas claras sobre las pruebas unitarias. En un gran número de casos por no decir casi todos, las pruebas unitarias se entienden como gastos y sólo eso, gastos.
Siempre hago la misma pregunta. ¿Te comprarías un coche que nunca nadie lo ha probado?. Alguien diría, si no se ha probado yo no lo compraría,... pues bien, ese es el principio del ROI en cuanto a pruebas unitarias formuladas como gastos que retornan una inversión indirecta, porque si nadie ha probado nuestro Software... ¿con qué cara se lo instalamos a un cliente o lo vendemos?.
Indudablemente en esto hay una trampa manifiesta, y es que nadie nunca admite cual es la cantidad o calidad de esas pruebas unitarias y la cobertura de las mismas en su Software, y ya no hablemos de otros temas aparte de este hilo y que tienen que ver con las pruebas funcionales, etc.
Quizás en un futuro próximo se obligue al Software a llevar un sellito de "Probado", o como dicen algunas marcas "Testado", pero lo que está claro es que eso hoy por hoy no existe, y mucho menos mientras pensemos que las pruebas unitarias son evitables, que no ahorran tiempo y dinero en cuanto a mantenimiento del Software, que no aportan calidad al Software final o que son chorradas.
Lo único cierto es que nuestra cultura (al menos hablo de España) no está preparada para realizar pruebas unitarias al Software, y cambiar esa mentalidad cuesta más de una úlcera de estómago.
Finalmente y por asociarlo con las pruebas unitarias, nunca olvidaré una de las clases que recibí en la Universidad en la asignatura de marketing. Allí nos comentaban que es
difícil hacer un cliente, pero mantenerlo es más difícil, y perderlo
está chupado. Ahora bien un cliente perdido es casi imposible volverlo a
recuperar. ¿Alguien no se ha comprado "algo", le ha salido mal y no ha
querido volver a comprar esa misma marca nunca más y cada vez que le
pregunta alguien le cuenta su experiencia o dice... "esa marca ni de
coña"?.
Lo único cierto es que esto último que he puesto lo he podido constatar cada día, y aquí simplemente digo: que cada uno en su empresa haga lo que quiera, pero muchas veces no es lo que uno quiere sino lo que a uno le dejan hacer, y ahí es donde muchos desarrolladores nos mordemos las uñas hasta dejarnos los dedos casi pelados.
Yo lo tengo claro, las pruebas unitarias no son una elección y aportan calidad, pero ¿cómo cambiar el hábito y esta mentabilidad al menos a las empresas en España?. Si alguien tiene la fórmula de la coca-cola que la cuente por favor...