Métricas objetivas para la calidad del software [cerrado]

12

Existen diversos tipos de calidad que se pueden medir en productos de software, por ejemplo, idoneidad para el propósito (por ejemplo, uso final), mantenibilidad, eficiencia. Algunos de estos son algo subjetivos o específicos del dominio (por ejemplo, los buenos principios de diseño de GUI pueden ser diferentes entre culturas o dependen del contexto de uso, piense en el uso militar versus el uso del consumidor).

Lo que me interesa es una forma más profunda de calidad relacionada con la red (o gráfico) de tipos y su interrelación, es decir, a qué tipos se refiere cada tipo, ¿hay grupos de interconectividad claramente identificables relacionados con un arquitectura escalonada, o por el contrario, hay una gran 'bola' de referencias de tipo (código 'monolítico'). Además, el tamaño de cada tipo y / o método (por ejemplo, medido en cantidad de código de bytes Java o .Net IL) debería dar alguna indicación de dónde se han implementado algoritmos complejos grandes como bloques de código monolíticos en lugar de descomponerse en más manejables / mantenibles trozos

Un análisis basado en tales ideas puede calcular métricas que son al menos un proxy de calidad. El umbral exacto / puntos de decisión entre alta y baja calidad sospecharía que es subjetivo, por ejemplo, ya que por mantenibilidad nos referimos a mantenibilidad por parte de programadores humanos y, por lo tanto, la descomposición funcional debe ser compatible con el funcionamiento de las mentes humanas. Como tal, me pregunto si alguna vez puede haber una definición matemáticamente pura de la calidad del software que trascienda todo el software posible en todos los escenarios posibles.

También me pregunto si es una idea peligrosa, que si los representantes objetivos de calidad se vuelven populares, las presiones comerciales harán que los desarrolladores busquen estas métricas a expensas de la calidad general (aquellos aspectos de la calidad no medidos por los representantes).

Otra forma de pensar sobre la calidad es desde el punto de vista de la entropía. La entropía es la tendencia de los sistemas a revertir de estados ordenados a desordenados. Cualquiera que haya trabajado en un mundo real, un proyecto de software de mediana a gran escala apreciará el grado en que la calidad de la base del código tiende a degradarse con el tiempo. Las presiones comerciales generalmente resultan en cambios que se centran en la nueva funcionalidad (excepto donde la calidad en sí misma es el principal punto de venta, por ejemplo, en el software de aviónica), y la erosión de la calidad a través de problemas de regresión y la funcionalidad de 'horquilla' donde no encaja bien Una perspectiva de calidad y mantenimiento. Entonces, ¿podemos medir la entropía del software? Y si es así, ¿cómo?

Redcalx
fuente
Estoy de acuerdo con S. Lott. En la vida a menudo hay una diferencia entre "cómo debería ser" y "cómo es". Ojalá quisiera que más personas en este planeta hubieran superado su enfoque de "buenas intenciones" y miraran con atención "cómo es". Además de los incentivos incorrectos, habrá una falsa sensación de seguridad peligrosa. Combina eso con las personas que intentan jugar con el sistema (lo cual es natural porque SIEMPRE intentan mejorar sus condiciones (ya sean monetarias u otras)), y obtienes una situación horrible. No debería sorprendernos que las caídas del mercado 'una vez en un milenio' ocurran una vez cada 2 décadas.
Trabajo

Respuestas:

20

Esta es una idea peligrosa. Los representantes "objetivos" de calidad conducen directamente a recompensas de gestión y los desarrolladores buscarán estas métricas a expensas de la calidad real.

Esta es la ley de las consecuencias no deseadas.

La calidad, aunque importante, es solo un pequeño aspecto del software. La funcionalidad y el valor creados por el software son mucho, mucho más importantes que la calidad.

Todas las métricas conducen a la actividad para optimizar la métrica. Eso, a su vez, tiene consecuencias que quizás no te gusten realmente.

