Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 28 de noviembre de 2017
Ya tenemos ganador del sorteo, muchas gracias a todos por participar. ¡Enhorabuena @jordimoz!

Podríamos decir que NDepend es un clásico en el mundo de las herramientas que nos ayudan a mejorar la calidad de nuestro software. Creado por Patrick Smacchia en 2004, pasó a ser comercial en 2007, y desde entonces ha ido mejorando con el objetivo de permitirnos analizar nuestros proyectos desde una perspectiva que difícilmente podríamos conseguir con otras herramientas.

Ya le echamos un vistazo por aquí hace muchos años, y tenía interés por ver cómo había evolucionado el producto y cómo se había adaptado a los cambios en plataformas y tecnologías que se han producido desde entonces, para lo que Patrick me ha brindado amablemente una licencia del producto.

Pero no contento con eso, y sabiendo que tenemos afición a regalar productos para desarrolladores de vez en cuando, también ha cedido una licencia de desarrollador, valorada en 399 Euros para sortear entre los lectores del blog :)
Nota: es importante aclarar que lo que vais a leer a continuación no ha sido filtrado ni condicionado en ningún momento por el equipo de NDepend.

Qué es NDepend

Se trata de una herramienta, enfocada a desarrolladores y arquitectos software, que realiza análisis estático de proyectos .NET y .NET Core, cuyo objetivo es ofrecernos interesantes métricas sobre la calidad de nuestro código y el estado interno de los proyectos.

Puede utilizarse tanto en tiempo de diseño como incluido en procesos de build o integración continua, por lo que, además de disponer de un ejecutable standalone y una extensión para Visual Studio, dispone de integraciones con herramientas como TFS, Teamcity, Jenkins y algunas más.

Integraciones NDepend

La instalación básica es bastante sencilla y poco intrusiva, pues se distribuye en un archivo .ZIP en cuyo interior encontramos un ejecutable que podemos utilizar de forma directa para abrir el GUI de NDepend, llamado Visual NDepend. Si queremos usarlo integrado en alguno de los productos citados anteriormente, sí tendremos que lanzar los instaladores incluidos en el comprimido, o bien lanzarlos desde el interfaz gráfico del producto.

Para qué sirve

A diferencia de otros productos, como los analizadores estáticos incluidos en la versiones recientes de Visual Studio (la evolución del difunto FxCop), NDepend no se queda en avisarnos de aspectos puramente sintácticos, detección de code smells o recomendaciones de de buenas prácticas (cosa que también hace), sino mira bastante más allá, ofreciéndonos una visión global de muchos aspectos importantes para conocer la salud de los proyectos.

Por ejemplo, con NDepend podemos responder, entre otras, a las siguiente preguntas:
  • ¿Qué partes de mi proyecto son más complejas? ¿O cuáles consumen más líneas de código?
  • ¿Qué clases, métodos u otros elementos son los más referenciados? ¿O desde dónde referenciamos más componentes? ¿Y cómo de acoplados están estos componentes?
  • ¿Qué deuda técnica tiene mi proyecto? ¿Dónde exactamente? ¿Y cuánto tiempo costaría dejarlo en orden?
  • ¿Qué módulos, bloques o áreas de mi aplicación inclumple más reglas de calidad de código?
  • ¿Qué cambios se han introducido entre dos versiones de mi producto? ¿Qué componentes han sufrido variaciones?
  • ¿Qué tendencias tiene mi proyecto, o cómo evoluciona a lo largo del tiempo en cuanto a introducción de deuda técnica, problemas en código, cobertura de tests, u otras métricas de calidad?
Pues si os gustaría conocer las respuestas a algunas de las cuestiones anteriores, quizás os valga la pena echar un vistazo a NDepend, sobre todo si trabajáis en proyectos grandes, complejos y con muchos años de evolución a sus espaldas, de los que no es fácil tener una visión completa.

Radiografiando un proyecto

Para analizar un proyecto, lo primero es abrirlo utilizando Visual NDepend, el GUI del producto, o bien desde Visual Studio (si hemos instalado la integración). Podemos abrir soluciones VS, proyectos, o incluso ensamblados de forma directa.

