Mejorando la calidad del código con NDepend (con sorteo de licencia!)

Tiempo de lectura: 6 minutos
Imagen ornamental con el logo de NDpend

Hace ya unos meses, me escribió Patrick Smacchia, autor y lead del equipo de desarrollo de NDepend para ofrecerme probar su herramienta y hacer una review sobre ella.

Me ha costado sacar tiempo para trastear la herramienta (lo siento Patrick 🙁 ), pero finalmente lo he podido hacer y ahí vamos con ello.

Disclaimer: Nada de lo que digo aquí está condicionado, Patrick me ofreció una licencia para probar el software y hacer una review objetiva sobre lo que ofrece si me parecía interesante, pero en ningún caso ha revisado ni opinado sobre lo que aquí estoy escribiendo

¿Qué es NDepend?

NDepend es un analizador de código con el que vamos a poder generar informes interactivos con métricas sobre la calidad del código analizado. Cada métrica está documentada y es monitorizable.

Se trata por tanto de una herramienta, enfocada a desarrolladores y arquitectos software, que realiza análisis estático de proyectos .NET y .NET Core.

Además, puede utilizarse tanto en nuestro propio equipo durante el proceso de desarrollo (ejecutable standalone e integraciones con Visual Studio), como en varios sistemas de integración continua como pueden ser Azure DevOps, TFS, Teamcity, Jenkins y algunas más.

¿Para qué me puede servir NDepend?

Detectar errores y demás está muy bien, pero eso ya lo consigo con FxCop Analyzers, ¿no?. La verdad es que NDepend llega bastante más alla de los que puede ser análisis de código estático simplemente. Una de las ventajas que nos aporta es la detección automática de puntos donde algo raro está pasando (code smells), así como la detección de buenas prácticas (o ausencia de ellas). Obviamente, también tenemos métricas sobre cantidad de lineas, complejidad ciclomática, etc…

En resumen (de brocha gorda):

  • Detección de código sospechoso (code smells)
  • Detección de zonas donde el código es complejo (complejidad ciclomática)
  • Detección de referencias (que partes de nuestro código son las más utilizadas)
  • Detección de acoplamiento
  • Cálculo de deuda técnica (sí, aunque no lo reconozcas, no todo tu código es perfecto)
  • Tendencias y gráficos de evolución sobre la calidad del código
  • Estimación del tiempo invertido

Un caso práctico

Como siempre, hablar es fácil y por eso quiero poner un caso práctico del análisis de una aplicación. En mi caso concreto yo he probado NDepend con un cliente en el que tenemos nada más y nada menos que 36 proyectos dentro de la misma solución (pequeñito el sistema… xD). Como evidentemente no puedo dar datos sobre los clientes de mi trabajo, el caso práctico lo vamos a plantear sobre un proyecto público que a más de uno os puede resultar familiar como es Dapper, un micro-ORM desarrollado por la gente de Stack Exchange (casi nada…)

Lo primero de todo, es que yo he optado por utilizar la versión standalone directamente en lugar de la integración con Visual Studio, ya que en muchos proyectos utilizo Visual Studio Code. No obstante, en una prueba rápida con su integración en VS he podido comprobar que ofrece prácticamente lo mismo.

Para esto simplemente he tenido que ejecutar la aplicación que me he descargado sin necesidad de hacer ninguna instalación extra. Una vez dentro de Visual NDepend, basta con ir al menú de archivo y decirle que queremos analizar un proyecto o solución de VS.

Tras unos instantes analizando el proyecto (que dependerá del tamaño del proyecto que estemos analizando), podremos acceder a los diferentes paneles con la información.

Panel general (dashboard)

Este es el cuadro de mando general con las métricas del análisis, por ejemplo, en el proyecto de Dapper:

  • 13059 líneas de código
  • 129 archivos de código fuente
  • 11 ensamblados
  • 40 espacios de nombres
  • 6385 líneas de comentarios
  • Estimación del esfuerzo para realizar la aplicación: 345 días
  • Deuda técnica: 40 días
  • 5 días y 6 horas de esfuerzo para reducir la deuda técnica de C a B
  • 2 alertas de fallos primordiales a revisar
  • 8 alertas de reglas críticas no superadas
La imagen muestra el panel de Visual NDepend donde se leen los datos arriba descritos

Vista de métricas

Este es otro panel que aporta a mi modo de ver una información importante de manera muy visual. Gracias a sus tres selectores vamos a poder configurar el nivel de agrupación (cantidad de métodos, campos, espacios de nombres,…), dentro de la agrupación, vamos a poder seleccionar en base a que métrica queremos que tenga el tamaño, y por último vamos a poder seleccionar en base a que métrica queremos que tenga el color.

De este modo vamos a poder hacer una revisión visual muy rápida, por ejemplo, de la complejidad ciclomática de cada método, haciendo que se represente más grande cuantas más referencias tiene:

La imagen muestra un recuadro por cada método del proyecto en un color del verde al rojo en funcion de la complejidad ciclomática del método

Gráfico y matriz de dependencias

Otros de los paneles que ofrece y que me parecen extremadamente interesantes son los referentes a las dependencias dentro de la solución. Estos paneles de dependencias nos van a mostrar, valga la redundancia, las dependencias.

De manera gráfica:

La imagen muestra de manera visual las dependencias  entre partes del proyecto

Y para proyectos más grandes, en forma de matriz:

Conclusión

Aunque he tenido poco trato con NDepend en batallas del día a día, la verdad es que creo que es una herramienta con mucho potencial. La posibilidad de crear reglas de análisis propias le otorga un grado extra de flexibilidad que creo que puede conseguir que se adapte a más escenarios.