El software es muy complejo. Es difícil entender lo verdaderamente complejo que es.

Incluso cosas tan "obvias" como la cobertura del código de prueba de unidad pueden perder el tiempo. Llegar al 100% puede requerir la creación de pruebas que en realidad son más complejas que el código trivial que se está probando. Llegar al 100% de cobertura puede implicar un costo inaceptable. [La alternativa para el código trivial, pequeño y poco utilizado es prueba por inspección. Pero eso no se ajusta al juego de métricas del 100%.]

Otro ejemplo es la Complejidad Ciclomática. Es una de las mejores medidas de calidad del código. Pero se puede jugar creando muchas funciones pequeñas que pueden ser más difíciles de leer (y más difíciles de mantener) que una función más grande. Termina en revisiones de código donde acepta que puede no ser muy legible pero cumple con el umbral de complejidad.

S.Lott
fuente
3
"Todas las métricas conducen a la actividad para optimizar la métrica". Creo que a menudo es cierto. Sin embargo, no debería ser así. Las métricas deberían, como aludí en mis últimos párrafos, guiar la gestión. Sin embargo, con demasiada frecuencia, las decisiones se toman exclusivamente porque y para los números, sin una comprensión del significado de los números y los riesgos y compensaciones asociados con la decisión.
Thomas Owens
3
"Sin embargo, no debería ser así". Explique de alguna manera en que se puede decir a las personas que no optimicen sus recompensas. Encuentre un solo ejemplo de comportamiento humano donde las recompensas culturales (basadas en todo tipo de estructuras sociales locas) no sean primarias, primordiales y lo más importante que la gente buscará. Cualquier cosa que implique "debería" o "no debería" debe ser comparada con lo que la gente realmente hace. Realmente optimizan sus recompensas. Si las métricas son parte de las recompensas, las personas optimizan las métricas. Por favor, no use "debería" para describir el comportamiento de las personas.
S.Lott
2
@Thomas Owens: "Simplemente no tiene recompensas para optimizar en función de las métricas". Eso es gracioso. ¿Cómo los mantendrás tan secretos? Una vez que descubra que su código fue aceptado antes que el mío, querré saber cómo la administración decidió que su módulo se realizó y el mío no. Una vez que encuentre la métrica que "guía" esa decisión, jugaré totalmente las métricas para hacerlo tan pronto como usted. Si no hay una métrica que pueda jugar, veré que la decisión fue arbitraria, a la gerencia le gustas más que a mí y renunciaré porque no hay un estándar de rendimiento que pueda percibir.
S.Lott
2
@Thomas Owens: "Nunca he visto métricas que conduzcan a recompensas". Los incentivos culturales existen en todas las situaciones donde dos o más personas trabajan juntas. "Las personas son reconocidas por su desempeño". Una métrica para la complejidad ciclomática se convierte en una meta. Si cumple con su meta de complejidad ciclomática más rápido que yo, entonces hay recompensas culturales: usted es más "productivo" que yo. Necesito jugar mi métrica de complejidad para parecer tan "productiva" como tú.
S.Lott
2
@Thomas Owens: "Es una cuestión de orgullo personal". Ese es un gran ejemplo de un sistema de recompensa cultural. Las métricas pueden sesgar esto debido a las consecuencias no deseadas de poder crear una métrica atractiva que no coincida con un buen código. Ha proporcionado un excelente ejemplo de recompensas culturales que pueden ser sesgadas por las métricas.
S.Lott
4

También me pregunto si es una idea peligrosa, que si los representantes objetivos de calidad se vuelven populares, las presiones comerciales harán que los desarrolladores busquen estas métricas a expensas de la calidad general (aquellos aspectos de la calidad no medidos por los representantes).

Bingo, y no "si" al respecto. Esto se llama "disfunción de medición" y se ha observado y escrito muchas veces sobre Joel escribió un artículo sobre él en 2002 refiriendo un libro de un profesor de Harvard.

