¿Cuáles son las métricas útiles para el código fuente? [cerrado]

33

¿Cuáles son las métricas útiles para capturar para el código fuente?

¿Cómo pueden las métricas, como por ejemplo (Ejecutable?) Líneas de Código o Complejidad Ciclomática ayudar con el aseguramiento de la calidad o cómo son beneficiosas en general para el proceso de desarrollo de software?

cschol
fuente
37
La única medida válida es WTF / seg. :)
terminal
2
@terminus osnews.com/story/19266/WTFs_m :-)
thbusch

Respuestas:

30

"Medir la productividad del software por líneas de código es como medir el progreso en un avión por cuánto pesa" - Bill Gates

chrisaycock
fuente
3
Por favor, no actualice las no respuestas.
Eric Wilson el
3
Si bien es una anécdota divertida, esta respuesta hace poco para contribuir a la respuesta de esta pregunta.
Chris Knight
77
@ Chris Esta respuesta recibió muchos votos positivos (o "actualizaciones" como FarmBoy quiere llamarlo) porque muchos desarrolladores creen que las métricas de software son inútiles. Si no está de acuerdo o siente que tiene una mejor respuesta a la pregunta, publique su propia respuesta. Comentar como lo has hecho aquí no es productivo; No has contribuido nada tú mismo.
chrisaycock
77
Mi voto negativo y comentario están destinados a desalentar las respuestas que carecen de profundidad y no abordan directamente la pregunta del OP. Esta podría ser una respuesta mucho mejor si entrara en más detalles sobre por qué cree que las métricas de software son inútiles con respecto al desarrollo de software y la garantía de calidad y se centró en algo más que LOC.
Chris Knight
Las métricas de software son realmente muy útiles si las usa correctamente. Es decir, cuanto más LoC -> más errores -> peor es la calidad. Nunca lo he visto fallar como medida de calidad. Y un avión es definitivamente mejor si realiza el mismo viaje a la misma velocidad pero requiere mucho menos peso. Obviamente, Bill Gates no sabía mucho acerca de los aviones cuando dijo eso, ni tampoco sabía lo suficiente sobre el software.
Pablo Ariel
12

Echa un vistazo a las publicaciones de Jeff sobre el tema:

Una visita de Metrics Maid

Ingeniería de software: ¿muerto?

También hay una publicación antigua, pero buena, de Joel, estrechamente relacionada con las métricas de software, y recomiendo encarecidamente su lectura: El método de gestión Econ 101

El punto clave, para mí, es este, citando a Jeff: "El uso responsable de las métricas es tan importante como recopilarlas en primer lugar".

Machado
fuente
+1 por citar esa frase de Jeff. Pura sabiduría endurecida por la batalla allí mismo.
luis.espinal
11

Lo que me confunde acerca de las métricas de código es que no se hace más. La mayoría de las compañías informan sobre la eficiencia de sus empleados, proveedores y sistemas establecidos, pero nadie parece querer informar sobre el código. Definitivamente voy a estar de acuerdo con las respuestas que afirman que más líneas de código es una responsabilidad, pero lo que hace su código es más importante.

Líneas de código: como he mencionado, esta es una medida vital y debe tomarse con la mayor seriedad, pero en cada nivel. Las funciones, clases, archivos e interfaces pueden indicar código de hacer todo que es difícil de mantener y costoso a largo plazo. Es infinitamente difícil comparar las líneas totales de código versus lo que hace un sistema. ¡Podría ser algo que haga muchas cosas y en ese caso habrá muchas líneas de código!

Complejidad: esta medición es buena para hacer en bases de código en las que no ha trabajado, y puede darle una buena indicación de dónde se encuentran las áreas problemáticas. Como anécdota útil, medí la complejidad en una de mis propias bases de código, y el área de mayor complejidad fue la que más tiempo pasé cuando necesitaba cambiarla. Trabajar para reducir la complejidad resultó en una reducción masiva en el tiempo de mantenimiento. Si la gerencia tuviera estas medidas a mano, podrían planificar iteraciones de refactorización o rediseños de áreas específicas de un sistema.

