¿Cómo puedo cuantificar la cantidad de deuda técnica que existe en un proyecto?

65

¿Alguien sabe si existe algún tipo de herramienta para asignar un número a la deuda técnica de un código base, como un tipo de código métrico? Si no, ¿alguien conoce un algoritmo o conjunto de heurísticas para ello?

Si ninguna de esas cosas existe hasta el momento, me interesaría obtener ideas sobre cómo empezar con tal cosa. Es decir, ¿cómo puedo cuantificar la deuda técnica incurrida por un método, una clase, un espacio de nombres, un conjunto, etc.?

Lo que más me interesa es analizar y evaluar una base de código C #, pero también siéntase libre de utilizar otros idiomas, especialmente si los conceptos son trascendentes del lenguaje.

    
pregunta Erik Dietrich 20.02.2012 - 20:14

10 respuestas

36

La deuda técnica es solo una idea abstracta de que, en algún punto de la línea de diseño, construcción, prueba y mantenimiento de un sistema, se tomaron ciertas decisiones de tal manera que el producto se ha vuelto más difícil de probar y mantener. Tener más deuda técnica significa que será más difícil continuar desarrollando un sistema: o necesita hacer frente a la deuda técnica y asignar más y más tiempo para lo que de otra manera serían tareas simples, o necesita invertir recursos (tiempo y tiempo). dinero) para reducir la deuda técnica mediante la refactorización del código, la mejora de las pruebas, etc.

Hay una serie de métricas que podrían darle alguna indicación sobre la calidad del código:

  • cobertura del código. Existen varias herramientas que le indican qué porcentaje de sus funciones, declaraciones y líneas están cubiertas por pruebas de unidad. También puede asignar el sistema y las pruebas de aceptación a los requisitos para determinar el porcentaje de requisitos cubiertos por una prueba a nivel del sistema. La cobertura adecuada depende de la naturaleza de la solicitud.
  • Acoplamiento y cohesión . El código que muestra un acoplamiento bajo y una alta cohesión suele ser más fácil de leer, comprender y probar. Existen herramientas de análisis de código que pueden informar la cantidad de acoplamiento y cohesión en un sistema determinado.
  • Complejidad ciclomática es el número de rutas únicas a través de una aplicación. Normalmente se cuenta en el nivel de método / función. La complejidad ciclomática está relacionada con la comprensibilidad y la capacidad de prueba de un módulo. Los valores de mayor complejidad ciclomática no solo indican que alguien tendrá más problemas para seguir el código, sino que la complejidad ciclomática también indica la cantidad de casos de prueba necesarios para lograr la cobertura.
  • Las diversas medidas de complejidad de Halstead proporcionan información sobre la legibilidad del código. Estos cuentan los operadores y los operandos para determinar el volumen, la dificultad y el esfuerzo. A menudo, esto puede indicar cuán difícil será para alguien recoger el código y entenderlo, a menudo en casos como la revisión de un código o un nuevo desarrollador de la base de código.
  • Cantidad de código duplicado. El código duplicado puede indicar el potencial de refactorización de los métodos. Tener código duplicado significa que hay más líneas para la introducción de un error y una mayor probabilidad de que existan los mismos defectos en varios lugares. Si la misma lógica empresarial existe en varios lugares, es más difícil actualizar el sistema para tener en cuenta los cambios.

A menudo, herramientas de análisis estático podrán alertarle sobre posibles problemas. Por supuesto, solo porque una herramienta indique que un problema no significa que haya un problema, se necesita un criterio humano para determinar si algo podría ser problemático en el futuro. Estas métricas solo le advierten que podría ser el momento de analizar un sistema o módulo más de cerca.

Sin embargo, estos atributos se centran en el código. No indican fácilmente ninguna deuda técnica en la arquitectura o diseño de su sistema que pueda relacionarse con varios atributos de calidad.

    
respondido por el Thomas Owens 20.02.2012 - 20:42
22

Sonar tiene una heurística de la deuda técnica, así como varias otras características útiles para un proyecto de software.

También admite una amplia gama de idiomas.

  

SonarQube (anteriormente Sonar ) es una plataforma de código abierto para la inspección continua de la calidad del código ...

     
  • Admite más de 25 idiomas: Java, C / C ++, C #, PHP, Flex, Groovy, JavaScript, Python, PL / SQL, COBOL, etc.
  •   
  • SonarQube también se usa en el desarrollo de Android.
  •   
  • Ofrece informes sobre códigos duplicados, estándares de codificación, pruebas unitarias, cobertura de códigos, códigos complejos, posibles errores, comentarios y diseño y arquitectura.
  •   
  • Máquina del tiempo y vistas diferenciales.
  •   
  • Análisis totalmente automatizados: se integra con Maven, Ant, Gradle y las herramientas de integración continua (Atlassian Bamboo, Jenkins, Hudson, etc.).
  •   
  • Se integra con el entorno de desarrollo Eclipse
  •   
  • Se integra con herramientas externas: JIRA, Mantis, LDAP, Fortify, etc.
  •   
  • Ampliable con el uso de complementos.
  •   
  • Implements SQALE metodología para calcular deuda técnica ...
  •   
    
