Etude statistique de la fiabilité d'un fichier au sein d'une architecture logicielle

L'analyse statistique de la fiabilité d'un fichier nécessite d'évaluer deux dimensions essentielles sur un nombre important de fichiers:

  • la fiabilité d'un fichier
  • des mesures susceptibles d'expliquer cette fiabilité

Une fois ces données collectées, le principe de l'analyse est simple : on calcule un modèle statistique qui explique au mieux la première dimension par la seconde.

On procède donc en trois étapes.

Premièrement, on lance un programme, svnSniffer, qui lit le dépôt SVN d'un projet, et qui, pour chaque fichier commité, compte le nombre de fois où il est marqué "buggé". On a donc une mesure - approximative, mais c'est mieux que rien - de la fiabilité d'un fichier.

Deuxièmement, le svnSniffer lance le logiciel Php_Depend qui calcule différentes métriques(*) , les récupère et stocke le tout dans une base de données.

Troisièmement, on construit un modèle statistique (modèle de Poisson) qui explique au mieux le nombre de fois où un fichier commité est marqué "buggé" en fonction des métriques calculées par Php_Depend.

Les résultats de cette analyse sont présentés dans un histogramme représentant les effets - positifs ou négatifs - des quatre variables (métriques) les plus significatives pour expliquer le niveau de fiabilité d'un fichier, dont voici un exemple pour le logiciel Typo3 (écrit en PHP). On présente également l'histogramme de la répartition du nombre de bugs pour ce logiciel ainsi que la représentation des fichiers qui le constituent dans le plan des deux facteurs principaux dégagés par le modèle.

On peut y distinguer deux choses en particulier : le nombre de contributeurs par fichier est fortement corrélé avec les bugs alors que ce sont les commentaires qui indiquent le mieux la corrélation inverse. Bref sur Typo3 mieux vaut ajouter des commentaires qu'augmenter le nombre de contributeurs.

On verra d'autres projets par la suite...

NB : la variable "comments" est ici le ratio du nombre de lignes de codes commentées par le nombre de lignes non commentées. Cela indique donc une importance relative des commentaires vis-à-vis du "code pur", et permet de mesurer l'effet d'un code abondamment - ou peu - commenté sur la fiabilité d'un fichier.

(*) Les métriques calculées par phpDepend et leurs définitions sont disponibles à l'adresse http://www.manuel-pichler.de/pages/php_depend.html

En voici le détail :

ClassLevel (Class)
  • dit: profondeur de l'arbre d'héritage
  • impl: nombre d'interfaces implémentées
  • cis: taille de l'interface de classe
  • csz: taille de la classe
  • vars: nombre de propriétés définis par la classe
  • varsi: nombre de variables propres et hérités par classe
  • varsnp: nombre de variables publiques par classe
  • wmc: valeur pondérée des méthodes par classe (sommes de la complexité cyclomatique par classe)
  • wmci: valeur pondérée des méthodes par classe + WMC héritée
  • wmcnp: valeur pondérée des méthodes publiques par classe
CodeRank (Class, Package)

Une adaptation de l'algorithme PageRank de Google pour des classes et des packages.

  • cr: Forward CodeRank (basé sur les noeuds entrants)
  • rcr: Reverse CodeRank (basé sur les noeuds sortants)
Coupling (Project)
  • calls: nombres de méthodes et de fonctions appelées
  • fanout: nombre de types référencées
Cyclomatic Complexity (Project, Method, Function)
  • ccn: complexité cyclomatique
  • ccn2: complexité cyclomatique étendue
Dependency (Package)

Pour avoir plus de détails, voir How reusable, extensible and maintainable is your software?.

  • ca: Afferent coupling
  • ce: Efferent coupling
  • a: Abstraction
  • i: Instability
  • d: Distance
Hierarchy (Project)
  • clsa: nombre de classes abstraites
  • clsc: nombre de classes concrètes
  • roots: nombre de classes "racine" à l'intérieur du système analysé
  • leafs: nombre de classes "feuille"
  • maxDIT: valeur maximale de la profondeur de l'arbre d'héritage
Inheritance (Project)
  • andc: nombre moyen de classes dérivées
  • ahh: moyenne de la profondeur de l'arbre d'héritage
NodeCount (Project, Package, Class, Interface)
  • nop: nombre de paquests
  • noc: nombre de classes
  • noi: nombre d'interfaces
  • nom: nombre de méthodes
  • nof: nombre de fonctions
NodeLOC (Project, Package, Class, Interface, Method, Function)
  • loc: lignes de code
  • cloc: lignes de commentaires
  • ncloc: lignes de code sans commentaires