{"id":146,"date":"2012-02-06T20:09:12","date_gmt":"2012-02-06T19:09:12","guid":{"rendered":"http:\/\/dev.qualilogy.com\/fr\/?p=146"},"modified":"2013-01-04T20:09:55","modified_gmt":"2013-01-04T19:09:55","slug":"10-a-20-metriques","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/10-a-20-metriques\/","title":{"rendered":"10 \u00e0 20 m\u00e9triques"},"content":{"rendered":"<p><a href=\"http:\/\/vicken.deviantart.com\/\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1091\" title=\"Qual10metricas\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/02\/Qual10metricas.jpg\" alt=\"\" width=\"230\" height=\"230\" \/><\/a>Nous avons vu dans le post pr\u00e9c\u00e9dent &lsquo;<a href=\"http:\/\/qualilogy.com\/fr\/cas-dutilisation-ensemble-et-sans-heurts\" target=\"_blank\">Cas d&rsquo;utilisation &#8211; Ensemble et sans heurts<\/a>&lsquo; quels use cases sont les plus souvent appliqu\u00e9s avec un outil d\u2019analyse de code, et permettent d\u2019en tirer le plus grand b\u00e9n\u00e9fice:<\/p>\n<ul>\n<li>Quality Gate afin de valider la livraison d\u2019une nouvelle version applicative.<\/li>\n<li>Gestion de SLAs et benchmarking des fournisseurs.<\/li>\n<li>Processus d\u2019Int\u00e9gration \/ Am\u00e9lioration continue des \u00e9quipes de d\u00e9veloppement.<\/li>\n<\/ul>\n<p><!--more--><\/p>\n<p>Il est recommand\u00e9 de combiner ces trois use cases pour une meilleure synergie et afin d\u2019en optimiser les r\u00e9sultats. N\u00e9anmoins, leur mise en \u0153uvre est diff\u00e9rente selon que vous \u00eates dans un contexte de :<\/p>\n<ul>\n<li>D\u00e9veloppement interne : Int\u00e9gration \/ Am\u00e9lioration continue + Quality Gate.<\/li>\n<li>D\u00e9veloppement externalis\u00e9 : Quality Gate + SLAs.<\/li>\n<\/ul>\n<p>Quelles sont m\u00e9triques les plus importantes pour ces use cases ?<\/p>\n<p>En fait, l\u2019objectif en mati\u00e8re d\u2019Am\u00e9lioration Continue et de SLAs doit rester simple et r\u00e9aliste.<br \/>\nR\u00e9aliste signifie concr\u00e8tement : atteignable. Si vous demandez \u00e0 vos \u00e9quipes de d\u00e9veloppement un r\u00e9sultat parfait sur 50 best practices, ce n\u2019est pas r\u00e9aliste. Personne ne peut avoir 50 mesures diff\u00e9rentes en t\u00eate, 50 bonnes pratiques de programmation \u00e0 respecter absolument. M\u00eame s\u2019ils les connaissent, m\u00eame s\u2019ils savent qu\u2019ils doivent \u00e9viter de cr\u00e9er des violations de ces r\u00e8gles de qualit\u00e9, il est impossible de toutes se les rappeler et vous ne pourrez pas \u00e9viter la faute d\u2019attention occasionnelle. Et si l\u2019objectif n\u2019est pas atteignable, l\u2019\u00e9quipe se d\u00e9courage rapidement et cesse de pr\u00eater attention et le processus mis en \u0153uvre sera un \u00e9chec.<\/p>\n<p>Fixez un objectif atteignable avec un minimum de 10 \u00e0 12 r\u00e9gles, 15 grand maximum.<\/p>\n<p>Simple signifie concr\u00e8tement : objectivement mesurable. Par exemple, vous d\u00e9cidez de fixer comme but d\u2019atteindre 99.99% de qualit\u00e9. Mais 99.99% de quoi ? Du nombre de lignes de code ? Du nombre d\u2019objets auxquels s\u2019applique la bonne pratique ? Imaginons une r\u00e8gle (classique) en mati\u00e8re de gestion des exceptions selon laquelle un \u2018throw\u2019 Java ne doit pas \u00eatre vide. Elle ne s\u2019applique \u00e9videmment qu\u2019aux m\u00e9thodes qui impl\u00e9mentent une logique m\u00e9tier. Si une classe a 100 setters\/getters sans aucune logique m\u00e9tier, la r\u00e8gle s\u2019applique-t-elle ? Si cette classe comporte 200 lignes de code ou plus, allez-vous inclure ces lignes dans votre calcul ? Non seulement cela devient compliqu\u00e9, mais de surcro\u00eet vous allez p\u00e9naliser le d\u00e9veloppeur qui aura une classe m\u00e9tier avec 20 m\u00e9thodes impl\u00e9mentant un \u2018throw\u2019 : il suffit d\u2019un oubli pour atteindre 5% d\u2019erreur, ce qui p\u00e9nalise \u00e9norm\u00e9ment ses r\u00e9sultats.<\/p>\n<p>L\u2019objectif le plus simple et le plus facilement mesurable est : 0 d\u00e9faut. Aucune malpractice n\u2019est tol\u00e9r\u00e9e, quelques soient le nombre de lignes, de m\u00e9thodes, de classes, etc.<\/p>\n<p>Donc 10 ou 12 m\u00e9triques avec une tol\u00e9rance 0.<\/p>\n<p>Et quelles sont les r\u00e8gles les plus importantes pour lesquelles nous n&rsquo;accepterons aucun d\u00e9faut ? Celles qui constituent une erreur critique en termes de d\u00e9veloppement, parce que l\u2019impact sur le comportement de l\u2019application et pour l\u2019utilisateur final sera critique. Une mauvaise gestion des erreurs peut aboutir \u00e0 une page blanche pour l\u2019utilisateur ou une page d\u2019erreur par d\u00e9faut incompr\u00e9hensible, l\u2019interruption du traitement, une transaction non finalis\u00e9e, voire m\u00eame une corruption de donn\u00e9es.<\/p>\n<p>Il en va de m\u00eame pour l\u2019utilisation de certaines classes g\u00e9n\u00e9riques qui ne permettent pas de sp\u00e9cialiser une exception et de comprendre et tracer l\u2019erreur survenue. Egalement, certaines syntaxes qui peuvent s\u2019av\u00e9rer dangereuses en mati\u00e8re de corruption de donn\u00e9es et de s\u00e9curit\u00e9.<\/p>\n<p>Cobol et ABAP ne connaissent pas la notion de classes ou de m\u00e9thodes mais les principes restent les m\u00eames : toujours utiliser un code retour lorsque l\u2019on appelle une fonction ou un traitement de base de donn\u00e9es, \u00e9viter les instructions qui interrompent les traitements tels que Break ou Stop Run. Ces technologies sont \u00e9galement tr\u00e8s sensibles \u00e0 la performance donc on ajoutera tous les traitements co\u00fbteux en temps de r\u00e9ponse dans le code SQL et\/ou dans des boucles.<\/p>\n<p>On favorisera donc des m\u00e9triques telles que :<\/p>\n<ul>\n<li>Java : Empty Try block, Empty Finally block, Empty If statement, Empty While Statement, Illegal throws (java.lang.error, java.lang.RuntimeException), Equals HashCode, Array stored directly, \u2026<\/li>\n<li>Cobol, Abap : If without Endif, Others in Case, When Other in Evaluate,  Break, Stop Run, Sort, Select *, Select Distinct, Group by, Select in Select, Cursor inside a loop, Open\/Close in a loop, \u2026<\/li>\n<\/ul>\n<p>Ces r\u00e8gles pr\u00e9sentent l\u2019avantage d\u2019\u00eatre \u00e9galement acceptables au sein d\u2019un SLA  pour un provider et un objectif de 0 d\u00e9faut est facilement mesurable.<\/p>\n<p>Qu\u2019en est-il maintenant des r\u00e8gles d\u2019acceptation ou de rejet d\u2019une version d\u2019application dans la Quality Gate ? Tout d\u2019abord on incluera logiquement les m\u00e9triques pr\u00e9c\u00e9dentes : si la r\u00e9gle de 0 d\u00e9faut s\u2019applique au niveau des d\u00e9veloppeurs, on ne veut pas retrouver ces d\u00e9fauts dans l\u2019application, que l\u2019\u00e9quipe soit interne ou externe.<\/p>\n<p>On incluera \u00e9galement quelques mesures en mati\u00e8re de maintenabilit\u00e9, c&rsquo;est-\u00e0-dire des m\u00e9triques qui mesurent la qualit\u00e9 du code en mati\u00e8re de co\u00fbts de maintenance et non pas de risques pour l\u2019utilisateur.<\/p>\n<p>Imaginons une application J2EE avec 500 classes comportant en moyenne 20 m\u00e9thodes, soit 1 000 m\u00e9thodes en tout. On admet qu\u2019un code Java de qualit\u00e9 puisse compter 7.5% d\u2019objets complexes et 2.5% d\u2019objets tr\u00e8s complexes, donc 750 m\u00e9thodes complexes et 250 m\u00e9thodes tr\u00e8s complexes dans notre exemple. Ce code est le plus co\u00fbteux \u00e0 faire \u00e9voluer parce qu\u2019il est difficile \u00e0 comprendre, et aussi le plus dangereux puisque le risque d\u2019introduire un d\u00e9faut en cas de modification est le plus \u00e9lev\u00e9.<\/p>\n<p>Imaginons maintenant que l\u2019\u00e9quipe de projet ajoute 5% de m\u00e9thodes complexes et tr\u00e8s complexes \u00e0 chaque version. Ce chiffre est assez limit\u00e9, cela ne repr\u00e9sente qu\u2019une douzaine de m\u00e9thodes tr\u00e8s complexes pour les 250 existantes. A raison de 4 versions par an, le total des r\u00e8gles les plus complexes aura augment\u00e9 de plus de 20% et la complexit\u00e9 de l\u2019application aura doubl\u00e9 en moins de 4 ans. Sachant l\u2019impact de cette complexit\u00e9 sur vos budgets, vos plannings et le nombre de bugs pour les utilisateurs, l\u2019on comprend rapidement pourquoi il est souhaitable de surveiller toute d\u00e9rive dans ce domaine.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/02\/QualCC.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1092\" title=\"QualCC\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/02\/QualCC.jpg\" alt=\"\" width=\"406\" height=\"311\" \/><\/a><br \/>\nOn pourra donc rajouter ce type de m\u00e9triques au niveau d\u2019un SLA et donc d\u2019une Quality Gate, et d\u2019autres mesures qui impactent la maintenabilit\u00e9 telles que le % de code dupliqu\u00e9, % de code en commentaires (Commented-out LOC), \u2026 et \u00e9videmment, si l\u2019outil sait le calculer, la Technical Debt (il faudra prendre en compte l\u2019augmentation de la taille du code pour cette mesure). Le pourcentage de commentaires peut \u00e9galement constituer une m\u00e9trique int\u00e9ressante lorsque le code est outsourc\u00e9.<\/p>\n<p>Evidemment, il est conseill\u00e9 de v\u00e9rifier ces m\u00e9triques le plus t\u00f4t possible, ce qui suppose de les faire appliquer au sein d\u2019un processus d\u2019Int\u00e9gration continue. Cependant, je ne recommande pas de politique \u20180 d\u00e9faut\u2019 \u00e0 ce niveau : l\u2019important est d\u2019arriver \u00e0 la Quality Gate sans aucun objet nouveau complexe, pas de les supprimer syst\u00e9matiquement de tout \u2018build\u2019. Une certaine marge de man\u0153uvre, pour ne pas dire d\u2019autonomie, peut-\u00eatre laiss\u00e9e \u00e0 l\u2019\u00e9quipe de projet dans ce domaine. On veillera n\u00e9anmoins \u00e0 les sensibiliser sur ces r\u00e8gles, dont la bonne application leur profite d\u2019ailleurs.<\/p>\n<p>A noter que les erreurs qui repr\u00e9sentent un risque pour l\u2019utilisateur peuvent \u00e9galement impacter fortement les co\u00fbts de maintenance de l\u2019application. Une mauvaise gestion des erreurs signifie un temps de d\u00e9tection du bug et donc de correction assez \u00e9lev\u00e9.<\/p>\n<p>Cette liste de m\u00e9triques n&rsquo;est pas absolue et nous ne pr\u00e9tendons pas lister celles-ci comme les 10 \u00e0 20 m\u00e9triques les plus importantes, mais \u00e0 titre d&rsquo;exemple pour ces trois use cases. Vous pouvez constituer votre propre liste selon vos propres crit\u00e8res: les technologies utilis\u00e9es pour vos applications, le niveau de maturit\u00e9 de vos \u00e9quipes, l&rsquo;alignement m\u00e9tier \/ IT (voir sur ce sujet &lsquo;<a title=\"Alignement IT \/ M\u00e9tier\" href=\"http:\/\/qualilogy.com\/fr\/quelle-est-la-premiere-question\" target=\"_blank\">Quelle est la premi\u00e8re question ?<\/a>&lsquo;), si les applications sont maintenues en interne ou &lsquo;outsourc\u00e9es&rsquo;, etc.<\/p>\n<p>Les 10 \u00e0 20 m\u00e9triques les plus importantes sont celles qui vous permettront d&rsquo;am\u00e9liorer la qualit\u00e9 de vos applications en tirant le maximum de b\u00e9n\u00e9fices de ces trois cas d&rsquo;usages.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nous avons vu dans le post pr\u00e9c\u00e9dent &lsquo;Cas d&rsquo;utilisation &#8211; Ensemble et sans heurts&lsquo; quels use cases sont les plus souvent appliqu\u00e9s avec un outil d\u2019analyse de code, et permettent d\u2019en tirer le plus grand b\u00e9n\u00e9fice: Quality Gate afin de valider la livraison d\u2019une nouvelle version applicative. Gestion de SLAs et benchmarking des fournisseurs. Processus [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,2],"tags":[],"class_list":["post-146","post","type-post","status-publish","format-standard","hentry","category-analyse-de-code","category-qualite-des-applications"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/146"}],"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=146"}],"version-history":[{"count":1,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/146\/revisions"}],"predecessor-version":[{"id":147,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/146\/revisions\/147"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=146"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}