Eso no significa que tales métricas sean inútiles, solo que uno nunca debe basar incentivos o políticas explícitamente en tales mediciones proxy. Si desea mejorar la calidad, una métrica de proxy con un valor muy malo es probablemente un buen punto para comenzar. Pero no puede concluir que la calidad es buena solo porque todas sus métricas tienen grandes valores.

Michael Borgwardt
fuente
3

Lo que me interesa es una forma más profunda de calidad relacionada con la red (o gráfico) de tipos y su interrelación, es decir, a qué tipos se refiere cada tipo, ¿hay grupos de interconectividad claramente identificables relacionados con un arquitectura escalonada, o por el contrario, hay una gran 'bola' de referencias de tipo (código 'monolítico').

Esto suena como fan-in y fan-out. Fan-in cuenta el número de módulos que llaman a un módulo dado y fan-in cuenta el número de módulos llamados por un módulo dado. Una señal de advertencia para usar serían los módulos que tienen un gran abanico de entrada y un gran abanico de salida, ya que esto podría indicar un diseño deficiente y un objetivo clave para la refactorización o el rediseño.

Además, el tamaño de cada tipo y / o método (por ejemplo, medido en cantidad de código de bytes Java o .Net IL) debería dar alguna indicación de dónde se han implementado algoritmos complejos grandes como bloques de código monolíticos en lugar de descomponerse en más manejables / mantenibles trozos

Una medida simple sería líneas de código. Podría dividirlo en líneas de código totales en todo el proyecto y líneas de código por módulo (quizás utilizando módulos de diferentes tamaños). Puede usar esto como un indicador de advertencia que indica que debe revisar módulos particulares. Un libro sobre mediciones y métricas de calidad de software analiza algunos trabajos que indican que la relación entre las tasas de defectos y el tamaño del módulo es curvilínea, donde el defecto promedio por KSLOC viene con módulos con un tamaño entre 175 y 350 SLOC.

Algo un poco más complejo sería la complejidad ciclomática, que está diseñada para indicar la capacidad de prueba, comprensibilidad y mantenibilidad de un sistema. La complejidad ciclomática cuenta el número de rutas independientes a través de una aplicación o módulo. El número de pruebas, y por lo tanto el esfuerzo necesario para producir y ejecutar las pruebas, está fuertemente relacionado con la complejidad ciclomática.

Sospecho que el punto exacto de umbral / decisión entre alta y baja calidad sería subjetivo, por ejemplo, ya que por mantenibilidad nos referimos a mantenibilidad por parte de programadores humanos y, por lo tanto, la descomposición funcional debe ser compatible con el funcionamiento de las mentes humanas.

No estoy seguro de que sea así.

Por ejemplo, ha habido investigaciones que sugieren que la memoria de trabajo de un humano solo puede contener 7 objetos más / menos 2 . Esto probablemente sea de interés para medir la entrada y salida del ventilador: si estoy trabajando en un módulo y está conectado a más de ~ 7 otros módulos, probablemente no podré hacer un seguimiento de exactamente qué Otros módulos están en mi cabeza.

También se ha trabajado en relacionar defectos con métricas como la complejidad ciclomática. Dado que desea minimizar los defectos en su sistema, puede identificar puntos que necesitan más pruebas de esfuerzo o refactorización, como lo identifica la alta complejidad ciclomática.

También me pregunto si es una idea peligrosa, que si los representantes objetivos de calidad se vuelven populares, las presiones comerciales harán que los desarrolladores busquen estas métricas a expensas de la calidad general (aquellos aspectos de la calidad no medidos por los representantes).

Este es el caso con cualquier medida o métrica. Deben usarse para comprender el sistema y tomar decisiones informadas. Me viene a la mente la frase "no puedes manejar lo que no puedes medir". Si desea un software de alta calidad, necesita algunas mediciones y métricas para evaluar esa calidad. Sin embargo, hay una otra cara de esto. No se puede administrar exclusivamente por los números. Puede usar los números para tomar decisiones informadas, pero no puede tomar una decisión solo porque los números lo dicen.