Tras seleccionar los ensamblados que nos interesa analizar, NDepend se llevará un ratillo trabajando en segundo plano. En las pruebas que he hecho con proyectos relativamente pequeños no pasaba de cinco o diez segundos; he probado también a cargar una solución con más de 20 proyectos y pasó ligeramente de treinta segundos.

Una vez terminado este proceso ya podremos comenzar a obtener información, tanto a través del informe en HTML que genera, como desde el propio dashboard del producto. La verdad es que, al principio, la cantidad de datos que tenemos a nuestra disposición es apabullante y podemos sentirnos un poco abrumados por su aparente complejidad; ya cuando pasamos un rato investigando y descubriendo opciones es cuando empezaremos a ver su sencillez de uso y el auténtico potencial de esta herramienta.

Por ejemplo, nada más empezar, tendremos una visión global del proyecto en base a distintas métricas: archivos, líneas de código, número de ensamblados, clases, métodos y otros tipos de elementos, comentarios, issues detectados, reglas violadas, complejidad de los métodos, deuda técnica acumulada y un largo etcétera. La siguiente captura de pantalla muestra este dashboard si analizamos el célebre proyecto Automapper:

Dashboard de NDepend

Seguro que algunos os estaréis preguntando qué criterio sigue NDepend para evaluar la deuda técnica de un proyecto: pues bien, en primer lugar se detectan code smells que frecuentemente son indicativos de este tipo de problema, como pueden ser clases con muchos métodos, métodos con muchos parámetros, interfaces extensos, dead code, ruptura de LSP, visibilidad incorrecta, etc. Partiendo de estos problemas, y aplicando medias conocidas (y en cualquier caso configurables), NDepend puede calcular las horas-hombre necesarias para corregirlos y el impacto que tendría el dejarlos sin corregir (interés anual).

También, basándose en el método SQALE (Software Quality Assessment based on Lifecycle Expectations), un estándard de evaluación de deuda técnica, se otorga una clasificación que varía entre “A” (entre 0 y 5% de deuda) y “E” (más del 50%). Por ejemplo, en el caso de Automapper, podemos ver en la captura anterior que con un 13% de deuda, su rating es “C”.

Si os interesa el tema, podéis leer más información en la documentación del producto.

Volviendo al dashboard, cada uno de los elementos mostrados actúan como hipervínculos que podemos utilizar para obtener más detalles del mismo. Continuando con el caso anterior, si nos centramos en los datos de deuda técnica, podemos pulsar sobre el valor “13,27%” y eso os llevaría a ver qué reglas son las que aportan mayor cantidad de deuda. O si lo hacemos sobre el rating, podremos ver los tipos que acumulan mayor deuda técnica.

Antes de que se me olvide comentarlo, un aspecto muy interesante de NDepend es la vista de evolución. Una vez salvamos el proyecto, podemos ir viendo los cambios de cada uno de los indicadores respecto a las versiones anteriores, lo que nos permite también vigilar la evolución de la aplicación y sus distintas métricas a lo largo del tiempo.

También desde el dashboard podemos consultar las reglas e issues que tenemos en nuestro código, clasificados en función de su severidad: bloqueantes, críticos, importantes, etc. Aunque NDepend viene con bastantes criterios ya “precocinados”, es posible añadir reglas personalizadas utilizando CQLinq, un lenguaje de consulta concebido exclusivamente para escudriñar en nuestro código.

Este lenguaje, que de hecho es una de las bases sobre las que descansan gran parte de las funcionalidades de NDepend, ofrece muchísima flexibilidad y potencia a la hora de realizar consultas sobre nuestra base de código. Por ejemplo, si queremos queremos conocer qué tipos utilizan la clase Mapper en el espacio de nombres Automapper, podemos crear una nueva consulta como la siguiente y ejecutarla desde el mismo entorno:
from t in Types where t.IsUsing ("AutoMapper.Mapper")
select new { t }
El resultado, además de obtenerlo en forma de lista que podemos ir recorriendo, también podemos exportarlo como diagrama, obteniendo algo como lo siguiente, donde podemos hacer que el tamaño de los bloques sea proporcional a su número de líneas de código, y el grosos de los conectores al de su grado de acoplamiento:

Grafo de dependencias