Duplicación de código: esta es una medida muy importante en lo que a mí respecta. La duplicación de código es una muy mala señal y podría señalar problemas profundos en los niveles bajos del diseño de un sistema o desarrolladores que copian y pegan, causando problemas masivos a largo plazo y sistemas que no se pueden mantener.

Gráficos de dependencia Encontrar malas dependencias y dependencias circulares es una medida importante en el código. Esto casi siempre apunta a un diseño incorrecto de alto nivel que necesita revisión. A veces, una dependencia puede absorber muchas otras innecesarias, porque alguien está usando addNumber dentro de una biblioteca de correo electrónico para hacer sus cálculos financieros. Todos se sorprenden cuando se cambia la biblioteca de correo electrónico y se interrumpe la financiación. Si todo depende de una cosa, también puede apuntar a hacer todo, bibliotecas que son difíciles de mantener y están mal diseñadas.

Una buena medición siempre le dirá que cada característica de un sistema tiene una huella pequeña. Menos dependencias, menos complejidades, menos duplicación. Esto apunta a acoplamiento flojo y alta cohesión.

Tjaart
fuente
8

¿Acaso esta "métrica del código fuente" nunca morirá?

Las líneas de código fuente sin formato (SLOC) son la métrica más antigua, fácil y básica que existe.

Halstead propuso originalmente un montón de métricas. Mucha gente se estaba divirtiendo mucho escribiendo programas de medición hasta que algunos deportes de base hicieron el estudio obvio y demostraron que todas y cada una de las métricas de Halstead estaban estrechamente relacionadas directamente con SLOC.

En ese momento, las métricas de Halstead fueron abandonadas, porque SLOC siempre es más fácil de medir.

John R. Strohm
fuente
1
¿Algún enlace al estudio?
Jon Hopkins el
Google es tu AMIGO, pero aquí hay uno para que comiences. ecs.csun.edu/~rlingard/comp589/HoffmanArticle.pdf
John R. Strohm
66
Estudio interesante, aunque su estudio solo analizó programas en general entre 50 y 100 líneas de código. Con un problema tan pequeño y bien definido que resolver, el resultado final no parece tan sorprendente.
Chris Knight
Yo diría que en el mundo real, todos estos estudios se vuelven fangosos.
Warren P
Esto es verdad. Cuanto más líneas de código, más clara es la calidad.
Pablo Ariel
8

Las métricas del código fuente para el aseguramiento de la calidad apuntan a dos objetivos:

  • escribir código con menos errores dentro
  • escribir código para facilitar el mantenimiento

Ambos conducen a escribir código lo más simple posible. Esto significa:

  • unidades cortas de código (funciones, métodos)
  • pocos elementos en cada unidad (argumentos, variables locales, declaraciones, rutas)
  • y muchos otros criterios más o menos complejos (ver Métrica del software en Wikipedia).
Mouviciel
fuente
7

Que yo sepa, el número de errores encontrados se correlaciona directamente con líneas de código (probablemente abandono), lenguaje de módulo, programador y dominio.

No conozco ninguna otra métrica directa y práctica que esté bien correlacionada con los errores.

Una cosa que me gustaría hacer es comenzar a ejecutar los números para los diferentes proyectos en los que estoy trabajando: Cobertura de prueba :: kLOC, y luego discutir la "calidad percibida" para ver si hay una correlación.