Thomas Owens
fuente
Lo que ocurre con el fan-in / out es que proporciona dos números por módulo / clase (o lo que sea) y, por lo tanto, ignora parte de la estructura organizativa más profunda de cómo se conectan los módulos. Por ejemplo, podría tener un pequeño grupo de módulos altamente conectados relacionados con un nivel lógico, y esperaría que las conexiones entre niveles sean mínimas (en comparación), lo que representa una interfaz / contrato bien definido entre niveles. Creo que estamos contentos de que algunos módulos estén muy conectados (por ejemplo, métodos / clases auxiliares comúnmente utilizados), pero dependiendo de la 'estructura' de la conectividad (esa es mi hipótesis).
redcalx
@locster Probablemente desee expandirlo y observar, por ejemplo, en qué paquetes están las clases a las que está conectado. No solo mire los números en bruto, sino que divídalos en cosas como las clases X dentro de mi paquete, Y clases fuera de mi paquete, o clases Z en este paquete en particular. Si ve un despliegue entre módulos en su modelo de datos y módulos en su interfaz de usuario, eso podría ser un indicador de un problema. Necesita cavar un poco más profundo que solo los números en bruto.
Thomas Owens
3

Existen indicadores o indicadores para muchas de las cualidades que le interesan:

  1. Líneas de código
  2. Fan in, fan out
  3. Tasa de error por 1000 líneas de código
  4. Complejidad ciclomática
  5. Cobertura de código
  6. Cobertura de puntos de decisión
  7. Relación de errores corregidos / introducidos por actividades de mantenimiento
  8. Análisis de puntos de función

Hay algunos problemas con todos estos elementos:

  1. Se está trabajando para optimizar la métrica: una tendencia universal; exacerbado masivamente si alguna de las métricas se utiliza como base para la evaluación o recompensa de equipos o individuos.
  2. No conozco ninguna métrica que esté libre de contexto. Esto implica que no es posible hacer una comparación entre tiendas, solo dentro de las tiendas, con el tiempo. Las métricas que surgen de tales comparaciones siguen siendo valiosas: "¿estamos produciendo código más correctamente ahora que hace un año"?

El efecto total de estos problemas es que las métricas como estas probablemente sean valiosas solo dentro de una cultura más amplia, como TQM, garantía de calidad (no control), mejora continua, kaizan, etc. Es necesario definir elementos de ambas culturas. y cómo necesita cambiar. Si tiene una definición de estos, las métricas como estas se convierten en herramientas esenciales para ayudar a mejorar la calidad del código, las prácticas de trabajo, la productividad, etc. Sin este contexto más amplio, las métricas generarán trabajo para optimizar la métrica; se convertirá en la herramienta del contador de frijoles para aumentar la productividad y disminuir los costos; y se convertirá en un obstáculo para ser jugado por el personal de desarrollo.

Chris Walton
fuente
2

Podría estar obsesionado con las métricas, o podría estar obsesionado con las mejores personas, herramientas, prácticas de ingeniería y control de calidad que puede pagar. Sería mucho más feliz tener varios genios paranoides de control de calidad que hayan leído 'Engañado por la aleatoriedad' y que les guste automatizar que un montón de informes con números bien formateados.

Trabajo
fuente
+1 para la referencia del libro Nassim Taleb. El razonamiento / epistemología defectuoso se encuentra en la cadena de causalidad de baja calidad.
redcalx
@locster, tu comentario me hizo pensar en el operador de canalización F # :). Empiezas con la 'referencia del libro de Nassim Taleb' pero terminas con 'cadena de causalidad para baja calidad' (en lugar de 'cadena de causalidad de baja calidad'). Al igual que en inglés a veces nos gusta tener dos formas de decir las cosas, también podríamos preferirlo en un lenguaje de programación.
Trabajo
1

