Introducción
Desde hace tiempo me produce bastante curiosidad el hecho de que puedan existir sistemas o algoritmos que nos puedan ayudar a “predecir” la existencia de bugs en nuestro software. Así leído puede parecer idílico e incluso algo difícil de creer dado que de base ya podemos pensar que hay muchos factores que pueden afectar a la inserción de un bug en nuestro código.
Para la predicción de bugs necesitaríamos una cantidad de datos importantes respecto al código, cambios realizados en la release, histórico de bugs. Y con todo ese caldo de datos…pum… magia?
Para que veáis que no solo puede afectar la parte técnica como curiosidad os dejo este enlace a un post que sobre todo es curioso.
Así que me he puesto a investigar un poco y ver la realidad y sobre todo los beneficios que nos puede aportar.
Algoritmo de predicción de bugs – FixCache
Existen varios algoritmos en lo que a la predicción de bugs respecta pero en este artículo me gustaría centrarme en el algoritmo FixCache y realizar una comparativa en artículos posteriores.
Actualmente existen dos tipos de estrategias para la predicción de bugs:
- Basados en las métricas de calidad como lineas de código (LOC) y la complejidad ciclomática.
- Basados en el control de cambios e histórico del repositorio.
FixCache entraría en el segundo grupo, dado que se sirve del repositorio de código para analizar los cambios y así predecir los posibles bugs.
En la imagen 1 vemos un ejemplo de la tasa de éxito del algoritmo FixCache sobre cuatro aplicaciones diferentes.
El algoritmo trabaja observando los cambios realizados en los ficheros o los métodos y utiliza tres heurísticas para añadir los ficheros a la “caché”:
- Nuevos ficheros de código o modificados los cuales pueden contener bugs.
- Ficheros que actualmente contienen bugs son propensos a contener más bugs (Aquí entra la teoría del “defect clustering”)
- Ficheros que han sido modificados para solucionar algún bug son propensos a contener otros bugs.
Como hemos indicado para crear la “caché” de datos se sirve del repositorio de software, donde identificará los cambios realizados en los ficheros mediante los commits al proyecto comparándolo con su propia base de datos o caché.
La gestión del caché es importante, normalmente cacheando un 10% de los ficheros del repositorio al finalizar el periodo de análisis. Es importante determinar si la caché está completa para remover los ficheros que no vayan a formar parte de posteriores análisis, para ello se pueden implementar varias políticas de reemplazo (parecido a las de la gestión de memoria caché de nuestro sistema):
- El fichero menos utilizado recientemente (LRU).
- El fichero que menos cambios ha tenido .
- El fichero que menos bugs ha tenido históricamente.
- El fichero que menos autores de cambios tenga.
Sería interesante ver que política de reemplazo da mejores resultados, lo cierto es que la más utilizada es LRU, me imagino que por su baja complejidad de gestión respecto a los demás.
Practicidad del sistema de predicción de bugs
Ya hemos visto un ejemplo de algoritmo que se basa en los cambios en los ficheros del repositorio pero, ¿Que utilidad podemos darle al uso de un algoritmo de predicción de bugs?
En un sistema de CI (continuous integration) donde se aplique la metodología ágil, donde se realizan cambios a diario en el código y donde la intención es realizar despliegues a producción continuamente puede ser una muy buena opción para ayudar al equipo de QA en sus pruebas. Pongamos varios ejemplos:
- Lanzar pruebas de regresión automáticas de aquellas funcionalidades o aquellos ficheros que el algoritmo detecte con riesgo de bugs en cada RC (release candidate).
- Crear un “semaforo” que identifique las zonas de riesgo de la RC y así focalizar las pruebas o reforzarlas para prevenir bugs.
- Mantener un histórico de ficheros conflictivos que puede ser utilizado a modo informativo por QA, desarrolladores etc.
Conclusiones
Depende de nuestro sistema de CI y la finalidad puede que nos sea más o menos viable implantar un sistema de predicción de bugs, lo cierto es que no muchas empresas disponen de ello (que se sepa) y puede ser interesante únicamente en los casos que se realicen cambios en nuestro código continuamente.
Bibliografía
- https://users.soe.ucsc.edu/~ejw/dissertations/AdaptiveBugPrediction_SungKim_Thesis.pdf
- http://static.googleusercontent.com/media/research.google.com/es//pubs/archive/41145.pdf
- http://www.mysmu.edu/faculty/davidlo/papers/csmr13-reopened.pdf
- https://users.soe.ucsc.edu/~supertri/docs/msr2011-final.pdf
- http://www.softwaretestingclub.com/profiles/blogs/defect-clustering-pesticide-paradox
- http://www.malavida.com/es/noticias/control-biometrico-para-predecir-errores-de-codigo-en-programacion-006101