Paul Nathan
fuente
1
Entonces, ¿cuanto más código hay, más errores hay?
3
@Thor: l sip sip. sorpresa, ¿eh?
Paul Nathan
Hasta donde recuerdo, los números típicos de la industria son alrededor de 2-3 errores por 1000 líneas de código para proyectos promedio, acercándose a algo así como 0.5 errores por 1000 líneas de código para software de control de plantas nucleares o proyectos de la NASA en los que ponen una enorme cantidad de esfuerzo , control, pruebas, revisión, etc. porque las fallas pueden tener consecuencias muy graves. ¿Alguien que tenga alguna referencia a los números que apoyan esto?
hlovdal
2
@hlovdal: 2-3 errores por KSLOC ya es una cifra muy baja. Las cifras más bajas que conozco de los dominios aeroespacial y de seguridad son del orden de 0.1 errores por KSLOC. Las cifras típicas parecen ser de 20 a 50 errores por KSLOC. Como referencia, Google para el artículo de Andy German titulado "Análisis de código estático de software: lecciones aprendidas".
Programado el
1
Discutiría estas cifras: depende completamente del idioma, el compilador y el entorno ejecutable. Los errores tipográficos en el código JavaScript pueden tardar años en encontrarse, pero un error tipográfico en un idioma compilado se encontraría en la primera compilación.
JBRWilkinson
7

Las métricas solo son útiles si sabe qué hacer con las respuestas que obtiene. En esencia, una métrica de software es como un termómetro. El hecho de que midas algo a 98.6 ° F no significa nada hasta que sepas cuál es la temperatura normal . La temperatura anterior es buena para la temperatura corporal pero realmente mala para el helado.

Las métricas comunes que pueden ser útiles son:

  • Errores descubiertos / semana
  • Errores resueltos / semana
  • # Requisitos definidos / liberación
  • # Requisitos implementados / lanzamiento

Las dos primeras tendencias de medida. ¿Encuentra errores más rápido de lo que puede solucionarlos? Dos posibles resultados: tal vez necesitemos más recursos para corregir errores, tal vez necesitemos dejar de implementar nuevas funciones hasta que nos pongamos al día. Los segundos dos proporcionan una imagen de lo cerca que está de haber terminado. Los equipos ágiles lo llaman una tabla de "quemar".

La complejidad ciclomática es una métrica interesante. En su concepto base, es el número de rutas de ejecución únicas en una función / método. En un entorno pesado de pruebas unitarias, esto corresponde al número de pruebas necesarias para verificar cada ruta de ejecución. Sin embargo, el hecho de que tenga un método que tenga una Complejidad Ciclomática de 96 no significa que sea necesariamente un código defectuoso, o que tenga que escribir 96 pruebas para proporcionar una confianza razonable. No es raro que el código generado (a través de WPF o generadores de analizadores) cree algo tan complejo. Puede proporcionar una idea aproximada del nivel de esfuerzo necesario para depurar un método.

Línea de fondo

Cada medida que tome debe tener lo siguiente definido o es inútil:

  • Una comprensión de lo que es "normal". Esto se puede ajustar durante la vida del proyecto.
  • Un umbral fuera de "normal" donde necesita tomar algún tipo de acción.
  • Un plan para tratar con el código cuando se supera el umbral.

Las métricas que tome pueden variar ampliamente de un proyecto a otro. Es posible que tenga algunas métricas que utilice en todos los proyectos, pero la definición de "normal" será diferente. Por ejemplo, si un proyecto descubrió un promedio de 5 errores / semana y el nuevo proyecto está descubriendo 10 errores / semana, no necesariamente significa que algo está mal. Es posible que esta vez el equipo de pruebas sea más meticuloso. Además, la definición de "normal" puede cambiar durante la vida del proyecto.

La métrica es solo un termómetro, lo que hagas depende de ti.

Berin Loritsch
fuente
Otro error relacionado que puede ser útil en algunos casos son los errores por líneas de código. En general, las bases de código maduras deberían tener un número bastante bajo de errores por líneas de código en comparación con las aplicaciones que aún están en desarrollo.
rjzii
@Rob Z, con cualquier métrica, las personas harán lo suficiente para optimizar esa métrica. Con errores por línea de código, es posible que un desarrollador introduzca una variable no utilizada que incremente solo para aumentar la cantidad de LOC sin errores (ya que los contadores SLOC pueden detectar varios puntos y comas). Por supuesto, eso también aumenta artificialmente la cantidad de código para pasar.
Berin Loritsch
6

