Dot.Blog

C#, XAML, Xamarin, UWP/Android/iOS

L’arme fatale : NDepend 5

[new:30/11/2013]Développer c’est bien. Refactorer c’est génial, mais interroger le code pour en connaitre ses secrets, ses faiblesses, son organisation, ses dépendances… C’est à la fois indispensable et un peu magique. NDepend version 5 va toujours plus loin pour vous aider dans ce data-mining dont la base de données n’est autre que votre propre code…

NDepend

Ce n’est pas la première fois que je vous parle de cet excellent outil qu’est NDepend. Le premier article date de janvier 2009… Et pour cause, cet analyseur de code me sert très souvent et même lorsque je n’en parle pas directement il se cache derrière certains articles…

Car NDepend est un outil indispensable pour maitriser son propre code mais il s’avère incontournable lorsqu’il s’agit de prendre possession rapidement d’un code complexe ou simplement grand écrit par d’autres.

Les grands articles de près de 100 pages ou plus que j’ai écrit sur des frameworks comme Mvvm Light, Jounce ou MvvmCross n’auraient pas pu être si complets et précis si je n’avais pas utilisé NDepend pour prendre possession du code source rapidement par exemple.

Tout code mérite d’être bien audité…

Mon métier consiste entre autre à faire des Audit de code. L’Audit c’est une opération de snipper : vous arrivez un matin dans une boîte où une équipe de 5 ou 10 gugusses ont pondu une usine à gaz de plusieurs millions lignes de code sur plusieurs années et on vous demande, rapidos, mais avec pertinence, d’en trouver toutes les faiblesses. Vous avez une demi journée de présentation par les intéressés, parfois moins, une doc, très souvent aucune, et un PC avec le code. Top chrono ! Le soir même il faudra s’être fait une idée rationnelle et pouvoir écrire un rapport qui ne soit pas juste du blabla, c’est à dire en donnant un avis professionnel motivé des forces et faiblesses du code, faire des propositions judicieuses pour améliorer l’ensemble, etc. Avec un peu de chance vous disposez d’une journée de plus pour étudier le code si les commanditaires ne sont pas trop près de leurs sous.

Vous voilà seul face à un tas de code imbuvable en si peu de temps, même s’il est bien écrit.

Vous avez votre expérience, votre expertise, et donc votre flair. Mais ce n’est pas tout… Il vous faut absolument une aide, un outil capable d’interroger le code, d’en faire un plan de masse, de vous montrer les connexions entre les diverses parties, les nœuds qui vont poser problème, le code spaghetti qui fait des appels à tout de partout, le respect des règles de base dans l’écriture des classes, des librairies, le couplage entre les différentes classes, la complexité moyenne de chaque bout de code, etc. Qu’il s’agisse d’obtenir des pistes pour savoir où chercher les grosses bévues sans perdre de temps, qu’il s’agisse de comprendre “comment ça marche”, de vérifier là où se trouvent les lourdeurs, les manques de commentaire, pour tout cela NDepend est indispensable.

Sans un tel outil il faudra compter uniquement sur votre expérience et votre flair et de la chance. Un Audit est un travail épuisant, court mais intense, je ne le survends pas, mais ce n’est pas cadeau non plus et chaque client mérite d’avoir le meilleur rapport, basé sur travail rationnel dans lequel la chance ou les aléas du flair doivent avoir le minimum de place.

NDepend est alors votre seul allié pour mener à bien la mission.

… Car l’Audit c’est notre métier à tous !

Tout le monde ne vend pas des Audits. C’est une évidence. Mais tout les développeurs pondent du code sur lequel, plus le temps passe, plus la quantité de lignes augmente, moins ils ont une vision correcte. Je le sais bien en tant qu’Auditeur ! Je vois hélas beaucoup de mauvais code, donc écrit par des développeurs pourtant pas mauvais le plus souvent. Bons, mais dépassés par leur “créature”, le nez dans le guidon, ils ne voient plus les problèmes. Il faut un œil extérieur et  objectif pour les ramener à la réalité. Un Audit est certainement le meilleur moyen d’obtenir cette vue objective, mais on ne peut pas demander un Audit toutes les semaines non plus… C’est là qu’un outil comme NDepend peut vous permettre d’avoir cet avis extérieur sur votre code et d’en conserver la maitrise.

Rares sont les entreprises qui ont le courage de se payer un Audit. Nous pas à cause du prix, n’exagérons rien, mais bien parce qu’il faut du courage pour affronter la qualité du code qu’on a produit. De fait tous les développeurs devraient être des Auditeurs au moins de leur propre code et de celui de leurs collègues dans leur équipe.

Tous les développeurs ont donc besoin d’un outil à la hauteur et cet outil existe, c’est NDepend.

La maitrise de la complexité, l’ABC du développeur