Y es que otro aspecto donde NDepend destaca frente a otro tipo de productos es en su capacidad de representar de forma gráfica la información sobre el proyecto. Por ejemplo, fijaos qué hermosura de matriz de dependencias genera con Automapper, y lo claro que resulta ver, en este caso agrupado por espacio de nombres, las dependencias del proyecto:

Matriz de dependencias

Como en otras ocasiones, podemos ir desplegando los elementos para obtener información sobre elementos específicos, como clases o miembros de éstas.

Otra joya interesante que descubrimos al poco de comenzar a utilizar la herramienta es la representación gráfica de métricas de código tan diversas como la cantidad de líneas de código, la complejidad ciclomática, sus niveles de herencia, etc., agrupado a nivel de ensamblado, espacio de nombres, tipos o incluso métodos.

La cantidad de información que podemos obtener de un solo vistazo es impresionante. Por ejemplo, en la siguiente captura mostramos las clases de la aplicación representadas en bloques cuyo tamaño es proporcional al número de líneas de código que las implementan, y cuyo color muestra la complejidad ciclomática que encontramos en ellas (siendo rojo la complejidad mayor, y amarillo la menor):

Métricas de código

Simplemente echando un ojo ya podemos saber dónde están los puntos más complejos de la base de código (ciclomáticamente hablando, claro), y qué tipos son los que acumulan mayor cantidad de líneas de código, aunque podemos consigurar la gráfica para consultar otras métricas. De nuevo, desde este punto podemos ir profundizando en cada elemento para obtener más información, o incluso acceder al código fuente directamente (o, si no lo tenemos, descompilarlo utilizando el viejo conocido Reflector).

Otra fuente de información que, opcionalmente, puede utilizar NDepend para ayudarnos durante la vida del proyecto es la generada desde los principales sistemas de análisis de cobertura de código de pruebas, como NCover, o VSTS. Analizando esta información, la aplicación podrá integrarla en los informes, gráficas y diagramas para, de nuevo, ofrecernos una visión de cómo evoluciona la cobertura de código a lo largo de las distintas versiones, así como mapas visuales que resaltan claramente dónde la cobertura es mayor o menor respecto al resto de la aplicación.

Lo que es seguro es que el resultado de estos análisis no os dejará indiferentes. Al pasar NDepend a proyectos propios, que son los que más duelen, probablemente comprobaréis que ese proyecto de cuya implementación estáis tan orgullosos tiene más deuda técnica de la que sería deseable, que el aroma de los code smells rezuma por doquier o asentiréis resignados al descubrir que las zonas “calientes” detectadas por NDepend coinciden precisamente con las que da más miedo tocar por si rompemos algo.

Pero, como mínimo, aprenderemos mucho sobre cómo debemos hacer las cosas :)

Recapitulando

NDepend es una interesante herramienta que nos ofrecerá una visión muy profunda, y distinta a lo que conocemos actualmente, de nuestros proyectos .NET y .NET Core. Es especialmente útil en proyectos de gran tamaño o con mucho tiempo de vida donde es interesante disponer de una vista global del estado en el que se encuentra su código.

También puede ayudarnos a controlar la deuda técnica siguiendo buenas prácticas y evitando errores frecuentes durante todo el ciclo de vida del desarrollo de proyectos, pues tanto podemos utilizarlo en modo stand alone, útil para cuando necesitamos analizar un proyecto de forma manual, como incluirlo en procesos de build o en sistemas de integración continua para un control más continuo.

Finalmente, decir que se trata de una herramienta comercial cuyo precio es posible consultar en la página oficial. Si no tenéis claro si es para vosotros, podéis descargar la trial de 14 días y aprovechar ese tiempo para comprobar de primera mano lo que os puede aportar en función de los proyectos que manejéis, los controles de calidad que queráis aplicar a los mismos, y el seguimiento continuo que queráis hacer a partir de ese momento.

No dudéis en probarlo, porque, muy probablemente, lo que descubriréis con NDepend no os dejará indiferentes.

¡Participa en el sorteo!

Sorteo de licencia Como comentaba más arriba, NDepend ha cedido muy amablemente una licencia de desarrollador, valorada en 399 Euros, para sortear entre los lectores de Variable not found :)