respondido por el Robert Greiner 20.02.2012 - 20:43
5

Odio usar una analogía de las finanzas pero parece realmente apropiado. Cuando está tasando algo (activos de cualquier tipo), puede tener valor tanto intrínseco como extrínseco. En este caso, el código existente tiene un valor intrínseco que sería una cantidad correspondiente a la calidad relativa de dicho código y también tendría un valor extrínseco (valor de lo que podría hacerse al código) y esas cantidades serían aditivas. El valor intrínseco se puede desglosar en créditos y débitos (bueno contra malo) utilizando la metodología que esté utilizando para calificar el código (+5 para comentarios / legibilidad, -10 para cobertura de códigos, etc.)

Ciertamente no conozco ninguna herramienta que cuantifique esto hoy y creo que tendría un debate completamente nuevo en sus manos si discute los méritos de diferentes estrategias de "valoración de la deuda" pero estoy de acuerdo con Matthew: el la deuda es el costo acumulativo de obtener el código tan bueno como sea posible, utilizando el método que utilice para costar las horas de trabajo necesarias para llegar allí.

Otra cosa a considerar es que ciertamente hay una medida de costo-efectividad por la cual, a medida que uno se acerca a la "perfección", el valor de una hora invertida en el código base es más probable que disminuya exponencialmente, por lo que probablemente haya una Problema de optimización para maximizar la utilidad del trabajo realizado.

    
respondido por el PatternMatching 20.02.2012 - 20:55
4

Creo que la pregunta es cuánto costaría "recomprar" su deuda técnica, es decir, ¿cuánto trabajo cuesta solucionarlo? Bueno, depende del equipo resolverlo.

Durante la planificación del sprint, le pido al equipo que calcule la complejidad de arreglar los elementos de deuda técnica de la misma manera que estimarían la complejidad de una historia de usuario. En ese momento, es un juego de negociación entre el equipo y el propietario del producto para determinar qué deuda técnica es lo suficientemente alta como para que se realice en el sprint actual (desplazando historias de usuarios reales) y qué puede esperar.

Si no estás haciendo scrum, me atengo a mi premisa: la deuda técnica debe medirse por el costo del remedio.

    
respondido por el Matthew Flynn 20.02.2012 - 20:29
4

Entre desarrolladores, una medida bastante confiable de deuda técnica parece ser WTFs / minute .

El problema con esta "métrica" es que normalmente es bastante difícil comunicarse "fuera".

La métrica que funcionó para mí en la comunicación de la deuda técnica a los "forasteros" fue la cantidad de pruebas y el esfuerzo de corrección de errores (especialmente para corregir errores de regresión ) necesarios para una entrega exitosa.

Una palabra de advertencia: aunque este enfoque es bastante poderoso, sería mejor verificar dos veces con WTFs / minute antiguos antes de recurrir a él. La cosa es que es bastante engorroso: para obtener los datos, uno tiene que hacer un seguimiento cuidadoso del tiempo y registrarlo con precisión según las categorías apropiadas.

  • es mucho más fácil indicar el total de 3 semanas invertidas en implementar la función A que

    Pasé 14 horas en el borrador de la implementación de la característica A, luego 29 horas en la prueba de humo, luego 11 horas en la implementación de correcciones para las regresiones que descubrí, y luego 18 horas en la prueba de la implementación de la característica QA-ready. Después de eso, los muchachos de control de calidad pasaron 17 horas probando el lanzamiento inicial del candidato. Después de eso, pasé 13 horas analizando los errores enviados por QA para la versión candidata inicial y 3 horas implementando las correcciones. Después de eso, pasé 11 horas en pruebas de humo de los cambios que hice al lanzamiento inicial del candidato. Después de eso ...

De todos modos, los datos sobre las pruebas y el esfuerzo de corrección de errores han sido bastante fáciles de comunicar en mi experiencia.

  

Para la versión reciente, dedicamos aproximadamente un 90% de tiempo a probar y corregir errores de regresión. Para la próxima versión, sugiera que se dedique un poco de esfuerzo para reducir este valor al 60-70%.

