
Ce premier chapitre de notre dossier consacré à l'analyse de code, se veut didactique et généraliste. Dans un second temps, nous étudierons plus particulièrement la complémentarité de l'analyse de code et des tests dans le suivi et l'optimisation de la qualité logicielle. N’hésitez pas à réagir sur le site ou nous envoyer les sujets que vous souhaiteriez voir aborder.
Introduction
Le terme d'analyse de code est celui donné à l'analyse statique du code même si parfois on utilise également cette terminologie pour l'analyse dynamique du code ou le debugging. L'analyse (statique) de code, connu sous l'appellation anglo-saxonne de "parsing", est un moyen, un procédé, une technique qui existe depuis près de 30 ans et que l'on emploie aujourd'hui dans de nombreux produits ou services outillés.
Tout comme les tests, cette technique provient des besoins de la défense et des industries de pointe à produire des logiciels d’un très haut niveau de qualité, de fiabilité et de sécurité. Isolément, les grandes DSI ont utilisé cette technique dans le cadre de migration, d'adaptation (Y2K, EURO), de rationalisation de leur patrimoine, de cartographie ou de référence documentaire (à destination des études ou de la production).
L'analyse de code revient périodiquement sur le front des solutions étudiées par les grandes DSI et il est à remarquer que les solutions qui ont su ou pu être déployées, ont perduré et se sont affirmées comme des outils efficients au sein des organisations. Poussé par la vague des outils d'industrialisation (gestion des exigences, gestion de configuration, automatisation des tests,…) et des méthodes, modèles ou bonnes pratiques d'optimisation (ISO, IEEE, CMMI, IDEAL, ITIL, SPICE, TMAP, SIX SIGMA, XP, RUP, UML…) des processus IT, l'analyse de code est de nouveau sur le devant de la scène grâce à l’un de ses savoirs-faires originels : la mesure de la qualité logicielle.
Originel, car deux des principales métriques de complexité, celles d'Halstead et de McCabe ont été publiées respectivement en 1975 et 1976 et que le modèle d'évaluation de la qualité logicielle de McCall (dont ISO 9126 est dérivé) a été créé lors d'une étude pour 'lUS AIR Force en 1977.
L'analyse de code s'inscrit dans l'effort mené par les grandes DSI pour industrialiser leur maintenance et leur développement. Nous sommes dans l'ère de la Taylorisation de la fonction IT, en décalage de quelques dizaines d’années avec par exemple l’automatisation des chaînes de productions de l'industrie automobile. En revanche, 2 éléments essentiels distinguent les patrimoines applicatifs des automobiles : c'est leur unicité et leur entropie.
Compte-tenu des multiples dimensions d’un patrimoine (organisation, environnement technique, métier, existant, …) aucun patrimoine n’est identique à un autre, même s’ils peuvent être similaires. Le code ne cesse d’évoluer de façon chaotique sans jamais atteindre l’équilibre, dans des environnements hétérogènes subissant des influences internes et externes aux organisations. La maintenance applicative des grandes DSI représentent plus de 80% des budgets consacrés aux études.
En résumé, l’industrialisation des processus de maintenance et de développement de logiciel au sein des organisations doit s’opérer de façon pragmatique et progresser graduellement grâce à des projets efficients pour les développeurs, les chefs de projets et les managers, principaux acteurs de la chaîne de production de logiciel.
Comment cela marche ?
Pour faciliter la compréhension de ce procédé, on peut s'appuyer sur l'exemple des traducteurs linguistiques automatiques (que je connais peu, en m'excusant par avance auprès des puristes en la matière). Lorsque l'on souhaite réaliser des traductions de phrases écrites dans une langue déterminée. Il faut :
- Un dictionnaire, c'est-à-dire, une référence des mots de la langue pour identifier et valider la syntaxe des mots de la phrase
- Un Bescherelle, c'est-à-dire, une référence des règles grammaticales pour identifier les mots clés et valider la construction de la phrase
- Un outil de transfert de la phrase identifiée en langue X vers la phrase reconstruite en langue Y grâce au dictionnaire des mots et aux règles grammaticale de la langue Y.
- Si l'on veut rendre générique le procédé et avoir la capacité de traduire de n’importe quel langage vers n’importe quel langage. Il faut l’ensemble des dictionnaires syntaxiques et grammaticaux, plus une couche d'abstraction telle que l’Esperanto.
Avec ces composants, on procède ensuite comme suit :
1 – Analyse syntaxique
L'analyse syntaxique va s'appuyer sur la référence fournie par le dictionnaire pour repérer les phrases du texte. Pour chaque phrase, on repère son début, sa fin, les parenthèses éventuelles, les ponctuations, et surtout ses mots.
2 – Analyse grammaticale
L'analyse grammaticale identifie la construction et donne leur nature aux composants de la phrase (sujet, verbe conjugué à tel temps, complément d'objet direct,…)
3 – Génération Sémantique
La génération sémantique est l'action qui en découle. En l'occurrence, dans cet exemple, il s'agit de transposer les composants et les mots dans une langue différente.
L'analyse de code utilise également ces éléments. Tout comme le traducteur automatique, l'outil va procéder à une analyse syntaxique et grammaticale du code pour constituer une représentation abstraite (arbre syntaxique) à partir de laquelle il va effectuer les actions sémantiques.
La plupart des solutions dérivées de l'analyse de code repose sur 4 types de composants principaux :
- Un modèle : la description des environnements applicatifs sous forme d'objet (application, jcl, programme, fichier, donnée,…) et de lien (déclare, contient, appelle,…)
- Des parsers : L'analyse syntaxique, l'analyse grammaticale et la génération sémantique
- Un repository : La consolidation et l'enrichissement
- Une interface : La navigation, les restitutions, les fonctions
Les parsers extraient une modélisation de chaque code source et l'injectent dans une base de données.Par consolidation de l'ensemble des sources, se crée un schéma global du patrimoine sous la forme d'une constellation d'objets et de liens qui peut être enrichie. A partir de cette modélisation du patrimoine, des outils de navigation, d'analyse, de transformation, réalisent les fonctions attendues.
Les domaines d'applications
La compilation
Le premier domaine d’application de l’analyse de code
L'inventaire
o Statistiques
o Détermination des adhérences de premier niveau
o Identification des composants manquants, inutilisés, incomplets,…
La qualité logicielle
o L’audit de code
o Le calcul de métriques
o Le contrôle et le suivi de la qualité
La cartographie applicative
o Vue métier/fonctionnelle détaillée
o Vue technique macroscopique
La rétro-documentation
o Vue métier/fonctionnelle simplifiée
o Vue technique détaillée
L'analyse d'impact
o Propagation
o Spécification des modifications
o Evaluation de la charge
La constitution d'encyclopédie métier
o Extraction des règles fonctionnelles
o Extraction des dictionnaires de données
La transformation massive
o Adaptation de patrimoine (Euro, An 2000, Ajout d'une entité fonctionnelle, Extension de champ,…)
o Migration de patrimoine (migration de base de données, migration de système,…)
o Factorisation de code
Les tests
o Analyse de la criticité technique
o Couverture des tests
o Génération de cas de tests
La Production
o Génération de dossiers d’exploitation et de mise en production
o Suivi des chaînes de traitement
Quelques apports directs
Les termes employés aujourd'hui, d'IT Gouvernance, de Gouvernance des patrimoines, d’Application Mining, d'Application Intelligence, de IT Knowledge Management, d'IT Process Management reflètent des domaines d’excellence dans lesquels contribuent plus ou moins l’analyse de code. De façon plus concrète, vous trouverez ci-dessous quelques apports directs de l’analyse de code :
- Réactivité et flexibilité des équipes par la maîtrise de la connaissance technique et fonctionnelle
- Optimisation du pilotage par le suivi et le contrôle de la qualité logicielle
- Amélioration de la maintenabilité et de la fiabilité des développements
- Maîtrise des risques et réduction de la charge des tests
- Evaluation de la performance des équipes (internes ou externes) de maintenance
- Estimation des charges des projets de maintenance, arbitrage avec les services extérieurs
Intégration aux processus
Comme nous l'avons vu, l'analyse de code peut s'appliquer à de multiples domaines et peut adresser des problématiques diverses.Comme toute solution informatique, l'analyse de code peut se décliner de multiples façons :
- Intégrée dans des solutions spécifiques
- Encapsulée dans des offres de services
- Encapsulée dans des produits fournis par une éditeur.
Quelque soit la solution choisie, elle doit répondre aux questions fondamentales :
- Pour Qui ?
- Pour Quoi?
- Comment ?
L'analyse de code est un moyen puissant mais il ne détermine qu'une partie du Comment. Il est primordial de définir au préalable le « Pour Qui » et le « Pour Quoi ? » :
- S'agit-il des équipes de développement ? Des responsables d'application? Des managers?
- Quels environnements souhaite-t-on adresser ? Cobol, Java, Pl1, Pacbase, Java, C,…?
- Sur quel périmètre organisationnel ? Quelle entité ? Externe, Interne ?
- Quel est le protocole de maintenance ? celui d'exploitation ?
- Quels sont les objectifs ? Quels sont les apports, les gains, le ROI attendus ?
La mise en œuvre d'une solution d'optimisation des développements à destination des développeurs Java sera bien différente d'une solution de suivi de la qualité des patrimoines destinée au haut management d'une organisation. Le haut manager attendra des informations synthétiques avec des vues multi-dimensionnelles et agrégées de la qualité de ses patrimoines. Le développeur Java voudra un outil qui s'intègre à son IDE et qui lui fournisse le détail des anomalies, le guide dans la correction et le fasse progresser dans sa programmation.Même si c’est bien la même technique d'analyse de code qui sous-tend ces deux solutions, on s'aperçoit facilement que l'intégration répondra à des exigences bien différentes voire opposées.
La complexité intrinsèque de ce type de solution ainsi que la difficulté à atteindre une analyse de code exhaustive dans un environnement spécifique de plusieurs dizaines de milliers de programmes impliquent encore plus d’attention dans la définition des besoins et des objectifs d’un projet d’instrumentation des processus avec des parsers.
Une des pratiques clé du CMMI3 est la revue de code par les paires. Voilà une application toute trouvée pour l’analyse de code. Pourtant, force est de constater que le SEI ne préconise cette application de l’analyse de code que dans le cadre d’un passage au niveau de maturité 3 (reproductible -> défini).
La mise en œuvre d’une solution d’analyse de code doit être synchronisée avec la maturité des processus dans l’organisation. Ce ne sont pas les outils qui déterminent la maturité des processus, même s’ils facilitent, automatisent, structurent leur exécution. L’instrumentation de la fonction IT par l’analyse de code trouve son efficacité dans son adéquation avec les processus de l’organisation.
Quelques conseils de mise en oeuvre
- Soyez pragmatique, progressez avec des objectifs simples et circonscrits à un environnement
- Axez-vous sur un profil utilisateur et étudiez les conditions d’utilisation
- Déterminez a priori (avant le choix de l'outillage) les besoins d'optimisation de vos processus
- Prenez le temps d'étudier attentivement l'exécution des activités pour rechercher la tâche à fort ROI
- Réalisez un pilote qui intègre l'évaluation du ROI
- Ne confondez pas contrôle et optimisation
- Inventoriez vos environnements et les spécificités de développement
- Rapprochez les résultats d'analyses statiques de code avec les données de pilotage de vos activités
- Rapprochez les résultats d'analyses statiques de code avec les restitutions des autres outils
- Considérez le haut niveau d’expertise technique que requièrent les parsers
- Optimisez la couverture des parsers en fonction du rapport entre les services attendus et ceux rendus
- Ne perdez pas de vu qu'il s'agit de solutions relativement complexes qui s'appliquent à une tâche non moins complexe : tenter de maîtriser l'entropie naturelle du code.
Conclusion
Le temps de l'amélioration des processus IT est venu. Après plusieurs années concentrées sur l'optimisation des processus métiers (ERP et autres solutions Best of Breed ou Spécifiques), un mouvement similaire influence en profondeur l'évolution des grandes DSI. Dans cette vague d'industrialisation de la fonction IT, de nombreux facteurs concomitants augurent d'un bel avenir pour cet outil polyvalent qui devrait s'affirmer auprès des grandes DSI et des acteurs de la TMA, comme il a été institutionnalisé dans les centres de développement de logiciel dédiés aux industries de pointe.


