<?xml 
version="1.0" encoding="utf-8"?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
>

<channel xml:lang="fr">
	<title>Mon p'tit coin du web</title>
	<link>http://nicolas.weeger.org/</link>
	
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>




<item xml:lang="fr">
		<title>Pourquoi utiliser un logiciel de gestion de version</title>
		<link>http://nicolas.weeger.org/spip.php?article44</link>
		<guid isPermaLink="true">http://nicolas.weeger.org/spip.php?article44</guid>
		<dc:date>2007-05-14T20:23:36Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Nicolas</dc:creator>



		<description>Un d&#233;veloppeur est souvent amen&#233; &#224; utiliser un logiciel de gestion de version pour ses projets. Pourtant c'est un outil tr&#232;s puissant qui peut servir &#224; bien d'autres choses. Qu'est-ce qu'un logiciel de gestion de version ? Il s'agit d'un logiciel qui permet de suivre les diff&#233;rentes versions d'un ensemble de fichiers. Il permet de retrouver un ou des fichiers tels qu'ils &#233;taient &#224; une date donn&#233;e. C'est, en r&#233;sum&#233;, un logiciel qui garde un historique de l'&#233;volution du fichier. Ces logiciels permettent, (...)

-
&lt;a href="http://nicolas.weeger.org/spip.php?rubrique6" rel="directory"&gt;R&#233;flexions&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Un d&#233;veloppeur est souvent amen&#233; &#224; utiliser un logiciel de gestion de version pour ses projets. Pourtant c'est un outil tr&#232;s puissant qui peut servir &#224; bien d'autres choses.&lt;/p&gt; &lt;h3 class=&quot;spip&quot;&gt;Qu'est-ce qu'un logiciel de gestion de version ?&lt;/h3&gt;
&lt;p&gt;Il s'agit d'un logiciel qui permet de suivre les diff&#233;rentes versions d'un ensemble de fichiers. Il permet de retrouver un ou des fichiers tels qu'ils &#233;taient &#224; une date donn&#233;e. C'est, en r&#233;sum&#233;, un logiciel qui garde un historique de l'&#233;volution du fichier.&lt;/p&gt; &lt;p&gt;Ces logiciels permettent, quand il s'agit de fichiers texte [&lt;a href='#nb1' class='spip_note' rel='footnote' title='Il est coutume de distinguer les fichiers ou formats dits texte &#8212; qui ne (...)' id='nh1'&gt;1&lt;/a&gt;], de voir les modifications (ajout, suppression, changement) entre diff&#233;rentes versions des fichiers, de savoir qui a modifi&#233;, etc. Pour un fichier binaire, le logiciel se contente de garder les diff&#233;rentes versions, sans &#234;tre capable de dire les modifications [&lt;a href='#nb2' class='spip_note' rel='footnote' title='Se contenter de rep&#233;rer les modifications d'une image entre deux versions ne (...)' id='nh2'&gt;2&lt;/a&gt;].&lt;/p&gt; &lt;p&gt;Plus pr&#233;cis&#233;ment, le d&#233;veloppeur demande manuellement, et aussi souvent qu'il le d&#233;sire, au logiciel de gestion de version de stocker l'&#233;tat de ses fichiers &#224; un instant donn&#233;, lui permettant de revenir &#224; cette version &#224; tout moment.&lt;/p&gt; &lt;p&gt;Pour les utilisateurs connaissant un logiciel tel que Microsoft Word (c), un logiciel de gestion de version est similaire au contr&#244;le de r&#233;visions que le traitement de texte offre [&lt;a href='#nb3' class='spip_note' rel='footnote' title='&#192; noter qu'un document Word n'est pas un document texte, mais bien un fichier (...)' id='nh3'&gt;3&lt;/a&gt;].&lt;/p&gt; &lt;h3 class=&quot;spip&quot;&gt;Pourquoi utiliser un tel logiciel, et quelles sont ses fonctionnalit&#233;s majeures ?&lt;/h3&gt;
&lt;p&gt;La premi&#232;re utilisation est bien s&#251;r de garder une trace des modifications. C'est un point tr&#232;s important :
&lt;br /&gt;&lt;img src=&quot;http://nicolas.weeger.org/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; il est possible de faire de nombreuses modifications sur les fichiers, puis de tout annuler pour revenir &#224; une version pr&#233;c&#233;dente sans avoir besoin de tout annuler manuellement, ou de garder une copie des fichiers originaux, ...
&lt;br /&gt;&lt;img src=&quot;http://nicolas.weeger.org/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; le logiciel de gestion de version permet de suivre l'historique, qui a modifi&#233; quoi, quand. La plupart de ces logiciels permettent d'entrer un commentaire au moment de sauver l'&#233;tat des fichiers. Associ&#233; &#224; la liste, g&#233;n&#233;r&#233;e automatiquement, des fichiers modifi&#233;s, ceci permet de suivre la vie d'un logiciel.&lt;/p&gt; &lt;p&gt;Le logiciel de gestion de version permet &#233;galement de faciliter le travail entre plusieurs personnes. Chaque d&#233;veloppeur travaille sur une copie des sources sur son propre ordinateur, puis quand il juge que sa version est correcte, il la transmet au logiciel de gestion de version, qui centralise les modifications. Les autres d&#233;veloppeurs peuvent alors r&#233;cup&#233;rer depuis cette base centrale la derni&#232;re version des fichiers.&lt;/p&gt; &lt;p&gt;Il existe deux philosophies par rapport au travail collaboratif :
&lt;br /&gt;&lt;img src=&quot;http://nicolas.weeger.org/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; soit les d&#233;veloppeurs travaillent en mode &#171; exclusif &#187;, c'est-&#224;-dire qu'une seule personne &#224; la fois peut modifier un fichier donn&#233;
&lt;br /&gt;&lt;img src=&quot;http://nicolas.weeger.org/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; soit les d&#233;veloppeurs modifient arbitrairement n'importe quel fichier, et le logiciel de gestion de version s'occupe de fusionner automatiquement les diff&#233;rentes modifications. Si la fusion automatique n'est pas possible (deux personnes ont modifi&#233; une m&#234;me zone d'un fichier de fa&#231;on diff&#233;rente et non compatible), il est n&#233;cessaire qu'un d&#233;veloppeur r&#233;solve &#224; la main les conflits de modification [&lt;a href='#nb4' class='spip_note' rel='footnote' title='La plupart des logiciels travaillent sur un mode de modification ligne &#224; (...)' id='nh4'&gt;4&lt;/a&gt;].&lt;/p&gt; &lt;p&gt;Les deux philosophies ont des points positifs et n&#233;gatifs. La premi&#232;re &#233;vite les conflits de modification puisqu'une seule personne peut modifier un fichier ; en revanche elle peut parfois forcer un d&#233;veloppeur &#224; attendre qu'un autre ait fini de travailler sur un fichier pour pouvoir continuer. La deuxi&#232;me approche est plus souple car elle permet de modifier sans restriction ni d&#233;lai ; par contre elle demande une coordination entre les d&#233;veloppeurs pour qu'ils ne modifient pas le m&#234;me endroit en m&#234;me temps [&lt;a href='#nb5' class='spip_note' rel='footnote' title='Un argument en faveur de cette m&#233;thode est que &#171; si deux d&#233;veloppeurs (...)' id='nh5'&gt;5&lt;/a&gt;].&lt;/p&gt; &lt;p&gt;Une fonctionnalit&#233; importante d'un logiciel de gestion de version est la possibilit&#233; de cr&#233;er des &#171; branches &#187;. Cette fonctionnalit&#233; permet d'avoir plusieurs versions en parall&#232;le des fichiers.&lt;/p&gt; &lt;p&gt;Ainsi, le projet &lt;a href='http://crossfire.real-time.com/' class='spip_out' rel='external'&gt;Crossfire&lt;/a&gt;, auquel je participe, a deux branches :
&lt;br /&gt;&lt;img src=&quot;http://nicolas.weeger.org/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; la branche &#171; 1.x &#187; correspond &#224; la version 1.10 du logiciel distribu&#233;e publiquement
&lt;br /&gt;&lt;img src=&quot;http://nicolas.weeger.org/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; la branche &#171; trunk &#187; comprend la version en cours de d&#233;veloppement qui sera la future version 2.&lt;/p&gt; &lt;p&gt;Apr&#232;s la distribution de la version 1.10, plusieurs bugs ont &#233;t&#233; signal&#233;s, et corrig&#233;s. Les corrections ont eu lieu sur la branche &#171; 1.x &#187;, qui donnera lieu, lorsque suffisamment de bugs auront &#233;t&#233; corrig&#233;s, &#224; la version 1.11.&lt;/p&gt; &lt;p&gt;Simultan&#233;ment, un travail de fond de modification a eu lieu sur la branche &#171; trunk &#187;. Cette branche est consid&#233;r&#233;e exp&#233;rimentale, et c'est sur elle que les efforts majeurs de d&#233;veloppement ont lieu, que la plupart des nouvelles fonctionnalit&#233;s sont rajout&#233;es. Les corrections apport&#233;es sur la branche &#171; 1.x &#187; sont, si applicables, dupliqu&#233;es sur cette branche.&lt;/p&gt; &lt;p&gt;Lorsque la branche &#171; trunk &#187; sera consid&#233;r&#233;e stable, la branche &#171; 1.x &#187; sera abandonn&#233;e sauf pour corrections de bugs majeurs.&lt;/p&gt; &lt;p&gt;Deux versions des fichiers cohabitent donc, chacune ayant son utilit&#233;, l'une pour avoir une version distribuable &#224; tout instant et l'autre pour exp&#233;rimenter.&lt;/p&gt; &lt;h3 class=&quot;spip&quot;&gt;&#192; quoi peut servir un tel logiciel pour un non d&#233;veloppeur ?&lt;/h3&gt;
&lt;p&gt;M&#234;me si c'est &#224; l'origine un outil destin&#233; aux d&#233;veloppeurs, un logiciel de gestion de version peut parfaitement &#234;tre utilis&#233; par un non d&#233;veloppeur.&lt;/p&gt; &lt;p&gt;Le premier avantage est qu'une copie des fichiers g&#233;r&#233;s par le logiciel est disponible dans un emplacement centralis&#233;. Ceci permet de facilement faire une sauvegarde des donn&#233;es &#8212; il suffit de copier le r&#233;pertoire central. De plus m&#234;me si un fichier est effac&#233; par erreur il est possible d'en r&#233;cup&#233;rer une version depuis le logiciel de gestion de version.&lt;/p&gt; &lt;p&gt;Le deuxi&#232;me avantage est l'historique offert. Pour des documents souvent modifi&#233;s, pouvoir revenir &#224; un point arbitraire dans le pass&#233; est un &#233;norme avantage.&lt;/p&gt; &lt;p&gt;Bien s&#251;r, utiliser un tel logiciel impose une certaine discipline, &#224; savoir transmettre r&#233;guli&#232;rement au logiciel de gestion de versions les modifications effectu&#233;es sur les documents. Cependant les gains sont probablement suffisants pour s'imposer cette contrainte sans trop de difficult&#233;s.&lt;/p&gt; &lt;p&gt;Utiliser un logiciel de version n&#233;cessite &#233;galement d'avoir un peu plus d'espace disque disponible, puisqu'un fichier existe en diff&#233;rentes versions, occupant de la place sur le disque. Mais avec les capacit&#233;s actuelles de stockage, ce n'est pas vraiment une difficult&#233; &#8212; enfin, vouloir g&#233;rer des versions de films en haute d&#233;finition poserait certainement des soucis !&lt;/p&gt; &lt;h3 class=&quot;spip&quot;&gt;Exemple d'application de la gestion de versions&lt;/h3&gt;
&lt;p&gt;Un exemple d'application de gestion de versions est disponible l'encyclop&#233;die &lt;a href='http://www.wikipedia.org/' class='spip_out' rel='external'&gt;Wikip&#233;dia&lt;/a&gt;. En effet, chaque article a un historique int&#233;gral depuis sa cr&#233;ation, comprenant toutes les modifications jamais effectu&#233;es [&lt;a href='#nb6' class='spip_note' rel='footnote' title='Il est possible de totalement supprimer des versions, cependant c'est une (...)' id='nh6'&gt;6&lt;/a&gt;]. Il est possible de visualiser les changements apport&#233;s entre deux versions arbitraires, de revenir &#224; des versions ant&#233;rieures, ...&lt;/p&gt; &lt;p&gt;De plus plusieurs personnes peuvent modifier le m&#234;me article simultan&#233;ment, avec un conflit uniquement si la m&#234;me zone a &#233;t&#233; modifi&#233;e de fa&#231;on incompatible.&lt;/p&gt; &lt;p&gt;M&#234;me si le m&#233;canisme est peu visible pour le contributeur, il s'agit bel et bien d'un syst&#232;me de gestion de version.&lt;/p&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;p&gt;[&lt;a href='#nh1' id='nb1' class='spip_note' title='Notes 1' rev='footnote'&gt;1&lt;/a&gt;] Il est coutume de distinguer les fichiers ou formats dits texte &#8212; qui ne contiennent que des caract&#232;res alphanum&#233;riques ou symboles &#8212; qui peuvent &#234;tre simplement affich&#233;s, et les fichiers dits binaires qui n&#233;cessitent un programme pour &#234;tre visualis&#233;s. Ainsi une image est un fichier binaire, alors que par exemple un mail est en format texte &#8212; il contient parfois des &#171; tags &#187; qui permettent d'indiquer l'italique, le gras, ..., mais ces tags eux-m&#234;mes sont en format texte, et peuvent &#234;tre lus sans logiciel sp&#233;cial si besoin.&lt;/p&gt; &lt;p&gt;[&lt;a href='#nh2' id='nb2' class='spip_note' title='Notes 2' rev='footnote'&gt;2&lt;/a&gt;] Se contenter de rep&#233;rer les modifications d'une image entre deux versions ne serait pas forc&#233;ment une t&#226;che insurmontable, mais pour par exemple un film cela n'aurait pas beaucoup de sens.&lt;/p&gt; &lt;p&gt;[&lt;a href='#nh3' id='nb3' class='spip_note' title='Notes 3' rev='footnote'&gt;3&lt;/a&gt;] &#192; noter qu'un document Word n'est pas un document texte, mais bien un fichier binaire. Les donn&#233;es de mise en forme (gras, italique, tableaux, ...) sont stock&#233;es sous format complexe illisible sans logiciel sp&#233;cialis&#233;. Cependant les derni&#232;res versions peuvent aussi utiliser un format dit XML, qui lui devrait &#234;tre, si j'ai bien compris, en format texte un peu plus simple &#224; interpr&#233;ter sans logiciel sp&#233;cial.&lt;/p&gt; &lt;p&gt;[&lt;a href='#nh4' id='nb4' class='spip_note' title='Notes 4' rev='footnote'&gt;4&lt;/a&gt;] La plupart des logiciels travaillent sur un mode de modification ligne &#224; ligne, avec une certaine zone autour. En g&#233;n&#233;ral, les conflits ont lieu uniquement si la m&#234;me ligne est modifi&#233;e par deux d&#233;veloppeurs simultan&#233;ment, les algorithmes des logiciels &#233;tant assez puissant pour fusionner les modifications.&lt;/p&gt; &lt;p&gt;[&lt;a href='#nh5' id='nb5' class='spip_note' title='Notes 5' rev='footnote'&gt;5&lt;/a&gt;] Un argument en faveur de cette m&#233;thode est que &#171; &lt;i&gt; si deux d&#233;veloppeurs modifient en m&#234;me temps la m&#234;me zone d'un fichier, ils ont un probl&#232;me de communication, ce qu'aucun logiciel de gestion de version ne peut r&#233;soudre. &lt;/i&gt; &#187;&lt;/p&gt; &lt;p&gt;[&lt;a href='#nh6' id='nb6' class='spip_note' title='Notes 6' rev='footnote'&gt;6&lt;/a&gt;] Il est possible de totalement supprimer des versions, cependant c'est une fonctionnalit&#233; uniquement utilis&#233;e pour purger les modifications de type spam, ou requises pour raisons l&#233;gales.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>L'art de documenter</title>
		<link>http://nicolas.weeger.org/spip.php?article43</link>
		<guid isPermaLink="true">http://nicolas.weeger.org/spip.php?article43</guid>
		<dc:date>2007-04-21T09:20:23Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Nicolas</dc:creator>



		<description>J'ai eu plusieurs discussions avec des coll&#232;gues sur comment, pourquoi, &#224; quelle fr&#233;quence commenter ou documenter du code. Et ceci fait l'objet de nombreux d&#233;bats sur Internet. Pourquoi commenter ? Simplement pour pouvoir, dans le futur, savoir ce que fait du code, et pourquoi et/ou comment il le fait. Ce besoin de savoir peut &#234;tre li&#233; &#224; une recherche de bug, ou simplement de curiosit&#233;. De plus, le d&#233;veloppeur ayant besoin de savoir n'est pas forc&#233;ment l'auteur du code en question &#8212; mais m&#234;me ce (...)