El código fuente es un pasivo, no un activo. Con eso en mente, medir líneas de código es análogo al seguimiento de los dólares gastados mientras se construye una casa. Debe hacerse si desea mantenerse por debajo del presupuesto, pero no necesariamente pensaría que gastar $ 1000 por día es mejor que gastar $ 50 por día; te gustaría saber cuánto de la casa se construyó con ese dinero. Es lo mismo con las líneas de código en un proyecto de software.

En resumen, no hay métricas útiles para el código fuente porque medir el código fuente por sí solo no es útil.

Larry Coleman
fuente
4

Dado que el código fuente es simplemente una combinación de secuencia, selección y repetición. Si tuviera que describir la pieza de software más óptima que razonablemente podríamos esperar producir, sería la siguiente. Software con una cobertura de código de prueba de casi el 100% que utiliza la menor cantidad de líneas de código necesarias para hacer el trabajo y, sin embargo, lo suficientemente flexible como para soportar los cambios.

Xenohacker
fuente
2
La cobertura del 100% es solo del 100% si cubre todas las rutas, no solo todas las líneas. En cualquier pieza de software realista, el 100% de cobertura de ruta es un mal objetivo, ya que será muy costoso de alcanzar y solo le dirá que su código se comporta como se diseñó, no que el diseño en sí sea sólido. Podría tener grandes agujeros de seguridad y tener una cobertura de ruta del 100%.
Joeri Sebrechts
+1 Más código fuente no es necesariamente mejor.
Larry Coleman el
Solo las aplicaciones muy simples son susceptibles a una cobertura de prueba del 100% (haciendo que la cobertura sea redundante). Es computacionalmente costoso (si no es imposible) lograr una cobertura de prueba del 100% para software complejo. Hemos conocido ese hecho en terreno firme desde hace 6 décadas. En segundo lugar, las pruebas solo le dicen que no ha encontrado un error; no le garantiza que no haya errores que no sean de calidad estructural, tamaño o complejidad (algo que también se conoce desde hace bastante tiempo). No conocer estos hechos al trabajar en software es similar a un físico que no conoce las leyes de la termodinámica, realmente.
luis.espinal
@ luis.espinal El software tan grande que es demasiado costoso computacionalmente para probarlo es un software increíblemente mal escrito. Está cerca de no tener idea de cómo hacer que el software funcione.
Pablo Ariel
@PabloAriel - "Software tan grande que es demasiado costoso computacionalmente para probar" << Eso no es lo que dije. Lea el comentario (tal vez dos o tres veces) para asegurarse de que realmente está leyendo lo que cree que está leyendo.
luis.espinal
4

Una anécdota para mostrar por qué los recuentos de KLOC son inútiles (e incluso perjudiciales) para medir el rendimiento.

Hace años trabajé en un gran proyecto (más de 70 personas en nuestra empresa, más de 30 en nuestro cliente) que usaba KLOC como la única medida del desempeño de equipos e individuos.

Para nuestro esfuerzo Y2K (le dice cuánto tiempo hace que era :)) hicimos una gran limpieza de la sección del código de la que era responsable mi equipo. Terminamos para el lanzamiento escribiendo alrededor de 30,000 líneas de código, no fueron malos 3 meses de trabajo para 5 personas. También terminamos desechando otras 70,000 líneas de código, un muy buen trabajo por 3 meses de trabajo, especialmente combinado con el nuevo código.

Resultado final del trimestre: -40,000 líneas de código. Durante la evaluación del desempeño posterior al trimestre, recibimos una reprimenda oficial de la compañía por no cumplir con nuestros requisitos de productividad de 20,000 líneas de código producidas por trimestre (después de todo, las herramientas mostraron que habíamos producido -40,000 líneas de código), que habría resultado en que todos estuviéramos en la lista de bajo desempeño y pasados ​​por alto para promociones, capacitación, aumento de sueldo, etc.