Existe este problema fundamental con las métricas.

Se ha demostrado que casi todas las métricas propuestas, en el mundo real en código real, están fuertemente o muy fuertemente correlacionadas con SLOC sin formato (líneas de código fuente).

Esto es lo que mató las métricas de Halstead, en la década de 1970. (Por accidente, un día, alrededor de 1978, me senté en una charla de un nuevo doctorado sobre las métricas de Halstead, en el que señaló esto).

Más recientemente, se ha demostrado que la complejidad ciclomática de McCabe se correlaciona muy fuertemente con SLOC sin procesar, hasta el punto de que el tipo que realizó el estudio se preguntó en voz alta si la métrica de McCabe nos decía algo útil.

Hemos sabido durante décadas que los programas grandes tenían más probabilidades de tener problemas que los pequeños. Hemos sabido durante décadas que las grandes subrutinas tenían más probabilidades de tener errores que las pequeñas. ¿Por qué necesitamos métricas arcanas para decirnos esto, cuando mirar cuatro páginas de impresoras distribuidas en una tabla debería ser lo suficientemente convincente?

John R. Strohm
fuente
Para ser mantenible, necesitamos que el código esté en fragmentos humanos, por lo tanto, una métrica SLOC se ve bastante bien desde esa perspectiva. Sin embargo, para un tamaño dado, podría tener un número variable de rutas únicas (según la complejidad ciclomática) y yo diría que más rutas es un proxy para una comprensión menos fácil. Por lo tanto, diría que CC probablemente agrega / algo / valor adicional a SLOC, siempre y cuando permita cierta flexibilidad, excepciones a la regla, etc. Es decir, no aplique estrictamente CC.limits / objetivos.
redcalx
1
@locster: dados dos módulos 100 SLOC, uno con un CC de 47 es probable que tenga más problemas que uno con un CC de 3. SIN EMBARGO, sin embargo, para el código del mundo real, en gran cantidad, uno encuentra que los módulos cortos tienden a tener baja Los módulos CC y largos tienden a tener un CC alto, hasta el punto de que conocer el SLOC le da una muy buena suposición sobre el CC, y viceversa. Esto es lo que se entiende por "muy fuertemente correlacionado". TAL COMO, en el código real, cualquier beneficio que obtenga al notar CC = 47 es MÁS FÁCILmente obtenido al notar SLOC = 1500. (Los números se extraen al azar, el principio es el mismo.)
John R. Strohm
Sí, estoy de acuerdo en que tenderán a estar fuertemente correlacionados, aunque la relación es generalmente no lineal. por ejemplo, un puntaje CC es aproximadamente LOC elevado a algún poder Entonces, desde un punto de vista psicológico, se puede ver que el puntaje CC se vuelve muy grande muy rápido, mientras que el puntaje SLOC asociado solo parece 'solo un poco más alto'. Sí, sé que estoy agarrando pajitas aquí :)
redcalx
@locster: He estado haciendo esto por más de 30 años. En estos días, veo rutinariamente rutinas continuas de flujo de conciencia, que siguen y siguen por unos pocos cientos de SLOC, sin ninguna razón. En todos esos años, he visto exactamente una (1) rutina que en realidad NECESITA ser más de una página de código de impresora (aproximadamente 60 líneas). Todo lo demás podría haberse factorizado de manera bastante rentable, y la legibilidad y fiabilidad aumentaron significativamente. (Eso no cuenta con grandes máquinas de estado. Pueden ser un problema en esta área, pero son RARAS).
John R. Strohm
-2

Dadas todas las otras respuestas aquí, me siento un poco tonto con esta pequeña. Eche un vistazo a Crap4j , que trata de clasificar los métodos en java por cuánto apestan. (El proyecto parece abandonado).

Utiliza una combinación de complejidad ciclomática y cobertura de prueba. Como cualquier otra métrica, es jugable.

Sean McMillan
fuente