<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Miximum &#187; bug</title>
	<atom:link href="http://www.miximum.fr/tag/bug/feed" rel="self" type="application/rss+xml" />
	<link>http://www.miximum.fr</link>
	<description>Le blog d&#039;un ingénieur web freelance</description>
	<lastBuildDate>Wed, 16 Nov 2011 16:25:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Comment PHP me rends fou</title>
		<link>http://www.miximum.fr/musee-des-horreurs/473-comment-php-me-rends-fou</link>
		<comments>http://www.miximum.fr/musee-des-horreurs/473-comment-php-me-rends-fou#comments</comments>
		<pubDate>Fri, 12 Mar 2010 18:07:21 +0000</pubDate>
		<dc:creator>thibault</dc:creator>
				<category><![CDATA[Musée des horreurs]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[wtf]]></category>

		<guid isPermaLink="false">http://www.miximum.fr/?p=473</guid>
		<description><![CDATA[Chers amis d&#233;veloppeurs bonsoir. Je vous &#233;cris car je souhaite soumettre &#224; votre sagacit&#233; un probl&#232;me &#233;trange. &#192; d&#233;faut de pouvoir me venir en aide (seule ma dignit&#233; m&#8217;emp&#234;che encore de verser des larmes de frustration), peut-&#234;tre au moins cela vous fera-t-il marrer. Je suis victime d&#8217;une version particuli&#232;rement vicieuse du bug de 17h30 (avec [...]]]></description>
			<content:encoded><![CDATA[<p>Chers amis d&eacute;veloppeurs bonsoir. Je vous &eacute;cris car je souhaite soumettre &agrave; votre sagacit&eacute; un probl&egrave;me &eacute;trange. &Agrave; d&eacute;faut de pouvoir me venir en aide (seule ma dignit&eacute; m&#8217;emp&ecirc;che encore de verser des larmes de frustration), peut-&ecirc;tre au moins cela vous fera-t-il marrer. Je suis victime d&#8217;une version particuli&egrave;rement vicieuse du <a href="http://www.miximum.fr/tranche_vie/62-le-bug-de-17h30">bug de 17h30</a> (avec un combo &laquo;&nbsp;bug du vendredi de fin d&#8217;it&eacute;ration&nbsp;&raquo; compte triple).</p>
<p>Projet symfony. Je code, tout se d&eacute;roule bien, fin de semaine, je balance mon code sur le serveur de recette, et je jette un coup d&#8217;&oelig;il sur l&#8217;environnement de prod. Horreur<span class="fine">&nbsp;</span>! Page blanche<span class="fine">&nbsp;</span>! Je v&eacute;rifie la m&ecirc;me page sous l&#8217;environnement de dev. Elle s&#8217;affiche correctement.</p>
<p>Je jette un coup d&#8217;&oelig;il dans la log apache&nbsp;:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;">child pid <span class="nu0">16813</span> <a href="http://www.php.net/exit"><span class="kw3">exit</span></a> signal Segmentation fault <span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span></pre></div></div>

<p>Un sentiment d&#8217;immense lassitude m&#8217;envahit aussit&ocirc;t.</p>
<p>Apr&egrave;s une longue et p&eacute;nible session profilage / debugage avec xdebug, je finit par circonvenir plus ou moins l&#8217;endroit du probl&egrave;me, et parviens m&ecirc;me &agrave; le reproduire &agrave; l&#8217;envie. Vous allez voir, c&#8217;est surprenant&nbsp;:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;"><span class="re0">$category</span> <span class="sy0">=</span> Article<span class="sy0">-&gt;</span><span class="me1">getCategory</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// objet de classe 'Category'</span>
<span class="kw1">echo</span> <span class="re0">$category</span><span class="sy0">;</span>  <span class="co1">// Affiche le titre de la catégorie</span>
<a href="http://www.php.net/printf"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st_h">'%s'</span><span class="sy0">,</span> <span class="re0">$category</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// Page blanche, segfault, sacrifice de chatons, etc.</span></pre></div></div>

<p>Amusant, non<span class="fine">&nbsp;</span>? Apr&egrave;s quelques recherches, il semblerait que dans le contexte d&#8217;une fonction *printf, php n&#8217;utilise pas la fonction magique __toString().</p>
<p>Je teste donc&nbsp;:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;"><span class="kw2">&lt;?php</span>
&nbsp;
<span class="kw2">class</span> Toto
<span class="br0">&#123;</span>
  <span class="kw2">private</span> <span class="re0">$tata</span><span class="sy0">;</span>
&nbsp;
  <span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="re0">$tata</span><span class="br0">&#41;</span>
  <span class="br0">&#123;</span>
    <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">tata</span> <span class="sy0">=</span> <span class="re0">$tata</span><span class="sy0">;</span>
  <span class="br0">&#125;</span>
&nbsp;
  <span class="kw2">public</span> <span class="kw2">function</span> __toString<span class="br0">&#40;</span><span class="br0">&#41;</span>
  <span class="br0">&#123;</span>
    <span class="kw1">return</span> <span class="br0">&#40;</span>string<span class="br0">&#41;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">tata</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>
  <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="re0">$toto</span> <span class="sy0">=</span> <span class="kw2">new</span> Toto<span class="br0">&#40;</span><span class="st_h">'tutu'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw1">echo</span> <span class="re0">$toto</span><span class="sy0">;</span>
<a href="http://www.php.net/printf"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st_h">'%s'</span><span class="sy0">,</span> <span class="re0">$toto</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// tutu</span>
<span class="co1">// tutu</span></pre></div></div>

<p>WTF<span class="fine">&nbsp;</span>? Mais &ccedil;a marche tr&eacute;s bien<span class="fine">&nbsp;</span>! C&#8217;est donc un probl&egrave;me sp&eacute;cifique &agrave; mon code<span class="fine">&nbsp;</span>? Je poursuis mon d&eacute;buggage, et j&#8217;arrive ici&nbsp;:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;"><span class="re0">$category</span> <span class="sy0">=</span> <span class="re0">$article</span><span class="sy0">-&gt;</span><span class="me1">getCategory</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="co1">// $category est de la classe sfOutputEscaperIteratorDecorator</span>
<span class="co1">// qui hérite de sfOutputEscaperObjectDecorator</span>
<span class="co1">// qui définit une fonction __toString()</span>
&nbsp;
<a href="http://www.php.net/printf"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st_h">'%s'</span><span class="sy0">,</span> <span class="re0">$category</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="co1">// Appelle sfOutputEscaperObjectDecorator::__toString</span></pre></div></div>

<p>Bon, allons voir sur place ce qui ne va pas.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;"><span class="kw2">class</span> sfOutputEscaperObjectDecorator
<span class="br0">&#123;</span>
…
  <span class="kw2">public</span> <span class="kw2">function</span> __toString<span class="br0">&#40;</span><span class="br0">&#41;</span>
  <span class="br0">&#123;</span>
    <span class="co1">// Jusqu'ici, tout va bien, mais dés l'instruction return, ça plante</span>
    <span class="kw1">return</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">escape</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">escapingMethod</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">value</span><span class="sy0">-&gt;</span>__toString<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="br0">&#125;</span>
&nbsp;
  <span class="co1">// Je modifie donc la fonction pour obtenir ceci :</span>
  <span class="kw2">public</span> <span class="kw2">function</span> __toString<span class="br0">&#40;</span><span class="br0">&#41;</span>
  <span class="br0">&#123;</span>
    <span class="re0">$value</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">escape</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">escapingMethod</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">value</span><span class="sy0">-&gt;</span>__toString<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <a href="http://www.php.net/var_dump"><span class="kw3">var_dump</span></a><span class="br0">&#40;</span><a href="http://www.php.net/gettype"><span class="kw3">gettype</span></a><span class="br0">&#40;</span><span class="re0">$value</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <a href="http://www.php.net/var_dump"><span class="kw3">var_dump</span></a><span class="br0">&#40;</span><span class="re0">$value</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <a href="http://www.php.net/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="kw1">return</span> <span class="re0">$value</span><span class="sy0">;</span>
  <span class="br0">&#125;</span>
&nbsp;
<span class="co1">// J'obtiens pour affichage :</span>
<span class="co1">// 'String'</span>
<span class="co1">// 'Titre de ma catégorie'</span>
&nbsp;
<span class="co1">// En revanche :</span>
&nbsp;
  <span class="kw2">public</span> <span class="kw2">function</span> __toString<span class="br0">&#40;</span><span class="br0">&#41;</span>
  <span class="br0">&#123;</span>
    <span class="re0">$value</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">escape</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">escapingMethod</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">value</span><span class="sy0">-&gt;</span>__toString<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <a href="http://www.php.net/var_dump"><span class="kw3">var_dump</span></a><span class="br0">&#40;</span><a href="http://www.php.net/gettype"><span class="kw3">gettype</span></a><span class="br0">&#40;</span><span class="re0">$value</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <a href="http://www.php.net/var_dump"><span class="kw3">var_dump</span></a><span class="br0">&#40;</span><span class="re0">$value</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="co1">// die();</span>
    <span class="kw1">return</span> <span class="re0">$value</span><span class="sy0">;</span>
  <span class="br0">&#125;</span>
&nbsp;
<span class="co1">// Page blanche. Continuons dans l'étrange, avec quelques modifications de la même méthode :</span>
&nbsp;
  <span class="kw2">public</span> <span class="kw2">function</span> __toString<span class="br0">&#40;</span><span class="br0">&#41;</span>
  <span class="br0">&#123;</span>
    <span class="re0">$value</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">escape</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">escapingMethod</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">value</span><span class="sy0">-&gt;</span>__toString<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <a href="http://www.php.net/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="st_h">'ici'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// Affiche 'ici'</span>
    <span class="kw1">return</span> <span class="st_h">'toto'</span><span class="sy0">;</span>
  <span class="br0">&#125;</span>
&nbsp;
  <span class="kw2">public</span> <span class="kw2">function</span> __toString<span class="br0">&#40;</span><span class="br0">&#41;</span>
  <span class="br0">&#123;</span>
    <span class="kw1">return</span> <span class="st_h">'toto'</span><span class="sy0">;</span> <span class="co1">// Affiche 'toto'</span>
  <span class="br0">&#125;</span>
&nbsp;
  <span class="kw2">public</span> <span class="kw2">function</span> __toString<span class="br0">&#40;</span><span class="br0">&#41;</span>
  <span class="br0">&#123;</span>
    <span class="re0">$value</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">escape</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">escapingMethod</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">value</span><span class="sy0">-&gt;</span>__toString<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="kw1">return</span> <span class="st_h">'toto'</span><span class="sy0">;</span> <span class="co1">// Page blanche</span>
  <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>

<p>Tout &ccedil;a, bien s&ucirc;r, c&#8217;est sur l&#8217;environnement de prod. En dev, tout se passe toujours normalement.</p>
<p>J&#8217;en suis l&agrave;. Si quelqu&#8217;un a une bonne explication. En attendant, je crois que je vais aller me coucher de bonne heure. Bon week-end &agrave; tous.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miximum.fr/musee-des-horreurs/473-comment-php-me-rends-fou/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Colombo 2.0</title>
		<link>http://www.miximum.fr/humour/420-colombo-2-0</link>
		<comments>http://www.miximum.fr/humour/420-colombo-2-0#comments</comments>
		<pubDate>Tue, 05 Jan 2010 11:43:21 +0000</pubDate>
		<dc:creator>thibault</dc:creator>
				<category><![CDATA[Humour]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[client]]></category>
		<category><![CDATA[freelance]]></category>
		<category><![CDATA[newbie]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.miximum.fr/?p=420</guid>
		<description><![CDATA[photo credit&#160;: Pieter Musterd D&#233;s qu&#8217;elle est entr&#233;e dans mon bureau, j&#8217;ai su que l&#8217;affaire ne sentait pas bon. On ne fait pas carri&#232;re dans ma branche si on ne d&#233;veloppe pas un solide sixi&#232;me sens pour flairer les probl&#232;mes. Et manifestement, mon embrouillom&#232;tre me criait que je ferais mieux de me planquer sous mon [...]]]></description>
			<content:encoded><![CDATA[<div class="postimg alignleft"><a href="http://www.flickr.com/photos/90794078@N00/3796655530/" title="Night" target="_blank"><img src="http://farm3.static.flickr.com/2468/3796655530_d4efa6d5ea_m.jpg" alt="Night" border="0" /></a><br /><small><a href="http://creativecommons.org/licenses/by-nc-nd/2.0/" title="Attribution-NonCommercial-NoDerivs License" target="_blank"><img src="http://www.miximum.fr/wp-content/plugins/photo-dropper/images/cc.png" alt="Creative Commons License" border="0" width="16" height="16" align="absmiddle" /></a> <a href="http://www.photodropper.com/photos/" target="_blank">photo</a> credit&nbsp;: <a href="http://www.flickr.com/photos/90794078@N00/3796655530/" title="Pieter Musterd" target="_blank">Pieter Musterd</a></small></div>
<p>D&eacute;s qu&#8217;elle est entr&eacute;e dans mon bureau, j&#8217;ai su que l&#8217;affaire ne sentait pas bon. On ne fait pas carri&egrave;re dans ma branche si on ne d&eacute;veloppe pas un solide sixi&egrave;me sens pour flairer les probl&egrave;mes. Et manifestement, mon embrouillom&egrave;tre me criait que je ferais mieux de me planquer sous mon bureau la t&ecirc;te cach&eacute;e dans une des poches de mon imper.</p>
<p>Malheureusement, mon vieux fauteuil donnait des signes de fatigue, la machine &agrave; caf&eacute; agonisait, et j&#8217;avais un besoin urgent de renflouer mes caisses. Je n&#8217;avais pas les moyens de faire le difficile.</p>
<p>&mdash; Thibault Jouannic, d&eacute;tective TMA priv&eacute;<span class="fine">&nbsp;</span>?<br />
&mdash; Lui m&ecirc;me, &agrave; votre service m&#8217;dame. Entez, je vous en prie.</p>
<p>D&#8217;un signe de main, je l&#8217;invitai &agrave; s&#8217;asseoir. Pendant qu&#8217;elle s&#8217;ex&eacute;cutait, je l&#8217;examinais &agrave; la d&eacute;rob&eacute;e. Mon boulot m&#8217;amenait plut&ocirc;t &agrave; c&ocirc;toyer de gros barbus aux dents jaunies par la clope et le caf&eacute;, et portants des tee-shirt rigolos. Aussi, cette belle brune &eacute;lanc&eacute;e en tailleur &eacute;l&eacute;gant avait imm&eacute;diatement &eacute;veill&eacute; mon attention. D&#8217;un point de vue professionnel, j&#8217;entends.</p>
<p>&mdash; Alors m&#8217;dame, que puis-je faire pour vous &ecirc;tre utile<span class="fine">&nbsp;</span>?</p>
<p>J&#8217;ai toujours pens&eacute; qu&#8217;un bon d&eacute;tective &eacute;tait comme un m&eacute;decin. Pas de bon diagnostic sans conna&icirc;tre les sympt&ocirc;mes. Le probl&egrave;me, c&#8217;est que mes clients me prenaient souvent pour une esp&egrave;ce de devin vaudou, et j&#8217;&eacute;tais oblig&eacute; de les soumettre &agrave; un interrogatoire digne d&#8217;un inquisiteur espagnol pour esp&eacute;rer obtenir le minimum d&#8217;indices.</p>
<p>&mdash; Je suis Lucie S., webmaster d&#8217;un site de petites annonces agricoles, et depuis quelques temps il semble que les performances ne soient plus au rendez-vous.<br />
&mdash; Vous voulez dire que le site est lent<span class="fine">&nbsp;</span>?<br />
&mdash; En fait, ce site n&#8217;a jamais &eacute;t&eacute; une foudre de guerre, mais depuis deux jours, la situation est devenue catastrophique. La moindre requete n&eacute;cessite 45 secondes avant d&#8217;aboutir. Quand on ne r&eacute;cup&egrave;re pas une page blanche. Et le moteur de recherche, le c&oelig;ur du site, est compl&egrave;tement inutilisable.</p>
<div class="postimg alignright"><a href="http://www.flickr.com/photos/71447254@N00/415929172/" title="Dr Cog" target="_blank"><img src="http://farm1.static.flickr.com/182/415929172_ca443ab75d_m.jpg" alt="Dr Cog" border="0" /></a><br /><small><a href="http://creativecommons.org/licenses/by-nc/2.0/" title="Attribution-NonCommercial License" target="_blank"><img src="http://www.miximum.fr/wp-content/plugins/photo-dropper/images/cc.png" alt="Creative Commons License" border="0" width="16" height="16" align="absmiddle" /></a> <a href="http://www.photodropper.com/photos/" target="_blank">photo</a> credit&nbsp;: <a href="http://www.flickr.com/photos/71447254@N00/415929172/" title="Balakov" target="_blank">Balakov</a></small></div>
<p>Les performances<span class="fine">&nbsp;</span>! Un grand classique. 90% de mes affaires concernaient des sites qui se trainaient comme des escargots neurasth&eacute;niques. Parfois, rajouter quelques caches rendait le probl&egrave;me supportable, mais la plupart du temps, la conception de base &eacute;tait tellement m&eacute;diocre qu&#8217;il n&#8217;y avait rien &agrave; faire. Allez expliquer &ccedil;a &agrave; un client d&eacute;sesp&eacute;r&eacute;.</p>
<p>Bref<span class="fine">&nbsp;</span>! Cela s&#8217;annon&ccedil;ait comme une petite enqu&ecirc;te de routine. Alors pourquoi mon instinct me criait-il qu&#8217;il y avait anguille sous roche<span class="fine">&nbsp;</span>?</p>
<p>&mdash; Vous dites que depuis deux jours, la situation a empir&eacute;. Que s&#8217;est-il pass&eacute; de sp&eacute;cial &agrave; ce moment l&agrave;<span class="fine">&nbsp;</span>?<br />
&mdash; Mais justement<span class="fine">&nbsp;</span>! Rien, rien du tout.</p>
<p>C&#8217;&eacute;tait louche. Soit elle me mentait, soit elle ignorait quelque chose, mais son histoire n&#8217;&eacute;tait pas cr&eacute;dible, et elle m&ecirc;me ne semblait pas convaincue. Je d&eacute;cidai de la titiller.</p>
<p>&mdash; Aucune erreur dans vos tests unitaires ou fonctionnels<span class="fine">&nbsp;</span>? Que dit votre plate-forme d&#8217;int&eacute;gration continue<span class="fine">&nbsp;</span>?<br />
&mdash; Euh&hellip;</p>
<p>J&#8217;avais touch&eacute; juste. Je posais la question pour la forme, j&#8217;aurais &eacute;t&eacute; bien surpris d&#8217;apprendre l&#8217;existence de tests automatis&eacute;s. La plupart du temps, je devais m&#8217;estimer heureux si des conventions de codages &eacute;taient d&eacute;finies et respect&eacute;es. Mais bon, la question avait le don de rendre mes clients mal &agrave; l&#8217;aise, et un client qui n&#8217;est pas droit dans ses chausettes est moins enclin &agrave; discuter mes tarifs. Et puis, &ccedil;a me distrait.</p>
<p>&mdash; &Eacute;coutez, je vais voir ce que je peux faire. Mais il me faudra un acc&egrave;s au serveur de production, un compte sur le gestionnaire de source, et un dump r&eacute;cent de la base de donn&eacute;es.<br />
&mdash; Je vous communiquerai ces informations dans la journ&eacute;e. Il y a autre chose, me dit-elle l&#8217;air embarass&eacute;e.<br />
&mdash; Oui<span class="fine">&nbsp;</span>?</p>
<p>Je masquai un petit sourire. Quand un client ne rechigne pas &agrave; vous donner l&#8217;acc&egrave;s &agrave; la prod, c&#8217;est qu&#8217;il y a toujours autre chose.</p>
<p>&mdash; Un grand salon d&#8217;agriculture a lieu dans deux jours. Une pr&eacute;sentation publique du site est pr&eacute;vue. C&#8217;est un site subventionn&eacute; par le minist&egrave;re, vous comprenez. Et si la situation n&#8217;est pas revenue &agrave; la normale d&#8217;ici l&agrave;, nous risquons de nous retrouver dans une situation d&eacute;licate.</p>
<p>Ben voyons<span class="fine">&nbsp;</span>! J&#8217;aimais travailler dans le stress du temps qui passe. Corriger un bug qui semblait insolvable est gratifiant, mais aucune sensation n&#8217;est plus exaltante que celle de le faire dans un d&eacute;lai aussi court. Et puis, &ccedil;a me permet de gonfler mon tarif.</p>
<p>&mdash; Je prends l&#8217;affaire en main m&#8217;dame. Envoyez moi les donn&eacute;es dont j&#8217;ai besoin, et je commence sur le champ.</p>
<div class="postimg alignleft"><a href="http://www.flickr.com/photos/7626777@N02/2975010771/" title="Smoke &#038; Smokey" target="_blank"><img src="http://farm4.static.flickr.com/3237/2975010771_ca17f3a713_m.jpg" alt="Smoke &#038; Smokey" border="0" /></a><br /><small><a href="http://creativecommons.org/licenses/by-nc-nd/2.0/" title="Attribution-NonCommercial-NoDerivs License" target="_blank"><img src="http://www.miximum.fr/wp-content/plugins/photo-dropper/images/cc.png" alt="Creative Commons License" border="0" width="16" height="16" align="absmiddle" /></a> <a href="http://www.photodropper.com/photos/" target="_blank">photo</a> credit&nbsp;: <a href="http://www.flickr.com/photos/7626777@N02/2975010771/" title="Anders Adermark" target="_blank">Anders Adermark</a></small></div>
<p>Une fois qu&#8217;elle fut sortie, je m&#8217;abandonnais &agrave; une m&eacute;ditation contemplative. R&eacute;fl&eacute;chir repr&eacute;sente une part importante de mon temps de travail. Je dirais m&ecirc;me que c&#8217;est la part la plus importante. Il m&#8217;est m&ecirc;me arriv&eacute; de r&eacute;soudre des affaires sans poser les mains sur mon clavier b&eacute;po.</p>
<p>L&#8217;ennui, avec la r&eacute;flexion, c&#8217;est qu&#8217;elle passe facilement pour de l&#8217;oisivet&eacute; pour les non-init&eacute;s. C&#8217;est pour &ccedil;a que je prends toujours l&#8217;air affair&eacute; et soucieux quand j&#8217;attends un client. Pour avoir l&#8217;air comp&eacute;tent et efficace.</p>
<p>C&#8217;est important, les apparences, dans mon m&eacute;tier. Pourquoi croyez-vous que je laisse tra&icirc;ner toutes ces piles de dossiers poussi&eacute;reux<span class="fine">&nbsp;</span>? Pas pour le travail, tout est num&eacute;ris&eacute;. Non, c&#8217;est simplement parce qu&#8217;un d&eacute;tective sans imper et qui ne pue pas le tabac froid. &Ccedil;a ne fait pas s&eacute;rieux.</p>
<p>Je suis bien rest&eacute; deux heures, les pieds sur mon bureau couvert de paperasse bidon, sirotant mon infusion &agrave; la verveine (que je ne bois qu&#8217;en cachette, un vrai d&eacute;tective est cens&eacute; carburer au caf&eacute; noir d&eacute;gueulasse), avant de parvenir &agrave; la conclusion suivante&nbsp;: j&#8217;&eacute;tais dans une impasse. J&#8217;avais le crime, mais pas le mobile.</p>
<p>Quelqu&#8217;un aurait-il sabot&eacute; volontairement le site pour plomber la pr&eacute;sentation publique<span class="fine">&nbsp;</span>? Un hacker<span class="fine">&nbsp;</span>? Un script-kiddie<span class="fine">&nbsp;</span>? Un concurrent<span class="fine">&nbsp;</span>?  Je n&#8217;arrivais pas &agrave; m&#8217;en persuader. Les gens regardent trop la t&eacute;l&eacute;. Ils s&#8217;imaginent que nous autres, d&eacute;tectives TMA, passont notre temps &agrave; combattre le crime virtuel organis&eacute;, sauver des demoiselles en d&eacute;tresse et emp&ecirc;cher <i>in-extremis</i> des fus&eacute;es d&#8217;exploser. Tout &ccedil;a, c&#8217;est la faute &agrave; Colombo.</p>
<p>La r&eacute;alit&eacute; est toute  autre, et le quotidien d&#8217;un d&eacute;tective TMA est finalement assez banal. Point de grand bantitisme. Point de course poursuite effr&eacute;n&eacute;e dans les limbes du web. Simplement quelques corrections orthographiques par ci, un petit bug css (damn IE!) par l&agrave;. Et puis, m&eacute;tro, popote, dodo. Comme tout le monde, finalement.</p>
<p>C&#8217;est justement pour cette raison que je ne parvenais pas &agrave; accepter l&#8217;id&eacute;e d&#8217;un acte de piraterie. R&egrave;gle n&deg;1 du d&eacute;tective TMA&nbsp;: &laquo;&nbsp;&nbsp;N&#8217;attribue jamais &agrave; la malveillance ce qui peut s&#8217;expliquer par l&#8217;incomp&eacute;tence&nbsp;&nbsp;&raquo;. Quelqu&#8217;un avait merd&eacute; dans cette histoire, et il fallait trouver qui.</p>
<div class="postimg alignleft"><a href="http://www.flickr.com/photos/63894760@N00/419776073/" title="Mala Strana" target="_blank"><img src="http://farm1.static.flickr.com/186/419776073_24039d39ab_m.jpg" alt="Mala Strana" border="0" /></a><br /><small><a href="http://creativecommons.org/licenses/by-nc-nd/2.0/" title="Attribution-NonCommercial-NoDerivs License" target="_blank"><img src="http://www.miximum.fr/wp-content/plugins/photo-dropper/images/cc.png" alt="Creative Commons License" border="0" width="16" height="16" align="absmiddle" /></a> <a href="http://www.photodropper.com/photos/" target="_blank">photo</a> credit&nbsp;: <a href="http://www.flickr.com/photos/63894760@N00/419776073/" title="Pensiero" target="_blank">Pensiero</a></small></div>
<p>C&#8217;est maintenant que les choses s&eacute;rieuses allaient commencer. Je commen&ccedil;ai par v&eacute;rifier la justesse des informations envoy&eacute;es par ma cliente, et r&eacute;cup&eacute;rais le trunk du site. Haha<span class="fine">&nbsp;</span>! Quelqu&#8217;un avait commit&eacute; un &laquo;&nbsp;&nbsp;Thumbs.db&nbsp;&nbsp;&raquo; dans le dossier &laquo;&nbsp;&nbsp;img&nbsp;&nbsp;&raquo;. Quelle bande de newbies<span class="fine">&nbsp;</span>! Mais<span class="fine">&nbsp;</span>!? Ils avaient &eacute;galement commit&eacute; leur r&eacute;pertoire de backup, rempli de dumps sql<span class="fine">&nbsp;</span>?! Seigneur<span class="fine">&nbsp;</span>! Je sentis mes yeux tenter de jaillir hors de leurs orbites.</p>
<p>Pris d&#8217;un doute, je r&eacute;cup&eacute;rai &eacute;galement en local la version de production du site. Autant vous dire qu&#8217;&agrave; ce moment, je m&#8217;attendais &agrave; tout. Pour le plaisir, j&#8217;ouvris quelques fichiers au hasard gr&acirc;ce &agrave; mon &eacute;diteur de geek pr&eacute;f&eacute;r&eacute; (vim, car tout le monde sait que les vrais pros n&#8217;utilisent jamais emacs). La syntaxe hasardeuse, l&#8217;indentation erratique, et les caract&egrave;res de saut de lignes al&eacute;atoires me firent vite tourner la t&ecirc;te, le c&oelig;ur au bord des l&egrave;vres.</p>
<p>&mdash; &laquo;&nbsp;&nbsp;Fiston, dans la vie, on ne m&eacute;lange jamais les espaces et les tabulations&nbsp;&nbsp;&raquo;, me disait souvent ma grand-m&egrave;re, de son air sage et p&eacute;n&eacute;trant de v&eacute;t&eacute;ran qui avait connu le Cobol. Il faut croire que tout le monde n&#8217;a pas eu la chance d&#8217;avoir une grand m&egrave;re comme la mienne.</p>
<p>En dernier recours, je d&eacute;cidai de jeter un coup d&#8217;&oelig;il &agrave; l&#8217;historique svn. En parcourant rapidement les derniers messages de commits, quelque chose attira mon regard. Serait-il possible que&hellip; Quelques diffs plus tard, j&#8217;&eacute;tais fix&eacute;. Les mains derri&egrave;re la t&ecirc;te, je me laissai aller en arri&egrave;re, un sourire sur les l&egrave;vres. Voil&agrave; une affaire rondement men&eacute;e.</p>
<p>Le c&oelig;ur l&eacute;ger, je d&eacute;crochai le t&eacute;l&eacute;phone, et appelai ma cliente.</p>
<p>&mdash; Allo<span class="fine">&nbsp;</span>?<br />
&mdash; Thibault Jouannic, d&eacute;tective TMA &agrave; l&#8217;appareil. J&#8217;ai quelque chose qui peut vous int&eacute;resser.<br />
&mdash; Vous avez trouv&eacute;<span class="fine">&nbsp;</span>?<br />
&mdash; Pas par t&eacute;l&eacute;phone. &Eacute;coutez, je veux que vous r&eacute;unissiez l&#8217;&eacute;quipe de d&eacute;veloppement au complet, dans vos locaux, demain 9h. Assurez-vous que tout le monde soit pr&eacute;sent. Et amenez des croissants.</p>
<div class="postimg alignright"><a href="http://www.flickr.com/photos/14326506@N08/3294156681/" title="Van Williams &#038; Bruce Lee" target="_blank"><img src="http://farm4.static.flickr.com/3557/3294156681_5f68e7dce4_m.jpg" alt="Van Williams &#038; Bruce Lee" border="0" /></a><br /><small><a href="http://creativecommons.org/licenses/by/2.0/" title="Attribution License" target="_blank"><img src="http://www.miximum.fr/wp-content/plugins/photo-dropper/images/cc.png" alt="Creative Commons License" border="0" width="16" height="16" align="absmiddle" /></a> <a href="http://www.photodropper.com/photos/" target="_blank">photo</a> credit&nbsp;: <a href="http://www.flickr.com/photos/14326506@N08/3294156681/" title="Elmo Alves" target="_blank">Elmo Alves</a></small></div>
<p>Sans attendre sa r&eacute;ponse, je raccrochai. Pour ma peine, je d&eacute;cidai de me pr&eacute;parer une autre infusion. Demain promettait d&#8217;&ecirc;tre une belle journ&eacute;e.</p>
<p>Le lendemain, je me rendis au si&egrave;ge de S&hellip; S.A., dans ma vielle guibarde fumante. J&#8217;ai l&#8217;habitude de me d&eacute;placer en v&eacute;lo, mais pour les rencontres avec mes clients, &ccedil;a me donne un genre.</p>
<p>Quand j&#8217;arrivai &agrave; la r&eacute;union, tout le monde &eacute;tait d&eacute;j&agrave; pr&eacute;sent, et &agrave; l&#8217;heure, preuve s&#8217;il en est de la gravit&eacute; de la situation. Les croissants &eacute;taient chauds, le caf&eacute; finissait de glouglouter dans le percolateur, les choses s&#8217;annon&ccedil;aient bien.</p>
<p>Je m&#8217;emparai d&#8217;une viennoiserie, et demandai &agrave; chacun de se pr&eacute;senter.</p>
<p>&mdash; Fr&eacute;d&eacute;ric B., chef de projet<br />
&mdash; Solange C., d&eacute;veloppeuse<br />
&mdash; Alfred D., designer / int&eacute;grateur<br />
&mdash; Anatole P., d&eacute;veloppeur stagiaire<br />
&mdash; Pierre Z, d&eacute;veloppeur<br />
&mdash; Lucie S., webmaster</p>
<p>Apr&egrave;s ce petit tour de table, je leur tournai le dos, et m&#8217;approchai de la fen&ecirc;tre, faignant de contempler le paysage b&eacute;tonneux des alentours d&#8217;un air inspir&eacute;. Dans mon m&eacute;tier, il faut savoir m&eacute;nager ses effets. Lorsque je jugeai la tension nerveuse suffisante, je me retournai, et commen&ccedil;ai mon num&eacute;ro.</p>
<p>&mdash; Comme vous le savez, j&#8217;ai &eacute;t&eacute; contact&eacute; hier par Lucie S., ici pr&eacute;sente, pour &eacute;lucider un cas myst&eacute;rieux. Depuis 2 jours, le site www.&hellip;.com semble rencontrer des probl&egrave;mes de lenteur anormale. Est-ce exact<span class="fine">&nbsp;</span>?<br />
&mdash; Tout &agrave; fait.<br />
&mdash; Cet &eacute;venement survient juste avant une importante pr&eacute;sentation publique du site. Si l&#8217;anomalie n&#8217;est pas r&eacute;solue, sa r&eacute;putation sera ruin&eacute;e, et par exension celle de l&#8217;agence web qui l&#8217;a con&ccedil;u et r&eacute;alis&eacute;, n&#8217;est-ce-pas<span class="fine">&nbsp;</span>?<br />
&mdash; En effet.<br />
&mdash; Comme vous, j&#8217;ai pens&eacute; &agrave; un acte malveillant. La vile d&eacute;marche d&#8217;un concurrent amer et jaloux d&#8217;avoir &eacute;t&eacute; &eacute;conduit lors de l&#8217;appel d&#8217;offre. Aussi ai-je analys&eacute; en d&eacute;tails les diff&eacute;rents logs de votre serveur de production. J&#8217;ai vite d&eacute;couvert que je faisais fausse route. Je n&#8217;ai rien remarqu&eacute; d&#8217;anormal. En revanche, je peux vous dire une chose.</p>
<p>Je les parcourus tous de mon regard de d&eacute;tective p&eacute;n&eacute;trant. La tension &eacute;tait &agrave; son comble, chacun &eacute;tait pendu &agrave; mes l&egrave;vres, retenant son souffle.</p>
<p>&mdash; Mesdames, messieurs, il s&#8217;agit d&#8217;un acte interne. Qui plus est, j&#8217;affirme que le coupable se trouve dans cette pi&egrave;ce<span class="fine">&nbsp;</span>!</p>
<p>L&#8217;annonce fit son effet. Des exclamations d&#8217;indignation &eacute;clat&egrave;rent, des caf&eacute;s furent renvers&eacute;s, certains manqu&egrave;rent s&#8217;&eacute;touffer avec leur croissant. J&#8217;attendis, inflexible, que le calme revienne, et imposai le silence de mon &oelig;il de lynx (la bestiole, pas le navigateur).</p>
<p>&mdash; Lucie S., vous m&#8217;avez annonc&eacute; lors de notre premier entretien qu&#8217;aucun changement n&#8217;&eacute;tais survenu sur l&#8217;application au moment du d&eacute;but des anomalies. Et bien, madame S., vous vous &ecirc;tes tromp&eacute;e. Il y a bel et bien eu une livraison ce jour l&agrave;.</p>
<p>Le chef de projet bondit alors de sa chaise, en renversant son caf&eacute;, hurlant presque.</p>
<p>&mdash; Mensonge<span class="fine">&nbsp;</span>! Calomnies<span class="fine">&nbsp;</span>! Aucune livraison n&#8217;a &eacute;t&eacute; d&eacute;ploy&eacute;e en production depuis 10 jours. V&eacute;rifiez le svn, le dernier tag date de plus d&#8217;une semaine. Et aucun ticket n&#8217;est pass&eacute; en &eacute;tat &laquo;&nbsp;&nbsp;clotur&eacute;&nbsp;&nbsp;&raquo; durant cette p&eacute;riode<span class="fine">&nbsp;</span>! Vous mentez<span class="fine">&nbsp;</span>!<br />
&mdash; Croyez-moi bien, j&#8217;ai v&eacute;rifi&eacute; ces &eacute;l&eacute;ments. Et comme vous le dite, aucune livraison n&#8217;a &eacute;t&eacute; d&eacute;ploy&eacute;e en utilisant votre proc&eacute;dure de livraison <em>officielle</em>. &mdash; J&#8217;appuyais sur le terme &mdash; En revanche, il y a bien eu une livraison <em>sans passer par votre proc&eacute;dure de d&eacute;ploiement<span class="fine">&nbsp;</span>!</em><br />
&mdash; C&#8217;en est trop, rugit le chef de projet. Comment pouvez-vous l&#8217;affirmer<span class="fine">&nbsp;</span>?<br />
&mdash; C&#8217;est simple, j&#8217;ai eu l&#8217;occasion de comparer la version svn des sources, avec ce qu&#8217;on peut trouver sur vos serveurs de production et pr&eacute;production. Le r&eacute;sultat fut tr&eacute;s instructif, je dois dire.</p>
<div class="postimg alignleft"><a href="http://www.flickr.com/photos/14838182@N00/4163064826/" title="Pens in light" target="_blank"><img src="http://farm3.static.flickr.com/2754/4163064826_1b5d350a02_m.jpg" alt="Pens in light" border="0" /></a><br /><small><a href="http://creativecommons.org/licenses/by-nc-nd/2.0/" title="Attribution-NonCommercial-NoDerivs License" target="_blank"><img src="http://www.miximum.fr/wp-content/plugins/photo-dropper/images/cc.png" alt="Creative Commons License" border="0" width="16" height="16" align="absmiddle" /></a> <a href="http://www.photodropper.com/photos/" target="_blank">photo</a> credit&nbsp;: <a href="http://www.flickr.com/photos/14838182@N00/4163064826/" title="maistora" target="_blank">maistora</a></small></div>
<p>Je les observai d&#8217;un air amus&eacute;, avant de reprendre.</p>
<p>&mdash; J&#8217;ai en effet pu constater que ces trois environnements n&#8217;&eacute;taient pas synchronis&eacute;s. Il ne peut y avoir qu&#8217;une seule explication. Quelqu&#8217;un n&#8217;a pas respect&eacute; votre proc&eacute;dure de d&eacute;ploiement.</p>
<p>L&#8217;assistance resta muette. Des murmures incr&eacute;dules se firent entendre. Le chef de projet, hagard, bafouilla.</p>
<p>&mdash; Mais&hellip; Qui<span class="fine">&nbsp;</span>? Qui pourrait faire une chose pareille<span class="fine">&nbsp;</span>?<br />
&mdash; Voyez-vous, j&#8217;ai eu l&#8217;occasion d&#8217;analyser les logs svn de votre application. Quelque chose a attir&eacute; mon attention. Quelque chose qui n&#8217;aurait pas du se trouver l&agrave;.</p>
<p>Suspense. J&#8217;observai une pause th&eacute;&acirc;trale, avant de m&#8217;&eacute;crier&nbsp;:</p>
<p>&mdash; Votre log svn est en effet truff&eacute; de messages de commits vides<span class="fine">&nbsp;</span>!</p>
<p>Stupeur dans l&#8217;auditoire. Le chef de projet, le souffle coup&eacute;, retomba sur sa chaise, effondr&eacute;. Je m&#8217;emparai d&#8217;un croissant, leur laissant le temps de reprendre leurs esprits avant de continuer.</p>
<p>&mdash; Plus int&eacute;ressant. J&#8217;ai &eacute;galement remarqu&eacute; que ces commits f&eacute;lons se sont multipli&eacute;s depuis quelque temps.</p>
<p>Je pointai alors un doigt vengeur vers l&#8217;un de mes auditeurs.</p>
<p>&mdash; Monsieur Anatole P. Pourriez vous nous indiquer &agrave; quel moment vous avez commenc&eacute; &agrave; travailler sur ce projet<span class="fine">&nbsp;</span>?!</p>
<p>Le pauvre stagiaire, au comble de l&#8217;embarras, parvint &agrave; peine &agrave; bredouiller une r&eacute;ponse intelligible.</p>
<p>&mdash; Une&hellip; une semaine environ. Mon stage a d&eacute;but&eacute; au d&eacute;but du mois.<br />
&mdash; Monsieur Anatole P. N&#8217;est-il-pas vrai que vous avez, au cours de cette semaine, r&eacute;alis&eacute; des d&eacute;veloppements sur le site dont nous parlons<span class="fine">&nbsp;</span>?<br />
&mdash; Oui, mais&hellip;<br />
&mdash; Et n&#8217;est-il-pas vrai qu&#8217;au cours de ces travaux, vous avez modifi&eacute; l&#8217;un des fichiers de configuration de l&#8217;application<span class="fine">&nbsp;</span>?<br />
&mdash; Peut-&ecirc;tre bien que oui.<br />
&mdash; Et bien monsieur Anatole P., lorsque vous avez livr&eacute; vos travaux directement sur le serveur de production, vous avez &eacute;cras&eacute; un fichier de configuration avec les param&egrave;tres de la plate-forme d&#8217;int&eacute;gration. Cela a eu pour action de <em>d&eacute;sactiver tous les caches de la production<span class="fine">&nbsp;</span>!</em></p>
<div class="postimg alignleft"><a href="http://www.flickr.com/photos/37996583025@N01/2821633690/" title="Not getting Involved" target="_blank"><img src="http://farm4.static.flickr.com/3120/2821633690_e0cb9b6bbb_m.jpg" alt="Not getting Involved" border="0" /></a><br /><small><a href="http://creativecommons.org/licenses/by-nc/2.0/" title="Attribution-NonCommercial License" target="_blank"><img src="http://www.miximum.fr/wp-content/plugins/photo-dropper/images/cc.png" alt="Creative Commons License" border="0" width="16" height="16" align="absmiddle" /></a> <a href="http://www.photodropper.com/photos/" target="_blank">photo</a> credit&nbsp;: <a href="http://www.flickr.com/photos/37996583025@N01/2821633690/" title="TarikB" target="_blank">TarikB</a></small></div>
<p>Dans la folie qui s&#8217;ensuivit, le chef de projet, rouge de col&egrave;re, tonna.</p>
<p>&mdash; Anatole<span class="fine">&nbsp;</span>! Je vous jure que vous allez&hellip;<br />
&mdash; Un instant<span class="fine">&nbsp;</span>! &mdash; J&#8217;avais us&eacute; de toute mon autorit&eacute; pour l&#8217;interrompre &mdash; J&#8217;affirme qu&#8217;il n&#8217;y a qu&#8217;un seul coupable dans cette pi&egrave;ce. Et ce coupable n&#8217;est pas Anatole.</p>
<p>Stup&eacute;faction.</p>
<p>&mdash; Monsieur Fr&eacute;d&eacute;ric B., chef de projet du site www.&hellip;.com, je vous accuse d&#8217;avoir confi&eacute; les acc&egrave;s de votre plate-forme de production &agrave; un stagiaire inexp&eacute;riment&eacute;. Je vous accuse de l&#8217;avoir laiss&eacute; travailler sur un projet sans l&#8217;avoir form&eacute; &agrave; vos m&eacute;thodes. Je vous accuse de ne pas avoir mis en place de proc&eacute;dure syst&eacute;matique de v&eacute;rification ni de validation de son travail par ses pairs plus exp&eacute;riment&eacute;s. Enfin, au nom d&#8217;Ada, sainte patronne des geeks et codeurs, je vous accuse de contribuer &agrave; la m&eacute;diocrit&eacute; logicielle g&eacute;n&eacute;rale, en omettant de mettre en place et de promouvoir des bonnes pratiques de d&eacute;veloppements. Arr&ecirc;tez-le<span class="fine">&nbsp;</span>!</p>
<p>Deux gorilles de la s&eacute;curit&eacute; se saisirent du f&eacute;lon, et l&#8217;emmen&eacute;rent tandis que ses cris de rage et menaces de vengeances raisonnaient dans les couloirs.</p>
<p>Quand le silence revint, je savourai les regards admiratifs qui se posaient sur moi. Ma cliente ne put s&#8217;emp&ecirc;cher de me demander&nbsp;:</p>
<p>&mdash; Mais comment avez-vous su<span class="fine">&nbsp;</span>? Pour la livraison en production<span class="fine">&nbsp;</span>?<br />
&mdash; C&#8217;est simple, ma ch&egrave;re. Lorsque j&#8217;ai r&eacute;alis&eacute; que certains fichiers n&#8217;&eacute;taient pas synchrones entre les diff&eacute;rents environnements, j&#8217;ai fouill&eacute; pour en d&eacute;couvrir l&#8217;origine. J&#8217;ai remarqu&eacute; que certaines modifications apport&eacute;es r&eacute;cemments sur le svn se trouvaient bien sur la pr&eacute;production, mais jamais sur la production. En revanche, d&#8217;autres commits avaient &eacute;t&eacute; directement report&eacute;s sur la production, mais &eacute;taient absent de la production. Et il se trouve que ces commits anormaux avaient tous un m&ecirc;me auteur&nbsp;: Monsieur Anatole P., ici pr&eacute;sent.</p>
<p>En remontant dans l&#8217;historique, j&#8217;ai tout de suite vu que ses premi&egrave;res contributions &eacute;taient tr&eacute;s r&eacute;centes. J&#8217;ai &eacute;videmment pens&eacute; &agrave; un stagiaire.<br />
&mdash; Votre analyse est limpide.<br />
&mdash; &Eacute;l&eacute;mentaire, m&ecirc;me. Cette affaire prouve une fois de plus l&#8217;une des Grandes Lois Immuables des TIC.<br />
&mdash; Laquelle<span class="fine">&nbsp;</span>?<br />
&mdash; Il n&#8217;existe pas d&#8217;anomalie, quelle qu&#8217;elle soit, dans laquelle aucun stagiaire ne soit impliqu&eacute;.<br />
&mdash; &Eacute;coutez, monsieur Jouannic. Vous nous avez d&eacute;montr&eacute; que vous &ecirc;tes un homme capable. Nous avons une place de chef de projet &agrave; pourvoir. Seriez-vous disponible<span class="fine">&nbsp;</span>?<br />
&mdash; D&eacute;sol&eacute;, m&#8217;dame, mais &ccedil;a ne m&#8217;int&eacute;resse pas. Ind&eacute;pendant je suis, ind&eacute;pendant je reste. Vous savez, d&eacute;tective freelance, ce n&#8217;est pas un m&eacute;tier, c&#8217;est un mode de vie.<br />
&mdash; Bon. Si vous changez d&#8217;avis, n&#8217;h&eacute;sitez pas &agrave; me contacter.<br />
&mdash; J&#8217;y penserai. Je vous enverrai ma facture d&#8217;ici demain.</p>
<p>Tout en m&#8217;installant derri&egrave;re le volant ma fid&egrave;le guibarde, je sortis mon agenda et v&eacute;rifiai mon emploi du temps du reste de la semaine. Rien. Parfait, j&#8217;allais pouvoir partir en vacances quelques jours. Je l&#8217;avais bien m&eacute;rit&eacute;.</p>
<div style="text-align: center">&#8211; FIN &#8211;</div>
]]></content:encoded>
			<wfw:commentRss>http://www.miximum.fr/humour/420-colombo-2-0/feed</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>Comment devenir un mauvais développeur ?</title>
		<link>http://www.miximum.fr/methodes-et-outils/81-comment-devenir-un-mauvais-developpeur</link>
		<comments>http://www.miximum.fr/methodes-et-outils/81-comment-devenir-un-mauvais-developpeur#comments</comments>
		<pubDate>Wed, 09 Jul 2008 15:25:40 +0000</pubDate>
		<dc:creator>thibault</dc:creator>
				<category><![CDATA[Méthodes et outils]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[SSII]]></category>
		<category><![CDATA[wtf]]></category>

		<guid isPermaLink="false">http://www.miximum.fr/methodes-et-outils/81-comment-devenir-un-mauvais-developpeur</guid>
		<description><![CDATA[La vie, c&#8217;est simple. Il y a les bons d&#233;veloppeurs, et il y a les mauvais d&#233;veloppeurs. On ne nait pas bon d&#233;veloppeur, bien entendu. On le devient. Par cons&#233;quent, tout d&#233;veloppeur qui se respecte devrait avoir pour id&#233;al de passer de la seconde cat&#233;gorie &#224; la premi&#232;re. Mais au fond, qu&#8217;est-ce qu&#8217;un mauvais d&#233;veloppeur&#160;? [...]]]></description>
			<content:encoded><![CDATA[<p>La vie, c&#8217;est simple. Il y a les bons d&eacute;veloppeurs, et il y a <a href="http://fr.thedailywtf.com/Series/Code_du_jour.aspx">les mauvais d&eacute;veloppeurs</a>. On ne nait pas bon d&eacute;veloppeur, bien entendu. On le devient. Par cons&eacute;quent, tout d&eacute;veloppeur qui se respecte devrait avoir pour id&eacute;al de passer de la seconde cat&eacute;gorie &agrave; la premi&egrave;re.</p>
<p>Mais au fond, qu&#8217;est-ce qu&#8217;un mauvais d&eacute;veloppeur<span class="fine">&nbsp;</span>? Intuitivement, nous savons les reconna&icirc;tre quand nous les voyons (ou quand <a href="http://www.miximum.fr/musee-des-horreurs/70-le-wtf-du-jour">nous voyons leur code</a>).</p>
<p>Parce que bon, le mauvais d&eacute;veloppeur, il doit &eacute;crire un programme, et ben, il code, tandis que le bon d&eacute;veloppeur, il doit &eacute;crire un programme, bon&#8230; il code. Mais bon, c&#8217;est un bon d&eacute;veloppeur<sup><a href="#footnote-1-81" id="footnote-link-1-81" title="Voir la note.">[1]</a></sup></p>
<p>Bref<span class="fine">&nbsp;</span>! Nos &eacute;tudiants apprenti-d&eacute;veloppeurs, s&#8217;ils apprennent parfois ce qu&#8217;il faut faire, n&#8217;&eacute;tudient pas encore assez <strong>ce qu&#8217;il ne faut <em>pas</em> faire</strong>. Et le <a href="http://dooblem.positon.org/index.php?post/2008/06/19/Perles-PHP">r&eacute;sultat peut devenir dramatique</a>. Car les mauvais d&eacute;veloppeurs ont une facheuses tendance &agrave;&#8230;</p>
<h2>Recoder ce qui existe d&eacute;j&agrave;</h2>
<p>La premi&egrave;re marque du mauvais d&eacute;veloppeur, c&#8217;est de vouloir absolument recoder ce qui existe d&eacute;j&agrave;. Pourquoi vouloir utiliser les fonctions de tri des <a href="http://fr.wikipedia.org/wiki/Standard_Template_Library">biblioth&egrave;ques standards</a>, alors qu&#8217;il est toujours plus amusant de <a href="http://fr.thedailywtf.com/Articles/QuelleEstLaTailleDeMaStackTRI(T).aspx">(mal) recoder un tri &agrave; bulles</a><span class="fine">&nbsp;</span>?</p>
<p>Apr&egrave;s tout, coder est une activit&eacute; hautement amusante. Ce serait dommage de se priver de longues heures de plaisir en r&eacute;utilisant des fonctions qui ont d&eacute;j&agrave; &eacute;t&eacute; test&eacute;es, optimis&eacute;es par des milliers de personnes.</p>
<p>En plus, recoder l&#8217;existant augmente consid&eacute;rablement les <a href="http://www.miximum.fr/vie_de_bureau/62-le-bug-de-17h30">chances de voir apparaitre des bugs</a>. C&#8217;est bien, &ccedil;a permet de vendre des extensions de garantie.</p>
<h2>&Eacute;crire un code illisible</h2>
<p>Le pire, avec les mauvais d&eacute;veloppeurs, c&#8217;est qu&#8217;ils sont en g&eacute;n&eacute;ral convaincus d&#8217;&ecirc;tre bons. Et pour bien montrer leur grosse intelligence, ils n&#8217;h&eacute;sitent pas &agrave; produire le code le plus compact et le plus illisible possible. Un peu comme ces philosophes qui emploient des phrases de 10 lignes et sont fiers de n&#8217;&ecirc;tre compris que d&#8217;une &eacute;lite.</p>
<p>On a dit au mauvais d&eacute;veloppeur qu&#8217;un bon code &eacute;tait un code OP-TI-MI-S&Eacute;. Alors, il optimise, persuad&eacute; que l&#8217;espace disque qu&#8217;occupe son code est un crit&egrave;re &agrave; prendre en compte.</p>
<p>Et vas-y que je te rajoute des affectations dans les conditions. Et vas-y que je t&#8217;imbrique les op&eacute;rateurs ternaires (?:). Et allez, une belle expression booleenne &agrave; trois niveaux sur une seule ligne.</p>
<p>Le r&eacute;sultat, bien entendu, c&#8217;est un code illisible, incompr&eacute;hensible, et immaintenable.</p>
<p>Puisqu&#8217;il en est aux optimisations, le mauvais d&eacute;veloppeur va &eacute;galement tenter de concevoir le code le plus complexe possible, parce qu&#8217;un code complexe est forc&eacute;ment meilleur qu&#8217;un code simple. Les codes simples, c&#8217;est pour les neuneus qui ne savent pas coder.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;"><span class="co1">// Parce qu'il serai trop simple d'écrire ceci :</span>
<span class="kw1">if</span><span class="br0">&#40;</span>adresseValide<span class="br0">&#40;</span> <span class="re0">$adresse</span> <span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> adresseDispo<span class="br0">&#40;</span> <span class="re0">$adresse</span> <span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="co1">// traitement</span>
<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
    <span class="co1">// Autre traitement</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">// Le mauvais développeur préférera ajouter quelques tests et conditions, pour être bien certain de gérer toutes les erreurs possibles :</span>
<span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$eAdrel</span> <span class="sy0">=</span> CompteUtil<span class="sy0">::</span><span class="me2">VerifierDispoAdrel</span><span class="br0">&#40;</span><span class="re0">$d</span><span class="br0">&#91;</span>champAdrel<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> COMPTESADREL_DISPO <span class="sy0">||</span> <span class="br0">&#40;</span><span class="re0">$eAdrel</span> <span class="sy0">=</span> VerifFormUtil<span class="sy0">::</span><span class="me2">checkExistingEmailAddress</span><span class="br0">&#40;</span><span class="re0">$d</span><span class="br0">&#91;</span>champAdrel<span class="br0">&#93;</span><span class="br0">&#41;</span> ? COMPTESADREL_PRESENTE <span class="sy0">:</span> COMPTESADREL_DISPO<span class="br0">&#41;</span> <span class="sy0">!=</span> COMPTESADREL_DISPO<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="sy0">...</span></pre></div></div>

<p>Bien entendu, si ligne par ligne, le mauvais d&eacute;veloppeur compacte au maximum, il n&#8217;h&eacute;site pas en revanche &agrave; &eacute;crire des fonctions qui d&eacute;passent all&eacute;grement les 350 lignes. Parce que, c&#8217;est bien connu, plus une fonction est complexe, plus elle est puissante.</p>
<h2>&Eacute;crire beaucoup de commentaires</h2>
<p>Le mauvais d&eacute;veloppeur, persuad&eacute; d&#8217;&ecirc;tre bon, a entendu dire que les bons d&eacute;veloppeurs ins&eacute;raient des commentaires dans leur code. Alors il en rajoute. Mais il en rajoute tellement, que ses commentaires deviennent des romans que ne renieraient pas Proust.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;"><span class="coMULTI">/* À FAIRE: éclater cette requête.
 * Le problème est que le traitement fait par nous n'est pas monstrueux,
 * et se fait facilement dans la transaction qu'on lui donne. Cependant
 * derrière, on a des manips eZ publish, inclues dans notre transaction,
 * susceptibles de gros brassages.
 * À l'origine, on travaillait compte par compte. Le problème est que
 * désormais, il peut y avoir des sauts façon attaque de convoi: un
 * compte secondaire peut vouloir profiter de la transition pour se
 * détacher de son principal. L'atome n'est donc plus le couple
 * [compte principal;abonnement]. La solution d'origine ne marche
 * plus.
 * À l'heure actuelle, il reste encore possible de découper par 
 * abonnement de départ (une transaction par abo, plus une par
 * nouvel abo): en effet, on a du:
 * a1 &lt;-1-n-&gt; c &lt;-1-0,1-&gt; a2
 * donc pas de recoupement du moment que ce n'est pas du:
 * … 1-n-&gt; a2
 * (qui permettrait de passer d'un a1, via un c et un a2, à un autre c
 * lié à un a1 différent du premier, autrement dit impossibilité de
 * trancher. Certes, c'est improbable qu'on permette un jour à deux
 * gusses de décider de se lier dans un même abonnement)
 * Autre piste: faire une transaction par compte, et à la fin une
 * grosse transaction sur les abonnements. Comme ça, au pire, s'il y a
 * une erreur à un moment, un certain nombre de comptes auront été
 * placés, et les abonnements seront restés dans leur état d'origine. Ce
 * qu'il faut vérifier alors est qu'on peut effectuer plusieurs fois la
 * passe de multipositionnement sans artefact (ex.: il ne faudrait pas
 * que ça incrémente un compteur, sinon, si on met trois échecs avant de
 * passer, le compteur aura été incrémenté trois fois pour une seule
 * transition d'abonnement.
 */</span>
<span class="coMULTI">/* À FAIRE: permettre, par un biais que je n'imagine pas encore, à un
 * compte secondaire qui a demandé son détachement, de quitter
 * prématurément son abo d'origine pour fonder le sien propre. Sinon
 * il est obligé d'attendre pour profiter de son abonnement en nom
 * propre, que le principal veuille bien expirer. */</span>
<span class="coMULTI">/* À FAIRE: repérer aussi les abonnements qui ont récupéré de nouvelles
 * options, trouver leurs comptes (comptes principaux mais aussi
 * secondaires) et rappeler leurs ActualiserGroupesComptesEz . */</span></pre></div></div>

<p>C&#8217;est clair<span class="fine">&nbsp;</span>? (Pour info, ce machin est vraiment tir&eacute; d&#8217;un vrai projet). Quand on doit se taper du code qui contient 20 lignes de commentaires toutes les 3 lignes de code, c&#8217;est&#8230; Comment dire<span class="fine">&nbsp;</span>? Lourd<span class="fine">&nbsp;</span>?</p>
<p>En plus, &eacute;tant donn&eacute; que son code est bard&eacute; de commentaires, le mauvais d&eacute;veloppeur se consid&egrave;re relev&eacute; de l&#8217;obligation d&#8217;&eacute;crire un code significatif. <a href="http://c2.com/cgi/wiki?SelfDocumentingCode">Le code auto document&eacute;</a>, c&#8217;est pour les d&eacute;butants. On se retrouve vite avec des variables et fonctions qui ne signifient plus rien.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;"><span class="re0">$paye</span> <span class="sy0">=</span> CompteUtil<span class="sy0">::</span><span class="me2">ModifierEntree</span><span class="br0">&#40;</span>PT<span class="sy0">.</span><span class="st_h">'produit'</span><span class="sy0">,</span> <span class="re0">$restes</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="nu0">1</span> <span class="sy0">:</span> COMPTES_EINTERNE<span class="sy0">;</span></pre></div></div>

<p>C&#8217;est limpide, non<span class="fine">&nbsp;</span>?</p>
<h2>Optimiser &agrave; mort</h2>
<p>Le mauvais d&eacute;veloppeur, on l&#8217;a dit, adore montrer sa grosse intelligence. Et pour bien montrer qu&#8217;il est un pur, un dur, un bon, il optimise son code. Sans doute parce qu&#8217;&agrave; l&#8217;&eacute;cole, il a re&ccedil;u l&#8217;enseignement de vieux de la vieille, des gens qui ont commenc&eacute; leur boulot quand la m&eacute;moire coutait cher, et que les processeurs n&#8217;ex&eacute;cutaient que quelques centaines d&#8217;instructions par seconde.</p>
<p>Forc&eacute;ment, &agrave; cette &eacute;poque, quand on gagnait quelques octets, quand on &eacute;conomisait quelques instructions, on &eacute;tait content. Mais aujourd&#8217;hui<span class="fine">&nbsp;</span>?! Aujourd&#8217;hui, &ccedil;a rime &agrave; quoi d&#8217;&eacute;crire un code tordu pour &eacute;conomiser trois octets de m&eacute;moire<span class="fine">&nbsp;</span>? Quel est l&#8217;int&eacute;r&ecirc;t de d&eacute;ployer des astuces de programmeurs pour gagner 1.10<sup>-1000000000</sup> secondes en temps d&#8217;ex&eacute;cution<span class="fine">&nbsp;</span>?</p>
<p>Le mauvais d&eacute;veloppeur est &eacute;galement un gros fain&eacute;ant. Pas dans le (bon) sens o&ugrave; il pr&eacute;f&egrave;re r&eacute;fl&eacute;chir 5 minutes pour &eacute;crire le moins possible, mais dans celui o&ugrave; il compacte &agrave; mort ses instructions pour gagner trois caract&egrave;res.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;"><span class="kw1">for</span><span class="br0">&#40;</span><span class="re0">$i</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="sy0">++</span><span class="re0">$i</span> <span class="sy0">&lt;=</span> <span class="nu0">2</span><span class="sy0">;</span><span class="br0">&#41;</span>
<span class="sy0">...</span>
<span class="kw1">return</span> <a href="http://www.php.net/array_key_exists"><span class="kw3">array_key_exists</span></a><span class="br0">&#40;</span>ABO_ACTIF<span class="sy0">,</span> <span class="re0">$etats</span><span class="br0">&#41;</span> ? COMPTESADREL_PRESENTE <span class="sy0">:</span> <span class="br0">&#40;</span><a href="http://www.php.net/array_key_exists"><span class="kw3">array_key_exists</span></a><span class="br0">&#40;</span>ABO_LATENT<span class="sy0">,</span> <span class="re0">$etats</span><span class="br0">&#41;</span> ? <span class="br0">&#40;</span><span class="re0">$aboFuturAvecCompte</span> ? COMPTESADREL_FUTURE <span class="sy0">:</span> COMPTESADREL_DEMANDEE<span class="br0">&#41;</span> <span class="sy0">:</span> <span class="br0">&#40;</span><a href="http://www.php.net/array_key_exists"><span class="kw3">array_key_exists</span></a><span class="br0">&#40;</span>ABO_FINI<span class="sy0">,</span> <span class="re0">$etats</span><span class="br0">&#41;</span> ? COMPTESADREL_DISPO <span class="sy0">:</span> COMPTESADREL_DISPO<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// Finalement, c'est une mauvaise idée de renvoyer COMPTESADREL_PASSEE: ça bloquerait un internaute ayant oublié de renouveler son abonnement et voulant se réabonner dès le lendemain. On renvoie donc COMPTESADREL_DISPO dans ce cas aussi.</span></pre></div></div>

<p>Merci pour celui qui passe apr&egrave;s.</p>
<p>Bref<span class="fine">&nbsp;</span>! Il est beaucoup plus facile d&#8217;&ecirc;tre un d&eacute;veloppeur moyen qu&#8217;un excellent d&eacute;veloppeur. En revanche, j&#8217;en connais qui ont &eacute;lev&eacute; la m&eacute;diocrit&eacute; au rang d&#8217;art, s&#8217;assurant pour jamais un sentiment de haine de la part des autres d&eacute;veloppeurs qui assurent la maintenance de leurs <del>erreurs</del> horreurs.</p>
<h4>Notes&nbsp;:</h4><ol class="footnotes"><li id="footnote-1-81">Attention, une r&eacute;f&eacute;rence culturelle se cache dans ce paragraphe. Saurez vous la retrouver<span class="fine">&nbsp;</span>?  [<a href="#footnote-link-1-81">retour</a>]</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.miximum.fr/methodes-et-outils/81-comment-devenir-un-mauvais-developpeur/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Le bug de 17h30</title>
		<link>http://www.miximum.fr/tranche_vie/62-le-bug-de-17h30</link>
		<comments>http://www.miximum.fr/tranche_vie/62-le-bug-de-17h30#comments</comments>
		<pubDate>Thu, 05 Jun 2008 15:56:52 +0000</pubDate>
		<dc:creator>thibault</dc:creator>
				<category><![CDATA[Tranche de vie]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[SSII]]></category>

		<guid isPermaLink="false">http://www.miximum.fr/vie_de_bureau/62-le-bug-de-17h30</guid>
		<description><![CDATA[Tous les d&#233;veloppeurs connaissent le terrible bug de 17h30 (&#224; 20 minutes pr&#232;s). C&#8217;est, je crois, le pire bug que puisse rencontrer un d&#233;veloppeur. Impr&#233;visible, implacable, inexpugnable, il surgit au pire moment&#160;: 30 minutes avant la quille, au moment m&#234;me ou le malheureux d&#233;veloppeur, entrapercevant la fin de la journ&#233;e, lance ses derni&#232;res forces dans [...]]]></description>
			<content:encoded><![CDATA[<p>Tous les d&eacute;veloppeurs connaissent le terrible bug de 17h30 (&agrave; 20 minutes pr&egrave;s). C&#8217;est, je crois, le pire bug que puisse rencontrer un d&eacute;veloppeur.</p>
<p>Impr&eacute;visible, implacable, inexpugnable, il surgit au pire moment&nbsp;: 30 minutes avant la quille, au moment m&ecirc;me ou le malheureux d&eacute;veloppeur, entrapercevant la fin de la journ&eacute;e, lance ses derni&egrave;res forces dans sa t&acirc;che en cours dans l&#8217;espoir de pouvoir rentrer chez lui vivre un peu s&#8217;il termine &agrave; l&#8217;heure.</p>
<p>Mais voil&agrave;, le bug de 17h30 est particuli&egrave;rement sournois. Et le d&eacute;veloppeur est vuln&eacute;rable&nbsp;: fatigu&eacute; nerveusement, &eacute;prouv&eacute; mentalement, son niveau de concentration, durant l&#8217;apr&egrave;s-midi, a chut&eacute; aussi spectaculairement que monte le prix du baril de p&eacute;trole, pour se retrouver aussi bas que le niveau intellectuel d&#8217;une &eacute;mission de TF1.</p>
<p>Dans ce pitoyable &eacute;tat, le d&eacute;veloppeur n&#8217;est plus bon &agrave; grand choses. Press&eacute; par le temps, il essaye de se concentrer sur la seule et unique t&acirc;che qui le s&eacute;pare de la fin de sa journ&eacute;e et d&#8217;un repos bien m&eacute;rit&eacute;. La t&ecirc;te dans le guidon, il enfile ses oeill&egrave;res et tente de rassembler ce qu&#8217;il lui reste de facult&eacute;s intellectuelles sans se laisser d&eacute;concentrer par l&#8217;agitation naissante de cette fin d&#8217;apr&egrave;s-midi.</p>
<p>Mais alors que la f&eacute;brilit&eacute; du d&eacute;veloppeur est &agrave; son comble, alors qu&#8217;il semble sur le point, pour une fois, de r&eacute;ussir l&#8217;exploit de terminer sa journ&eacute;e &agrave; l&#8217;heure, surgit brusquement le terrible bug de 17h30. Il fond sur le d&eacute;veloppeur comme un rapace sur sa proie, le prend au d&eacute;pourvu, le heurte comme un uppercut qui le laisse pantois, sans souffle et sans voix.</p>
<p>Le d&eacute;veloppeur, exp&eacute;riment&eacute;, comprend vite &agrave; qui il a &agrave; faire. Rompu &agrave; l&#8217;art de l&#8217;algorithmique, endurci par son exp&eacute;rience riche en longues sessions d&#8217;intense d&eacute;buggage, il n&#8217;entend pas se laisser abattre par le premier message d&#8217;erreur venu. Son sang gorg&eacute; de caff&eacute;ine ne fait qu&#8217;un tour. D&eacute;termin&eacute; &agrave; en d&eacute;coudre, il se jette corps et &acirc;me dans la bataille num&eacute;rique. &Agrave; la fin, il n&#8217;en restera qu&#8217;un seul.</p>
<p>&Agrave; ma gauche, le d&eacute;veloppeur. 1m75, 70 kilos, 5 ann&eacute;es d&#8217;&eacute;tudes et 15 ans d&#8217;exp&eacute;rience sur le terrain. &Agrave; ma droite, un message d&#8217;erreur sibyllin annon&ccedil;ant un dysfonctionnement du programme.</p>
<p>Le combat commence. Le d&eacute;veloppeur commence par un message de d&eacute;bug pour localiser le probl&egrave;me. Le programme r&eacute;pond par un segfault. Le d&eacute;veloppeur vide les caches. Heap overflow. Il installe l&#8217;extension manquante. Fatal error&nbsp;: Call to a member function on a non-object. Il tente un cvs update. Failed to open stream<span class="fine">&nbsp;</span>!</p>
<p>Bing<span class="fine">&nbsp;</span>! Paf<span class="fine">&nbsp;</span>! Vlan<span class="fine">&nbsp;</span>! Les coups pleuvent de toutes parts. Et pendant ce temps, le d&eacute;veloppeur voit, de plus en plus paniqu&eacute;, l&#8217;horloge qui avance, inexorablement. D&eacute;j&agrave; son r&ecirc;ve de rentrer chez lui &agrave; l&#8217;heure s&#8217;envole. Finalement, en l&#8217;espace de quelques minutes, il a l&#8217;impression qu&#8217;une journ&eacute;e enti&egrave;re s&#8217;est &eacute;coul&eacute;e. Il a vu passer tous les messages d&#8217;erreurs imaginables, et en a m&ecirc;me d&eacute;couvert de nouveaux, inconnus jusqu&#8217;alors.</p>
<p>Le d&eacute;veloppeur est loin d&#8217;&ecirc;tre un incomp&eacute;tent, et il s&#8217;est battu honorablement. Mais la lutte, trop in&eacute;gale, &eacute;tait perdue d&#8217;avance. R&eacute;sign&eacute;, il comprend que son programme, malgr&eacute; tous ses efforts, ne tournera pas ce soir. &Agrave; 18h55, &eacute;puis&eacute;, pantelant, couvert de l&#8217;aigre sueur de la d&eacute;faite, il n&#8217;a d&#8217;autre choix que d&#8217;abandonner, en songeant que de toutes fa&ccedil;ons, sa copine lui passera un savon.</p>
<p>T&ecirc;te basse, il se d&eacute;cide &agrave; tout laisser en plan. Il ajoute un dernier commentaire pour retrouver facilement l&#8217;emplacement du probl&egrave;me le lendemain, fait dispara&icirc;tre son &eacute;diteur pr&eacute;f&eacute;r&eacute; d&#8217;un :q<span class="fine">&nbsp;</span>! rageur, se d&eacute;connecte de ses quelques consoles ssh, et fini par &eacute;teindre sa machine, le coeur lourd, l&#8217;&acirc;me en peine. Vaincu<span class="fine">&nbsp;</span>!</p>
<p>Le lendemain, frais, dispos, l&#8217;esprit clair, il d&eacute;couvrira l&#8217;origine du probl&egrave;me en une minute, et le corrigera en cinq. Car le terrible bug de 17h30 n&#8217;est g&eacute;n&eacute;ralement qu&#8217;une p&eacute;cadille, un point-virgule manquant, une erreur d&#8217;index, une variable non affect&eacute;e, une inversion de casse.</p>
<p>Apr&egrave;s coup, le d&eacute;veloppeur se demandera comment une erreur aussi stupide, aussi &eacute;vidente, a pu lui r&eacute;sister aussi longtemps. Il en rira, et amusera ses coll&egrave;gues, autour de la machine &agrave; caf&eacute;, en leur racontant son &eacute;pop&eacute;e. Mais au fond de lui, demeurera toujours cette hantise, cette angoisse qui appara&icirc;t lorsque l&#8217;aiguille approche de cette horaire fatidique&nbsp;: 17h30. L&#8217;heure des bugs.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miximum.fr/tranche_vie/62-le-bug-de-17h30/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>J&#8217;aime pas les lundis</title>
		<link>http://www.miximum.fr/inclassable/50-jaime-pas-les-lundis</link>
		<comments>http://www.miximum.fr/inclassable/50-jaime-pas-les-lundis#comments</comments>
		<pubDate>Sun, 01 Jun 2008 15:30:00 +0000</pubDate>
		<dc:creator>thibault</dc:creator>
				<category><![CDATA[Inclassable]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[SSII]]></category>
		<category><![CDATA[wtf]]></category>

		<guid isPermaLink="false">http://www.miximum.fr/?p=50</guid>
		<description><![CDATA[Une demi-journ&#233;e pour d&#233;couvrir qu&#8217;il fallait remplacer un f minuscule par un F majuscule ( et encore, le jok3r m&#8217;a aid&#233;. Une autre demi-journ&#233;e pour diagnostiquer une erreur de cache. Bilan de la journ&#233;e&#160;: une migraine et 5 lignes de code. J&#8217;aime pas les lundis.]]></description>
			<content:encoded><![CDATA[<p>Une demi-journ&eacute;e pour d&eacute;couvrir qu&#8217;il fallait remplacer un f minuscule par un F majuscule ( et encore, le <a href="http://www.pwet.fr/blog">jok3r</a> m&#8217;a aid&eacute;.</p>
<p>Une autre demi-journ&eacute;e pour <a href="http://www.miximum.fr/musee-des-horreurs/48-mon-attributefilter-deconne-pourquoi">diagnostiquer une erreur de cache</a>.</p>
<p>Bilan de la journ&eacute;e&nbsp;: une migraine et 5 lignes de code.</p>
<p>J&#8217;aime pas les lundis.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miximum.fr/inclassable/50-jaime-pas-les-lundis/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