-
&lt;a href="http://nicolas.weeger.org/spip.php?rubrique6" rel="directory"&gt;R&#233;flexions&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;J'ai eu plusieurs discussions avec des coll&#232;gues sur comment, pourquoi, &#224; quelle fr&#233;quence commenter ou documenter du code. Et ceci fait l'objet de nombreux d&#233;bats sur Internet.&lt;/p&gt; &lt;p&gt;Pourquoi commenter [&lt;a href='#nb2-1' class='spip_note' rel='footnote' title='je vais utiliser ce verbe pour d&#233;signer le fait de commenter ou documenter, (...)' id='nh2-1'&gt;1&lt;/a&gt;] ? Simplement pour pouvoir, dans le futur, savoir ce que fait du code, et pourquoi et/ou comment il le fait. Ce besoin de savoir peut &#234;tre li&#233; &#224; une recherche de bug, ou simplement de curiosit&#233;. De plus, le d&#233;veloppeur ayant besoin de savoir n'est pas forc&#233;ment l'auteur du code en question &#8212; mais m&#234;me ce dernier b&#233;n&#233;ficie du commentaire quand il relit du code plusieurs mois apr&#232;s son &#233;criture en ayant cod&#233; sur d'autres projets entre-temps.&lt;/p&gt; &lt;p&gt;Cependant savoir o&#249;, quand et comment commenter est tr&#232;s difficile [&lt;a href='#nb2-2' class='spip_note' rel='footnote' title='je ne pr&#233;tends aucunement &#234;tre expert en ce domaine, d'ailleurs.' id='nh2-2'&gt;2&lt;/a&gt;].&lt;/p&gt; &lt;p&gt;La premi&#232;re r&#232;gle est de donner des noms significatifs aux fonctions et variables, afin d'identifier leur signification. Ainsi &lt;code class='spip_code' dir='ltr'&gt;void ResetMap(mapstruct* map)&lt;/code&gt; est plus parlant que &lt;code class='spip_code' dir='ltr'&gt;void Reset(mapstruct* var)&lt;/code&gt; s'il s'agit d'une carte.&lt;/p&gt; &lt;p&gt;Un exemple de mauvais commentaire est du style :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt; x = 0; /* initialisation */&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;ou&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt; /* Retourne le solde /*&lt;br /&gt; int GetSolde()&lt;br /&gt; {&lt;br /&gt; return solde;&lt;br /&gt; }&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;qui n'apporte strictement rien. Il arrive aussi que les commentaires soient totalement faux par rapport au code, donc leur signification devient nulle.&lt;/p&gt; &lt;p&gt;Il m'est arriv&#233; de travailler dans des groupes o&#249; il fallait imp&#233;rativement commenter toutes les m&#233;thodes, fonctions, classes publiques pour pouvoir archiver des modifications dans le contr&#244;le de sources. Le probl&#232;me est que de nombreuses propri&#233;t&#233;s ou fonctions n'ont tout simplement pas mati&#232;re &#224; commentaire &#8212; leur nom &#233;tant descriptif, bien entendu. Bilan, nous avons utilis&#233; un programme pour extraire automatiquement les signatures (entr&#233;es, sorties) de ces &#233;l&#233;ments, et r&#233;pondre &#224; l'imp&#233;ratif de commentaires. &#192; mon sens c'est une valeur ajout&#233;e nulle, voire n&#233;gative, car plusieurs fois je perdais du temps &#224; rajouter les commentaires qui n'apportaient rien. Il aurait fallu faire en sorte qu'un archivage commente automatiquement en extrayant les informations, et laisser au d&#233;veloppeur la responsabilit&#233; de savoir o&#249; le commentaire &#233;tait n&#233;cessaire.&lt;/p&gt; &lt;p&gt;Pour moi, un commentaire doit r&#233;pondre &#224; diff&#233;rents crit&#232;res pour &#234;tre utile :
&lt;br /&gt;&lt;img src=&quot;http://nicolas.weeger.org/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; ne pas paraphraser le code, ne pas dire comment on fait quelque chose, sauf si c'est vraiment tr&#232;s complexe &#8212; auquel cas il faut aussi se poser la question de simplifier &#231;a. Lire le code r&#233;pond en effet &#224; la question du &#171; comment &#187;, mais pas du &#171; pourquoi &#187;.
&lt;br /&gt;&lt;img src=&quot;http://nicolas.weeger.org/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; dire pourquoi on fait quelque chose &#8212; &#171; le chemin peut comporter des /, qui sont invalides dans un nom de fichier et doivent donc &#234;tre transform&#233;s en _ &#187;
&lt;br /&gt;&lt;img src=&quot;http://nicolas.weeger.org/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; pr&#233;ciser quelle partie des sp&#233;cifications fonctionnelles la fonction impl&#233;mente &#8212; &#171; cette fonction traite le cas sp&#233;cifique de la r&#233;duction d'imp&#244;t de la loi xxx dans le cadre yyy &#187;, si le nom de la fonction ne suffit pas &#224; indiquer cela
&lt;br /&gt;&lt;img src=&quot;http://nicolas.weeger.org/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; indiquer les cas d'erreur de la fonction, ou ses pr&#233;suppositions &#8212; &#171; la carte peut &#234;tre nulle, auquel cas la fonction ne fait rien &#187;, ou &#171; l'objet doit &#234;tre correctement initialis&#233; par un appel &#224; &lt;code class='spip_code' dir='ltr'&gt;InitObject()&lt;/code&gt; avant d'utiliser cette fonction &#187;
&lt;br /&gt;&lt;img src=&quot;http://nicolas.weeger.org/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &#233;ventuellement dire pourquoi une m&#233;thode a &#233;t&#233; choisie plut&#244;t qu'une autre &#8212; &#171; il est &#233;galement possible d'utiliser tel algorithme, cependant il est plus compliqu&#233; &#224; mettre en &#339;uvre et n'apporterait aucun gain de performance sur de si petits ensembles de donn&#233;es &#187;
&lt;br /&gt;&lt;img src=&quot;http://nicolas.weeger.org/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; en r&#232;gle g&#233;n&#233;rale, ne rien dire qu'un outil automatis&#233;, comme &lt;a href='http://www.doxygen.org/' class='spip_out' rel='external'&gt;Doxygen&lt;/a&gt;, ne puisse extraire&lt;/p&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;p&gt;[&lt;a href='#nh2-1' id='nb2-1' class='spip_note' title='Notes 2-1' rev='footnote'&gt;1&lt;/a&gt;] je vais utiliser ce verbe pour d&#233;signer le fait de commenter ou documenter, pour simplifier l'&#233;criture.&lt;/p&gt; &lt;p&gt;[&lt;a href='#nh2-2' id='nb2-2' class='spip_note' title='Notes 2-2' rev='footnote'&gt;2&lt;/a&gt;] je ne pr&#233;tends aucunement &#234;tre expert en ce domaine, d'ailleurs.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>L'art de d&#233;bugger</title>
		<link>http://nicolas.weeger.org/spip.php?article37</link>
		<guid isPermaLink="true">http://nicolas.weeger.org/spip.php?article37</guid>
		<dc:date>2007-02-23T19:11:02Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Nicolas</dc:creator>



		<description>Tout d&#233;veloppeur est confront&#233; au probl&#232;me de la correction de bogues ou de comportements aberrants, que ce soit dans du code qu'il a &#233;crit ou non. Une telle correction peut en g&#233;n&#233;ral se d&#233;couper en plusieurs phases, parfois m&#234;l&#233;es ou confondues. La premi&#232;re phase est de comprendre le comportement anormal. Cela peut parfois &#234;tre tr&#232;s simple (&#171; l'application plante &#187;), parfois un rapport de bogue &#233;crit par un utilisateur n'a pas assez de d&#233;tails (&#171; le troisi&#232;me alinea a une mauvaise forme &#187;). D&#233;veloppeur (...)