A partir d'une certaine taille le code d'une application devient difficile à maintenir même s'il est bien conçu. De même, la maintenance évolutive oblige souvent à mettre les mains dans un code écrit par d'autres (si ce code est assez ancien, on peut s'y perdre même en en étant l'auteur d'ailleurs !). Auditer un code est ainsi un besoin fréquent dans le travail de tous les jours d'un développeur sérieux. Si on effectue des missions d'audit ce besoin devient alors impérieux car il est nécessaire d'entrer rapidement dans un code "étranger" et toujours complexe. Mais finalement on a tous ce besoin, Audit ou pas !

Les outils d'analyse de code sont ainsi des compagnons indispensables. Hélas ils ne sont pas si nombreux que ça et comme tout ce qui touche la qualité, ils sont un peu "oubliés".

NDepend est puissant, il permet de construire et visualiser des comparaisons, d'auditer la qualité du code, et surtout de mieux visualiser la structure d'une application. Le tout quantitativement (métriques), qualitativement (l'information est pertinente) et graphiquement (le logiciel propose de nombreux diagrammes et schémas permettant de visualiser ce qui est invisible en lisant le code source : structures, dépendances, ...).

NDepend ne se limite pas seulement à l'audit de code, c'est aussi un excellent outil de refactoring.

On notera aussi, côté puissance, l'intégration d'un langage d'interrogation, le CQL (Code Query Language), permettant à la façon de SQL de "questionner" un projet et son code comme s'il s'agissait d'une base de données. La comparaison s'arrête là avec SQL car CQL "comprend" le code alors que SQL ne comprend pas le sens des données qu'il manipule. Cette grande différence confère à NDepend une très grande souplesse et beaucoup d'intelligence. Mieux, depuis la version 4, CQL est remplacé par CQLinq qui, vous l'aurez compris, offre une syntaxe LINQ plus moderne pour toutes les requêtes.

On peut ainsi écrire des choses très sophistiquées comme :

// <Name>UI layer shouldn't use directly DB types</Name>
warnif count > 0

// UI layer is made of types in namespaces using a UI framework
let uiTypes = Application.Namespaces.UsingAny(
                 
Assemblies.WithNameIn("PresentationFramework", "System.Windows", 
                                       
"System.Windows.Forms", "System.Web")
              
).ChildTypes()

// You can easily customize this line to define what are DB types.
let dbTypes = ThirdParty.Assemblies.WithNameIn("System.Data", "EntityFramework", "NHibernate").ChildTypes()
              
.Except(ThirdParty.Types.WithNameIn("DataSet", "DataTable", "DataRow"))

from uiType in uiTypes.UsingAny(dbTypes)
let dbTypesUsed = dbTypes.Intersect(uiType.TypesUsed)
select new { uiType, dbTypesUsed }

Mais CQLinq peut être aussi utilisé pour effectuer des requêtes plus simples permettant de questionner le code au gré des besoins, par exemple pour connaître toutes les méthodes qui ont été refactorées depuis la dernière release et qui ne sont pas encore totalement couvertes par des tests unitaires on écrira :

from m in Application.Methods where 
m.CodeWasChanged()  &&  m.PercentageCoverage <  100
select new { m, m.PercentageCoverage }

Comme on le voit les requêtes peuvent être simples mais d'une grande complexité dans leur signification. Il est bien entendu difficilement envisageable d'obtenir des réponses aussi précises, sans rien oublier, en balayant le code à la main sous Visual Studio !

NDepend est ainsi un outil de grande qualité dont on ne peut que conseiller l'utilisation. Réalisé par Patrick Smacchia, un acteur connu de la scène .NET, NDepend est vendu 299 euros en licence 1 utilisateur, c'est à dire pas grand chose au regard des immenses services qu'il peut rendre et ce prix n’a pas augmenté depuis des années, donc il a baissé alors que le produit n’a cessé de s’améliorer...

Une évolution constante

Depuis ses premières versions NDepend s’étoffe et devient de plus en plus puissant. Depuis la version 3 il a su s’intégrer totalement dans Visual Studio pour être encore plus facilement accessible par exemple.

La version 5 disponible depuis peu apporte elle aussi son lot d’améliorations et de services indispensables comme par exemple le support pour Visual Studio 2013 (ainsi que des versions 2012, 2010 et 2008), la présence d’un nouveau Dashboard qui présente les principales métriques du code, le monitoring des tendances pour surveiller l’évolution du code dans le temps, de nouveaux filtrages pour obtenir uniquement les avertissements sur le code ajouté depuis la dernière analyse, des rapports encore plus pratiques, etc… Bien entendu toutes ces nouveautés s’ajoutent aux puissantes fonctions déjà présentes et s’accompagnent de nouvelles règles de contrôle du code, d’une modernisation permanente de l’UI…

NDepend est un produit mature et la version 5 pousse encore plus loin les limites de l’outil tout en le rendant encore plus convivial et plus simple.

Votre code est une mine d’or !

Votre code est une mine d’or sans que vous le sachiez… Car comme toute mine il faut y mettre les moyens techniques pour en faire sortir de l’or ! Et ces moyens sont concentrés dans NDepend.

Le Dashboard par exemple permet d’obtenir une vue synthétique sur l’ensemble du code et de ses métriques, le tout est paramétrable en fonction des besoins de chacun et de chaque projet;

Trend Charts on the NDepend Dashboard

Les graphes de dépendance, l’analyse des lignes de code utiles, plus de 80 métriques différentes permettent de sonder le code en un clic !

Selection by Metrics and display the set of methods selected on the Metrics View

Comprendre les appels entre les différentes classes, les différentes librairies qui composent le code permet de voir rapidement où se pose les problèmes de couplages trop fort par exemple…

A generated graph of dependencies between some classes of System.Collections.Generic

Un outil ultra complet

NDepend est un outil particulièrement complet, quelque soit le code que vous écrivez vous trouverez des utilisations de NDepend qui vous rendrons réellement service.

Multi-facettes, NDepend est capable de choses incroyables, rapidement :

  • Vérifier des règles de code
  • Exécuter des requêtes sur le code
  • Calculer des métriques pertinentes
  • Comparer des builds différents
  • Comparer des codes entre eux (Différentiel)
  • Générer des graphiques de tendances pour vérifier l’évolution de la qualité du code dans le temps
  • Mettre en évidence la structure intime d’un code, les appels entre classes, les dépendances créées, l’importance des blocs en fonction de leur nombre de lignes ou d’autres critères
  • Vérifier l’immutabilité des valeurs et la pureté des méthodes, très utile en programmation multi-tâche (qui se généralise avec les processeurs multi-cœurs) – une méthode pure étant une méthode qui ne change pas l’état de l’objet (qui reste donc immuable pour se prémunir des effets de bord)
  • Vérifier le pourcentage de couverture en tests unitaires par importation des données de Visual Studio Team System ou de NCover
  • Détecter les cycles entre composants ou classes d’une application
  • Mesure la complexité d’un code pour savoir où porter des améliorations immédiatement
  • Générer des diagrammes interactifs pour rendre toutes ces analyses utilisables facilement et parlantes
  • Générer des états précis pouvant être facilement communiqués ou archivés
  • Etc…

C’est déjà une liste impressionnante de services absolument uniques. Mais NDepend va encore plus loin, il est doté d’une API publique, NDepend.API, qui peut être utilisée pour créer ses propres outils d’analyse. Des exemples sont fournis, par exemple détecter du code dupliqué. Chacun est libre de se créer ses propres outils pertinents pour un projet ou une stratégie de développement globale.

Conclusion

J’utilise NDepend depuis des années. C’est un outil de travail aussi indispensable que peut l’être Resharper dans un autre domaine. C’est quand on installe une nouvelle version “nue” de Visual Studio qu’on s’aperçoit que ces outils là manquent. Ils semblent si naturels qu’on les utile sans même se rendre compte qu’en réalité on dispose d’une puissance absente de Visual Studio pourtant déjà très riche.

Il est difficile de garder le cap, maitriser la complexité de son code, aller droit au but quand on cherche une anomalie, une lourdeur, un effet de bord et milles autres détails qui font de notre métier un art plus qu’une science.

Tout comme le chaos en physique peut fort bien apparaitre dans des systèmes où pourtant toutes les règles physiques sont connues (car c’est de la sensibilité aux conditions initiales que nait alors la difficulté de prévoir l’évolution du système), l’informatique a beau se reposer sur des principes et des machines parfaitement déterministes, écrire une application d’une certaine taille fait naitre des situations nouvelles et incontrôlables. Seule le respect de certaines guidelines ou méthodologies alliées à une grande expérience permettent de limiter la casse. Limiter seulement car aucun code n’a zéro défaut même produit par les meilleures équipes du monde. Car le flair et les méthodes les plus sophistiquées ne font pas tout, nous ne sommes que des humains et une application moderne par sa complexité est chaotique par nature.

Nous sommes donc faillibles, comme le code que nous produisons.

Pour combler nos failles nous avons besoin de nous reposer sur des outils de qualité qui inlassablement, mécaniquement mais en transposant une part de notre intelligence et en la répétant des millions de fois sans se tromper, vont superviser le code que nous produisons, le surveiller et nous alerter là où nous n’aurions rien vu.

NDepend fait partie de ces outils indispensables en cela qu’il permet de limiter encore un peu plus la dérive inhérente à tout code qui fait quelque chose d’utile et ce en donnant au développeur les moyens de reprendre la main sur la complexité de ce code. C’est un complément indispensable aux tests unitaires qui eux permettent de vérifier qu’un code ne régresse pas. Encore faut-il tout tester et correctement. NDepend peut aussi intervenir pour aider à mieux écrire les programmes de test qui, en tant que programmes écrits par des humains, souffrent exactement des mêmes problèmes que le code qu’ils sont censés contrôler !

Vous êtes encore là ? Tsss … foncez téléchargez la version de démo de NDepend et contrôlez par vous-mêmes à quel point cet outil peut vous être utile !

Et Stay Tuned !

blog comments powered by Disqus