Para ello, utilizaremos la misma fórmula que otras veces: para participar basta con escribir un comentario en este post, en el que, al menos, deberíais incluir algún dato que me permita ponerme en contacto con vosotros si resultáis premiados (email, twitter…). Si queréis, 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 este blog, si sois más de Coca-Cola que de Pepsi, o si está lloviendo por vuestra ciudad. La cosa es comentar algo para participar ;)
Ojo: Recordad que los robots rastreadores están siempre al acecho, así que si váis a poner en el comentario vuestro email es mejor que lo hagáis con algún tipo de “ofuscación” ingeniosa que impida su lectura automatizada, pero que yo sea capaz de entender fácilmente si sois agraciados, por ejemplo como en “juanXXgonzalez@myserverXXcom”.Replace(“XX”, “.”).
El sorteo se realizará el próximo domingo día 3 de diciembre ante notario (jejeje, mentira: sólo estaremos yo y una instancia de System.Random), y consistirá en elegir al azar uno de los comentarios publicados. 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!

Publicado en Variable not found.

46 Comentarios:

Unknown dijo...

Una herramienta increible.
sergio(dot)m(dot)calzada@gmail(dot)com

Unknown dijo...

Buena herramienta, quiero pàrticipar!

Javier Ros dijo...

El 3 de diciembre es mi santo, estoy obligado a participar.

Indudablemente esta herramienta es super útil.

@tolemac_jros

Unknown dijo...

Increíble herramienta! Me encantaría tenerla en mis proyectos.

Excelente post!

sergiomar73@gmail(dot)com

Goph LB dijo...

mis comienzos en esto de la programación fueron en una empresa que construía (y sigue en ello) un analizador estático de código, así que le tengo un especial aprecio a este tipo de herramientas.

siempre me han parecido increíblemente útiles y, seamos sinceros, los gráficos y datos que pintan molan mucho :)

gophlb(arroba)hotmail(punto)com

Nelson Simão dijo...

Herramienta increíble y además excelente post!

nelson8000[at]gmail[dot]com

Saludos de un español desde Brasil.

Manolo Nacher dijo...

Buenas! Excelente herramienta, la verdad es que me gustaria mucho disponer de ella y asi seguir siempre mejorando. Que para eso estamos aqui, no?

Gracias por compartirla.

manolo(guionbajo)10(guionbajo)(arroba)hotmail(punto)com

Fran dijo...

Vaya recuerdos, estuve haciendo alguna prueba con él allá por el 2010... y si hubiera tenido un artículo como este a mano, igual le hubiera sacado partido.

Como ha dicho un compañero, además mi santo también es el día 3 XD.
franjruiz[arroba]gmail(punto)com

Unknown dijo...

Buenas me parece muy interesante la herramienta, nunca he tenido la oportunidad de trabajar con ella pero se ve que es de gran ayuda.
Ojala me la gane

halm0291(arrroba)gmail(punto)(com)

Gracias a ustedes por la gestión.

Juan Diego dijo...

Excelente herramienta, sería genial contar con ella y aprovechar todas las características que mencionas para mantener nuestro código.

Muchas gracias,

diegox77[arroba]gmail(punto)com
twitter [arroba]Juandf_v

Alejandro Escobar dijo...


Buen Día.

Herramienta interesante la cual me seria de mucha utilidad, espero poder probarla.

Twitter: [arroba]AlejoEscobar[GuionBajo]
Correo: elbra18[arroba]gmail[punto]com

Unknown dijo...

jaime(punto)camargo(arroba)gmail(punto)com

Desde Colombia, lejos pero cercanos en internet. Gracias.

Anónimo dijo...

Se mira muy interesante me gustaria participar

caravantes[at]outlook[dot]com

Miguel Quiroz dijo...

Esto es sumamente util e interesante, me gustaria participar

ing(punto)quiroz(arroba)outlook(punto)com

Gracias y saludos!

Alberto dijo...

Participo en el sorteo, tengo curiosidad por probarlo, sobre todo el proyectos caseros en los que tengo más control.

pujatolon(arroba)gmail(punto)com

Gracias!!

Michael-Jorge Gómez dijo...

Lo quiero para mí porque soy un cleptómano y lo necesito grrr WIN!!!

michakun[at]gmail[dot]com (que complicaos sois con el correo con letritas pero no voy a ser menos!!)

Francis Matamoros dijo...

Gracias por el sorteo. Espero aprender a utilizarla para aprovechar esa licencia.
francis{dot}matamoros{arroba}hotmail{dot}com