-
&lt;a href="http://nicolas.weeger.org/spip.php?rubrique6" rel="directory"&gt;R&#233;flexions&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Tout d&#233;veloppeur est confront&#233; au probl&#232;me de la correction de bogues ou de comportements aberrants, que ce soit dans du code qu'il a &#233;crit ou non.&lt;/p&gt; &lt;p&gt;Une telle correction peut en g&#233;n&#233;ral se d&#233;couper en plusieurs phases, parfois m&#234;l&#233;es ou confondues.&lt;/p&gt; &lt;p&gt;La premi&#232;re phase est de comprendre le comportement anormal. Cela peut parfois &#234;tre tr&#232;s simple (&#171; &lt;i&gt;l'application plante&lt;/i&gt; &#187;), parfois un rapport de bogue &#233;crit par un utilisateur n'a pas assez de d&#233;tails (&#171; &lt;i&gt;le troisi&#232;me alinea a une mauvaise forme&lt;/i&gt; &#187;). D&#233;veloppeur et utilisateur ne parlent pas toujours le m&#234;me langage, donc la communication est parfois difficile.&lt;/p&gt; &lt;p&gt;La deuxi&#232;me phase est de savoir reproduire le bogue. Tr&#232;s souvent, elle va avec la premi&#232;re, car pour comprendre le comportement anormal le plus simple est de le reproduire et de constater de visu ce qui ne va pas.&lt;/p&gt; &lt;p&gt;La troisi&#232;me phase est de savoir quel est le comportement attendu. L&#224;, &#231;a peut &#234;tre plus compliqu&#233; &#224; savoir. Si l'application a un cahier des charges, ce n'est pas forc&#233;ment difficile, mais il existe parfois des m&#233;sententes entre la demande que le r&#233;dacteur voulait exprimer et celle que le d&#233;veloppeur lit, sans m&#234;me qu'il y ait de mauvaise foi de part et d'autre. Encore une fois, r&#233;dacteur et d&#233;veloppeur ne parlent pas forc&#233;ment le m&#234;me langage, donc il faut clarifier au maximum.&lt;/p&gt; &lt;p&gt;Parfois, l'application n'a pas sp&#233;cifiquement de cahier des charges. C'est un probl&#232;me r&#233;current par exemple dans les projets Open Source, o&#249; des fonctionnalit&#233;s sont d&#233;velopp&#233;es puis le codeur s'&#233;loigne du projet, sans avoir forc&#233;ment tout document&#233;. Je d&#233;veloppe pour un jeu nomm&#233; &lt;a href='http://crossfire.real-time.com/' class='spip_out' rel='external'&gt;Crossfire&lt;/a&gt;, jeu de r&#244;le assez standard. Parfois, un comportement est anormal (un objet ne se comporte pas comme il le faut), la cause en est connue (il manque un param&#233;trage pour l'objet), mais personne ne sait quelle est la correction ad&#233;quate, le param&#233;trage que le cr&#233;ateur de l'objet voulait donner. D'o&#249; discussion &#233;ventuelle entre les d&#233;veloppeurs et les joueurs pour d&#233;cider ce qu'il faut faire. Sachant que parfois la discussion n'est pas tr&#232;s active, et le premier &#224; corriger d&#233;cide de facto de la fa&#231;on de corriger.&lt;/p&gt; &lt;p&gt;La quatri&#232;me phase est de comprendre ce qui cause le probl&#232;me. Et l&#224;, il y a des fois des surprises. Sur Crossfire, il existe depuis plusieurs ann&#233;es un code de climat permettant de rendre les cartes un peu plus dynamiques et variables selon la saison dans le jeu. Ce code &#233;tait anormal depuis plusieurs mois voire ann&#233;es, des arbres apparaissaient sur l'eau, du sol disparaissait, bref plein d'anomalies. Son code a &#233;t&#233; trac&#233;, examin&#233;, en vain. Les erreurs &#233;taient en fait dans d'autres parties du code, sans aucun rapport. La premi&#232;re coupable &#233;tait une fonction ins&#233;rant des objets &#224; un endroit de la carte, qui ne se comportait pas comme elle le devait. Comme seul le climat utilisait certains param&#232;tres, l'anomalie n'avait pas &#233;t&#233; remarqu&#233;e. Le second coupable &#233;tait une fonction de concat&#233;nation de noms de chemins. Elle utilisait un buffer statique qu'elle retournait &#224; son appelant avec un chemin [&lt;a href='#nb3-1' class='spip_note' rel='footnote' title='autrement dit, si l'appelant garde une r&#233;f&#233;rence vers le r&#233;sultat retourn&#233;, le (...)' id='nh3-1'&gt;1&lt;/a&gt;]. Or le climat appelait plusieurs fonctions diff&#233;rentes, dont certaines appelant cette fonction de concat&#233;nation et changeant sa valeur. Au final, le climat travaillait &#224; un moment sur une carte et &#224; un moment sur une autre en pensant &#234;tre sur la premi&#232;re. Bilan, des &#233;l&#233;ments supprim&#233;s ou ins&#233;r&#233;s &#224; des endroits incoh&#233;rents car tests et insertion &#233;taient sur deux cartes diff&#233;rentes.&lt;/p&gt; &lt;p&gt;La cinqui&#232;me phase est la correction du bogue. Dans le cas cit&#233; auparavant, le buffer statique a &#233;t&#233; remplac&#233; par un param&#232;tre buffer que la fonction remplit, &#233;liminant le cas d'&#233;criture parasite [&lt;a href='#nb3-2' class='spip_note' rel='footnote' title='chaque appelant fournit son emplacement priv&#233; o&#249; la fonction &#233;crit le (...)' id='nh3-2'&gt;2&lt;/a&gt;]. Bien &#233;videmment, il faut v&#233;rifier que la correction n'introduit pas de nouveaux bogues...&lt;/p&gt; &lt;p&gt;La sixi&#232;me phase, enfin, est la validation par l'utilisateur de la validit&#233; de la correction. &#192; ce niveau, il est parfois n&#233;cessaire de recommencer &#224; la premi&#232;re phase, si la modification n'est pas satisfaisante.&lt;/p&gt; &lt;p&gt;Une septi&#232;me phase, en g&#233;n&#233;ral oubli&#233;e, est de documenter les modifications, tout au moins le comportement voulu par l'utilisateur ou d&#233;cid&#233;. Ceci permet de s'assurer que des d&#233;veloppeurs futurs auront les informations n&#233;cessaires &#224; la compr&#233;hension du code.&lt;/p&gt; &lt;p&gt;Un &#233;l&#233;ment amusant est la r&#233;partition temporelle entre ces diff&#233;rentes phases. Le d&#233;veloppeur, bien naturellemment, pr&#233;f&#232;re souvent d&#233;velopper plut&#244;t que discuter pour savoir le comportement attendu, surtout quand celui-ci pr&#234;te &#224; discussion. Les quatri&#232;me et cinqui&#232;me phases sont donc souvent ses favorites. Mais, souvent, ce sont les autres phases qui demandent le plus de temps. Le pire des cas est celui o&#249; la cause du probl&#232;me est comprise, la fa&#231;on de corriger aussi (et en plus la correction est simple et sans effet de bord), mais il faut attendre de savoir comment corriger.&lt;/p&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;p&gt;[&lt;a href='#nh3-1' id='nb3-1' class='spip_note' title='Notes 3-1' rev='footnote'&gt;1&lt;/a&gt;] autrement dit, si l'appelant garde une r&#233;f&#233;rence vers le r&#233;sultat retourn&#233;, le contenu ainsi r&#233;f&#233;renc&#233; peut changer sans pr&#233;avis. Ce qui bien s&#251;r pose un souci.&lt;/p&gt; &lt;p&gt;[&lt;a href='#nh3-2' id='nb3-2' class='spip_note' title='Notes 3-2' rev='footnote'&gt;2&lt;/a&gt;] chaque appelant fournit son emplacement priv&#233; o&#249; la fonction &#233;crit le r&#233;sultat, donc plus d'interf&#233;rence.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