Unos meses más tarde (estas cosas llevan tiempo) nos dijeron que la compañía estaba revisando sus estándares de productividad y había contratado a un equipo de expertos para crear un nuevo sistema basado en el análisis de puntos de función.

jwenting
fuente
¿Por qué no mostraste las diferencias?
reinierpost
Creo que eso fue lo que se hizo. Pero si un sistema es tan rígido que ni siquiera suena la alarma cuando aparece un punto de datos tan descaradamente falso que no servirá de mucho.
Jwent
2
Su respuesta no muestra que los KLOC sean inútiles, muestra cómo no usarlos.
Neil N
2
muestra que confiar en ellos como una medida de productividad es miope, confiar en ellos como la única medida es idiota. En otros proyectos que usan KLOC como una medida de productividad e incluso calidad, inflamos fácilmente los números creando estándares de codificación que causaron muchas líneas (prácticas de arriostramiento C ++, líneas vacías adicionales con solo un breve comentario en todas partes, dividiendo las condiciones en una declaración if) 3 líneas, etc.).
Jwenting
1
Usar SLOC como una métrica de productividad es simplemente tonto y probablemente nunca dará buenos resultados. Usar SLOC como una métrica de calidad que indica mantenibilidad y número de defectos es más sensato, con todas las advertencias ya discutidas en esta pregunta.
Redcalx
2

Me sorprende que nadie haya mencionado la Declaración / Cobertura de decisión de las pruebas unitarias (porcentaje del código ejercido por las pruebas unitarias) todavía.

La cobertura del código es útil porque sabe qué porcentaje de la aplicación no falla catastróficamente; con el resto de su utilidad depende de la calidad de las pruebas unitarias.

StuperUser
fuente
la cobertura del código también es una métrica falsa (aunque puede tener algún uso). Invita a escribir pruebas sin sentido solo para obtener una mayor cobertura. Y, por supuesto, hay cosas que nunca se cubrirán, y la gente comenzará a evitar escribir esas cosas. por ejemplo, he visto herramientas de cobertura de código que marcaron JavaDoc como código y, por supuesto, no estaría cubierto. otra herramienta marcó todas las líneas vacías como no cubiertas por las pruebas. ¿Está de acuerdo en que eliminar los comentarios y los espacios en blanco en su código es peor que perderse las pruebas unitarias para algunos setters, espero?
Jwent
Absolutamente, las malas pruebas unitarias duelen más de lo que ayudan de muchas maneras. Por ejemplo, podría obtener una cobertura de código del 100% para un conjunto de pruebas que no tenían una sola afirmación.
StuperUser
1

Cuanto más pequeño es el commit, mejor, por lo general. Se trata de herramientas SCM, no de código per se, pero es una métrica muy medible. Cuanto más pequeño sea el compromiso, más fácil será ver cada cambio como una unidad atómica; cuanto más fácil es revertir cambios específicos y precisar cuando las cosas se rompen.

Mientras ningún commit rompa la compilación ...

Assaf Lavie
fuente
1

Estas no son métricas absolutas muy útiles en términos de progreso, pero pueden usarse para dar una idea general del estado del código.

En particular, la Complejidad Ciclomática que he encontrado útil en términos de visualizar cuán modularizada es una base de código dada. En general, desea una baja complejidad ya que esto significa que el número de fuentes por módulo es bajo y hay muchos módulos.

usuario1249
fuente
1

A menudo trabajo en un paquete gigante de C ++, y cuando busco un código problemático que valga la pena refactorizar la Complejidad Ciclomática o el horrible FanIn / FanOut , generalmente son buenas señales de alerta para buscar. Solucionar problemas allí generalmente conducirá a mejoras en toda la base de código.