Otra palabra de precaución. Los datos como el 90% anterior podrían interpretarse no solo como un indicio de deuda técnica, sino también (sorpresa) como un indicio de que uno no es bastante competente en programación / tecnología particular. "Solo haces demasiados errores en tu código".

Si existe el riesgo de que los datos se malinterpreten de esa manera, es útil contar con datos de referencia adicionales sobre algo menos propenso a WTF con el que comparar.

  • Diga si hay dos componentes / aplicaciones similares mantenidos por el mismo desarrollador (s), primero liberando a "tasa de desperdicio" alrededor del 50% y segundo a 80-90, esto constituye un caso bastante sólido a favor de segundo ser sujeto de deuda técnica.

Si hay probadores dedicados en el proyecto, también podrían contribuir a una evaluación más objetiva de los datos. Como mencioné en otra respuesta ,

  

Con los evaluadores, consigue que alguien respalde su comprensión de los problemas de diseño. Cuando solo hay desarrolladores que se quejan de la calidad del código , esto a menudo suena como WTF subjetivos detrás de la puerta cerrada .
  
  Pero cuando esto se repite cuando el tipo de control de calidad dice algo como component A tenía 100 errores de regresión para 10 nuevas características, en lugar de component B que tenía 10 errores de regresión por 20 nuevas características , la comunicación de repente se convierte en Todo otro juego.

    
respondido por el gnat 22.02.2012 - 14:56
2

Existe una plataforma bastante sólida llamada CAST para buscar deuda técnica en aplicaciones grandes. Lo usamos en un proyecto donde asumimos una gran mejora en un sistema heredado. No le dice qué había en las cabezas de las personas que escribieron el código, pero examina el código y encuentra fallas en el código y la arquitectura, y luego lo cuantifica en deuda técnica si lo desea. Sin embargo, el uso real de esto no es la cantidad de $ sino la lista de problemas que ya se encuentran en el código. Esto le informa sobre una parte de la deuda técnica que tiene (por lo tanto, no estoy de acuerdo con algunas de las respuestas anteriores). Hay una deuda técnica que está puramente basada en el diseño y que es muy subjetiva, como la pornografía, lo sabes cuando lo ves y conoces el contexto. Yo diría si esa es realmente una deuda "técnica". Hay una deuda técnica que está puramente en la implementación y creo que vale la pena medirla y hacer un seguimiento.

    
respondido por el Leonhard 25.02.2012 - 00:30
2

Aquí hay un seminario web de MIT que describe investigaciones sobre deuda técnica en grandes sistemas de software: enlace

Los autores escribieron código para analizar un proyecto y extraer las métricas de "complejidad arquitectónica". Se demostró que estas métricas tienen una fuerte relación con la densidad de defectos, la productividad del desarrollador y la rotación del personal de desarrollo.

El trabajo descrito en el seminario web se basa en la investigación de modularidad realizada por Alan MacCormack y Carliss Baldwin en la Escuela de Negocios de Harvard. Yo también miraría sus papeles. Su 'costo de propagación' podría ser lo que está buscando.

    
respondido por el user94203 18.06.2013 - 12:23
1

Yo diría que las métricas de código estándar se pueden usar como una vista de alto nivel del relativo del endeudamiento técnico. VS Ultimate incluye un analizador de código que le proporcionará un "índice de mantenibilidad" basado en la complejidad ciclónica, el acoplamiento, la LoC y la profundidad de la herencia. Puede sumergirse en cualquier punto problemático y ver detalles (hasta el nivel de función). Simplemente lo ejecuté en mi proyecto y los puntajes más bajos que obtuvimos fueron 69 en nuestro paquete de datos (configuración e inicialización de EF) y nuestro Test Suite. Todo lo demás era 90 o superior. Hay otras herramientas que le darán más métricas como las discutidas en PPP

    
respondido por el Michael Brown 20.02.2012 - 20:41
0

No consideraría la deuda técnica como dólares, ya que se necesita un modelo elegante para cuantificarlo. Pensaría en ello como favores. Si alguien te hace un favor y es probable que lo olvides, lo escribes. Cuando tomes un atajo, escríbelo. Esto te ayuda a recordar, y más impotente te obliga a reconocerlo. No se necesita ninguna herramienta de lujo. Bloc de notas o Ecxel pueden hacer el truco.

    
respondido por el MathAttack 20.02.2012 - 21:14
-1

Si tiene un buen historial a través de un bugtracker o algún tipo de software ágil, puede hacerlo simple. Tiempo dedicado a completar tareas básicas. Además, la fiabilidad de las estimaciones cuando el proyecto era joven vs. ahora.

    
respondido por el Erik Reppen 18.06.2013 - 15:15

Lea otras preguntas en las etiquetas