{"id":961,"date":"2013-06-21T03:32:06","date_gmt":"2013-06-21T02:32:06","guid":{"rendered":"http:\/\/qualilogy.com\/fr\/?p=961"},"modified":"2013-06-26T17:19:06","modified_gmt":"2013-06-26T16:19:06","slug":"creation-de-metriques-personnalisees-4","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/creation-de-metriques-personnalisees-4\/","title":{"rendered":"Cr\u00e9ation de m\u00e9triques personnalis\u00e9es (4)"},"content":{"rendered":"<p><a href=\"http:\/\/vicken.deviantart.com\/\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright  wp-image-962\" alt=\"M\u00e9triques personnalis\u00e9es\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/06\/NewMetric4.jpg\" width=\"333\" height=\"279\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/06\/NewMetric4.jpg 370w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/06\/NewMetric4-300x251.jpg 300w\" sizes=\"(max-width: 333px) 100vw, 333px\" \/><\/a> Dernier article de notre s\u00e9rie sur la cr\u00e9ation de m\u00e9triques personnalis\u00e9es.<\/p>\n<p>Nous allons aborder dans celui-ci les diff\u00e9rents co\u00fbts attach\u00e9s \u00e0 la customisation de m\u00e9triques, et qui sont g\u00e9n\u00e9ralement mal identifi\u00e9s voire compl\u00e8tement ignor\u00e9s lors d&rsquo;un projet d&rsquo;acquisition d&rsquo;un outil d&rsquo;analyse de code.<\/p>\n<p>Nous terminerons par r\u00e9sumer l&rsquo;ensemble des diff\u00e9rentes questions \u00e0 se poser &#8211; ou \u00e0 poser \u00e0 un client &#8211; afin de d\u00e9terminer si la cr\u00e9ation de m\u00e9triques personnalis\u00e9es constitue r\u00e9ellement un crit\u00e8re de choix pour un tel outil. \u00a0<!--more--><\/p>\n<h2>Les co\u00fbts cach\u00e9s<\/h2>\n<h3>Co\u00fbt d&rsquo;impl\u00e9mentation<\/h3>\n<p>Un client va g\u00e9n\u00e9ralement vous poser la question \u00ab\u00a0Est-ce facile de cr\u00e9er de nouvelles m\u00e9triques avec tel outil ?\u00a0\u00bb ou \u00ab\u00a0Quel est le degr\u00e9 de difficult\u00e9 ?\u00a0\u00bb, mais jamais \u00ab\u00a0Combien cela me co\u00fbte de g\u00e9rer mes propres m\u00e9triques ?\u00a0\u00bb. Or, il\u00a0existe diff\u00e9rents co\u00fbts de diff\u00e9rentes natures.<\/p>\n<p>Tout d&rsquo;abord, il existe un co\u00fbt \u00e0 la cr\u00e9ation de m\u00e9triques. Evidemment, les vendeurs de software ne vont pas vous le dire, mais au contraire vont s&rsquo;attacher \u00e0 vous cacher ceux-ci, avec une belle d\u00e9mo de cr\u00e9ation d&rsquo;une r\u00e8gle en direct. Or il s&rsquo;agira le plus souvent d&rsquo;une <a title=\"Cr\u00e9ation de m\u00e9triques personnalis\u00e9es\" href=\"http:\/\/qualilogy.com\/fr\/creation-de-metriques-personnalisees\/\" target=\"_blank\">m\u00e9trique simple<\/a> et non pas d&rsquo;une <a title=\"Cr\u00e9ation de m\u00e9triques personnalis\u00e9es\" href=\"http:\/\/qualilogy.com\/fr\/creations-de-metriques-personnalisees-2\/\" target=\"_blank\">r\u00e8gle complexe<\/a>. Et nous avons vu dans le troisi\u00e8me article de cette s\u00e9rie, consacr\u00e9e \u00e0 la <a title=\"Cr\u00e9ation de m\u00e9triques personnalis\u00e9es\" href=\"http:\/\/qualilogy.com\/fr\/creation-de-metriques-personnalisees-3\/\" target=\"_blank\">personnalisation de m\u00e9triques par technologie<\/a>, que ce sont justement ces r\u00e8gles complexes qui sont les plus utiles et les plus fr\u00e9quentes.<\/p>\n<p>Donc contrairement \u00e0 ce qu&rsquo;on veut souvent faire croire, la cr\u00e9ation d&rsquo;une m\u00e9trique personnalis\u00e9e ne se r\u00e9alise pas sur un coin de table, mais n\u00e9cessite un minimum de r\u00e9flexion, pour ne pas dire de conception :<\/p>\n<ul>\n<li>Souhaitez-vous identifier dans le code l&rsquo;utilisation d&rsquo;une instruction r\u00e9v\u00e9latrice d&rsquo;une violation \u00e0 une bonne pratique de programmation ?\n<ul>\n<li>Et dans ce cas, s&rsquo;agit-il d&rsquo;une instruction simple identifiable par une unique cha\u00eene de caract\u00e8res ou plut\u00f4t d&rsquo;une instruction compos\u00e9e type &lsquo;IF &#8230; THEN &#8230; ELSE &#8230; ENDIF&rsquo;.<\/li>\n<\/ul>\n<\/li>\n<li>Devez-vous au contraire impl\u00e9menter une r\u00e8gle d&rsquo;architecture (type framework), comme nous l&rsquo;avons vu dans<a href=\"http:\/\/qualilogy.com\/fr\/creation-de-metriques-personnalisees-3\/\" target=\"_blank\"> le 3\u00e8me post de cette s\u00e9rie<\/a>.<\/li>\n<\/ul>\n<p>M\u00eame pour un m\u00e9trique simple bas\u00e9e sur une unique instruction, il vous faut penser \u00e0 toutes les expressions possibles de celle-ci. Par exemple, un <strong>catch ()<\/strong> peut s&rsquo;\u00e9crire avec un espace ou non avant la parenth\u00e8se, et parfois cet espace sera en fait une tabulation, et vous pouvez m\u00eame l&rsquo;\u00e9crire sur plus d&rsquo;une ligne si cela vous chante.<\/p>\n<p>M\u00eame pour une m\u00e9trique simple, il faut un minimum de r\u00e9flexion afin de construire l&rsquo;expression r\u00e9guli\u00e8re, la fameuse RegExp qui va permettre d&rsquo;impl\u00e9menter celle-ci, et cela signifie\u00a0proc\u00e9der par t\u00e2tonnement et essai multiple. Croyez-moi, il n&rsquo;y a que dans les d\u00e9mos que cela marche du premier coup !<\/p>\n<p>Donc vous imaginez bien que pour une instruction compos\u00e9e, cela devient beaucoup plus compliqu\u00e9e. Et vous avez un grand nombre de r\u00e8gles qui combinent plusieurs instructions, comme par exemple\u00a0les r\u00e8gles de structuration avec des instructions imbriqu\u00e9es (un IF dans un IF dans un IF, etc.), ou les violations au bonnes pratiques de performance pour des instructions gourmandes en m\u00e9moire (cr\u00e9ation d&rsquo;objets, appel de m\u00e9thodes par exemple)\u00a0rencontr\u00e9es au sein d&rsquo;une boucle.<\/p>\n<p>Et nous n&rsquo;avons parl\u00e9 jusqu&rsquo;ici que de l&rsquo;identification du code sp\u00e9cifique \u00e0 une m\u00e9trique, \u00e0 travers une RegExp. Si vous devez parcourir un arbre syntaxique, ce sera plus compliqu\u00e9. Si vous devez programmer une r\u00e8gle d&rsquo;architecture, ce sera plus compliqu\u00e9. Dans la plupart des cas, c&rsquo;est toujours plus compliqu\u00e9.<\/p>\n<p>Le d\u00e9veloppement ne s&rsquo;arr\u00eate pas \u00e0 seulement \u00e0 identifier des instructions dans des fichiers, il sera parfois n\u00e9cessaire de programmer le calcul des r\u00e9sultats,\u00a0par exemple, en d\u00e9veloppant des proc\u00e9dures stock\u00e9es. Ou tout autre calcul n\u00e9cessaire \u00e0 l&rsquo;affichage de la m\u00e9trique dans le tableau de bord, comme par exemple, le pourcentage de violations rencontr\u00e9es pour l&rsquo;ensemble des instructions correspondantes.<\/p>\n<p>Enfin, il faut \u00e9galement se poser la question de l&rsquo;affichage de la m\u00e9trique. Tous les outils vont forc\u00e9ment cat\u00e9goriser une m\u00e9trique sur un axe de gravit\u00e9 &#8211; de mineure \u00e0 critique ou bloquante. Certains vous obligeront \u00e9galement \u00e0 sp\u00e9cifier d&rsquo;autres param\u00e8tres afin que la m\u00e9trique apparaisse dans un tableau de bord, par exemple la place de cette r\u00e8gle dans un mod\u00e8le qualim\u00e9trique, selon qu&rsquo;elle impacte la maintenabilit\u00e9, ou la performance, ou la robustesse, etc.<\/p>\n<p>Ce que je veux souligner, c&rsquo;est que la cr\u00e9ation de m\u00e9triques personnalis\u00e9es doit \u00eatre abord\u00e9e comme un v\u00e9ritable projet, avec :<\/p>\n<ul>\n<li>Une phase de conception : quelles sont les m\u00e9triques que vous souhaitez impl\u00e9menter ? Sont-elles d\u00e9finies dans un cahier de r\u00e8gles ? Quels sont les diff\u00e9rents cas possibles, les diff\u00e9rentes syntaxes possibles, les RegExp correspondantes, etc.<\/li>\n<li>Une phase de d\u00e9veloppement : l&rsquo;\u00e9criture des RegExp ou la programmation de la recherche dans l&rsquo;arbre syntaxique, et un minimum de tests unitaires.<\/li>\n<li>Une phase de QA, avec de v\u00e9ritables jeux de tests, couvrant l&rsquo;ensemble des diff\u00e9rents cas possibles identifi\u00e9s, combinant plusieurs occurrences d&rsquo;une m\u00eame r\u00e8gle au sein d&rsquo;un m\u00eame programme, la v\u00e9rification des r\u00e9sultats &#8211; le comptage des violations, l&rsquo;identification de false-positives &#8211; et de leur affichage dans le tableau de bord.<\/li>\n<\/ul>\n<h3>Co\u00fbt de maintenance<\/h3>\n<p>Le co\u00fbt de d\u00e9veloppement de r\u00e8gles personnalis\u00e9es peut donc atteindre rapidement plusieurs dizaines de jours-hommes. Mais il existe encore d&rsquo;autres co\u00fbts ult\u00e9rieurs.<\/p>\n<p>Le premier, le plus fr\u00e9quent et auquel on pense peu : que se passe-t-il lorsque vous installez une nouvelle version du logiciel d&rsquo;analyse de code ? Vous avez effectu\u00e9 un d\u00e9veloppement, celui-ci est forc\u00e9ment impl\u00e9ment\u00e9 quelque part, dans un fichier, un r\u00e9pertoire, un repository, un workspace, une base de donn\u00e9es, etc.<\/p>\n<p>Par exemple : la RegExp est d\u00e9finie dans un fichier xml dans tel r\u00e9pertoire, ainsi que dans une table de la la base de donn\u00e9es avec une proc\u00e9dure stock\u00e9e pour calculer certains r\u00e9sultats \u00e0 afficher. Et bien que se passe-t-il en cas d&rsquo;upgrade du logiciel ? La nouvelle version va-t-elle \u00e9craser les fichiers xml pr\u00e9sents dans le r\u00e9pertoire ? Vous faut-il mettre \u00e0 jour un fichier xml install\u00e9 par d\u00e9faut par le logiciel et pr\u00e9cisant l&#8217;emplacement de ces fichiers xml ?<\/p>\n<p>Faut-il importer et appliquer \u00e0 nouveau la proc\u00e9dure stock\u00e9e ? Faut-il importer votre propre mod\u00e8le qualim\u00e9trique avec la d\u00e9finition de vos propres r\u00e8gles dans celui-ci afin de les voir s&rsquo;afficher dans la nouvelle version du dashboard ?<\/p>\n<p>Autre type de co\u00fbt de maintenance : le logiciel a \u00e9volu\u00e9, et votre d\u00e9veloppement ne fonctionne plus. Et oui, le mode de cr\u00e9ation des m\u00e9triques peut, et va certainement \u00e9voluer dans le temps au fil des versions. Vous devrez alors modifier votre &lsquo;package&rsquo; de m\u00e9triques personnalis\u00e9es afin de les adapter \u00e0 la nouvelle version. Co\u00fbt de maintenance \u00e9volutive.<\/p>\n<p>Notez que vous pouvez \u00e9galement conna\u00eetre des bugs. Par exemple, vous devez d\u00e9finir un num\u00e9ro ou identifiant pour chacune de vos m\u00e9triques, et manque de chance, il se trouve que la nouvelle version du logiciel impl\u00e9mente de nouvelles m\u00e9triques qui utilisent ces m\u00eames identifiants. Vos r\u00e8gles n&rsquo;apparaissent plus dans la nouvelle version du tableau de bord et vous devez rechercher pourquoi, puis ensuite faire \u00e9voluer vos propres d\u00e9veloppement afin de solutionner ce conflit d&rsquo;IDs. Co\u00fbt de maintenance corrective.<\/p>\n<p>Cela signifie que vous allez devoir g\u00e9rer vos d\u00e9veloppements en configuration. J&rsquo;ai vu des clients, tr\u00e8s m\u00e9contents, qui signalaient des r\u00e9gressions sur une nouvelle version, parce que certaines de leurs m\u00e9triques avaient disparu apr\u00e8s l&rsquo;installation de la derni\u00e8re release,\u00a0alors qu&rsquo;ils avaient tout simplement install\u00e9 une version ancienne de leurs r\u00e8gles dans laquelle ces m\u00e9triques n&rsquo;existaient pas. Et \u00e7\u00e0. cela prend du temps \u00e0 investiguer et \u00e0 d\u00e9celer l&rsquo;origine de la soi-disante \u00ab\u00a0r\u00e9gression\u00a0\u00bb.<\/p>\n<p>Enfin, pour \u00e9viter cela, il est pr\u00e9f\u00e9rable de tester de mani\u00e8re exhaustive et approfondie la nouvelle version avec vos propres r\u00e8gles. Ce qui signifie quelque documentation de quelques proc\u00e9dures de tests (en plus de la documentation de proc\u00e9dure d&rsquo;upgrade du logiciel, de gestion des versions de votre &lsquo;package&rsquo; de r\u00e8gles, etc.).<\/p>\n<p>Donc en fait, j&rsquo;ai inclus dans une m\u00eame cat\u00e9gorie de co\u00fbts de maintenance toutes sortes de co\u00fbts d&rsquo;upgrade, de corrections et d&rsquo;\u00e9volutions, de tests, de documentation, etc. Mais il est important de bien les identifier d\u00e9s le d\u00e9part car vous pouvez constater qu&rsquo;ils ne sont pas minces.<\/p>\n<h2>Les questions<\/h2>\n<p>Vous l&rsquo;avez bien compris : la cr\u00e9ation de m\u00e9triques personnalis\u00e9es ne se justifie qu&rsquo;en cas de besoin r\u00e9el et important. Et donc le degr\u00e9 de facilit\u00e9 pour cr\u00e9er celles-ci ne doit pas \u00eatre un crit\u00e8re de choix d&rsquo;outil d&rsquo;analyse de code. Au mieux, c&rsquo;est un plus.<\/p>\n<p>Si vous souhaitez acheter un v\u00e9lo, vous pouvez vous offrir un v\u00e9lo tout terrain de comp\u00e9tition, avec cadre en titane, fourche en carbone, 15 vitesses et roues tubeless. Mais si vous comptez l\u2019utiliser pour aller faire des courses, ce ne sera pas le plus pratique, et le prix d\u00e9passera largement les b\u00e9n\u00e9fices que vous en tirez. Sauf si votre intention est de vous faire plaisir \u00e9videmment.<\/p>\n<p>C&rsquo;est malheureusement souvent le cas, et cela devient d\u00e8s lors difficile de faire renoncer quelqu&rsquo;un d\u00e9cid\u00e9 \u00e0 s&rsquo;offrir un cadeau. C&rsquo;est notre\u00a0travail de consultant de v\u00e9rifier l&rsquo;existence r\u00e9elle d&rsquo;un besoin et de mesurer les co\u00fbts cach\u00e9s. Donc, les questions \u00e0 poser :<\/p>\n<ul>\n<li>Disposez vous de r\u00e8gles de Qualit\u00e9 et bonnes pratiques que vous souhaitez automatiser ?\u00a0En cas de r\u00e9ponse n\u00e9gative, je ne vois pas r\u00e9ellement de cas qui justifie la possibilit\u00e9 de cr\u00e9er ses \u00a0propres m\u00e9triques.<\/li>\n<\/ul>\n<p>Souvent, la r\u00e9ponse sera &lsquo;Non mais &#8230;&rsquo; suivie d&rsquo;une tentative de justification \u00e0 base d&rsquo;arguments pas tr\u00e8s pr\u00e9cis. Il faut bien d\u00e9fendre son petit caprice, n&rsquo;est-ce pas. Dans ce cas, je rappelle que 90% des utilisateurs d&rsquo;un outil d&rsquo;analyse de code se contentent des r\u00e8gles existantes, et que 90% des 10% qui d\u00e9veloppent leurs propres m\u00e9triques abandonnent au bout de deux ans.<\/p>\n<ul>\n<li>Quel type de m\u00e9triques ?<\/li>\n<\/ul>\n<p style=\"font-size: 1rem\">J&rsquo;ai connu un client qui voulait absolument les m\u00e9triques de Halstead. Ces m\u00e9triques comptent le nombre d&rsquo;op\u00e9randes et \/ ou d&rsquo;op\u00e9rateurs, comme mesure de la complexit\u00e9. Certains veulent parfois les indexs de maintenabilit\u00e9 du SEI (combinaison de m\u00e9triques telles que le nombre de lignes de code, la complexit\u00e9 cyclomatique, le taux de commentaires, &#8230;).<\/p>\n<p style=\"font-size: 1rem\">Ces m\u00e9triques sont tomb\u00e9es en d\u00e9su\u00e9tude, raison pour laquelle la plupart des outils d&rsquo;analyse de code ne les proposent plus. Pourquoi investir dans la cr\u00e9ation de telles m\u00e9triques alors que celles existantes sont bien plus pertinentes ? Pourquoi alourdir l&rsquo;utilisation d&rsquo;un outil et la lecture d&rsquo;un tableau de bord avec des mesures impr\u00e9cises ?<\/p>\n<p style=\"font-size: 1rem\">Il y a aussi ceux qui ne sont pas satisfaits avec les cat\u00e9gories &lsquo;Critical&rsquo; ou &lsquo;Blockers&rsquo; de m\u00e9triques existantes, et veulent une cr\u00e9er une\u00a0cat\u00e9gorie sp\u00e9cifique rien que pour eux, quelque chose comme des &lsquo;super-extra-blockers&rsquo;. J&rsquo;appelle cela le syndrome Spinal Tap : <a href=\"http:\/\/www.youtube.com\/watch?v=XuzpsO4ErOQ\" target=\"_blank\">This one goes to eleven<\/a>.<\/p>\n<ul>\n<li>Si oui, pour quelles technologies ?<\/li>\n<\/ul>\n<p>Comme vu dans\u00a0dans <a href=\"http:\/\/qualilogy.com\/fr\/creation-de-metriques-personnalisees-3\/\" target=\"_blank\">le post pr\u00e9c\u00e9dent<\/a>, c&rsquo;est dans le domaine des applications SAP que vous rencontrerez assez souvent un besoin r\u00e9el. Dans le monde des nouvelles technologies : J2EE, .NET, etc. \u00a0il existe d\u00e9j\u00e0\u00a0suffisamment\u00a0de r\u00e8gles pour ne pas avoir \u00e0 en cr\u00e9er de nouvelles, sauf le cas particulier des frameworks propri\u00e9taires.<\/p>\n<ul>\n<li>Quel part du portfolio applicatif cette technologie repr\u00e9sente-t-elle ?<\/li>\n<\/ul>\n<p>Vous aurez toujours des clients qui voudront des m\u00e9triques pour des langages peu courants ou tr\u00e8s anciens : PL1, Pacbase, Informix, Fortran, etc. Ils disposeront m\u00eame souvent d&rsquo;un cahier de r\u00e8gles utilis\u00e9es en interne pour des contr\u00f4les manuels. Il s&rsquo;agit donc l\u00e0 d&rsquo;un vrai besoin, mais les applications d\u00e9velopp\u00e9es dans ces langages repr\u00e9sentent rarement plus de 10% du parc applicatif, sont anciennes et g\u00e9n\u00e9ralement \u00e9prouv\u00e9es, \u00e9voluent assez peu, etc.<\/p>\n<ul>\n<li>Avez-vous un cahier de r\u00e8gles ou tout autre documentation sur vos r\u00e8gles ?<\/li>\n<\/ul>\n<p>Si ce n&rsquo;est pas le cas, je doute que ces r\u00e8gles soient effectivement appliqu\u00e9es.<\/p>\n<p>Si vous avez un r\u00e9el besoin de m\u00e9triques personnalis\u00e9es, si\u00a0vous devez choisir un outil d&rsquo;analyse de code sur ce crit\u00e8re de cr\u00e9ation et de gestion de m\u00e9triques \u00a0personnalis\u00e9es, iI est tr\u00e8s important d&rsquo;identifier pr\u00e9cis\u00e9ment :<\/p>\n<ul>\n<li>Quelles sont les diff\u00e9rents \u00e9tapes de cr\u00e9ation d&rsquo;une m\u00e9trique.<\/li>\n<li>Ce que l&rsquo;outil d&rsquo;analyse de code fait automatiquement.<\/li>\n<li>Ce qu&rsquo;il ne fait pas : ce sera \u00e0 vous de le faire.<\/li>\n<li>Quelles sont les diff\u00e9rentes actions \u00e0 mener en cas d&rsquo;upgrade de version.<\/li>\n<\/ul>\n<p>Sur les 3 ou 4 logiciels que vous aurez retenu en short-list, pr\u00e9parez un test sous forme de pilote avec au programme quelques cas tel que:<\/p>\n<ul>\n<li>D\u00e9veloppement d&rsquo;une m\u00e9trique simple de type indicateur. Par exemple, pouvoir entrer un co\u00fbt de projet en nombre de jours ou un nombre de personnes dans l&rsquo;\u00e9quipe de projet et diviser celui-ci par le nombre de d\u00e9fauts bloquants, critiques ou majeurs.<\/li>\n<li>D\u00e9veloppement d&rsquo;une m\u00e9trique simple de bonne pratique de programmation. Par exemple, identifier toutes les instructions write() et writeln() &#8211; imaginons qu&rsquo;elles soient interdites au profit d&rsquo;un syst\u00e8me maison de gestion des messages. Pr\u00e9voyez quelques fichiers de test avec des cas bien tordus d&rsquo;instructions avec des espaces ou des sauts de lignes.<\/li>\n<li>D\u00e9veloppement d&rsquo;une m\u00e9trique complexe : identifier les instructions pr\u00e9c\u00e9dentes write() et writeln() dans une boucle. L\u00e0 encore, imaginez quelques tests bien complexes, avec des boucles dans des boucles sur plusieurs pages par exemple.<\/li>\n<li>Upgrade de version : demandez \u00e0 chaque \u00e9diteur logiciel de packager les fichiers (ou tout autre objet) r\u00e9sultant du d\u00e9veloppement des 3 r\u00e8gles pr\u00e9c\u00e9dentes, avec une proc\u00e9dure d&rsquo;installation ou d&rsquo;upgrade. Faites un test d&rsquo;upgrade de version (ou r\u00e9-installez la version actuelle) avec la proc\u00e9dure d&rsquo;installation du package, afin de mesure la complexit\u00e9 de cette op\u00e9ration.<\/li>\n<\/ul>\n<p>La cr\u00e9ation de m\u00e9triques personnalis\u00e9es n&rsquo;est pas un crit\u00e8re de choix d&rsquo;outil d&rsquo;analyse de code si vous n&rsquo;avez pas un r\u00e9el besoin. Si c&rsquo;est le cas, traitez ce crit\u00e8re avec le maximum de s\u00e9rieux et identifiez bien les co\u00fbts cach\u00e9s. Ne vous contentez pas d&rsquo;une simple d\u00e9mo, faites un pilote, mettez \u00e0 contribution l&rsquo;\u00e9diteur logiciel. Eventuellement, faites vous assister.<\/p>\n<p>Si vous souhaitez acheter un v\u00e9lo de course, vous allez l&rsquo;essayer non ? Vous n&rsquo;allez pas vous contenter de demander au vendeur quel degr\u00e9 de faciliter pour p\u00e9daler ou changer la roue.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dernier article de notre s\u00e9rie sur la cr\u00e9ation de m\u00e9triques personnalis\u00e9es. Nous allons aborder dans celui-ci les diff\u00e9rents co\u00fbts attach\u00e9s \u00e0 la customisation de m\u00e9triques, et qui sont g\u00e9n\u00e9ralement mal identifi\u00e9s voire compl\u00e8tement ignor\u00e9s lors d&rsquo;un projet d&rsquo;acquisition d&rsquo;un outil d&rsquo;analyse de code. Nous terminerons par r\u00e9sumer l&rsquo;ensemble des diff\u00e9rentes questions \u00e0 se poser &#8211; [&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-961","post","type-post","status-publish","format-standard","hentry","category-qualite-des-applications"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/961"}],"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=961"}],"version-history":[{"count":51,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/961\/revisions"}],"predecessor-version":[{"id":965,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/961\/revisions\/965"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=961"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=961"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=961"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}