Por supuesto, estos números solo pueden servir como una pista sobre lo que valdría la pena mirar. Hacer que este sea un umbral difícil después del cual fallar una construcción o rechazar una confirmación sería ridículo.

Benjamin Bannier
fuente
1

Hay muchas situaciones en mi trabajo donde uso métricas de código:

Mientras escribe código

El uso más grande y quizás más importante en mi trabajo diario es Checkstyle , una herramienta para desarrolladores de Java que verifica continuamente las métricas (entre otras cosas) de mi código contra un conjunto de reglas que hemos definido y marca lugares donde mi código no cumplir con esas reglas. A medida que desarrollo el código, me dice en tiempo real si mis métodos se vuelven demasiado largos, complejos o acoplados, lo que me permite dar un paso atrás y pensar en refactorizarlo a algo mejor.

Los desarrolladores son completamente libres de romper todas las reglas ya que nunca se aplicarán a todas las situaciones. Las "reglas" están ahí para estimular el pensamiento y decir "Oye, ¿es esta la mejor manera de hacer esto?"

Durante el control de calidad / revisiones de código

Lo primero que hago generalmente cuando realizo una revisión de código es verificar la cobertura de código del código que estoy revisando junto con una herramienta de cobertura de código que resalta qué líneas de código se han cubierto. Esto me da una idea general de cuán exhaustivo es el código de prueba. Realmente no me importa si la cobertura es del 20% o 100%, siempre que el código importante esté bien probado. Por lo tanto, el porcentaje cubierto no tiene sentido, pero el 0% seguro se destaca como un pulgar dolorido como algo que quiero mirar con cuidado.

También verifico qué métricas acordadas por el equipo se han "roto", si las hay, para ver si estoy de acuerdo con el desarrollador en que estaba bien o si puedo sugerir formas de mejorarlo. Tener estas métricas de desarrollo acordadas en nuestro equipo para escribir código nuevo ha hecho grandes avances para mejorar nuestro código. Escribimos mucho menos métodos monolíticos y ahora somos mucho mejores en el principio de responsabilidad única .

Mejoras de tendencia en el código heredado Tenemos muchos códigos heredados que nos gustaría mejorar. Las métricas en cualquier momento son bastante inútiles, pero lo importante para nosotros es que con el tiempo la cobertura del código aumenta y cosas como la complejidad y el acoplamiento disminuyen. Por lo tanto, nuestras métricas están conectadas a nuestro servidor de Integración Continua, lo que nos permite mirar con el tiempo para asegurarnos de que estamos en el camino correcto.

Familiarizarse con una nueva base de código La única vez que uso líneas de métrica de código fuente es cuando busco una base de código con la que no estoy familiarizado. Me permite medir rápidamente el tamaño aproximado del proyecto en comparación con otros con los que he trabajado. Usando otras métricas también puedo obtener una idea aproximada de la calidad del proyecto.

Las cosas clave son usar métricas como puntos de partida para tendencias, discusiones o formas de avanzar y no manejarlas religiosamente para obtener cifras exactas. Pero sí creo firmemente que pueden ayudarlo a mejorar el código correcto cuando se usa correctamente.

Chris Knight
fuente
0

P: ¿Cuáles son las métricas útiles para capturar para el código fuente?

Para los negocios:

A: número de horas hombre

Para el supervisor del codificador:

A: no importa. Hagamos todo hoy

Para la autoestima del codificador:

A: Número de SLOC (líneas de código fuente)

Para la madre del codificador:

R: Come más de estos panecillos franceses suaves y bebe té

continúa en los comentarios a continuación ...

Genio
fuente
-1

Recuerde: Todo el código se puede reducir al menos 1 instrucción. Todo el código tiene al menos 1 error. Por lo tanto, todo el código puede reducirse a una sola instrucción que no funciona. ¡Espero que ayude!

Will Kunkel
fuente
y con menos efectos secundarios.