Dans le bâtiment, livrer un immeuble avec des murs de guingois, des fondations en sable et des termites à tous les étages, c'est impossible ou presque. Pourtant l'équivalent dans le monde de l'informatique est courant : du moment que ça marche conformément au cahier des charges, le client est heureux.
C'est cool l'informatique
Evidement un peu plus tard, les couts des corrections et évolutions lui feront peut-être comprendre que son système est loin de l'optimal. Ou pas, puisque tous ses systèmes sont sans doute du même acabit… L'informatique, le paradis des escrocs ?
[Raaaa mais laissez moi caricaturer en paix, enfin quoi. Précisons aussi que je ne parle pas dans ce billet des livrables à courte durée de vie tels que les
sites Web évènementiels, dont les qualités attendues sont bien différentes
de celles des systèmes amenés à durer]
Pas sûr. Si on donne aux clients les moyens de rendre tangible la qualité du code, ils doivent pouvoir toucher du doigt les faiblesses du code aussi rapidement qu'ils perçoivent les murs fissurés.
Autant que j'ai pu en voir pendant un test rapide, NDepend fait parti des logiciels qui rendent le code et ses défauts "palpables" en quelques clics.
Du global au détail
Lancé sur un de mes projets personnels à partir des dlls et exe qui composent l'application développée en c#, j'ai immédiatement à ma portée plusieurs angles d'analyse :
En sélectionnant l'angle "code quality", les méthodes qui "sentent mauvais" sautent au nez :
Un clic sur la ligne "Method too big" me permet de voir instantanément les coupables, en l'occurrence surtout des initialiseurs de WinForms générés par l'IDE (mais j'avoue, pas seulement) :
La navigation est intuitive, on peut cliquer chacune de ces méthodes pour les éditer.
Documenter l'architecture
Une autre visualisation intéressante de NDepend est le graphe des dépendances. En quelques instants, NDepend produit un graphique capable de faire office de documentation pour les nouveaux développeurs de l'équipe comme pour le consultant en train de mener un audit. L'éventuelle complexité des dépendances et faiblesse du design devient évidente :
Le graphe est interactif et permet d'identifier en quelques clics des dépendances pathologiques, par exemple la curieuse relation entre Altercept.Repository.Database et Altercept.WatcherLib.Editor.
De la métrique avant toute chose
NDepend contient d'autres procédés de visualisation de données, notamment les matrices croisées et les treemaps, et d'autres façons simples de naviguer d'une visualisation à une autre. Le plus souvent, le graphique intègre les mesures réalisées sur les modules analysés. Il s'agit de métriques telles que le nombre de lignes, le nombre d'instructions IL, le nombre de connexions afférentes et efférentes (méthodes appelées, appelantes), la complexité des méthodes (nombre de if, while, for, etc.), et beaucoup d'autres. Chacune de ces métriques peut être exécutée au niveau méthode, classe, namespace, champ ou assemblée.
Ainsi les treemaps associent la mesure sélectionnée par l'utilisateur à la surface des rectangles. Idem pour le graphe de dépendance, dans lequel chaque module représente la métrique sélectionnée par la surface qu'ils occupent ou par la taille de leur police.
Personnalisation via Code Query Language
La définition de ce qu'est un code de qualité peut évidemment se discuter. Du reste elle dépend du contexte. A une extrémité du discutable on trouve le respect des conventions de codage, variable d'une entreprise à une autre, voire d'un projet à un autre. Les seuils de déclenchement des alertes (longueurs d'une méthode, nombre de méthode sur une classe, etc.) sont aussi sujet à discussion.
Pour faire face à cette variabilité, NDepend expose sa mécanique de vérification des contraintes de qualité à travers des requêtes qui s'exécutent sur le code analysé. Le formalisme des requêtes, écrites en CQL, est très proche de SQL.
Par exemple, une contrainte sur le nombre maximum de paramètre s'écrit en CQL :
WARN IF Count > 0 IN SELECT METHODS WHERE NbParameters > 5 ORDER BY NbParameters DESC
Pour détecter les interfaces qui ne respectent pas une convention de nommage (commencent par 'I') :
WARN IF Count > 0 IN SELECT TYPES WHERE IsInterface AND !NameLike "^I"
Plus d'exemples sur cette spécification de CQL : http://www.ndepend.com/CQL.htm
C'est pour qui ?
A mon avis NDepend est un must-have pour tous ceux qui doivent auditer la qualité d'un système à la livraison ou en production, qu'ils soient consultants auditeurs, responsables MOE interne ou architectes. Les prestataires escrocs, qui livrent des systèmes déstructurés bourrés de méthodes obèses, ceux qui produisent du jetable quand on leur avait demandé de l'évolutif, ceux-là sont vite démasqués.
Je vois bien aussi NDepend dans la main des chefs de projets techniques pour partager une vue globale du système en cours de développement et de son évolution. Le graphe de dépendances est déjà une documentation de l'architecture.
D'autre part NDepend peut aussi analyser le code modifié/ajouté/supprimé entre deux versions, Cf. l'analyse de la toute dernière livraison de .Net 4.0.
Des (petits) regrets
Juste deux petits regrets. D'abord je trouve dommage que la vue treemap ne puisse pas afficher deux mesures simultanément. Pour moi les treemaps c'est fait pour ça : la surface représente une mesure, la couleur en représente une autre. C'est par exemple le cas de cette représentation du marché qui associe la capitalisation des entreprises à la surface et l'évolution de leurs cours à la couleur.
Ensuite, je regrette que NDepend n'offre aucun moyen de détecter le code dupliqué, réputé génant vis-à-vis de la correction (code dupliqué -> bugs dupliqués) et de l'évolution (code dupliqué -> évolution dupliquée) du code. Il va falloir que je teste Clone Detective.
NDepend papa
Pour une fois que ça se passe dans se sens là, ça vaut le coup d'être souligné, ne serait-ce que pour l'Histoire : NDepend est le papa d'un petit Depend dans le monde Java, il est commercialisé sous le nom de XDepend par OCTO Technology (ce n'est pas tant que les J majuscules soit passés de mode, mais il semble que JDepend soit déjà pris).
Un très beau succès de Patrick Smacchia, créateur de NDepend.
Les commentaires récents