El soporte que ofrece para diferentes entornos de integración y despliegue continuo la verdad que me parece una maravilla también, ya que simplifica mucho el proceso de utilización de la herramienta.

Más allá del coste de licenciamiento, que puede ser o no una barrera para adoptar NDepend (como cualquier otro software), si que creo importante resaltar que es una herramienta muy focalizada en .Net.

También he de añadir que NDepend se integra con SonarQube y puede hacer su trabajo también junto a este si necesitas encajarlo con esta herramienta.

Si con todo esto que he comentado, crees que puede encajarte esta herramienta, te recomiendo echarle un ojo tanto a sus costes como a su versión de prueba.

¡Participa en el sorteo!

Como comentaba en el titulo, NDepend ha cedido muy amablemente una licencia de desarrollador, valorada en 399 Euros, para sortear entre los lectores de FixedBuffer.

Para participar, basta con escribir un comentario en este post (OJO, en la sección de correo electrónico hay que poner uno válido o no podré contactar), podéis aprovechar también para contarnos qué os parece NDepend o en qué pensáis que os podría ayudar, todo lo que os gusta FixedBuffer, o si hace frío o calor. La cosa es comentar algo para participar 😉

El sorteo se realizará el próximo domingo día 10 octubre de 2020 y consistirá en elegir al azar entre uno de los comentarios. Tras ello, me pondré en contacto con el autor para detallarle los pasos a dar para reclamar su licencia gratuita.

¡No dejéis de participar! ¡Suerte!

Edición 10-10-2020:
Felicidades Lorenzo, tu comentario ha sido el ganador!!!

La imagen muestra el resultado del sorteo donde se ve que Lorenzo es el ganador

16 comentarios en «Mejorando la calidad del código con NDepend (con sorteo de licencia!)»

  1. Acabo de leer el post y la verdad esta bastante interesante, pero me planteo una duda de NDepend

    ¿que diferencia aparente hay entre NDepend y sonarqube? he llegado a trabajar un poco con sonarqube y me parece que ofrecen bastante funcionalidad comun, por ver en que se pueden diferenciar

    Responder
    • Buenas Lorenzo,
      Gracias por tu comentario!
      La verdad es que si que ofrecen mucha funcionalidad común.
      La diferencia aquí creo que puede ser que NDepend esta mucho más especializado en .Net que Sonar, ya que es el target de NDepend mientras que Sonar soporta muchos más lenguajes.
      El tipo de gráficos que ofrece también tienen sus diferencias, por ejemplo el gráfico de dependencias personalmente me parece canelita 🙂
      Además si tiene una opción muy interesante que es que puede funcionar standalone en tu máquina sin instalar nada simplemente con el ejecutable (o extensión de Visual Studio) y en cambio en Sonar ya necesitas de un servidor de SonarQube o enviar los datos a SonarCloud.

      Un saludo

      Responder
    • Hola Bia,
      Muchas gracias por tu comentario, siempre es agradable leer cosas así! 🙂
      Intenté escribir cada semana en lugar de cada 2, pero eso me dejaba poco tiempo para otros proyectos.
      De todos modos, si tienes interés en leer más cosas que escribo, en la sección de colaboraciones voy apuntando todo lo que escribo en otros sitios.

      Un abrazo!

      Responder
  2. Si todavía tienes la licencia activa, estaría bien poder comparar con una misma base de código las 3 herramientas de análisis de código: Sonar, NDepend y Fxcop, para ver que reporta cada una

    Responder
    • Buenas Jesus,
      Pues no es mala idea la que propones la verdad. Si que es cierto que FxCop se queda un poco corto en el sentido de que no aporta analítica como si hace NDepend y Sonar.
      No obstante tomo nota de la sugerencia, muchas gracias! 🙂

      Responder
  3. gracias por el articulo super interesante..
    Consulta este apartado «5 días y 6 horas de esfuerzo para reducir la deuda técnica de C a B» Esos 5 dias se toman en base a 24 horas o una base de 8?

    Responder
    • Buenas Hugo,
      Pues la verdad es que no lo acabo de encontrar claro en ningún sitio, pero si veo que las fórmulas en general utilizan personas día, por lo que entiendo que hace referencia a jornadas de trabajo y no a días naturales (que por otro lado tiene sentido además)
      Un saludo

      Responder
  4. Muy buena publicación.
    Ya me gustaría probar este software, he usado SonarQube y es bastante útil.
    Un escenario donde puede ser util es con el Legacy, cuando heredas un software seguro que te ayuda con esa batalla.
    Por otro lado, este software hace una estimación de esfuerzo para resolver bugs, no se si has podido verlo pero ¿como es de buena?

    Un saludo y a ver si hay suerte.

    Responder
    • Buenas Iñaki,
      La verdad es que tampoco he probado a ver si el tiempo estimado en arreglar un bug es el tiempo que realmente tardo después. Ni con Ndepend ni con Sonar.
      Imagino que los cálculos se harán en base a algún dato bien estudiado. En cualquier caso ese tipo de fórmulas es habitual que se puedan editar para ajustarla y NDepend también lo permite.
      Un saludo

      Responder
  5. Excelente artículo, de verdad es una herramienta muy útil que ayuda a mejorar la arquitectura y diseño de los sistemas, me quedo una duda los desarrolladores de ndepend son los mismos que de JARCHITECT??

    Responder
    • Buenas Sergio,
      Pues la verdad es que en su web no pone nada sobre el tema, aunque son muchos los repositorios de Github donde ponen que NDepend colabora y les da licencias gratuitas.

      Supongo que es si se da el caso, es cuestión de escribirles un mail y preguntáselo. Si tienes algún proyecto en mente dime y les planteo el caso directamente 🙂

      Un saludo

      Responder

Deja un comentario