Unknown dijo...

Suerte a todos.

String.Format("cesaredj{0}gmail{1}com", "@", ".");

Javier Cantos dijo...

Es mi dia asi que seria un buen regalo

Vela dijo...

Me interesa!!

"fjvela at gmail dot com"
.Replace(' ','')
.Replace("at","@")
.Replace("dot",".")

JFM75 dijo...

La verdad que la herramienta me ha parecido sumamente útil e interesante, y me gustaría participar en el sorteo.

"jfmiranda75 at hotmail dot com"
.Replace(" at ","@")
.Replace(" dot ",".");

Gracias y un saludo.

Radhull dijo...

Buenos días

Herramienta muy interesante.

Me gustaría participar en el sorteo

Un saludo

Antonio A. Carrillo dijo...

Esta herramienta parece indispensable para los proyectos que tienen que sobrevivir en el largo plazo. También me gustaría participar.

Saludos.

Javier Campos dijo...

Participemos pues! (tw: @javiercampos)

Unknown dijo...

al ataquerrr!
@franjfgcarmo
franjfgcarmo gmail

Mats! dijo...

No he utilizado nunca una herramienta así. Sería interesante probar.
Muy buen blog... hace años que lo sigo.
mcompa[at]gmail[dot]com

Saludos

Francisco Serrano dijo...

¡Probablemente la herramienta se vuelva loca si analiza algunas partes de mi código, jeje!. (pserranopESTOESLAARROBAmsnESTOESUNPUNTOcom)
¡Gracias!

Miguel dijo...

Cruzaremos los dedos! twitter.com/mdelvallemurcia

Unknown dijo...

Nunca había usado antes esta herramienta, pero he probado la versión de prueba y me ha parecido FASCINANTE.

canichillo[at]gmail[dot]com

Apertil dijo...

Lo bueno de este blog es que siempre encuentras algo interesante, y este post es uno de estos casos.

La herramienta tiene una pinta excelente dicho sea de paso.

apertil(arroba)gmail(punto)com

Sergio dijo...

Ufff,

demasiado bueno para creer. Analizar la deuda técnica? Espero poder tener la oportunidad de probarlo ;)

sergio(punto)calleja(arrobá)gmail(punto).com

Unknown dijo...

esperemos ganar

twitter: [arroba]netsky01

Fran V. dijo...

Parece interesante, espero poder probarla :D

fran[guionbajo]vibora[arroba]hotmail[punto]com

Goodyr dijo...

Interesante herramienta. A ver si tengo suerte!

Dariovillar dijo...

Muy interesante la herramienta. Vamos a meter ficha, a ver si hay suerte. dariovillar arroba hotmail punto com

Joseba dijo...

La herramienta me vendría al pelo para ayudarme con un sitio web tipo herencia técnica que alguien ya jubuilado hizo en su moomento.

Por cierto, yo soy más de zumos naturales. Eso de beber azucar ya no lo peta ;-)

joseba_rguez(algarroba)hotmail(puntazo)com

Anónimo dijo...

Realmente me gustaría hacer una comparación entre esta herramienta y SonarQube, y comparar los resultados de ambos.

Un saludo

@Jonathan_JFR

Jonatan Rodríguez Suárez dijo...

pos eso
yoniyoni1987arrobagmailpuntocom

Unknown dijo...

Muy interesante!!! Gracias fenómeno!
@carlos_lande
CarlosLanderas Gmailcom

jorge.serrano dijo...

Muy buena entrada José María.

Y muy buen producto, por supuesto. :)

Anónimo dijo...

Que buen producto! me gustaría integrarlo con SonarQube

twitter: @jordimoz

Arsenio Inojosa dijo...

arsenioi4@hotXXX.com”
.Replace(“XXX”, “mail”)

Diego dijo...

Es tarde y tengo frio!
Pero me gustaria lo de la licencia :)

@diego_hi

Iñaki dijo...

Estaría muy bien poder ganar la licencia.
jipcgr(arroba)gmail(punto)com

Unknown dijo...

Me parece una herramienta increíble y que me resultaría muy útil.
carnicerosmith(arroab)gmail(punto)com

Unknown dijo...

Que herramienta más interesante.

corralperez(aroab)gmail(unto)com