{"id":1578,"date":"2014-01-19T15:39:31","date_gmt":"2014-01-19T14:39:31","guid":{"rendered":"http:\/\/qualilogy.com\/fr\/?p=1578"},"modified":"2014-01-21T16:40:19","modified_gmt":"2014-01-21T15:40:19","slug":"analyse-plsql-avec-sonarqube-majors","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/analyse-plsql-avec-sonarqube-majors\/","title":{"rendered":"Analyse PL\/SQL avec SonarQube \u2013 Majors"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1589\" alt=\"PLSQL_Majors\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/PLSQL_Majors2.jpg\" width=\"375\" height=\"249\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/PLSQL_Majors2.jpg 375w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/PLSQL_Majors2-300x199.jpg 300w\" sizes=\"(max-width: 375px) 100vw, 375px\" \/><\/a>Nous continuons cette s\u00e9rie sur l&rsquo;analyse de code PL\/SQL, avec aujourd&rsquo;hui les r\u00e8gles de type Major.<\/p>\n<p>Nous avons vu pr\u00e9c\u00e9demment comment <a href=\"http:\/\/qualilogy.com\/fr\/analyse-plsql-sonarqube-organisation\/\" target=\"_blank\">organiser notre environnement <\/a>et <a href=\"http:\/\/qualilogy.com\/fr\/analyse-plsql-sonarqube-configuration\/\" target=\"_blank\">configurer notre analyse de code avec Jenkins et SonarQube<\/a>.<\/p>\n<p>Nous avons cr\u00e9\u00e9 <a href=\"http:\/\/qualilogy.com\/fr\/analyse-plsql-sonarqube-quality-profile-plsql\/\" target=\"_blank\">notre propre Quality Profile<\/a>, puis examin\u00e9 les r\u00e8gles de type <a href=\"http:\/\/qualilogy.com\/fr\/analyse-plsql-sonarqube-blockers\/\" target=\"_blank\">Blockers<\/a> et <a href=\"http:\/\/qualilogy.com\/fr\/analyse-plsql-avec-sonarqube-criticals\/\" target=\"_blank\">Criticals<\/a>, toutes orient\u00e9es Robustesse (Reliability) et S\u00e9curit\u00e9. <!--more--><\/p>\n<h2>Les r\u00e8gles de type Major<\/h2>\n<p>Si on passe aux Majors, on commence \u00e0 avoir des r\u00e8gles qui impactent la maintenabilit\u00e9.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/Majors10.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1595\" alt=\"Majors10\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/Majors10.jpg\" width=\"722\" height=\"170\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/Majors10.jpg 722w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/Majors10-300x70.jpg 300w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/Majors10-624x146.jpg 624w\" sizes=\"(max-width: 722px) 100vw, 722px\" \/><\/a><\/p>\n<p>Je vais faire passer en Minors un certain nombre de bonnes pratiques qui concernent la lisibilit\u00e9 du code ou sa portabilit\u00e9, car je ne souhaite pas en faire une priorit\u00e9. Et faire passer en Criticals certaines r\u00e8gles Majors qui concernent la robustesse, la performance ou la s\u00e9curit\u00e9.<\/p>\n<p>Pour quelles raisons ? Parce que ces d\u00e9fauts vont impacter l\u2019utilisateur. Un bug qui \u2018sort\u2019 l\u2019utilisateur de l\u2019application ou laisse celle-ci dans un \u00e9tat instable, avec une possible corruption de donn\u00e9es, ou un temps de traitement trop long vont affecter l\u2019utilisateur alors que des d\u00e9fauts portant sur la lisibilit\u00e9 ou la compr\u00e9hension du code vont augmenter le travail \u2013 et donc les co\u00fbts et les temps \u2013 de maintenance, mais sans cons\u00e9quences directes pour l\u2019utilisateur. Je souhaite donc mettre ce type de bonnes pratiques au second plan \u2013 en issues de type Major voire Minor.<\/p>\n<p>Il s&rsquo;agit bien entendu d&rsquo;une d\u00e9cision personnelle dans le cadre de cette analyse, destin\u00e9e \u00e0 r\u00e9aliser une &lsquo;d\u00e9mo&rsquo; qui puisse me permettre de d\u00e9montrer \u00e0 un client comment utiliser SonarQube et quels b\u00e9n\u00e9fices en tirer. Je ne vais pas ignorer des d\u00e9fauts qui affectent les co\u00fbts de maintenance, mais je souhaite les faire passer au second plan et mettre en avant les violations aux bonnes pratiques qui pr\u00e9sentent un risque pour l&rsquo;utilisateur final.<\/p>\n<p>Egalement, la plupart du code utilis\u00e9 pour effectuer cette analyse est assez ancien, et date d\u2019une \u00e9poque o\u00f9 ces bonnes pratiques de programmation n\u2019\u00e9taient pas en vigueur. Les d\u00e9veloppeurs qui doivent maintenir actuellement ce code ne sont pas responsables de ces d\u00e9fauts, alors m\u00eame qu\u2019ils p\u00e8sent lourdement sur la dette technique.<\/p>\n<h2>Technical dette et SQALE<\/h2>\n<p>Si nous allons dans la page Squale, la pyramide suivante nous montre que la Robustesse (Reliabililty &#8211; 163 jours), la performance (Efficiency \u2013 192.5 jours) et la s\u00e9curit\u00e9 (Security \u2013 40 jours) repr\u00e9sentent ensemble 395.6 jours de dette technique (co\u00fbts de rem\u00e9diation des d\u00e9fauts correspondants) sur un total de 2 677.2, soit 14.7%.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/PLSQL_Sqale1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1597\" alt=\"PLSQL_Sqale1\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/PLSQL_Sqale1.jpg\" width=\"582\" height=\"249\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/PLSQL_Sqale1.jpg 582w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/PLSQL_Sqale1-300x128.jpg 300w\" sizes=\"(max-width: 582px) 100vw, 582px\" \/><\/a><\/p>\n<p>Le diagramme suivant nous montre bien l\u2019importance prise par la maintenabilit\u00e9, qui repr\u00e9sente les 3\/4 de la dette technique. Nous reviendrons dans un prochain post sur ce diagramme SQALE Sunburst. Mais nous pouvons voir (second cercle) que la lisibilit\u00e9 (Readibility) et la compr\u00e9hension du code (Understandability) sont les 2 facteurs constitutifs de la Maintenability. Toutes les r\u00e8gles (troisi\u00e8me cercle, le plus ext\u00e9rieur) concernant la Maintenabilit\u00e9 se r\u00e9partissent au sein de ces 2 groupes.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/PLSQL_SqaleSunburst1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1598\" alt=\"PLSQL_SqaleSunburst1\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/PLSQL_SqaleSunburst1.jpg\" width=\"581\" height=\"603\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/PLSQL_SqaleSunburst1.jpg 581w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/PLSQL_SqaleSunburst1-289x300.jpg 289w\" sizes=\"(max-width: 581px) 100vw, 581px\" \/><\/a><\/p>\n<p>La fl\u00e8che nous montre qu\u2019en mati\u00e8re de Changeabilit\u00e9, il faudrait 165.6 jours de travail pour affecter un alias \u00e0 chaque colonne des tables afin d\u2019en faciliter la compr\u00e9hension et les \u00e9volutions futures (Changeability). Cela repr\u00e9sente plus d&rsquo;une ann\u00e9e-homme, et je ne pense pas que cela soit vraiment le plus critique. Ou en tout cas pas autant qu&rsquo;un d\u00e9faut qui impacte l&rsquo;utilisateur.<\/p>\n<p>En fait, il faudrait un chantier sp\u00e9cifique de plus de 15 ann\u00e9es hommes afin de supprimer la part de la dette technique imputable \u00e0 la Maintenabilit\u00e9, alors m\u00eame que nous ignorons si cette application va \u00e9voluer, voire m\u00eame exister encore longtemps.<\/p>\n<p>Je vais faire donc faire passer en Minors un certain nombre de bonnes pratiques qui concernent la lisibilit\u00e9 du code ou sa portabilit\u00e9, car je ne souhaite pas en faire une priorit\u00e9. Et faire passer en Critical certaines r\u00e8gles Major qui concernent la robustesse, la performance ou la s\u00e9curit\u00e9.<\/p>\n<p>Sans rentrer dans trop de d\u00e9tails, les r\u00e8gles que nous passons en Criticals sont les suivantes :<\/p>\n<ul>\n<li>EXCEPTION &#8211; Catch all exceptions with WHEN OTHERS<\/li>\n<li>GOTO &#8211; Avoid use of GOTO statements<\/li>\n<li>IF &#8211; Avoid nested if statements &#8211; Remarque : celle-ci concerne la maintainabilit\u00e9, mais me para\u00eet suffisamment critique pour justifier cette promotion. D&rsquo;autant qu&rsquo;elle peut impacter \u00e9galement, dans une certaine mesure, la robustelle de l&rsquo;application, puisqu&rsquo;elle favorise le risque d&rsquo;erreurs de logique applicative.<\/li>\n<li>LOOP &#8211; Avoid simple loops of the form LOOP &#8230; END LOOP<\/li>\n<li>LOOP &#8211; Avoid using EXIT from within a FOR or WHILE loop<\/li>\n<li>RETURN &#8211; Avoid using RETURN from within a loop<\/li>\n<li>SQL &#8211; Avoid nested subqueries (queries in the WHERE clause)<\/li>\n<\/ul>\n<p>Je vais passer en Blockers les r\u00e8gles suivantes :<\/p>\n<ul>\n<li>SQL &#8211; Avoid using the GROUP BY clause<\/li>\n<li>SQL \u2013 Avoid using UNION (celle-ci est de type Info).<\/li>\n<li>SQL &#8211; Do not join on more than X tables<\/li>\n<li>SQL &#8211; SELECT * should not be used<\/li>\n<\/ul>\n<p>car celles-ci impactent la performance de mani\u00e8re importante. Ce sont d&rsquo;ailleurs des r\u00e8gles SQL qui s&rsquo;appliquent \u00e0 toutes les technologies (Cobol, ABAP, etc.). En fait, ces r\u00e8gles ne pr\u00e9sentent pas de d\u00e9fauts, donc sont connues par les d\u00e9veloppeurs. Dans le cadre de cette analyse et de ce code.<\/p>\n<p>Ce ne sera pas le cas pour d&rsquo;autres langages, particuli\u00e8rement en mati\u00e8re de d\u00e9veloppement ABAP : la connaissances des bonnes pratiques SQL n&rsquo;est pas un point fort des \u00e9quipes de projet SAP.<\/p>\n<p>Les r\u00e8gles Major que nous passons en Minor :<\/p>\n<ul>\n<li>FORMAT &#8211; Do not use more that one statement per line<\/li>\n<li>LITERALS &#8211; Avoid using magic numbers<\/li>\n<li>LITERAL &#8211; Avoid new-line or control characters in string literals<\/li>\n<li>SQL &#8211; Columns should be aliased<\/li>\n<li>SQL &#8211; Introduce column aliases using the AS keyword<\/li>\n<li>SQL &#8211; Prefer EXECUTE IMMEDIATE to DBMS_SQL&rsquo;s package procedure calls<\/li>\n<li>SQL &#8211; Tables should be aliased<\/li>\n<li>SQL &#8211; Use standard ANSI syntax instead of old syntax for join queries<\/li>\n<\/ul>\n<p>Remarque : je modifie cette r\u00e9partition sur la base du code analys\u00e9. J&rsquo;ai l&rsquo;habitude de r\u00e9aliser ce travail pour chaque nouveau client, sur la base de ses propres r\u00e8gles. Le plugin SQALE de SonarQube est d&rsquo;une grande aide pour ce faire.<\/p>\n<p>A la suite de cette affectation, dans notre propre Quality Profile, la r\u00e9partition des r\u00e8gles selon leur criticit\u00e9 me para\u00eet maintenant plus \u00e9quilibr\u00e9e :<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/Sqale_Rules.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1602\" alt=\"Sqale_Rules\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/Sqale_Rules.jpg\" width=\"582\" height=\"177\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/Sqale_Rules.jpg 582w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/Sqale_Rules-300x91.jpg 300w\" sizes=\"(max-width: 582px) 100vw, 582px\" \/><\/a><\/p>\n<p>Le nombre de d\u00e9faut de type &lsquo;Blockers&rsquo; n&rsquo;a pas \u00e9volu\u00e9 : les r\u00e8gles que nous avons pass\u00e9 dans cette cat\u00e9gorie sont manifestement connues et respect\u00e9es par l&rsquo;\u00e9quipe de projet.<\/p>\n<p>La dette technique imputable aux r\u00e8gles Criticals a par contre augment\u00e9e, mais de mani\u00e8re relativement limit\u00e9e : il doit \u00eatre possible de corriger ces d\u00e9fauts au cours du cycle de vie de projet, voire avec un chantier sp\u00e9cifique qui ne n\u00e9cessite pas un investissement trop lourd.<\/p>\n<p>Le nombre de Majors a baiss\u00e9, puisque certaines r\u00e8gles sont pass\u00e9es en Criticals ou ont \u00e9t\u00e9 degrad\u00e9es en Minor. La plupart de ces r\u00e8gles Major sont orient\u00e9es Maintenabilit\u00e9, et un client pourra d\u00e9cider de prendre en compte toute ou partie de cette dette technique, en fonction de sa propre orientation IT :<\/p>\n<ul>\n<li>Eviter les bugs pour les utilisateurs de cette application.<\/li>\n<li>R\u00e9duire les co\u00fbts de maintenance, en fonction de la dur\u00e9e de vie de l&rsquo;application, des \u00e9volutions \u00e0 effectuer, de son budget, etc.<\/li>\n<\/ul>\n<p>Le plugin SQALE offre une aide pr\u00e9cieuse pour adapter un Quality Profile en fonction des besoins du client. Il faut bien comprendre que le Quality Profile offert par d\u00e9faut par SonarQube pour chaque technologie, est une base de travail et non pas un corpus de r\u00e8gles inscrites dans le marbre. C&rsquo;est le r\u00f4le du consultant Qualit\u00e9 de qualifier l&rsquo;orientation IT de chaque client, et d&rsquo;adapter ce Quality Profile de mani\u00e8re sp\u00e9cifique \u00e0 ses besoins, de mani\u00e8re \u00e0 pouvoir construire ensuite un plan d&rsquo;actions r\u00e9aliste, qui permette de g\u00e9rer la dette technique de mani\u00e8re optimale.<\/p>\n<p>Nous aurons probablement l&rsquo;occasion de consacrer dans le futur un &#8211; et m\u00eame probablement plusieurs posts \u00e0 ce plugin SQALE.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nous continuons cette s\u00e9rie sur l&rsquo;analyse de code PL\/SQL, avec aujourd&rsquo;hui les r\u00e8gles de type Major. Nous avons vu pr\u00e9c\u00e9demment comment organiser notre environnement et configurer notre analyse de code avec Jenkins et SonarQube. Nous avons cr\u00e9\u00e9 notre propre Quality Profile, puis examin\u00e9 les r\u00e8gles de type Blockers et Criticals, toutes orient\u00e9es Robustesse (Reliability) et [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[],"class_list":["post-1578","post","type-post","status-publish","format-standard","hentry","category-sonarqube-plsql"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1578"}],"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=1578"}],"version-history":[{"count":28,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1578\/revisions"}],"predecessor-version":[{"id":1581,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1578\/revisions\/1581"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=1578"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=1578"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=1578"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}