{"id":169,"date":"2012-03-25T21:03:20","date_gmt":"2012-03-25T20:03:20","guid":{"rendered":"http:\/\/dev.qualilogy.com\/fr\/?p=169"},"modified":"2013-01-04T21:03:53","modified_gmt":"2013-01-04T20:03:53","slug":"cite-critique","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/cite-critique\/","title":{"rendered":"Cit\u00e9 critique"},"content":{"rendered":"<p>J&rsquo;ai continu\u00e9 \u00e0 jouer avec le plugin City Model pour Sonar de eXcentia.<\/p>\n<p>Pour ceux qui ont manqu\u00e9 les \u00e9pisodes pr\u00e9c\u00e9dents, vous pouvez les trouver ici : <a title=\"City Model\" href=\"http:\/\/qualilogy.com\/fr\/city-model\" target=\"_blank\">City Model<\/a>, <a title=\"City Model - Nouvelle version\" href=\"http:\/\/qualilogy.com\/fr\/city-model-nouvelle-version\" target=\"_blank\">City Model \u2013 Nouvelle version<\/a>, <a href=\"http:\/\/qualilogy.com\/fr\/la-metrique-abc\" target=\"_blank\">La m\u00e9trique ABC.<\/a><\/p>\n<p>Ce plugin est vraiment tr\u00e8s fun. Et tout le monde trouve fantastique une repr\u00e9sentation visuelle de son code sous forme d&rsquo;une cit\u00e9. Aller \u00e0 l&rsquo;essentiel est important lorsque vous devez r\u00e9guli\u00e8rement juger de la qualit\u00e9 d&rsquo;une application. <!--more--><\/p>\n<p>J&rsquo;ai donc pens\u00e9 \u00e0 quelques cas simples mais fr\u00e9quents, o\u00fa son utilisation va s&rsquo;av\u00e9rer pr\u00e9cieuse. Ce qui me donnera \u00e9galement l&rsquo;opportunit\u00e9 de d\u00e9montrer \u00e0 quel point il est simple \u00e0 param\u00e9trer.<\/p>\n<h3><strong>Cit\u00e9 critique<\/strong><\/h3>\n<p>Un client me demande un audit de deux de ses applications. Je creuse un peu pour savoir un peu plus pr\u00e9cis\u00e9ment le &lsquo;pourquoi&rsquo; de cet audit. Il peut y avoir plusieurs raisons, et j&rsquo;ai besoin d&rsquo;en savoir un peu plus afin de r\u00e9pondre pr\u00e9cis\u00e9ment \u00e0 sa demande.<\/p>\n<p>Par exemple : il souhaite externaliser ces deux applications assez anciennes, et avant d&rsquo;effectuer un appel d&rsquo;offres aupr\u00e8s de diff\u00e9rents outsourcers, il aimerait savoir quel est leur niveau de qualit\u00e9. C&rsquo;est effectivement une bonne id\u00e9e, qui va lui permettre de mieux juger les offres qu&rsquo;on lui pr\u00e9sentera et de pr\u00e9ciser un co\u00fbt de maintenance. A l&rsquo;heure actuelle, nombre de providers sont pr\u00eats \u00e0 n&rsquo;importe quoi pour obtenir un contrat. Estimer la dette technique sur ces applications lui permettra d&rsquo;\u00e9carter les offres &lsquo;low-cost&rsquo;, peu r\u00e9alistes.<\/p>\n<p>Autre cas : le responsable d&rsquo;un centre de d\u00e9veloppement se voit demander de reprendre une application. Assez compliqu\u00e9e \u00e0 premi\u00e8re vue: plusieurs centaines de milliers de lignes de code .NET, frameworks propri\u00e9taires, aucune documentation, etc. De quoi \u00eatre un peu suspicieux. Il aimerait bien se donner un peu de visibilit\u00e9 sur la qualit\u00e9 de cette application et l&rsquo;effort \u00e0 effectuer pour cette reprise de code, avant d&rsquo;accepter. Ou que je lui fournisse quelques arguments bien sentis pour justifier un \u00e9ventuel refus.<\/p>\n<p>En fait, le client dont je vous parle avait justement fait appel \u00e0 un de ces outsourcers &lsquo;low-cost&rsquo; pour d\u00e9velopper ses applications. Retards, budgets en d\u00e9passement, beaucoup de bugs et d&rsquo;utilisateurs m\u00e9contents, quelques situations de crise, l&rsquo;image de l&rsquo;IT d\u00e9grad\u00e9e, &#8230; bref, il cherchait quelques raisons d&rsquo;expliquer \u00e0 son provider qu&rsquo;il ne voulait plus de lui.<\/p>\n<p>D\u00e9s lors, je savais comment aller au plus important. Violations critiques. Lui montrer quelques bons gros bugs.<\/p>\n<p>J&rsquo;ai param\u00e9tr\u00e9 une analyse de code Sonar depuis Jenkins. Tr\u00e8s simple : <a href=\"http:\/\/qualilogy.com\/fr\/sonar-jenkins-plugin\" target=\"_blank\">Sonar \u2013 Jenkins plugin<\/a>. L&rsquo;analyse fut tr\u00e8s rapide.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_SonarAdmin_Login.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1417\" title=\"Qual_SonarAdmin_Login\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_SonarAdmin_Login.jpg\" alt=\"\" width=\"137\" height=\"33\" \/><\/a>Puis j&rsquo;ai lanc\u00e9 mon dashboard Sonar pr\u00e9f\u00e9r\u00e9, comme Admin :<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_Sonar_CityModelTop_Add.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1418\" title=\"Qual_Sonar_CityModelTop_Add\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_Sonar_CityModelTop_Add.jpg\" alt=\"\" width=\"281\" height=\"94\" \/><\/a>Je suis entr\u00e9 dans la configuration des widgets et j&rsquo;ai ajout\u00e9 un widget City Model Top de eXcentia.<\/p>\n<p>Et j&rsquo;ai entr\u00e9 les param\u00e8tres suivants :<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_Sonar_CityModelTop_params.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1420\" title=\"Qual_Sonar_CityModelTop_params\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_Sonar_CityModelTop_params.jpg\" alt=\"\" width=\"583\" height=\"177\" \/><\/a><\/p>\n<ul>\n<li>title : Blocker<\/li>\n<li>topListLength : 5. Je ne veux voir que les 5 premi\u00e8res violations de type &lsquo;bloquantes&rsquo;.<\/li>\n<li>formula : {blocker_violations}.<\/li>\n<\/ul>\n<p>La formule correspond au top 5 des composants avec le plus de violations de type &lsquo;Blocker&rsquo;. Celles qu&rsquo;on ne veut voir dans aucune application. Celles qui pr\u00e9sentent le plus de risques pour les utilisateurs. Celles qui d\u00e9montrent que l&rsquo;outsourcer produit du code de la pire qualit\u00e9 qui soit.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_Sonar_CityModel_Add.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1422\" title=\"Qual_Sonar_CityModel_Add\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_Sonar_CityModel_Add.jpg\" alt=\"\" width=\"282\" height=\"94\" \/><\/a> Puis je vais ajouter le widget City Model et modifier ses param\u00e8tres.<br \/>\nLe premier champ &lsquo;heightExp&rsquo; contient une formule pour d\u00e9finir la hauteur de chaque \u00e9difice en fonction de la taille de chaque classe, exprim\u00e9e en nombre de lignes de code (Lines Of Code ou LOC).<\/p>\n<p>Cette mesure utilise une fonction logarithmique afin d&rsquo;\u00e9viter une croissance trop rapide et donc une diff\u00e9rence de taille qui ferait que certains &lsquo;gratte-ciels&rsquo; sortent du champ visuel et que les autres b\u00e2timents apparaissent minuscules.<\/p>\n<p>Je vais reprendre cette formule et la modifier afin d&rsquo;utiliser une autre m\u00e9trique : le nombre de &lsquo;violations&rsquo; de bonnes pratiques, c&rsquo;est-\u00e0-dire le nombre de d\u00e9fauts rencontr\u00e9s dans le code :<\/p>\n<address>        Math.pow(Math.E &#8211; 0.25, Math.log({violations}))<\/address>\n<address> <\/address>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_Sonar_CityModel_params.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1435\" title=\"Qual_Sonar_CityModel_params\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_Sonar_CityModel_params.jpg\" alt=\"\" width=\"583\" height=\"178\" \/><\/a>Les autres param\u00e8tres sont les suivants :<\/p>\n<ul>\n<li>title : Blocker<\/li>\n<li>colorExp : num2col({blocker_violations}, 0, 1).<\/li>\n<li>widthExp : {functions}.<\/li>\n<\/ul>\n<p>Je veux que les \u00e9difices repr\u00e9sentant chaque classe apparaissent en rouge d\u00e9s lors qu&rsquo;existe au moins une violation critique, de type &lsquo;Blocker&rsquo;. Donc la formule &lsquo;colorExp&rsquo; n&rsquo;admet qu&rsquo;un intervalle tr\u00e8s \u00e9troit de valeurs: vert pour 0 &lsquo;blocker&rsquo; et rouge d\u00e8s lors qu&rsquo;existe au moins un d\u00e9faut bloquant, mesur\u00e9e par la m\u00e9trique {blocker_violations}.<\/p>\n<p>La largeur de chaque building sera calcul\u00e9 en fonction du nombre de m\u00e9thodes avec la m\u00e9trique {functions}.<\/p>\n<p>Une fois sauv\u00e9s ces param\u00e8tres, voici \u00e0 quoi ressemble ma &lsquo;Cit\u00e9 critique&rsquo; :<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_Sonar_CityModel1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1437\" title=\"Qual_Sonar_CityModel1\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_Sonar_CityModel1.jpg\" alt=\"\" width=\"583\" height=\"463\" \/><\/a><\/p>\n<p>N&rsquo;oubliez pas que vous pouvez zoomer au sein de cette repr\u00e9sentation ou la faire pivoter horizontalement ou verticalement, ce qui va nous permettre d&rsquo;identifier les classes avec un ou plusieurs &lsquo;Blockers&rsquo;.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_Sonar_CityModel2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1438\" title=\"Qual_Sonar_CityModel2\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_Sonar_CityModel2.jpg\" alt=\"\" width=\"367\" height=\"363\" \/><\/a>Cette grande tour verte \u00e0 droite poss\u00e8de un grand nombre de d\u00e9fauts mais aucun critique. D&rsquo;autres classes, m\u00eame avec un nombre plus important de m\u00e9thodes, pr\u00e9sentent un au moins une violation bloquante.<\/p>\n<p>Ces d\u00e9fauts doivent \u00eatre corrig\u00e9s imp\u00e9rativement avant m\u00eame que l&rsquo;application ne soit test\u00e9e ou, a fortiori, soit install\u00e9e en environnement de production.<\/p>\n<p>En navigant au sein de cette repr\u00e9sentation 3D, on peut rencontrer des classes qui autrement seraient ind\u00e9tectables de par leurs petites dimensions, en nombre de lignes de code ou de m\u00e9thodes ou de complexit\u00e9, mais qui compte n\u00e9anmoins un bug bloquant.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_Sonar_CityModel31.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1443\" title=\"Qual_Sonar_CityModel3\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_Sonar_CityModel31.jpg\" alt=\"\" width=\"564\" height=\"425\" \/><\/a><\/p>\n<p>Nous pouvons voir dans le coin inf\u00e9rieur gauche trois petites classes avec seulement deux m\u00e9thodes et au moins 1 d\u00e9faut bloquant.<\/p>\n<p>Maintenant, nous voulons \u00e9galement identifier les classes avec un nombre \u00e9lev\u00e9 de d\u00e9fauts critiques ou majeurs. Voici les r\u00e8gles que j&rsquo;ai d\u00e9finies en accord avec le client :<\/p>\n<ol>\n<li>Une classe appara\u00eet en rouge si elle comporte au moins une violation &lsquo;Blocker&rsquo;.<\/li>\n<li>Une classe appara\u00eet en rouge si elle comporte au moins quatre violations &lsquo;Critical&rsquo;. Sinon, sa couleur ira de verte \u00e0 rouge en fonction d&rsquo;une \u00e9chelle de 1 \u00e0 4 de ces violations.<\/li>\n<li>Sinon, la couleur de la classe sera d\u00e9finie selon le nombre de d\u00e9fauts &lsquo;Major&rsquo; sur une \u00e9chelle de 1 \u00e0 100.<\/li>\n<\/ol>\n<p>Si je ram\u00e8ne ces trois r\u00e8gles sur une \u00e9chelle de 1 \u00e0 100 :<\/p>\n<ul>\n<li>Une violation bloquante = 100.<\/li>\n<li>4 violations critiques = 100, 3 violations critiques = 75, 2 violations critiques = 50 et 1 violation critique = 25.<\/li>\n<li>Les violations majeures sont mesur\u00e9es sans facteur multiplicatif.<\/li>\n<\/ul>\n<p>Et derni\u00e8re r\u00e8gle, la couleur de l&rsquo;\u00e9difice sera d\u00e9finie en fonction de la plus haute de ces valeurs. Par exemple :<\/p>\n<ul>\n<li>Une classe avec 30 violations majeures sans violation bloquante ou critique aura une couleur (de verte \u00e0 rouge) \u00e9gale \u00e0 30 sur une \u00e9chelle de 1 \u00e0 100.<\/li>\n<li>Une classe avec 2 violations critiques sans violation bloquante ou majeure aura une couleur \u00e9gale \u00e0 50, soit 2 violations x 25.<\/li>\n<li>Une classe avec 2 violations critiques et 30 violations majeures aura une valeur de 50 (plus haute des deux valeurs).<\/li>\n<li>Une classe avec 2 violations critiques et 60 violations majeures aura une valeur de 60.<\/li>\n<\/ul>\n<p>Et voici la formule qui correspond \u00e0 ces r\u00e8gles :<\/p>\n<address>num2col(Math.max(({blocker_violations}*100), ({critical_violations}*25), {major_violations}), 0, 100)<\/address>\n<address> <\/address>\n<p>Le r\u00e9sultat :<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_Sonar_CityModel41.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1448\" title=\"Qual_Sonar_CityModel4\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_Sonar_CityModel41.jpg\" alt=\"\" width=\"557\" height=\"372\" \/><\/a><\/p>\n<p>J&rsquo;ai personnalis\u00e9 mon dashboard avec 3 listes City Model Top correspondant \u00e0 ces trois types de d\u00e9faut :<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_Sonar_CityModel5.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1449\" title=\"Qual_Sonar_CityModel5\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/Qual_Sonar_CityModel5.jpg\" alt=\"\" width=\"1173\" height=\"465\" \/><\/a><\/p>\n<p>Certaines classes avec des &lsquo;Blockers&rsquo; comportent \u00e9galement un nombre \u00e9lev\u00e9 de d\u00e9fauts majeurs.<\/p>\n<h3><strong>Conclusion<\/strong><\/h3>\n<p>En guise de conclusion, si vous \u00eates un outsourcer, je pense que vous pourriez tirer profit de ces plugins. Par exemple, vous devez r\u00e9pondre \u00e0 un appel d&rsquo;offres :<\/p>\n<ul>\n<li>Organisez un rendez-vous avec votre client potentiel et demandez lui de pr\u00e9parer quelques extraits de l&rsquo;application que celui-ci souhaite outsourcer, si possible comportant le plus de d\u00e9fauts.<\/li>\n<li>Analysez les en direct pendant la r\u00e9union et montrez lui les r\u00e9sultats. Vous pouvez jouer avec les param\u00e8tres en fonction des &lsquo;top 10&rsquo; de chaque cat\u00e9gorie ou selon que vous souhaitez une cit\u00e9 plus ou moins &lsquo;rouge&rsquo;.<\/li>\n<li>Vous pouvez estimer avec le client une charge de correction de ces d\u00e9fauts ou de refactoring de ces classes.<\/li>\n<li>Vous pouvez demander au client dans quelle mesure ces extraits sont repr\u00e9sentatifs de son code et donc \u00e9valuer l&rsquo;effort global de reprise de l&rsquo;application.<\/li>\n<\/ul>\n<p>Votre client sera tr\u00e8s certainement favorablement impressionn\u00e9. De plus, les mesures obtenues constituent une base d&rsquo;informations objectives qui permettent d&rsquo;\u00e9viter le typique affrontement &lsquo;client-fournisseur&rsquo; au profit d&rsquo;un dialogue beaucoup plus constructif et r\u00e9aliste. Votre client s&rsquo;en souviendra au moment de choisir le prestataire auquel il confiera ses applications.<\/p>\n<p>Autre exemple, utilisez ces plugins dans le cadre d&rsquo;une Quality Gate :<\/p>\n<ul>\n<li>Analysez r\u00e9guli\u00e8rement votre code avec ces plugins.<\/li>\n<li>Corrigez imm\u00e9diatement toute classe apparaissant en rouge.<\/li>\n<li>Effectuez une ultime analyse avant de livrer une nouvelle version de l&rsquo;application ou d&rsquo;un de ses modules et montrez le dashboard Sonar avec la cit\u00e9 correspondante.<\/li>\n<li>Vous pouvez vous permettre quelques d\u00e9fauts majeurs si l&rsquo;urgence l&rsquo;autorise, d\u00e8s lors que vous vous engagez \u00e0 les corriger par la suite.<\/li>\n<\/ul>\n<p>Dans tous les cas, je vous recommande d&rsquo;utiliser ces plugins pour Sonar avant que votre client ne les d\u00e9couvre. Ou que quelqu&rsquo;un les lui fasse d\u00e9couvrir.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>J&rsquo;ai continu\u00e9 \u00e0 jouer avec le plugin City Model pour Sonar de eXcentia. Pour ceux qui ont manqu\u00e9 les \u00e9pisodes pr\u00e9c\u00e9dents, vous pouvez les trouver ici : City Model, City Model \u2013 Nouvelle version, La m\u00e9trique ABC. Ce plugin est vraiment tr\u00e8s fun. Et tout le monde trouve fantastique une repr\u00e9sentation visuelle de son code [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[],"class_list":["post-169","post","type-post","status-publish","format-standard","hentry","category-sonar-360"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/169"}],"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=169"}],"version-history":[{"count":1,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/169\/revisions"}],"predecessor-version":[{"id":170,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/169\/revisions\/170"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=169"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}