{"id":1734,"date":"2014-04-06T14:56:51","date_gmt":"2014-04-06T13:56:51","guid":{"rendered":"http:\/\/qualilogy.com\/fr\/?p=1734"},"modified":"2014-05-27T09:25:00","modified_gmt":"2014-05-27T08:25:00","slug":"audit-application-legacy-c-microsoft-word-1-1a-1","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/audit-application-legacy-c-microsoft-word-1-1a-1\/","title":{"rendered":"Audit d\u2019une application Legacy en C \u2013 Microsoft Word 1.1a (I)"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1738\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Analysis_Word0.jpg\" alt=\"C_Analysis_Word0\" width=\"239\" height=\"360\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Analysis_Word0.jpg 239w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Analysis_Word0-199x300.jpg 199w\" sizes=\"(max-width: 239px) 100vw, 239px\" \/><\/a>Microsoft a publi\u00e9 cette semaine le code source de Word 1.1a (1990) via le Computer History Museum : <a href=\"http:\/\/www.computerhistory.org\/atchm\/microsoft-word-for-windows-1-1a-source-code\/\" target=\"_blank\">http:\/\/www.computerhistory.org\/atchm\/microsoft-word-for-windows-1-1a-source-code\/.<\/a><\/p>\n<p>Il s\u2019agit d\u2019une des premi\u00e8res versions de Word for Windows, de Janvier 1991 :<br \/>\n<a href=\"http:\/\/blogs.technet.com\/b\/microsoft_blog\/archive\/2014\/03\/25\/microsoft-makes-source-code-for-ms-dos-and-word-for-windows-available-to-public.aspx\" target=\"_blank\">http:\/\/blogs.technet.com\/b\/microsoft_blog\/archive\/2014\/03\/25\/microsoft-makes-source-code-for-ms-dos-and-word-for-windows-available-to-public.aspx<\/a>.<\/p>\n<p>Je me suis amus\u00e9 \u00e0 analyser le code source de cette version. J\u2019\u00e9tais curieux de voir quels seraient les r\u00e9sultats tant d\u2019un point de vue quantitatif &#8211; nombre de lignes de code, niveau de complexit\u00e9, etc &#8211; que qualitatif : violations aux bonnes pratiques de programmation, d\u00e9fauts de type Blockers, Criticals, etc. <!--more--><\/p>\n<p>Egalement, comment utiliser la dette technique dans un tel contexte ? Ce n\u2019est pas tous les jours que l\u2019on rencontre une application Legacy en C. Quels sont les Uses cases int\u00e9ressants dans un tel contexte et en quoi l\u2019analyse de la dette technique peut-elle nous aider ?<\/p>\n<p>Mais nous reviendrons sur ce dernier point plus tard. Je ne sais pas encore combien de posts je vais consacrer \u00e0 ces diff\u00e9rents sujets. Dans ce premier article, je vais pr\u00e9senter succinctement la configuration d\u2019analyse et les premiers r\u00e9sultats quantitatifs.<\/p>\n<h2>Analyse<\/h2>\n<p>Je ne vais pas rentrer dans trop de d\u00e9tails, car ce code source n\u2019est pas publi\u00e9 sous licence libre et il est interdit de l\u2019utiliser \u00e0 des fins commerciales. Vous comprendrez bien que je n\u2019ai pas du tout envie que Microsoft vienne me cr\u00e9er des ennuis si je mets en avant une entreprise ou un des ses produits. Je me contenterais donc de dire que j\u2019ai effectu\u00e9 mes analyses avec SonarQube en version 4.2 et son plugin C\/C++ en version 2.1.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_CodeStructure.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1744\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_CodeStructure.jpg\" alt=\"Word_CodeStructure\" width=\"167\" height=\"210\" \/><\/a>Si vous t\u00e9l\u00e9chargez le .zip correspondant au code de Word 1.1a, vous rencontrerez 3 r\u00e9pertoires correspondant \u00e0 diverses versions, avec plus ou moins de documentation et d\u2019utilitaires. J\u2019ai utilis\u00e9 la version la plus simple, \u2018Opus\u2019, qui se centre sur le code source.<\/p>\n<p>Il y a plusieurs types de fichiers qui ne peuvent \u00eatre analys\u00e9s : utilitaires .exe ou code assembleur par exemple. Je n\u2019ai travaill\u00e9 que sur des fichiers .c et .h. Les r\u00e9pertoires \u2018lib\u2019 et \u2018resource\u2019 ne contiennent que des .h. Les autres dossiers, y compris le r\u00e9pertoire principal \u2018Opus\u2019, contiennent des fichiers .c et .h.<\/p>\n<p>Je n\u2019ai pas cherch\u00e9 \u00e0 d\u00e9clarer les macros. Cela n\u00e9cessite une connaissance pr\u00e9cise de l\u2019application, et sans travailler avec un architecte ou un membre de l\u2019\u00e9quipe de projet, cela peut prendre beaucoup de temps avant de comprendre comment tout le code est structur\u00e9. Ce serait indispensable pour rechercher des bugs potentiels, mais je ne vise pas une telle pr\u00e9cision dans les r\u00e9sultats sinon plut\u00f4t une \u00e9valuation g\u00e9n\u00e9rale de la qualit\u00e9.<\/p>\n<p>J\u2019ai rencontr\u00e9 quelques erreurs de parsing, essentiellement caus\u00e9es par des d\u00e9clarations de types, pour une compilation sur Mac je pense. J&rsquo;ai tent\u00e9 divers types de syntaxe C (C89, C99 ou C11), sans que cela change quoique ce soit \u00e0 ce niveau. Il s\u2019agit essentiellement de structures de donn\u00e9es que j\u2019ai mises en commentaires, sans aucune incidence sur les r\u00e9sultats d\u2019analyse, sinon qu\u2019il me manquera quelques lignes de code dans le calcul final.<\/p>\n<p>Il y a aussi des fichiers \u00e0 ne pas analyser, comme par exemple un fichier qui commence par \u2018THIS FILE IS OBSOLETE\u2019 sans m\u00eame que cette ligne soit en commentaire, donc il est normal que cela g\u00e9n\u00e8re une erreur pour le parser.<\/p>\n<p>Enfin, je me suis bas\u00e9 sur le Quality Profile par d\u00e9faut de SonarQube, sans utiliser de r\u00e8gles suppl\u00e9mentaires comme par exemple celles de Cppcheck. Encore une fois, notre objectif n\u2019est pas de d\u00e9bugguer Word, mais d\u2019effectuer une analyse globale de la qualit\u00e9 du code, regarder la dette technique pour ce software et tenter d\u2019en tirer quelques enseignements. Le tout dans le contexte de l\u2019\u00e9poque.<\/p>\n<h2>M\u00e9triques quantitatives<\/h2>\n<p>Ce que j\u2019appelle les m\u00e9triques quantitatives sont tous les r\u00e9sultats qui nous donnent une indication sur la taille et la complexit\u00e9 du code, le taux de commentaires, etc. Bref, tout ce qui ne concerne pas des bonnes pratiques de programmation.<\/p>\n<h3>Taille<\/h3>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_SizeMetrics.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1745\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_SizeMetrics.jpg\" alt=\"Word_SizeMetrics\" width=\"313\" height=\"126\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_SizeMetrics.jpg 313w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_SizeMetrics-300x120.jpg 300w\" sizes=\"(max-width: 313px) 100vw, 313px\" \/><\/a>On trouve 326 500 lignes dans 349 fichiers, dont 165 milliers de lignes de code (KLocs). Je m\u2019attendais \u00e0 trouver beaucoup plus de lignes de code, mais ce qui est frappant selon moi est le petit nombre de fichiers. En moyenne, chaque fichier compte pr\u00e9s de 1 000 lignes, dont la moiti\u00e9 sont des lignes de code. Cela ne doit pas favoriser la lecture et la compr\u00e9hension de celui-ci, surtout lorsqu\u2019il s\u2019agit d\u2019un langage aussi complexe que le langage C.<\/p>\n<p>D\u2019ailleurs, si l\u2019on regarde la distribution du code en fichiers, \u00e0 l\u2019aide du Project File Bubble Chart, on peut remarquer quelques jolis monstres, comme ce fichier \u2018fltexp.c\u2019 qui compte 2 600 lignes de code et 506 issues. A noter que sa dette technique reste cependant limit\u00e9e avec seulement 23 jours de refactoring estim\u00e9e pour corriger les d\u00e9fauts identifi\u00e9s.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_WordBubbleChart.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1746\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_WordBubbleChart.jpg\" alt=\"C_WordBubbleChart\" width=\"802\" height=\"308\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_WordBubbleChart.jpg 802w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_WordBubbleChart-300x115.jpg 300w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_WordBubbleChart-624x239.jpg 624w\" sizes=\"(max-width: 802px) 100vw, 802px\" \/><\/a><\/p>\n<h3>Documentation<\/h3>\n<p>Le niveau de commentaires est correct sans \u00eatre exceptionnel, je dirais m\u00eame dans la fourchette basse de ce qu\u2019on peut attendre g\u00e9n\u00e9ralement d\u2019une application de nos jours, mais l\u00e0 encore, nous ne sommes pas en pr\u00e9sence d\u2019une application de gestion, mais d\u2019un software.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_CustomMetrics.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1750\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_CustomMetrics.jpg\" alt=\"Word_CustomMetrics\" width=\"582\" height=\"121\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_CustomMetrics.jpg 582w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_CustomMetrics-300x62.jpg 300w\" sizes=\"(max-width: 582px) 100vw, 582px\" \/><\/a><\/p>\n<p>De plus, le niveau de commentaires est important lorsque vous savez qu\u2019une application peut \u00eatre outsourc\u00e9e, et que d\u2019autres que ses auteurs vont devoir comprendre ce que fait le code, ce qui n\u2019est pas le cas pour du code maintenu par une \u00e9quipe de R&amp;D. Enfin, 20% de niveau de commentaires \u00e9tait probablement correct il y a 30 ans, m\u00eame si cela para\u00eet plut\u00f4t bas aujourd\u2019hui.<\/p>\n<h3>Duplications<\/h3>\n<p>J\u2019ai \u00e9t\u00e9 frapp\u00e9 par le niveau minimal de duplications. Et en allant v\u00e9rifier dans le code, il s\u2019agit essentiellement de structures de donn\u00e9es.<\/p>\n<p>Rappelons que nous ne sommes pas ici en pr\u00e9sence d\u2019un langage orient\u00e9 objet, donc il n\u2019est pas possible de cr\u00e9er des classes sp\u00e9cifiques \u00e0 un \u2018objet\u2019 fonctionnel. M\u00eame ainsi, le niveau de duplication extr\u00eamement bas montre une r\u00e9utilisation optimale du code existant. Probablement indispensable pour une R&amp;D qui doit d\u00e9velopper et maintenir des logiciels, mais certainement pas aussi fr\u00e9quent de nos jours.<\/p>\n<h3>Complexit\u00e9<\/h3>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_Complexity.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1751\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_Complexity.jpg\" alt=\"Word_Complexity\" width=\"348\" height=\"160\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_Complexity.jpg 348w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_Complexity-300x137.jpg 300w\" sizes=\"(max-width: 348px) 100vw, 348px\" \/><\/a>Le niveau global de Complexit\u00e9 Cyclomatique est assez \u00e9lev\u00e9, avec 43 846 points de complexit\u00e9. Rappelons qu\u2019\u00e0 partir de 20 000 points, une application n\u00e9cessite une phase de QA sp\u00e9cifique, avec des cahiers et des jeux de tests formalis\u00e9s. A partir de 60 000, un outil d\u2019automatisation des tests est fortement recommand\u00e9. De tels outils n\u2019existaient pas au d\u00e9but des ann\u00e9es 1990, donc je serais curieux d\u2019en savoir un peu plus sur les pratiques de Microsoft \u00e0 l\u2019\u00e9poque.<\/p>\n<p>La grande majorit\u00e9s des fonctions ne sont pas tr\u00e8s complexes, mais plusieurs centaines sont toutefois sup\u00e9rieures \u00e0 12 points de CC, et un tr\u00e8s grand nombre sont au-del\u00e0 des 30 points de CC, ce qui en fait des objets complexes ou tr\u00e8s complexes, avec un co\u00fbt de maintenabilit\u00e9 \u00e9lev\u00e9 et un risque important d\u2019introduire un d\u00e9faut en cas de modification. La phase de QA se doit donc d\u2019\u00eatre encore plus exigeante.<\/p>\n<p>Heureusement, nous avons vu que la r\u00e9utilisabilit\u00e9 semblait assez bonne. On peut donc concentrer les tests de non r\u00e9gression sur les objets les plus complexes qui ont \u00e9t\u00e9 modifi\u00e9s.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_ComplexityFiles.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1752\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_ComplexityFiles.jpg\" alt=\"Word_ComplexityFiles\" width=\"349\" height=\"161\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_ComplexityFiles.jpg 349w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_ComplexityFiles-300x138.jpg 300w\" sizes=\"(max-width: 349px) 100vw, 349px\" \/><\/a>Ce haut niveau de complexit\u00e9 se confirme qu niveau des fichiers avec environ la moiti\u00e9 d\u2019entre eux au-del\u00e0 des 90 points de CC.<\/p>\n<p>J\u2019ai configur\u00e9 ci-dessous le Bubble Chart pour croiser le nombre de lignes de code avec la complexit\u00e9.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_WordBubbleChart2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1754\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_WordBubbleChart2.jpg\" alt=\"C_WordBubbleChart2\" width=\"810\" height=\"322\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_WordBubbleChart2.jpg 810w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_WordBubbleChart2-300x119.jpg 300w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_WordBubbleChart2-624x248.jpg 624w\" sizes=\"(max-width: 810px) 100vw, 810px\" \/><\/a><\/p>\n<p>Une fois de plus, nous retrouvons le fichier \u2018fltexp.c\u2019 avec 2 600 lignes de code et un niveau de CC de 740. Quand je vous dis que c\u2019est un monstre !<\/p>\n<h3>Evaluation<\/h3>\n<p>Que pouvons-nous dire \u00e0 ce stade de notre \u00e9valuation ?<\/p>\n<p>Le niveau tr\u00e8s faible de code dupliqu\u00e9 m\u2019incite \u00e0 penser que les choix d\u2019architecture ont port\u00e9 principalement sur une r\u00e9utilisation maximale des fonctions, et ainsi pouvoir d\u00e9dier chaque fichier \u00e0 une fonctionnalit\u00e9 sp\u00e9cifique, avec tous les objets n\u00e9cessaires pour g\u00e9rer celle-ci. Ce qui explique que certains fichiers sont tr\u00e8s imposants, en taille comme en complexit\u00e9.<\/p>\n<p>Il faut rappeler que la m\u00e9moire \u00e9tait limit\u00e9e \u00e0 l\u2019\u00e9poque, et que la taille prise par un logiciel en m\u00e9moire constituait un crit\u00e8re d\u00e9cisif de la performance et donc du succ\u00e8s ou de l\u2019\u00e9chec de celui-ci. Donc priorit\u00e9 \u00e0 l\u2019efficacit\u00e9 en la mati\u00e8re, ce qui suppose d\u2019\u00e9viter de dupliquer une m\u00eame structure de donn\u00e9es dans des fichiers diff\u00e9rents, m\u00eame si cela signifie des fichiers plus longs, plus lourds, plus complexes.<\/p>\n<p>Ceci va probablement affecter la lisibilit\u00e9, la compr\u00e9hension et la maintainabilit\u00e9 du code.<br \/>\nNous allons donc pr\u00eater attention \u00e0 ces facteurs pour la suite de notre \u00e9valuation, dans notre prochain post sur les m\u00e9triques qualitatives et le respect des bonnes pratiques de programmation.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Microsoft a publi\u00e9 cette semaine le code source de Word 1.1a (1990) via le Computer History Museum : http:\/\/www.computerhistory.org\/atchm\/microsoft-word-for-windows-1-1a-source-code\/. Il s\u2019agit d\u2019une des premi\u00e8res versions de Word for Windows, de Janvier 1991 : http:\/\/blogs.technet.com\/b\/microsoft_blog\/archive\/2014\/03\/25\/microsoft-makes-source-code-for-ms-dos-and-word-for-windows-available-to-public.aspx. Je me suis amus\u00e9 \u00e0 analyser le code source de cette version. J\u2019\u00e9tais curieux de voir quels seraient les r\u00e9sultats tant [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1734","post","type-post","status-publish","format-standard","hentry","category-qualite-des-applications"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1734"}],"collection":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/comments?post=1734"}],"version-history":[{"count":24,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1734\/revisions"}],"predecessor-version":[{"id":1908,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1734\/revisions\/1908"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=1734"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=1734"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=1734"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}