{"id":926,"date":"2013-06-14T14:33:45","date_gmt":"2013-06-14T13:33:45","guid":{"rendered":"http:\/\/qualilogy.com\/fr\/?p=926"},"modified":"2013-06-15T11:44:55","modified_gmt":"2013-06-15T10:44:55","slug":"creation-de-metriques-personnalisees-3","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/creation-de-metriques-personnalisees-3\/","title":{"rendered":"Cr\u00e9ation de m\u00e9triques personnalis\u00e9es (3)"},"content":{"rendered":"<p><a href=\"http:\/\/vicken.deviantart.com\/\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-927\" alt=\"NewMetric3\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/06\/NewMetric3.jpg\" width=\"250\" height=\"350\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/06\/NewMetric3.jpg 250w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/06\/NewMetric3-214x300.jpg 214w\" sizes=\"(max-width: 250px) 100vw, 250px\" \/><\/a>Troisi\u00e8me article de notre s\u00e9rie sur la cr\u00e9ation de m\u00e9triques personnalis\u00e9es, et pourquoi la possibilit\u00e9 de d\u00e9finir ses propres m\u00e9triques dans un outil d&rsquo;analyse de code n&rsquo;est pas le crit\u00e8re important que tout le monde croit.<\/p>\n<p>Nous avons vu dans <a title=\"Cr\u00e9ation de m\u00e9triques personnalis\u00e9es (1)\" href=\"http:\/\/qualilogy.com\/fr\/creation-de-metriques-personnalisees\/\" target=\"_blank\">le premier article<\/a> que les m\u00e9triques les plus simples \u00e0 cr\u00e9er n&rsquo;\u00e9taient pas les plus nombreuses et dans<a title=\"Cr\u00e9ation de m\u00e9triques personnalis\u00e9es (2)\" href=\"http:\/\/qualilogy.com\/fr\/creations-de-metriques-personnalisees-2\/\" target=\"_blank\">\u00a0le second de cette s\u00e9rie<\/a>\u00a0que les m\u00e9triques les plus int\u00e9ressantes et importantes \u00e9taient \u00e9galement les plus complexes \u00e0 impl\u00e9menter, voire m\u00eame parfois (ou souvent) impossibles \u00e0 r\u00e9aliser.<\/p>\n<p>Dans ce dernier post, nous allons aborder cette question de personnalisation sous l&rsquo;angle des technologies applicatives, avant un dernier article qui nous servira \u00e0 r\u00e9sumer le tout et \u00e0 identifier les bonnes questions.<!--more--><\/p>\n<h2>M\u00e9triques personnalis\u00e9es et technologies<\/h2>\n<p>Quand on me demande s&rsquo;il est possible de cr\u00e9er des m\u00e9triques avec tel ou tel outil, je r\u00e9ponds &lsquo;Pourquoi faire ?&rsquo;. Le plus souvent, vous n&rsquo;obtiendrez pas de r\u00e9ponses tr\u00e8s pr\u00e9cises, ce qui n&rsquo;est \u00e9videmment pas bon signe quant \u00e0 l&rsquo;existence d&rsquo;un besoin r\u00e9el.<\/p>\n<p>La question plus pr\u00e9cise est en fait : &lsquo;Pour quelles technologies ?&rsquo;.<\/p>\n<h2>Java<\/h2>\n<p>Java reste le langage le plus utilis\u00e9 dans les entreprises, celui pour lequel existe le plus d&rsquo;applications.\u00a0Les bonnes pratiques de programmation sont bien connues, normalis\u00e9es et nombreuses. Bien s\u00fbr, il existe des d\u00e9bats de puristes pour savoir si l&rsquo;usage de telle ou telle instruction constitue ou non une violation \u00e0 une bonne pratique, mais soyons s\u00e9rieux, tout le monde est d&rsquo;accord sur les m\u00e9triques les plus importantes \u00e0 v\u00e9rifier.<\/p>\n<p>Les r\u00e8gles correspondantes existent depuis longtemps dans nombre d&rsquo;outils, au point que les plus connus s&rsquo;int\u00e8grent assez facilement (SonarQube sait travailler avec Findbugs, PMD, Checkstyle par exemple). En fait, il existe tellement d&rsquo;outils qui incorporent tellement de r\u00e8gles que vous avez la possibilit\u00e9 de sp\u00e9cialiser celles-ci selon vos priorit\u00e9s, et les objectifs qui vous sont fix\u00e9s :<\/p>\n<ul>\n<li>Applications nouvelles et critiques : vous souhaitez partir \u00e0 la chasse aux bugs potentiels afin de d\u00e9livrer des applications robustes et performantes, et limiter les probl\u00e8mes pour vos utilisateurs.<\/li>\n<li>Applications anciennes et \u00e9prouv\u00e9es : quelques probl\u00e8mes et retards sur la nouvelle version ne sont certes pas souhaitables, mais votre priorit\u00e9 &#8211; et ce sur quoi vous \u00eates jug\u00e9s &#8211; est de contr\u00f4ler les co\u00fbts de maintenance et de ne pas exploser votre budget. Vous privil\u00e9giez les bonnes pratiques de programmation qui impactent la maintenabilit\u00e9 de vos applications.<\/li>\n<\/ul>\n<p>Donc, si vous m&rsquo;avez bien compris, il n&rsquo;y a aucune raison de vouloir programmer ses propres r\u00e8gles en mati\u00e8re de Java, sauf \u00e0 vouloir se faire plaisir bien s\u00fbr, et jouer \u00e0 l&rsquo;apprenti-gourou.<\/p>\n<h2>Autres nouvelles technologies<\/h2>\n<p>Par autres nouvelles technologies, j&rsquo;entends les langages autres que Java : C++, C#, .NET, etc. Je dois dire que je ne suis pas un sp\u00e9cialiste de ces langages, mais j&rsquo;ai quand m\u00eame analys\u00e9 quelques applications de ce type (pas mes pr\u00e9f\u00e9r\u00e9es je dois dire), et\u00a0je sais que la plupart des r\u00e8gles de qualit\u00e9 applicative sont assez proches de celles qu&rsquo;on trouvera en Java. Je veux dire : un IF est un IF et une boucle est une boucle, donc nous allons retrouver les m\u00eames bonnes pratiques de structuration de code par exemple. Ensuite, il y a toujours dans tous les langages certaines instructions sp\u00e9cifiques qu&rsquo;il n&rsquo;est pas recommand\u00e9 d&rsquo;utiliser.<\/p>\n<p>Je pense d&rsquo;ailleurs que l&rsquo;offre en mati\u00e8re d&rsquo;outils et de &lsquo;repository&rsquo; de r\u00e8gles est de plus en plus abondante et de qualit\u00e9 pour ces langages.\u00a0Donc les principes pr\u00e9c\u00e9dents concernant la customisation de r\u00e8gles Java restent selon moi applicable : ne pas r\u00e9inventer la roue.<\/p>\n<h2>Frameworks<\/h2>\n<p>En fait, il existe un unique cas acceptable selon moi : les frameworks &lsquo;maison&rsquo;. Imaginons que vous travaillez dans le cadre d&rsquo;une architecture SOA, avec un middleware d\u00e9velopp\u00e9 et maintenu en interne, et encapsulant des appels \u00e0 des requ\u00eates ou traitements Mainframe-Cobol ou d&rsquo;un ERP quelconque. Il est bien \u00e9videmment souhaitable que tout le monde utilise le framework et que personne ne d\u00e9veloppe ses traitements de son c\u00f4t\u00e9.<\/p>\n<p>Car le jour o\u00f9 le programme appel\u00e9 sur la couche SOA et les param\u00e8tres d&rsquo;appels \u00e0 celui-ci\u00a0sont modifi\u00e9s, le framework &#8211; les APIs pour ce programme &#8211; seront \u00e9galement mis-\u00e0-jour et les applications pourront continuer de fonctionner. Mais si quelqu&rsquo;un a fait son petit programme dans son coin, il faudra identifier celui-ci et le modifier (ou le r\u00e9\u00e9crire en utilisant le framework). En admettant que l&rsquo;on se souvienne de son existence, que son auteur soit encore dans les parages, etc.<\/p>\n<p>Autre cas pas si inusuel que cela : c&rsquo;est incroyable le nombre de soci\u00e9t\u00e9s qui ont d\u00e9velopp\u00e9 leur propre version de frameworks Struts ou Hibernate. Ok, la plupart sont des soci\u00e9t\u00e9s de services qui ont utilis\u00e9 ces frameworks propri\u00e9taires dans le cadre de d\u00e9veloppements d&rsquo;applications pour leurs clients, et s&rsquo;assurer ainsi des contrats de maintenance \u00e0 vie pour ces applications. Ou alors, il faut r\u00e9\u00e9crire celles-ci sans le framework. J&rsquo;ai vu des portfolios Java avec jusqu&rsquo;\u00e0 3 ou 4 frameworks propri\u00e9taires diff\u00e9rents.<\/p>\n<p>Donc dans ce cas, il est acceptable de supporter le co\u00fbt de personnalisation de m\u00e9triques pour un framework personnalis\u00e9, afin de s&rsquo;assurer que celui-ci est bien utilis\u00e9. Encore faut-il que lesdites r\u00e8gles soient possibles \u00e0 impl\u00e9menter. Comment identifier qu&rsquo;un traitement n&rsquo;utilise pas les instructions ou les objets d&rsquo;un framework alors qu&rsquo;il le devrait ? Dans le meilleur des cas, il vous faudra identifier toutes les instructions qui vont acc\u00e9der \u00e0 une couche (SOA dans notre exemple pr\u00e9c\u00e9dent, couche de donn\u00e9es pour un framework type Hibernate, etc.), et que ces instructions se trouvent dans du code &lsquo;d\u00e9veloppeur&rsquo; et non pas du code du framework, ou du code du framework instanci\u00e9 par le d\u00e9veloppeur, etc.<\/p>\n<p>C&rsquo;est horriblement compliqu\u00e9, et il vous faudra travailler au niveau de l&rsquo;arbre syntaxique (Abstract Metric Tree), en disposant encore une fois des outils et des comp\u00e9tences n\u00e9cessaires. Le co\u00fbt de cr\u00e9ation et de maintenance de ces r\u00e8gles sera assez voire tr\u00e8s \u00e9lev\u00e9.<\/p>\n<p>M\u00eame le co\u00fbt d&rsquo;utilisation de ces m\u00e9triques personnalis\u00e9es peut s&rsquo;av\u00e9rer important, en cas de false-positives, toujours probables. Je me souviens d&rsquo;un m\u00e9trique qui devait v\u00e9rifier que chaque JSP ou chaque page Html devait \u00eatre associ\u00e9 \u00e0 un page d&rsquo;erreur. Mais la relation avec cette derni\u00e8re n&rsquo;\u00e9tait pas toujours directe, et passait parfois par un objet Struts, parfois par un composant sp\u00e9cifique \u00e0 la gestion des erreurs, etc. La premi\u00e8re chose que je faisais \u00e9tait d&rsquo;aller voir cette m\u00e9trique car je n&rsquo;ai jamais autant rencontr\u00e9 de false-positives que sur celle-ci. Et \u00e9videmment, si vous annoncez \u00e0 une \u00e9quipe Java qu&rsquo;elle g\u00e8re mal les erreurs alors que l&rsquo;erreur, c&rsquo;est vous qui la commettez, &#8230; hum hum.<\/p>\n<h2>L4G<\/h2>\n<p>Par L4G (langage de 4\u00e8me g\u00e9n\u00e9ration), j&rsquo;entends tous les outils de type client-serveur qui fleurissaient dans les ann\u00e9es 80 et 90 : les SqlWindows, Powerbuilder, Delphi, NS\/DK (en France), etc.<\/p>\n<p>Il reste encore quelques applications avec ces langages, trop volumineuses pour qu&rsquo;on pense \u00e0 les r\u00e9-\u00e9crire, m\u00eame si on en parle r\u00e9guli\u00e8rement mais que cela ne se fait jamais. Apr\u00e8s tout, si cela marche&#8230;<\/p>\n<p>Il existe assez peu d&rsquo;outils d&rsquo;analyse de code qui couvrent ces outils, et pas suffisamment d&rsquo;applications et donc de clients pour que cela vaille la peine d&rsquo;investir pour la plupart des \u00e9diteurs logiciels. En g\u00e9n\u00e9ral, ces clients ont d\u00e9j\u00e0 suffisamment de probl\u00e8mes \u00e0 pouvoir v\u00e9rifier les r\u00e8gles les plus basiques et la customisation de nouvelles r\u00e8gles n&rsquo;est pas une priorit\u00e9.<\/p>\n<p>La seule exception &#8211; toutes proportions gard\u00e9es &#8211; r\u00e9side peut-\u00eatre dans un langage comme\u00a0Oracle-Forms qui reste assez utilis\u00e9. Cela d\u00e9pend un peu de\u00a0quel coin du monde on parle, je suis toujours \u00e9tonn\u00e9 de voir \u00e0 quel point certains outils sont tr\u00e8s utilis\u00e9s dans certains pays et pas du tout dans d&rsquo;autres r\u00e9gions du globe. Mais il reste encore pas mal de portfolios tr\u00e8s volumineux et critiques d&rsquo;applications Forms. Cependant, leurs propri\u00e9taires, comme pr\u00e9c\u00e9demment sont le plus souvent satisfaits de pouvoir disposer de bonnes m\u00e9triques avant de penser \u00e0 developper les leurs.<\/p>\n<h2>Cobol<\/h2>\n<p>Le Cobol est un des langages les mieux normalis\u00e9s avec Java. C&rsquo;est logique, si l&rsquo;on consid\u00e8re que Sun, \u00e0 l&rsquo;origine de Java, et IBM, principal fournisseur de hardware et de logiciels du monde mainframe, se sont souci\u00e9s de mettre \u00e0 disposition nombre de publications en mati\u00e8re de qualit\u00e9 de code. Donc les r\u00e8gles en ce domaine sont bien connues et normalis\u00e9es et il est rare d&rsquo;en d\u00e9roger. Dans le pire des cas, une r\u00e8gle n&rsquo;est pas appliqu\u00e9e par une \u00e9quipe de projet, et sera d\u00e9sactiv\u00e9e dans l&rsquo;outil d&rsquo;analyse de code.<\/p>\n<p>Il est m&rsquo;est arriv\u00e9 une ou deux fois de rencontrer une soci\u00e9t\u00e9 qui avait d\u00e9fini une r\u00e8gle sp\u00e9cifique qui ne correspondait pas \u00e0 une norme existante. Par exemple : vous savez qu&rsquo;un programme Cobol va se d\u00e9composer en sections et surtout paragraphes, \u00e9quivalents de proc\u00e9dures ou fonctions r\u00e9utilisables au sein du m\u00eame programme. Un client avait \u00e9dict\u00e9 une r\u00e8gle selon laquelle il n&rsquo;\u00e9tait pas possible d&rsquo;appeler un paragraphe si celui-ci n&rsquo;avait pas \u00e9t\u00e9 d\u00e9clar\u00e9 et cod\u00e9 pr\u00e9c\u00e9demment (avant l&rsquo;appel).\u00a0La r\u00e8gle se justifiait, et m\u00eame si personne d&rsquo;autre ne l&rsquo;utilisait, il \u00e9tait possible de l&rsquo;impl\u00e9menter avec une RegExp. Et le client insistait, donc&#8230;<\/p>\n<h3>SAP<\/h3>\n<p>Cas inverse du pr\u00e9c\u00e9dent. SAP n&rsquo;a jamais \u00e9t\u00e9 un sp\u00e9cialiste de la qualit\u00e9 de code. La priorit\u00e9, c&rsquo;est de vendre de nouvelles versions, pas de stabiliser du code ABAP existant. Il est m\u00eame arriv\u00e9 que SAP pr\u00e9conise l&#8217;emploi d&rsquo;instructions qui repr\u00e9sentent un risque pour la performance ou la robustesse de l&rsquo;application.<\/p>\n<p>Donc beaucoup pour ne pas dire toutes les entreprises avec des programmes ABAP disposent d&rsquo;un cahier de bonnes pratiques de programmation. On y retrouvera souvent les principales normes existantes, mais pas toujours sous la m\u00eame forme. Par exemple, une r\u00e8gle \u00e9dicte de toujours utiliser et tester un code-retour apr\u00e8s l&rsquo;appel \u00e0 un autre traitement. Mais parfois, cette r\u00e8gle d\u00e9finira pr\u00e9cis\u00e9ment quel code-retour correspondra \u00e0 quelle situation (0 = pas d&rsquo;erreur, 1 = erreur de tel type, &#8230; X = erreur de type X, &#8230;). Dans un tel cas, il vous faudra probablement d\u00e9velopper une m\u00e9trique plus avanc\u00e9e que celle d\u00e9j\u00e0 existante, qui v\u00e9rifie non seulement la pr\u00e9sence d&rsquo;un code-retour mais aussi sa valeur.<\/p>\n<p>Vous aurez \u00e9galement des normes importantes qui ne seront pas pr\u00e9sentes dans un cahier de r\u00e8gles, et il vous faudra v\u00e9rifier avec votre client si elles pr\u00e9sentent un int\u00e9r\u00eat pour lui. Il sera souvent \u00e0 l&rsquo;\u00e9coute, mais pas forc\u00e9ment int\u00e9ress\u00e9 \u00e0 modifier les r\u00e8gles existantes. C&rsquo;est normal : il va devoir expliquer \u00e0 tous ses outsourcers que cela fait des ann\u00e9es qu&rsquo;ils travaillent mal sans que personne le sache puisque ces r\u00e8gles n&rsquo;\u00e9taient pas utilis\u00e9es.\u00a0Et c&rsquo;est \u00e9galement dans le monde ABAP que vous allez rencontrer le plus de r\u00e8gles tr\u00e8s complexes ou impossibles \u00e0 automatiser.<\/p>\n<p>Donc en r\u00e9sum\u00e9 :<\/p>\n<ul>\n<li>Java et nouvelles technologies : sauf \u00e0 vouloir jouer au petit chimiste fou en inventant ses propres recettes, il est difficile de justifier la n\u00e9cessit\u00e9 de nouvelles m\u00e9triques, sauf si &#8230;<\/li>\n<li>Framework : mais attention, le co\u00fbt de d\u00e9veloppement, de maintenance et m\u00eame d&rsquo;utilisation de m\u00e9triques personnalis\u00e9es pour un framework propri\u00e9taire sera \u00e9lev\u00e9, tr\u00e8s \u00e9lev\u00e9.<\/li>\n<li>Autres langages type L4G : peu ou pas de demande.<\/li>\n<li>Cobol : pareil, mais vous aurez souvent \u00e0 effectuer un travail de personnalisation du mod\u00e8le qualim\u00e9trique. Sur ce sujet, voir le post suivant\u00a0<a href=\"http:\/\/qualilogy.com\/fr\/votre-propre-modele-qualite\/\" target=\"_blank\">votre propre mod\u00e8le qualit\u00e9<\/a>.<\/li>\n<li>SAP : ABAP est probablement le seul langage pour lequel la personnalisation de r\u00e8gles peut se justifier. Par contre, toutes ne sont pas automatisables, et la plupart sont complexes \u00e0 impl\u00e9menter.<\/li>\n<\/ul>\n<p>Dans tous les cas, la cr\u00e9ation de nouvelles m\u00e9triques repr\u00e9sente un co\u00fbt souvent plus \u00e9lev\u00e9 qu&rsquo;on ne le croit. Le prochain article nous permettra d&rsquo;identifier quels sont les co\u00fbts cach\u00e9s et r\u00e9sumer l&rsquo;ensemble des questions \u00e0 se poser afin d&rsquo;\u00e9valuer au mieux le besoin r\u00e9el et le retour sur investissement.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Troisi\u00e8me article de notre s\u00e9rie sur la cr\u00e9ation de m\u00e9triques personnalis\u00e9es, et pourquoi la possibilit\u00e9 de d\u00e9finir ses propres m\u00e9triques dans un outil d&rsquo;analyse de code n&rsquo;est pas le crit\u00e8re important que tout le monde croit. Nous avons vu dans le premier article que les m\u00e9triques les plus simples \u00e0 cr\u00e9er n&rsquo;\u00e9taient pas les plus [&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-926","post","type-post","status-publish","format-standard","hentry","category-qualite-des-applications"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/926"}],"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=926"}],"version-history":[{"count":32,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/926\/revisions"}],"predecessor-version":[{"id":959,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/926\/revisions\/959"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=926"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=926"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=926"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}