Me pregunto si alguien ha realizado algunos experimentos correlacionando métricas de código (SLOC, Complejidad Ciclomática, etc.) con densidad de errores en aplicaciones orientadas a objetos.
No estoy buscando experimentos que solo prueben o refuten una correlación, sino en ambos. No estoy tratando de encontrar una bala de plata, ya que creo que la densidad de errores de un proyecto podría correlacionarse con una o más métricas para un proyecto o equipo determinado y la correlación puede cambiar durante la vida útil del proyecto / equipo.
Mi objetivo es
- Mida todas las métricas interesantes durante 2-3 meses (ya tenemos bastantes de sonar).
- Encuentre una métrica que se correlacione con la cantidad de nuevos errores.
- Haga un análisis de causa raíz para verificar por qué sucede esto (por ejemplo, ¿nos falta una cierta habilidad de diseño?).
- Mejore la habilidad y mida el cambio para un par de iteraciones.
- Enjuague y repita desde 2.
Si no tiene experiencia en esto, pero recuerde haber visto un artículo / blog sobre este tema, le agradecería si pudiera compartirlo.
Hasta ahora he encontrado los siguientes enlaces con información sobre este tema.
- ¿Los errores residen en el código complejo? - solo las diapositivas de una presentación.
- Cambios y errores: minería y predicción de actividades de desarrollo : solo diapositivas de una presentación. En pocas palabras, cuantas más dependencias, mayores serán las posibilidades de errores (creo que esta es una regla bastante general).
- Fracaso es una palabra de cuatro letras : una parálisis sobre la correlación entre errores y métricas.
fuente
Respuestas:
Cada vez que escucho sobre intentos de asociar algún tipo de métrica basada en código con defectos de software, lo primero que pienso es en la complejidad ciclomática de McCabe . Varios estudios han encontrado que existe una correlación entre una alta complejidad ciclomática y el número de defectos. Sin embargo, otros estudios que analizaron módulos con un tamaño similar (en términos de líneas de código) encontraron que podría no haber una correlación.
Para mí, tanto el número de líneas en un módulo como la complejidad ciclomática pueden servir como buenos indicadores de posibles defectos, o tal vez una mayor probabilidad de que se inyecten defectos si se realizan modificaciones en un módulo. Un módulo (especialmente a nivel de clase o método) con alta complejidad ciclomática es más difícil de entender ya que hay una gran cantidad de rutas independientes a través del código. Un módulo (de nuevo, especialmente a nivel de clase o método) con una gran cantidad de líneas también es difícil de entender ya que el aumento de líneas significa que están sucediendo más cosas. Hay muchas herramientas de análisis estático que admiten el cálculo tanto de las líneas de código fuente con reglas específicas como de la complejidad ciclomática, parece que capturarlas estaría tomando la fruta que cuelga.
Las medidas de complejidad de Halstead también pueden ser interesantes. Desafortunadamente, su validez parece ser algo debatida, por lo que no necesariamente confiaría en ellos. Una de las medidas de Halstead es una estimación de defectos basada en el esfuerzo o el volumen (una relación entre la longitud del programa en términos de operadores totales y operandos y el vocabulario del programa en términos de operadores y operadores distintos).
También hay un grupo de métricas conocidas como CK Metrics. La primera definición de este conjunto de métricas parece estar en un artículo titulado Un conjunto de métricas para el diseño orientado a objetos por Chidamber y Kemerer. Definen métodos ponderados por clase, profundidad del árbol de herencia, número de hijos, acoplamiento entre clases de objetos, respuesta para una clase y falta de cohesión en los métodos. Su documento proporciona los métodos computacionales, así como una descripción de cómo analizar cada uno.
En términos de literatura académica que analice estas métricas, es posible que le interese el análisis empírico de métricas CK para la complejidad del diseño orientado a objetos: implicaciones para defectos de software, escrito por Ramanath Subramanyam y MS Krishna. Analizaron tres de las seis métricas CK (métodos ponderados por clase, acoplamiento entre objetos clasificados y árbol de profundidad de herencia). Echando un vistazo al artículo, parece que descubrieron que estas son métricas potencialmente válidas, pero deben interpretarse con precaución como "mejorar" uno podría conducir a otros cambios que también conducen a una mayor probabilidad de defectos.
El análisis empírico de las métricas de diseño orientado a objetos para predecir fallas de gravedad alta y baja, escrito por Yuming Zhou y Hareton Leung, también examina las métricas de CK. Su enfoque fue determinar si pueden predecir defectos basados en estas métricas. Descubrieron que muchas de las métricas de CK, a excepción de la profundidad del árbol de herencia y el número de hijos) tenían cierto nivel de significación estadística en la predicción de áreas donde se podrían localizar defectos.
Si tiene una membresía de IEEE, recomendaría buscar en las Transacciones de IEEE sobre Ingeniería de Software más publicaciones académicas y IEEE Software para obtener algunos informes más reales y aplicados. El ACM también podría tener publicaciones relevantes en su biblioteca digital .
fuente
He discutido posibles correlaciones en una de mis publicaciones de blog :
fuente
En el libro Code Complete, p.457, Steve McConnell dice que "la complejidad del flujo de control es importante porque se ha correlacionado con baja confiabilidad y errores frecuentes". Luego menciona algunas referencias que respaldan esa correlación, incluido el propio McCabe (a quien se le atribuye haber desarrollado la métrica de complejidad ciclomática). La mayoría de estos son anteriores al uso generalizado de lenguajes orientados a objetos, pero como esta métrica se aplica a los métodos dentro de esos lenguajes, las referencias pueden ser lo que está buscando.
Esas referencias son:
Desde mi propia experiencia, la métrica de McCabe, como puede ser calculada por un programa en muchas secciones de código, es útil para encontrar métodos y funciones que son demasiado complicadas y que tienen una alta probabilidad de contener errores. Aunque no he calculado, la distribución de errores dentro de funciones de alta complejidad ciclomática versus funciones de baja complejidad ciclomática, investigar esas funciones me ha permitido descubrir errores de programación pasados por alto.
fuente