<?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>Exponential Fault &#187; management</title>
	<atom:link href="http://weblog.lo2k.net/tag/management/feed/" rel="self" type="application/rss+xml" />
	<link>http://weblog.lo2k.net</link>
	<description></description>
	<lastBuildDate>Fri, 25 Feb 2011 16:26:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>5 bonnes raisons pour un geek d&#8217;apprendre à danser</title>
		<link>http://weblog.lo2k.net/2010/05/5-bonnes-raisons-pour-un-geek-dapprendre-a-danser/</link>
		<comments>http://weblog.lo2k.net/2010/05/5-bonnes-raisons-pour-un-geek-dapprendre-a-danser/#comments</comments>
		<pubDate>Mon, 17 May 2010 08:27:13 +0000</pubDate>
		<dc:creator>X-Blaster</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[management]]></category>

		<guid isPermaLink="false">http://weblog.lo2k.net/?p=338</guid>
		<description><![CDATA[Ohhh, je vous entend déjà ! &#8220;Oui, la danse&#8230; c&#8217;est un truc de taffioles (sans aucune homophobie) !&#8221; Je vous arrête tout de suite. Je dis &#8220;NON !&#8221; J&#8217;ai décidé de faire un petit texte a contre courant, plutôt que de faire un 546ème article sur HTML5/CSS3 pourquoi ne pas parler des bienfaits de la danse [...]]]></description>
			<content:encoded><![CDATA[<p>Ohhh, je vous entend déjà ! &#8220;Oui, la danse&#8230; c&#8217;est un truc de taffioles (sans aucune homophobie) !&#8221; Je vous arrête tout de suite. Je dis &#8220;NON !&#8221;</p>
<p>J&#8217;ai décidé de faire un petit texte a contre courant, plutôt que de faire un 546ème article sur HTML5/CSS3 pourquoi ne pas parler des bienfaits de la danse ? <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>C&#8217;est moi qui décide</h2>
<p>Quand on danse en couple, <strong>c&#8217;est l&#8217;homme qui décide </strong>! Un peu comme dans la pub carrefour. C&#8217;est d&#8217;ailleurs l&#8217;un des rare endroit où on peut guider, diriger  sans avoir une association de féministe en furie sur le dos.</p>
<p>Pour ceux qui pense que la danse ce n&#8217;est pas viril j&#8217;ai envie de leur dire &#8220;Est-ce que vous pensez que décider pour votre partenaire ce n&#8217;est pas viril ?&#8221;</p>
<h2>J&#8217;ai confiance en moi</h2>
<p>Vous décidez&#8230; c&#8217;est bien mais encore faut-il le faire en ayant confiance en vous. En danse tout se décide sur un petit mouvement de main. Une main trop haute, trop basse ou hésitante sur ce que vous comptez faire et c&#8217;est le drame !</p>
<p>Votre partenaire doit vous faire confiance et elle ne connait pas la chorégraphie que vous comptez faire. Sachant qu&#8217;on a pas le temps de faire un plan avant que la musique commence et que vous n&#8217;aurez pas l&#8217;occasion de lui en crier &#8220;LA JE COMPTE TE FAIRE TOURNER A DROITE&#8221;, il va bien falloir lui faire comprendre par quelques mouvements vifs et assurés.</p>
<h2>Je m&#8217;adapte</h2>
<p>Si vous avez au début de vos cours de danse de le faire avec une partenaire très &#8220;pro&#8221;, vous aurez aussi bien l&#8217;occasion de danser avec une petite veille de 68ans raide comme un piquet qui sent un peu la naphtaline ou encore avec une ménagère qui a bien décidée de vous faire comprendre qu&#8217;elle veut autant guider que vous.</p>
<p>A chaque partenaire il faudra agir d&#8217;une manière différente. Plus directif, souple ou laisser une certaine liberté, il vous faudra très souvent changer de stratégie.</p>
<p>Je ne parle même pas ici des différences morphologiques qui vous demanderont de vous adapter.</p>
<h2>J&#8217;anticipe</h2>
<p>La chorégraphie n&#8217;est jamais prévu a l&#8217;avance. Nombre de personnes sur la piste de danse, durée de la musique, tempo, style sont autant de paramètres qui font qu&#8217;on ne peut pas prévoir une chorégraphie &#8220;standard&#8221;.</p>
<p>Comme vous avez en charge de &#8220;diriger&#8221; la danse, il vous faut donc établir un plan en temps réel ! Vous devez déjà guider mais en plus vous devez réfléchir a la prochaine figure que vous comptez faire et voir si cela est possible au vu de la place que vous avez autour de vous.</p>
<h2>Je me sociabilise</h2>
<p>Pour danser, on est obligé d&#8217;être en contact avec des gens. Pour un geek completement associal, c&#8217;est un très bon exercice !</p>
<p>Il y a de forte chance que pendant le cours vous deviez changer de partenaire. Et ça c&#8217;est bien <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<h2>Pour conclure</h2>
<p>Décision, confiance, adaptation, anticipation  sont autant de qualités qui sont nécessaires pour bien évoluer dans le monde de l&#8217;informatique (pour la sociabilisation ça peut être optionnel dans certain cas <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ).</p>
<p>Si il vous en manque, vous savez ce qu&#8217;il vous reste a faire <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.lo2k.net/2010/05/5-bonnes-raisons-pour-un-geek-dapprendre-a-danser/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>4 excuses de collègues pour faire du code spaghetti</title>
		<link>http://weblog.lo2k.net/2010/02/4-excuses-de-collegues-pour-faire-du-code-spaghetti/</link>
		<comments>http://weblog.lo2k.net/2010/02/4-excuses-de-collegues-pour-faire-du-code-spaghetti/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 10:38:03 +0000</pubDate>
		<dc:creator>X-Blaster</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://weblog.lo2k.net/?p=288</guid>
		<description><![CDATA[Vous avez un regard terrifié ! Les yeux en sangs, vous venez de voir 12 000 lignes de codes sans commentaire dans une classe statique. Vous demandez des explications ! Pourquoi ? Pourquoi tant de haine ? Voici les &#8220;réponses&#8221; les plus fréquentes. Pourquoi changer ? ça marche Pourquoi changer ? C&#8217;est une bonne question [...]]]></description>
			<content:encoded><![CDATA[<p>Vous avez un regard terrifié ! Les yeux en sangs, vous venez de voir 12 000 lignes de codes sans commentaire dans une classe statique. Vous demandez des explications ! Pourquoi ? Pourquoi tant de haine ?</p>
<p>Voici les &#8220;réponses&#8221; les plus fréquentes.</p>
<p><span id="more-288"></span></p>
<h2>Pourquoi changer ? ça marche</h2>
<p>Pourquoi changer ? C&#8217;est une bonne question et elle n&#8217;est pas si stupide que ça.</p>
<p>Vous avez déjà vu un ou deux stagiaires qui ont voulus optimiser un code backdoor qui n&#8217;est quasiment jamais appelé. Passer de 513ms a 437ms sur un code qui est appelé dans un CRON tout les mois&#8230; ça n&#8217;a pas forcément un grand intérêt. Mais il faut se poser quelques questions:</p>
<ul>
<li>Dois-je modifier ce code souvent ?</li>
<li>Ce code est-il appelé dans une boucle haptique a 1000Hz ?</li>
<li>Est-ce que ma fonction ressemble plus a une boite noire qui des fois me retourne des résultats &#8220;mystique&#8221; ?</li>
</ul>
<p>Si vous avez répondu &#8220;oui&#8221; a une seule de ses 3 réponses, OUI ! Il faut changer !</p>
<p><strong>solution: </strong> Expliquez que la machine à vapeur ça marche aussi et pourtant&#8230;</p>
<h2>On avait pas le temps</h2>
<blockquote><p>C&#8217;est la vie ! Dans une boite (une vrai comme nous), on nous demande des trucs et on a pas le temps de faire comme à l&#8217;univ !</p></blockquote>
<p>HAHAHAHA, celle là me fait bien rire <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . On a pas le temps de reviewer un peu son code mais on a la temps de rester 3 jours jusqu&#8217;a minuit juste avant la prod ! Là on peut bosser !</p>
<p>Le temps ça se trouve. La plupart des entreprises devrait fixer un créneau horaire pour revoir et remanier le code existant. Le temps passé a faire cela serait largement gagné sur les phases de debugging.</p>
<p><strong>solution:</strong> expliquez que ranger sa chambre tout les jours c&#8217;est moins chiant que de le faire une fois par an juste avant que maman passe en foutant tout sous le lit.</p>
<h2>C&#8217;est pour optimiser</h2>
<p>Il y a un petit coté &#8220;humain&#8221; derrière cette excuse. &#8220;J&#8217;aurais bien voulu mais c&#8217;est pas possible&#8221;.</p>
<p>Tout d&#8217;abord si la personne qui vous dit ça fait autre chose que du C ou C++ vous pouvez directement lui jeter des pierres. On &#8220;optimise&#8221; pas un code PHP ou Ruby en faisant du code crade. A partir du moment ou on ne sait pas comment l&#8217;interpréteur/compilateur fonctionne derrière. Le fait de tout mettre dans une fonction ne vous fait faire que des économies de bout de chandelles.</p>
<p>Le soucis d&#8217;optimisation pouvait s&#8217;expliquer encore il y a quelques années avec des machines plus lentes mais maintenant les machines sont suffisamment puissante.</p>
<p>Les solutions actuelles pour gérer de gros volumes de données se font surtout par des clustering/cloud car les processeurs ne montent plus en puissance mais en nombre. Il y a de forte chance pour qu&#8217;un code &#8220;optimiser&#8221; à l&#8217;ancienne ne puissent pas être réutiliser sur un cloud.</p>
<p><strong>solution:</strong> proposez de multi-threadé le code comme ça il sera encore plus performant ;). Les autres dev n&#8217;auront plus l&#8217;excuse de l&#8217;optimisation.</p>
<h2>C&#8217;est trop compliquer, on peut pas faire autrement !</h2>
<p>&#8220;Il y a trop de vérification a faire, on a besoin de ces 34 if/else imbriqués&#8221;.</p>
<p>Souvent les collègues se cachent derrière l&#8217;excuse du &#8220;trop compliqué&#8221;. C&#8217;est vrai que c&#8217;est facile. Le code est compliqué a lire on en déduit que ce que le code fait est&#8230; compliqué.</p>
<p>Si je pars sur l&#8217;exemple du &#8220;34 if/else&#8221;, on peut se poser la question &#8220;si c&#8217;est une vérification, ce code ne devrait t&#8217;il pas être déporté dans une classe Validator ?&#8221;. Sémantiquement, les &#8220;34 if/else&#8221; sont-il dissociable ?</p>
<blockquote><p>Un problème infiniment complexe n&#8217;est que la somme d&#8217;une infinité de problème simple</p></blockquote>
<p>J&#8217;aime me dire que tout problème aussi compliqué soit-il peut être résumé par une somme de problème simple à comprendre.</p>
<p>Partant de ce principe, le code aura surement beaucoup plus de classe et pourra peut être effrayé des personnes de passé d&#8217;une classe statique a une douzaine de petite classe mais pour autant le code sera beaucoup plus simple et raisonné.</p>
<p><strong>solution:</strong> expliquez qu&#8217;un code complexe peut être subdivisé en code plus simple.</p>
<h2>Quelques &#8220;autres&#8221; excuses bidons envoyés par twitter <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </h2>
<ul>
<li>cette appli a pas loin de 7 ans, on va pas s&#8217;amuser à tout reprendre maintenant !</li>
<li>mais si, c&#8217;est bien codé, toi tu sais !</li>
<li>w3c c&#8217;est pour les low</li>
<li>je mets pas de commentaire parce que j&#8217;ai peur de pas comprendre ce que j&#8217;ai voulu dire</li>
</ul>
<p><strong>N&#8217;hésitez pas a en laisser en commentaire <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </strong></p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.lo2k.net/2010/02/4-excuses-de-collegues-pour-faire-du-code-spaghetti/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>GIT n&#8217;est pas magique !</title>
		<link>http://weblog.lo2k.net/2009/07/git-nest-pas-magique/</link>
		<comments>http://weblog.lo2k.net/2009/07/git-nest-pas-magique/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 20:47:45 +0000</pubDate>
		<dc:creator>X-Blaster</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[management]]></category>

		<guid isPermaLink="false">http://weblog.lo2k.net/?p=193</guid>
		<description><![CDATA[Après un article qui explique &#8220;pourquoi GIT c&#8217;est mieux que SVN ?&#8220;, j&#8217;ai jugé qu&#8217;il pouvait être intéressant de faire un petit retour sur mon expérience et d&#8217;expliquer les bonnes ou mauvaises pratique autour de ce merveilleux logiciel de versionning. Pourquoi GIT n&#8217;est pas magique ? Certaines personnes pensent que GIT est &#8220;magique&#8221;. Il permet [...]]]></description>
			<content:encoded><![CDATA[<p>Après un article qui explique &#8220;<a href="http://weblog.lo2k.net/2008/11/pourquoi-utiliser-git-plutot-que-svn/">pourquoi GIT c&#8217;est mieux que SVN ?</a>&#8220;, j&#8217;ai jugé qu&#8217;il pouvait être intéressant de faire un petit retour sur mon expérience et d&#8217;expliquer les bonnes ou mauvaises pratique autour de ce merveilleux logiciel de versionning.</p>
<h2>Pourquoi GIT n&#8217;est pas magique ?</h2>
<p>Certaines personnes pensent que GIT est &#8220;magique&#8221;. Il permet de merger mieux que SVN c&#8217;est donc l&#8217;occasion de faire plein de fork ? GIT permet de décentraliser, est-ce une bonne idée de le garder centraliser ? Autant de bonnes questions auquel il est important de répondre.</p>
<p>Comment savoir si vous utilisez mal git ?</p>
<ul>
<li>Vous avez plus de 20 branches en cours de développement sur votre serveur GIT</li>
<li>Votre serveur GIT est centralisé et tout le monde utilise ce même serveur</li>
<li>Tout le monde a le droit de push</li>
<li>Aucune personne n&#8217;est en charge des merges</li>
<li>Vous n&#8217;avez pas l&#8217;habitude de signer.</li>
</ul>
<p>Si vous vous reconnaissez dans un ou plusieurs de ces choix, il faut revoir votre politique de développement <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><span id="more-193"></span></p>
<h2>TROP de fork TUE le fork.</h2>
<p>GIT n&#8217;est pas magique et même si il facilite les merges entre les branches il n&#8217;est pas &#8220;conflict proof&#8221;. Certains conflits vont apparaitre c&#8217;est obligatoire, et ce n&#8217;est pas parce qu&#8217;il facilite les merge qu&#8217;il faut pour autant ne pas prendre des mesures pour les éviter.</p>
<p>Lorsque l&#8217;on décide de développer plusieurs projets en parallèles sur une même base il est bon de définir ce qui va être développé. Il est toujours bon dans une structure d&#8217;avoir une personne qui décide des points clés d&#8217;un projet et si plusieurs points se rejoignent il faut faire en sorte que les équipes n&#8217;effectuent pas le même travail chacun de leur coté ou alors vous risquez irrémédiablement d&#8217;avoir des conflits.</p>
<p>Cela peut paraitre &#8220;trivial&#8221; mais pour autant dans des structures de taille moyenne, il n&#8217;y a pas toujours de personnes dédiés à ce genre de coordination. GIT nous oblige ici à avoir un développement discipliné.</p>
<h2>Une organisation bien défini</h2>
<p>Si vous n&#8217;avez qu&#8217;un seul serveur GIT pour tout centraliser vous avez fait une grosse erreur. Pourquoi ?</p>
<ul>
<li>Si vous avez une équipe ou une personne avec des compétences assez médiocres, comment contrôlerez vous l&#8217;intégration de son développement ?</li>
<li>Quand bien même vous auriez une équipe très compétente, quel est l&#8217;intérêt d&#8217;avoir tout vos commits centralisé sur un même serveur en permanence ? A part avoir beaucoup trop de branches et beaucoup trop de choses à gérer cela n&#8217;est pas très utile. C&#8217;est une mauvaise habitude résultant de l&#8217;utilisation de SVN</li>
</ul>
<p>Intéressons nous à  l&#8217;organisation du noyau Linux. Si je devais la résumer en une seule phrase de Machiavel &#8220;Diviser pour mieux régner&#8221;. Si Linus Torvalds a choisit cette organisation ce n&#8217;est pas pour rien. C&#8217;est un geek et<strong> tout bon geek est fainéant</strong>.</p>
<p>Il fait confiance à un certains nombre de personnes. Il vérifie de manière ponctuel un certain nombre de patch mais si un patch qu&#8217;on lui envoie est signé par 2 ou 3 personnes de confiance il peut l&#8217;intégrer sans trop de vérification au noyau Linux.</p>
<p>Dans une entreprise cette attitude serait similaire a un coordinateur qui irait récupérer une branche git définit comme stable et qui ferait une vérification de cette branche avant son intégration. Si ce coordinateur n&#8217;a jamais eu de soucis avec le responsable du développement de la branche, il peut juste effectuer des vérifications sommaire mais là nous rentrons plus dans une relation de confiance et dans le relationnel entre les personnes de l&#8217;équipe.</p>
<p>Dans une grosse structure on pourrait voir ainsi 1, 2, 3, voir même 4 niveaux de hiérarchie entre le développeur et le &#8220;code keeper&#8221;. Le plus haut niveau n&#8217;a pas a se soucier des problèmes de développement, il a juste a valider la version finale qui sera intégrer dans le GIT. A contrario, le bas niveau n&#8217;a pas à se soucier de l&#8217;integration, il respecte juste un certain nombre de règles et développe son application.</p>
<h2>Et si on pense que cela ne sert à rien ?</h2>
<p>Si il n&#8217;y a aucune validation on peut se retrouver dans des cas dramatiques.</p>
<p>Un merge farfelus d&#8217;une branche en test dans un développement pour ne pas se prendre la tête et faire un raccourcis, des hotfix sur le noyau dans plusieurs branches, aucun suivis des branches upstream ou encore des merges avec une strategy &#8220;-s ours&#8221; sans vérification. <strong>L&#8217;intégration d&#8217;une branche &#8220;MAUDITE&#8221; peut devenir un vrai casse tête voir même impossible.</strong></p>
<p>Au hasard les conséquences peuvent être:</p>
<ul>
<li>De nombreux conflits</li>
<li>L&#8217;intégration de code &#8220;instable&#8221; par merge d&#8217;une branche déjà mergé avec une autre branche instable</li>
<li>Rendre le code moins performant.</li>
</ul>
<p>Bien sûr vous avez pu mettre un certain nombre d&#8217;indicateur comme des tests unitaires, des coverages reports mais il faut dans tout les cas avoir une organisation solide.</p>
<h2>Cas pratique: la traversée du désert</h2>
<p>Prenons un cas pratique que j&#8217;ai déjà eu l&#8217;occasion de voir. Ce cas j&#8217;aime l&#8217;appeler &#8220;la traversée du désert&#8221;.</p>
<p>Prenez un développeur, donnez lui une tâche et laissez le faire son fork. Il revient 3 mois après avec un développement qui a modifié votre noyau de base, qui n&#8217;a pas suivis les évolutions de l&#8217;upstream et qui soit dit en passant a sûrement réinventé la roue carrée. Résultat ? 3 mois de travail de perdu. Son code peut être considéré comme inutilisable.</p>
<p>L&#8217;image de traversée du désert montre bien l&#8217;image de ce développeur qui part seul sans radio avec une mission sommairement posé sur un bout de papier. Son chef de projet confiant pense que GIT arrivera comme un grand a merger ce qu&#8217;il &#8220;dénichera&#8221;. Il se trompe, cela ne changera rien.</p>
<h2>Si vous deviez retenir que quelques regles ?</h2>
<blockquote><p>With great power comes great responsibility</p></blockquote>
<ol>
<li>Définissez une organisation.</li>
<li>Formez les personnes responsables aux différents enjeux.</li>
<li>Instaurez un climat de confiance entre les différents niveaux de votre pyramide.</li>
<li>Ne donnez pas des &#8220;pouvoirs&#8221; à des gens qui ne les maitrisent pas.</li>
<li>Définissez des règles pour les modifications de parties communes a tout les projets.</li>
</ol>
<p>Ces règles pourraient être tout aussi utile pour un développement sous SVN mais le fait de faire des &#8220;fork&#8221; accentuent ces problèmes car les développeurs peuvent vite être isolé et leurs erreurs peuvent être detecté moins vite et avoir un plus gros impact sur le long terme.</p>
<h2>Pour conclure</h2>
<p>GIT est un outil puissant avec une grande liberté d&#8217;action. Il peut vous apportez beaucoup mais il faut bien comprendre son fonctionnement. Autant pour l&#8217;utilisateur néophyte qui fait un fork de Ruby on Rails pour rajouter une fonction, son utilisation est simple; autant pour la gestion de très gros projet, son utilisation peut être contre productive si vous n&#8217;avez pas une organisation bien structurée.</p>
<p>Si vous prenez la décision de changer de logiciel de versionning est d&#8217;adopter une méthode plus agile, plus souple, retenez bien cela ne se traduit pas que dans les logiciels que vous utilisez mais aussi dans l&#8217;utilisation que vous en faite.</p>
<p>Les mentalités sont encore habitués a un système de versioning centralisé avec un impact direct sur le développement. Avec GIT vous entrez dans des méthodes de développement sur le long terme où <strong>il faut savoir anticiper les problèmes avant de les laisser germer.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.lo2k.net/2009/07/git-nest-pas-magique/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Faire des tests unitaires FUN avec Cucumber et Watir</title>
		<link>http://weblog.lo2k.net/2009/02/faire-des-tests-unitaires-fun-avec-cucumber-et-watir/</link>
		<comments>http://weblog.lo2k.net/2009/02/faire-des-tests-unitaires-fun-avec-cucumber-et-watir/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 12:49:15 +0000</pubDate>
		<dc:creator>X-Blaster</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://weblog.lo2k.net/?p=173</guid>
		<description><![CDATA[On vous demande pour la 3459eme fois de tester votre application web. Vous entendez déjà votre patron &#8220;Pourtant quand j&#8217;appuie sur SAVE, ça devrait sauvegarder ! C&#8217;est si dûr que ça ? Hein ? Non mais ! Jte paye a faire quoi ?!? A écrire des billets débiles pendant tes pauses sur ton blog ?!?&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>On vous demande pour la 3459eme fois de tester votre application web. Vous entendez déjà votre patron <strong>&#8220;Pourtant quand j&#8217;appuie sur SAVE, ça devrait sauvegarder ! C&#8217;est si dûr que ça ? Hein ? Non mais ! Jte paye a faire quoi ?!? A écrire des billets débiles pendant tes pauses sur ton blog ?!?&#8221;</strong></p>
<p>On sent le vécu hein ? <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Non bon serieusement, on va essayer de rendre ça &#8220;FUN&#8221; avec un cocombre et un renard de feux. Déjà on va définir notre vocabulaire.</p>
<ul>
<li><a href="http://cukes.info/">Cucumber</a> est un &#8220;framework&#8221; de test unitaire ou on écrit tout en langage &#8220;humain&#8221;. Genre &#8220;là j&#8217;ouvre ma page web et j&#8217;epluche des carottes&#8221;.</li>
<li><a href="http://wiki.openqa.org/display/WTR/Project+Home">Watir</a> c&#8217;est une bibliothèque pour faire des tests unitaires sur une interface web.</li>
</ul>
<p>Et si comme <a href="http://redsquirrel.com/dave/">Dave Hoover</a>, on combine les 2, ça donne quoi ?</p>
<p><span id="more-173"></span></p>
<h2>Installation de Cucumber et FireWatir</h2>
<p>Simple. Après avoir installé gem (le systeme de packaging de ruby) on tape</p>
<pre class="css">gem install cucumber
gem install firewatir</pre>
<p>Vous aurez aussi besoin d&#8217;un petit plugin firefox disponible <a href="http://wiki.openqa.org/display/WTR/FireWatir+Installation">ici</a></p>
<h2>En route pour notre premier test.</h2>
<p>On nomme les test de cucumber &#8220;feature&#8221;. La syntaxe d&#8217;une feature de cucumber est assez libre mais se base essentiellemet sur 3 mots clé &#8220;When&#8221;, &#8220;Given&#8221; et &#8220;Then&#8221;. On peut assimiler ça a &#8220;Hypothèse, developpement et conclusion&#8221;.</p>
<p>Ici j&#8217;utilise Cucumber en anglais (car les clients que l&#8217;on a sont essentiellement anglais) mais il existe une version française de cucumber.</p>
<pre class="css">Feature: "lab" section Menu
  In order to ensure that the lab menu
  Verify that the "lab" menu entry exist on lo2k websites

Scenario: Check if "lab" menu exist
  Given I am on website "http://www.lo2k.net"
  Then "lab" is present in the menu</pre>
<p>Voici le contenu du fichier &#8220;lab.feature&#8221;</p>
<p>Si je lance cucumber avec la commande &#8220;cucumber lab.feature&#8221; j&#8217;ai le resultat suivant.</p>
<pre class="css">Feature: "lab" section Menu  # features/lab.feature
  In order to ensure that the lab menu
  Verify that the "lab" menu entry exist on lo2k websites
  Scenario: Check if "lab" menu exist           # features/lab.feature:5
    Given I'm on website "http://www.lo2k.net"  # features/lab.feature:6
    Then "lab" is present in the menu           # features/lab.feature:7

1 scenario
2 steps pending (2 with no step definition)

You can use these snippets to implement pending steps which have no step definit
ion:

Given /^I am on website "http:\/\/www\.lo2k\.net"$/ do
end

Then /^"lab" is present in the menu$/ do
end</pre>
<p>Sympa, il me definie des templates pour mes &#8220;steps&#8221;. Comme vous pouvez le voir, les steps sont definis par des expressions regulières. COOL !!! On va donc ecrire nos &#8220;steps&#8221; dans un repertoire que nous allons nommer  &#8220;step_definitions&#8221;.<br />
Nous allons a l&#8217;interieur nous constituer une &#8220;bibliotheque&#8221; de &#8220;step&#8221;. Peut importe le nom du fichier ici.</p>
<p>Je définis donc un fichier &#8220;bootstrap.rb&#8221;</p>
<pre class="ruby">#Include the FireWatir file.
require 'firewatir'

#include the FireWatir Module.
include FireWatir

Before do
	@browser = Firefox.new
end

After do
	@browser.close
end</pre>
<p>Puis mes steps.</p>
<pre class="ruby">Given /^I am on website "(.*)"$/ do |url|
	@browser.goto(url)
end

Then /^"(.*)" is present in the menu$/ do |menu|
	@browser.link( :text, 'lab').exists?
end</pre>
<p>J&#8217;ai profité ici de redefinir avec des parenthèses les elements succeptible de changer.</p>
<p>Bingo, le scenario passe sans aucun soucis <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h2>On améliore un peu</h2>
<p>Maintenant je peux réecrire mon script comme suit.</p>
<pre class="css">Feature: "lab" section Menu
  In order to ensure that the lab menu
  Verify that the "lab" menu entry exist on lo2k websites

Scenario: Check if "lab" menu exist
  Given I am on website "http://www.lo2k.net"
  Then "lab" is present in the menu
  And "timeline" is present in the menu</pre>
<p>Et <strong>avoir le resultat directement</strong> car ayant définis un pattern qui match, il ne me demande même pas de réecrire un bout de code <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<pre class="css">Feature: "lab" section Menu  # features/lab.feature
  In order to ensure that the lab menu
  Verify that the "lab" menu entry exist on lo2k websites
  Scenario: Check if "lab" menu exist            # features/lab.feature:5
    Given I am on website "http://www.lo2k.net"  # features/step_definitions/step1.rb:27
    Then "lab" is present in the menu            # features/step_definitions/step1.rb:31
    And "timeline" is present in the menu        # features/step_definitions/step1.rb:31

1 scenario
3 steps passed</pre>
<h2>Et si je veux m&#8217;y mettre serieusement ?</h2>
<p>Vous remarquerez déjà quelques erreurs dans mon test que j&#8217;ai fait précipitement.</p>
<ul>
<li>Je fais le test que le lien &#8220;existe&#8221; pas qu&#8217;il est bien situé dans le menu</li>
<li>Je ne simule pas d&#8217;action sur d&#8217;autre page.</li>
</ul>
<p>Vous pouvez facilement mettre des informations dans des champs, simuler des clicks sur des boutons. Voici un exemple de code ci dessous.</p>
<pre class="ruby">When /^with password "(.*)"$/ do |password|
	@browser.text_field(:name,"passw").set(password)
end

Given /^I press the "(.*)" button$/ do |button_name|
	@browser.button(:value,button_name).click
end</pre>
<p>Watir est assez exhaustif et montre une flexibilité très interessante qui couvre la plupart des cas, vous n&#8217;aurez pas trop de soucis a lui faire ce que vous voulez.</p>
<h2>Conclusion</h2>
<p>Enfin quelque chose de clair a montrer a votre client et quelque chose d&#8217;assez simple a mettre en place.</p>
<p>Quelques idées en vrac que j&#8217;ai dans mon cerveau bouillonant:</p>
<ul>
<li>Faire un serveur web pour taper vos &#8220;features&#8221; avec autocompletion basé sur votre bibliothèque de mots clés déjà définis</li>
<li>Integrer ça a un systeme de builbot pour verifier que les scenarios de votre application marche correctement <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</li>
</ul>
<p>Enfin bref&#8230; ya du &#8220;potentiel&#8221; (et du boulot) <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.lo2k.net/2009/02/faire-des-tests-unitaires-fun-avec-cucumber-et-watir/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pourquoi utiliser GIT plutôt que SVN ?</title>
		<link>http://weblog.lo2k.net/2008/11/pourquoi-utiliser-git-plutot-que-svn/</link>
		<comments>http://weblog.lo2k.net/2008/11/pourquoi-utiliser-git-plutot-que-svn/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 12:34:44 +0000</pubDate>
		<dc:creator>X-Blaster</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[organisation]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://weblog.lo2k.net/2008/11/26/pourquoi-utiliser-git-plutot-que-svn/</guid>
		<description><![CDATA[VITE URGENT ! Notre client &#8220;xxx&#8221; veut à tout pris une integration avec gloubiboulga maintenant. Cela ne PEUT pas attendre. Cas de figure avec SVN Je pense que vous avez déjà tous eu le cas d&#8217;un client qui a une demande super urgente. La gestion de ce genre de cas est très difficile car: L&#8217;application [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>VITE URGENT ! Notre client &#8220;xxx&#8221; veut à tout pris une integration avec gloubiboulga maintenant. Cela ne PEUT pas attendre.</p></blockquote>
<h2>Cas de figure avec SVN</h2>
<p>Je pense que vous avez déjà tous eu le cas d&#8217;un client qui a une demande super urgente.</p>
<p>La gestion de ce genre de cas est très difficile car:</p>
<ol>
<li>L&#8217;application doit rester stable.</li>
<li>Les developpeurs ne DOIVENT pas gérer plusieurs version à la fois.</li>
</ol>
<p>Concrètement cela va se résumer à la création d&#8217;une branche, sûrement un &#8220;branches/gloubiboulga&#8221;.  Mais voila ! Il doit partir en production mais il n&#8217;a pas été testé dans tout les cas car le client sur lequel l&#8217;appli va être testé n&#8217;utilise pas toutes les fonctionnalités de votre logiciel et dans l&#8217;état, IL MARCHE.  Il peut partir en production mais en aucun cas ne peut être mergé avec le &#8220;trunk&#8221;car cela pourrait causer un désastre sur le reste de l&#8217;appli.  3 versions se succedent et votre client revient en vous demandant &#8220;pourquoi ma version n&#8217;évolue plus ?&#8221;. <span id="more-76"></span></p>
<h2>SVN donne de mauvaises habitudes</h2>
<p>Si vous êtes un utilisateur de SVN vous devez trouver la gestion de branch assez &#8220;utopique&#8221;. On a souvent en tête <strong>le développeur un peu foufou qui part s&#8217;exiler 3 semaines dans un chalet</strong> pour faire un fork complet qu&#8217;il faudra reintegrer à l&#8217;appli.  Le reste du temps, tout le monde développe dans &#8220;trunk&#8221; et trouve cela parfaitement normal. Pour reprendre une phrase que j&#8217;ai déjà souvent entendu &#8220;ça marche, pourquoi changer ?&#8221;.</p>
<blockquote><p>Et si maintenant je veux une version stable, dans la seconde, je fais comment ?</p></blockquote>
<p>Le soucis est maintenant, avec cette méthode de développement, si je veux une version stable instantanément je fais comment ?  Vous allez me ressortir une vieille version stabilisé il y a 2 mois. Vous êtes sûr qu&#8217;elle marche, elle a était testé par 30 personnes de manières intensives pendant 2 semaines. Pourtant à l&#8217;heure actuel, vous pourriez peut être faire une version stable sauf que &#8220;Roger&#8221; doit finaliser un support de fichier quelconque et le soucis c&#8217;est que lui aussi travaille dans &#8220;trunk&#8221;.</p>
<h2>Pourquoi on a prit de mauvaises habitudes ?</h2>
<p>Tout simplement parce que SVN ne permet pas de faire simplement <strong>un merge dans les deux sens</strong>.</p>
<p>Si chacun travaille dans une branche dans SVN</p>
<ol>
<li>Les merges peuvent devenir un cauchemard</li>
<li>Si Roger commit une amélioration, Patrick n&#8217;en beneficiera pas dans sa branche sans faire un merge qui pourrait devenir un casse tête.</li>
</ol>
<p>Alors je vais vous poser deux questions:</p>
<ol>
<li>Et si &#8220;trunk&#8221; devenait stable ?</li>
<li>Et si tout le monde crée une branche par amélioration à apporter ?</li>
</ol>
<h2>Maintenant on change la méthode de travail</h2>
<p><a href="http://weblog.lo2k.net/wp-content/uploads/2008/11/state-machine-diagram1.gif" title="state-machine-diagram1.gif"><img src="http://weblog.lo2k.net/wp-content/uploads/2008/11/state-machine-diagram1.thumbnail.gif" alt="state-machine-diagram1.gif" /></a> Voici à présent comment sous GIT le développement peut s&#8217;articuler. Une branche est crée pour chaque &#8220;tache&#8221;. Les taches mineures pouvant bien évidemment être dans une même branche.</p>
<p>Il y a 3 principal zones</p>
<ol>
<li>Les branches (en developpement)</li>
<li>La branche &#8220;Testing&#8221;</li>
<li>La branche &#8220;Stable&#8221;</li>
</ol>
<p>On garantit ici la stabilité par 2 tests.</p>
<p>Le deuxième test est justifié sur de possibles interactions entre taches qui pourraient faire apparaitre des bugs qui ne seraient pas apparu pendant le test du module a la fin de la période de développement.</p>
<p>On se retrouve ici avec une architecture de développement proche des packages debian avec plusieurs niveaux de &#8220;stabilité&#8221;.</p>
<h2>GIT serait-il magique ?</h2>
<p>GIT permet une approche de développement totalement différente et permet plus facilement a mon sens de &#8220;stabiliser&#8221; une version d&#8217;une application si on utilise ce type d&#8217;architecture. Cependant il y plusieurs autre élément a prendre en compte.</p>
<ul>
<li>Une architecture de ce type est inutile pour des petits projects avec juste 2 ou 3 personnes</li>
<li>GIT est un outil qui propose une grande liberté. Un merge avec par exemple &#8220;-s ours&#8221; pourrait causer des catastrophes desastreuses, il faut donc avoir conscience de ce que l&#8217;on fait.</li>
</ul>
<p>Pour plus d&#8217;info sur git je vous conseille de voir comment fonctionne la fonction &#8220;<a href="http://www.kernel.org/pub/software/scm/git/docs/git-rebase.html">rebase</a>&#8221; de GIT et de consulter mais bookmarks associé sur &#8220;<a href="http://delicious.com/xblaster/git">del.icio.us</a>&#8221;<br />
C&#8217;est mon premier post &#8220;serieux&#8221; sur mon blog&#8230; donc n&#8217;hesitez pas a donner des critiques <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.lo2k.net/2008/11/pourquoi-utiliser-git-plutot-que-svn/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

