{"id":202,"date":"2012-06-23T10:16:05","date_gmt":"2012-06-23T09:16:05","guid":{"rendered":"http:\/\/dev.qualilogy.com\/fr\/?p=202"},"modified":"2013-01-05T10:16:40","modified_gmt":"2013-01-05T09:16:40","slug":"sonar-cobol-regles-cobol","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/sonar-cobol-regles-cobol\/","title":{"rendered":"Sonar Cobol &#8211; R\u00e8gles Cobol"},"content":{"rendered":"<p><a href=\"http:\/\/vicken.deviantart.com\/\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1941\" title=\"QualSonarCobolRules\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/06\/QualSonarCobolRules.jpg\" alt=\"\" width=\"284\" height=\"426\" \/><\/a>Les pr\u00e9c\u00e9dents posts sur la pr\u00e9paration et l\u2019analyse de code Cobol avec Sonar et Jenkins ont attir\u00e9 quelques commentaires impatients au sujet du r\u00e9sultat des analyses et des r\u00e8gles disponibles dans le dashboard Sonar.<\/p>\n<p>Ces r\u00e9sultats permettent-ils une \u00e9valuation de la qualit\u00e9 des applications Cobol ? Quelle valeur pouvons-nous d\u00e9livrer aux \u00e9quipes, aux partenaires et au management ? Et pour ceux qui ne sont pas familiers du monde Mainframe, quelles sont les \u2018best\/bad practices\u2019 en mati\u00e8re de code Cobol ?<\/p>\n<p>Beaucoup de questions, et nous n\u2019allons pas pouvoir r\u00e9pondre \u00e1 toutes en un seul post. Celui-ci sera donc d\u00e9di\u00e9 \u00e0 la pr\u00e9sentation de diff\u00e9rentes r\u00e8gles et d\u00e9fauts de qualit\u00e9, fr\u00e9quemment rencontr\u00e9s dans les applications Cobol.<\/p>\n<p>L\u2019objectif est le suivant : vous avez effectu\u00e9 une analyse, les r\u00e9sultats apparaissent dans le tableau de bord Sonar. Et maintenant, par o\u00f9 commencer ?<!--more--><strong><\/strong><\/p>\n<h3><strong>Blockers<\/strong><\/h3>\n<p>La premi\u00e8re r\u00e8gle \u00ab bloquante \u00bb que vous allez rencontrer va probablement vous surprendre : \u2018Avoid use of SQL\u2019. Comment ? Il n\u2019est pas possible de programmer des requ\u00eates SQL en Cobol ? En fait, c\u2019est compl\u00e8tement prohib\u00e9 dans certaines organisations, qui ont mis en place des composants r\u00e9utilisables en charge de l\u2019acc\u00e8s \u00e1 la couche de donn\u00e9es.<\/p>\n<p>La raison en est simple : si chaque d\u00e9veloppeur ajoute ses propres requ\u00eates SQL chaque fois qu\u2019il doit acc\u00e9der \u00e0 une table, les acc\u00e8s \u00e0 la base de donn\u00e9es se multiplient au fil du temps. Les applications Cobol sont les plus anciennes qui soient, et au cours des ann\u00e9es, pour ne pas dire des d\u00e9cennies, les \u2018update \/ insert \/ delete\u2019 se sont multipli\u00e9s. D\u00e9s lors, toute modification de la structure de donn\u00e9es d\u2019une table n\u00e9cessite de modifier des dizaines de requ\u00eates SQL redondantes dans diff\u00e9rents programmes, donc un effort de maintenance tr\u00e8s important et un risque \u00e9lev\u00e9 d\u2019oublier un programme et donc de cr\u00e9er un bug.<\/p>\n<p>Toutefois, r\u00e9server les acc\u00e8s \u00e1 la couche de donn\u00e9es \u00e0 un ensemble de composants r\u00e9utilisables n\u00e9cessite une \u00e9quipe d\u00e9di\u00e9e \u00e0 la maintenance de ces programmes, et un processus de demandes justifi\u00e9es de modifications de la part des autres \u00e9quipes. Assez lourd, co\u00fbteux en temps, donc l\u2019interdiction de programmer en SQL ne se rencontre pas dans toutes les entreprises.<\/p>\n<p>Ce qui explique que cette m\u00e9trique soit optionnelle, et d\u00e9sactiv\u00e9e par d\u00e9faut (sur ce sujet, voir notre post pr\u00e9c\u00e9dent <a href=\"http:\/\/qualilogy.com\/fr\/quality-profile\" target=\"_blank\">Quality Profiles<\/a>). Donc v\u00e9rifiez aupr\u00e8s des \u00e9quipes Cobol si cette \u2018bonne pratique\u2019 existe ou non, afin de savoir si vous devez activer ou non cette m\u00e9trique.<\/p>\n<p>Sinon, vous risquez de rencontrer le cas suivant :<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/06\/QualSQL.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1918\" title=\"QualSQL\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/06\/QualSQL.jpg\" alt=\"\" width=\"249\" height=\"28\" \/><\/a>Pr\u00e9senter un dashboard avec 18 000 d\u00e9fauts \u2018bloquants\u2019 interdisant les requ\u00eates SQL risque de cr\u00e9er une certaine incompr\u00e9hension de la part de l&rsquo;\u00e9quipe Cobol.<\/p>\n<p>Autres blockers :<br \/>\n<a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/06\/QualSTOPRUN.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1919\" title=\"QualSTOPRUN\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/06\/QualSTOPRUN.jpg\" alt=\"\" width=\"443\" height=\"26\" \/><\/a>Un STOP RUN est tout simplement une interruption du programme. Tout s\u2019arr\u00eate, les programmes mont\u00e9s en m\u00e9moire sont supprim\u00e9s de celle-ci, les fichiers ferm\u00e9s, retour direct \u00e0 l\u2019OS. Cette instruction doit donc \u00eatre utilis\u00e9e avec pr\u00e9caution (voire m\u00eame interdite). Et dans tous les cas, il ne peut pas y avoir de code apr\u00e8s un STOP RUN puisque ce code ne sera pas ex\u00e9cut\u00e9.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/06\/QualCobolBigBank.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1920\" title=\"QualCobolBigBank\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/06\/QualCobolBigBank.jpg\" alt=\"\" width=\"226\" height=\"73\" \/><\/a>J\u2019ai trouv\u00e9 ces 4 blockers au sein de cette application :<\/p>\n<p>Vous imaginez cette fois que vos interlocuteurs seront tr\u00e8s heureux que vous ayez identifi\u00e9 ces 4 d\u00e9fauts au sein de plus de 2 millions de lignes, dont pr\u00e9s d\u20191.5 million de lignes de code (le reste est du commentaire). Rien que cela justifie compl\u00e8tement votre travail d\u2019analyse.<\/p>\n<p>J\u2019ai \u00e9galement trouv\u00e9 dans cette application 10 Performs recursifs.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/06\/QualCobolRecPerf.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1925\" title=\"QualCobolRecPerf\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/06\/QualCobolRecPerf.jpg\" alt=\"\" width=\"277\" height=\"29\" \/><\/a>Le code Cobol est organis\u00e9 dans un programme en une succession de paragraphes qui sont l\u2019\u00e9quivalent de proc\u00e9dures ou fonctions (pour faire simple, nous n\u2019allons pas commencer un cours de Cobol dans ces pages). Un Perform recursif est donc l\u2019\u00e9quivalent d\u2019une proc\u00e9dure s\u2019appelant de mani\u00e8re r\u00e9cursive.<\/p>\n<p>Sonar nous montre la ligne o\u00f9 se rencontre cette \u2018bad practice\u2019 :<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/06\/QualCobolRecPerfCode.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1926\" title=\"QualCobolRecPerfCode\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/06\/QualCobolRecPerfCode.jpg\" alt=\"\" width=\"472\" height=\"176\" \/><\/a> Comme le montre cet exemple, le Perform r\u00e9cursif se rencontre g\u00e9n\u00e9ralement dans un code compliqu\u00e9 bourr\u00e9 de IFs \u00edmbriqu\u00e9s, et ici dans un \u2018Else\u2019. Donc si l\u2019une des conditions pr\u00e9c\u00e9dentes n\u2019est pas v\u00e9rifi\u00e9, le risque est important de se retrouver dans une boucle r\u00e9cursive infinie. De plus, cela complique \u00e9norm\u00e9ment la compr\u00e9hension du code, donc augmente encore le risque d\u2019introduire une erreur lorsque le d\u00e9veloppeur effectue une modification. Donc c\u2019est dangereux et tout programmeur Cobol le sait bien (sauf les petits g\u00e9nies qui veulent \u00e0 tout prix programmer des paragraphes r\u00e9cursifs).<\/p>\n<p>Un dernier blocker que vous rencontrerez probablement peu souvent :<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/06\/QualCobolPerfThru.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1927\" title=\"QualCobolPerfThru\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/06\/QualCobolPerfThru.jpg\" alt=\"\" width=\"524\" height=\"24\" \/><\/a><\/p>\n<p>Un Perform Thru est une ex\u00e9cution successive de diff\u00e9rents paragraphes. Par exemple, imaginons 3 paragraphes cons\u00e9cutifs A, B, C et une instruction \u2018Perform A thru C\u2019, alors les paragraphes A puis B puis C seront ex\u00e9cut\u00e9s. Probl\u00e8me : si B est d\u00e9fini avant A, alors seuls A et C seront ex\u00e9cut\u00e9s, ce qui n\u2019est pas l\u2019objectif recherch\u00e9.<br \/>\nEncore une fois, il est rare de rencontrer ce type de d\u00e9faut.<\/p>\n<h3><strong>Critical<\/strong><\/h3>\n<p>Toujours dans cette m\u00eame application, voici les violations \u2018Critical\u2019.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/06\/QualCobolCritical.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1928\" title=\"QualCobolCritical\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/06\/QualCobolCritical.jpg\" alt=\"\" width=\"524\" height=\"175\" \/><\/a>Un d\u00e9faut que vous allez rencontrer dans toutes les applications : un IF qui ne se termine pas par un END-IF. Par quoi se termine-t-il alors ? Par un point. Oui, un \u2018.\u2019 minuscule et facilement inaper\u00e7u. La moindre crotte de mouche \u00e0 l\u2019\u00e9cran et c\u2019est l\u2019erreur assur\u00e9e. Vous n\u2019imaginez pas les milliers d\u2019heures pass\u00e9es \u00e0 d\u00e9buguer des programmes Cobol \u00e0 cause de ce fichu point.<\/p>\n<p>Tous les programmeurs le savent et tout le monde respecte cette \u2018best practice\u2019 de nos jours, mais ce ne fut pas toujours le cas. En fait, plus l\u2019application est ancienne, plus vous rencontrerez ce d\u00e9faut. Cela peut justifier de d\u00e9grader la s\u00e9v\u00e9rit\u00e9 de cette r\u00e8gle de \u2018Critical\u2019 \u00e0 \u2018Major\u2019. Elles sont souvent trop nombreuses pour envisager de les corriger. Et puis, \u00e9vitez de d\u00e9moraliser les \u00e9quipes Cobol en leur pr\u00e9sentant un tableau de bord avec des milliers de d\u00e9fauts critiques.<\/p>\n<p>Certaines de ces r\u00e8gles sont facilement compr\u00e9hensible par des non-cobolistes, comme la n\u00e9cessit\u00e9 d\u2019initialiser les donn\u00e9es pass\u00e9s en param\u00e8tres d\u2019un CALL, les requ\u00eates SQL imbriqu\u00e9es ou l\u2019utilisation de SQL dynamique (pratique peu courante toutefois chez les d\u00e9veloppeurs Cobol). D\u2019autres semblent plus \u00e9sot\u00e9riques, mais sont toutefois assez simples.<\/p>\n<p>La Linkage Section d\u00e9finit les donn\u00e9es qui peuvent \u00eatre partag\u00e9es entre programmes. Comme pour les requ\u00eates SQL, si chaque d\u00e9veloppeur commence \u00e0 modifier cette structure de donn\u00e9es en en supprimant certaines par exemples, le risque est de voir les autres programmes appelant ce dernier ne plus fonctionner. Donc il serait souhaitable de d\u00e9finir ces donn\u00e9es dans un Copy-Book. Mais comme pour les requ\u00eates SQL, cela suppose une certaine organisation de programmeurs g\u00e9rant ces donn\u00e9es, donc cette r\u00e8gle ne s\u2019applique pas souvent.<\/p>\n<p>Elle est d\u2019ailleurs d\u00e9sactiv\u00e9e dans le <a href=\"http:\/\/qualilogy.com\/fr\/quality-profile\" target=\"_blank\">Quality Profile<\/a> par d\u00e9faut de Sonar, tout comme la r\u00e8gle d\u2019initialisation des param\u00e8tres d\u2019un CALL. Ceci explique donc le nombre de violations trouv\u00e9es dans cette application pour ces deux r\u00e8gles. Donc l\u00e0 encore, v\u00e9rifiez avec l\u2019\u00e9quipe Cobol si elles s\u2019appliquent et \u00e9ventuellement, d\u00e9sactivez-les. Personnellement, je les mettrais en s\u00e9v\u00e9rit\u00e9 (pour) \u2018Info\u2019.<\/p>\n<p>Un SORT est tout simplement une instruction de tri, malheureusement tr\u00e8s co\u00fbteuse en performance. La r\u00e8gle qui prohibe son utilisation peut d\u2019ailleurs \u00eatre consid\u00e9r\u00e9e comme \u2018Critical\u2019, sauf \u00e9ventuellement lorsqu\u2019il s\u2019agit d\u2019applications Batch. Mais tout le monde sera d&rsquo;accord si vous pr\u00e9conisez de corriger ces d\u00e9fauts.<\/p>\n<p>Un GOTO est un d\u00e9placement de la logique du programme vers un autre paragraphe. Plus connu comme le symbole m\u00eame du code spaghetti. Par exemple, si lors d\u2019un \u2018Perform A Thru C\u2019, le paragraphe B comporte un GOTO Paragraph D, on sort de la s\u00e9quence initialement pens\u00e9e puisque le paragraphe C ne sera pas ex\u00e9cut\u00e9, avec des cons\u00e9quences parfois impr\u00e9visibles.<\/p>\n<p>Donc un rapide examen de ces r\u00e8gles \u2018Blockers\u2019 et \u2018Critical\u2019 nous permet d\u00e9j\u00e0 une premi\u00e8re \u00e9valuation de la qualit\u00e9 du code de cette application et une premi\u00e8re \u00e9bauche de plan d\u2019actions :<\/p>\n<ul>\n<li>D\u00e9sactiver la r\u00e8gle prohibant l\u2019usage du SQL : elle ne s\u2019applique manifestement pas ici.<\/li>\n<li>Corriger au plus t\u00f4t les 4 STOP RUN et les 10 Performs r\u00e9cursifs.<\/li>\n<li>Le IF sans END-IF soul\u00e8vera certainement des soupirs de r\u00e9signation de la part de vos interlocuteurs Cobol, mais sauf refactoring complet de l\u2019application, ils sont certainement l\u00e0 pour longtemps. N\u00e9anmoins, vous pouvez leur indiquer de tenter de les corriger lors d\u2019\u00e9volutions du code. Sonar vous aide en indiquant la ligne de code o\u00f9 ils sont pr\u00e9sents.<\/li>\n<li>D\u00e9sactivez \u00e9galement les r\u00e8gles concernant le passage de param\u00e8tres ou la Linkage section, manifestement non appliqu\u00e9es par l\u2019\u00e9quipe Cobol.<\/li>\n<li>Les autres d\u00e9fauts doivent \u00eatre corrig\u00e9s. Vous pourriez passer la r\u00e8gle prohibant l\u2019usage du SORT en \u2018Critical\u2019.<\/li>\n<\/ul>\n<p>Vous avez d\u00e9j\u00e0 de quoi faire une Quality Gate et demander \u00e0 un provider les corrections mentionn\u00e9es ci-dessus.<\/p>\n<p>Nous continuerons cette \u00e9valuation de la qualit\u00e9 du code Cobol dans un prochain post, avec plus de r\u00e8gles encore. D\u2019ici l\u00e0, bonnes analyses Cobol.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Les pr\u00e9c\u00e9dents posts sur la pr\u00e9paration et l\u2019analyse de code Cobol avec Sonar et Jenkins ont attir\u00e9 quelques commentaires impatients au sujet du r\u00e9sultat des analyses et des r\u00e8gles disponibles dans le dashboard Sonar. Ces r\u00e9sultats permettent-ils une \u00e9valuation de la qualit\u00e9 des applications Cobol ? Quelle valeur pouvons-nous d\u00e9livrer aux \u00e9quipes, aux partenaires 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":[6],"tags":[],"class_list":["post-202","post","type-post","status-publish","format-standard","hentry","category-sonar-cobol"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/202"}],"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=202"}],"version-history":[{"count":1,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/202\/revisions"}],"predecessor-version":[{"id":203,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/202\/revisions\/203"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=202"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=202"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=202"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}