<?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>Barre Verte !</title>
	<atom:link href="http://www.barreverte.fr/feed" rel="self" type="application/rss+xml" />
	<link>http://www.barreverte.fr</link>
	<description>Notes de développeurs sur le logiciel, le design, l&#039;agilité, l&#039;open source, les mobiles, linux...</description>
	<lastBuildDate>Wed, 12 Dec 2012 19:42:56 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Barre verte! au Lean IT summit 2012</title>
		<link>http://www.barreverte.fr/barre-verte-au-lean-it-summit-2012</link>
		<comments>http://www.barreverte.fr/barre-verte-au-lean-it-summit-2012#comments</comments>
		<pubDate>Thu, 15 Nov 2012 19:59:41 +0000</pubDate>
		<dc:creator>Philippe Blayo</dc:creator>
				<category><![CDATA[agilité]]></category>
		<category><![CDATA[evenements]]></category>
		<category><![CDATA[A3]]></category>
		<category><![CDATA[binômage]]></category>
		<category><![CDATA[mesure]]></category>

		<guid isPermaLink="false">http://www.barreverte.fr/?p=2810</guid>
		<description><![CDATA[Après les conférences Agile France et XP days Benelux, barre verte! sera représentée au European Lean IT summit les 22 et 23 novembre 2012. Nous montrerons comment, grâce à la magie du binômage, nous avons utilisé la démarche A3 de &#8230; <a href="http://www.barreverte.fr/barre-verte-au-lean-it-summit-2012">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Après les conférences <a href="http://www.barreverte.fr/conference-agile-france-2011">Agile France</a> et <a href="http://www.barreverte.fr/retour-sur-xpdays-benelux">XP days Benelux</a>, barre verte! sera représentée au <a href="http://www.lean-it-summit.com/">European Lean IT summit</a> les 22 et 23 novembre 2012. Nous montrerons comment, grâce à la magie du binômage, nous avons utilisé la démarche A3 de résolution de problème au sein d&rsquo;équipes agiles pour :</p>
<ul>
<li>fournir aux managers de nos Product Owner des données pour améliorer leurs décisions d&rsquo;un projet à l&rsquo;autre</li>
<li>corriger un problème de concurrence d&rsquo;accès en production en moins de deux jours</li>
<li>tordre le cou à des croyances erronées sur nos retards</li>
</ul>
<p>Comme la demande des participants de la précédente édition étaient de relater des expériences de terrain, nous nous autoriserons à certains moments à rentrer dans les détails du quotidien d&rsquo;un développeur agile.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.barreverte.fr/barre-verte-au-lean-it-summit-2012/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Formation accélérée &#171;&#160;agile avancé&#160;&#187; avec Alistair Cockburn</title>
		<link>http://www.barreverte.fr/agile-avance-alistair-cockburn</link>
		<comments>http://www.barreverte.fr/agile-avance-alistair-cockburn#comments</comments>
		<pubDate>Thu, 04 Oct 2012 17:09:52 +0000</pubDate>
		<dc:creator>David Boissier</dc:creator>
				<category><![CDATA[agilité]]></category>
		<category><![CDATA[evenements]]></category>
		<category><![CDATA[formation]]></category>
		<category><![CDATA[software craftmanship]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://www.barreverte.fr/?p=2695</guid>
		<description><![CDATA[Mardi et mercredi 11 et 12 nous avons eu la chance de pouvoir participer à une formation gratuite en français chez /ut7 avec Alistair Cockburn. Voici ce que nous en avons retenu. Il y a toujours des personnes passionnées dans &#8230; <a href="http://www.barreverte.fr/agile-avance-alistair-cockburn">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Mardi et mercredi 11 et 12 nous avons eu la chance de pouvoir participer à une <a href="http://alistair.cockburn.us/Cours+Agile+Avancé+en+Français">formation gratuite en français</a> chez <a title="/ut7" href="http://ut7.fr/">/ut7</a> avec <a href="http://alistair.cockburn.us/">Alistair Cockburn</a>. Voici ce que nous en avons retenu.</p>
<p style="text-align: center;"><a title="IMGP8127.jpg de bamthomas, sur Flickr" href="http://www.flickr.com/photos/31719094@N04/7983418863/"><img class="aligncenter" src="http://farm9.staticflickr.com/8443/7983418863_78084109f5.jpg" alt="IMGP8127.jpg" width="331" height="500" /></a></p>
<p>Il y a toujours des personnes passionnées dans le mouvement agile. C&rsquo;est suffisamment rare pour le souligner : des formations gratuites avec l&rsquo;un des fondateur, hébergée gracieusement, ça ne court pas les rues. L&rsquo;échange, le partage de moments, d&rsquo;informations, de questionnements autour de ce thème continue d&rsquo;intéresser, ça fait du bien.</p>
<p>Paradoxalement, des pionniers ont exprimé un certain spleen en observant une large adoption de l&rsquo;agilité, noyée dans une <a href="http://www.youtube.com/watch?v=h-zICcYavFM">soupe marketing indigeste</a> loin de ses valeurs fondatrices. L&rsquo;agilité est récupérée pour attirer des clients ou des développeurs, victime de son succès et d&rsquo;absence d&rsquo;alternatives devant la difficulté de réussir des projets informatiques. Pire, elle peut être utilisée de manière cynique en donnant aux équipes une autonomie de façade, moyen de les impliquer d&rsquo;avantage et <em>in fine</em> de les faire travailler plus. Qu&rsquo;elles soient prestataire ou client, ces en-général-grosses-boites  se foutent comme d&rsquo;un post-it de l&rsquo;objectif de l&rsquo;agilité, à savoir (grosso-modo) apporter de la valeur de manière durable dans un environnement en évolution, en développant les individus.</p>
<p><a href="http://bossavit.com/">Laurent Bossavit</a> a une analyse intéressante s&rsquo;appuyant sur les frontières ouvertes de l&rsquo;agilité, entre la gestion de projet, le développement logiciel et le management. Le métier de l&rsquo;agiliste et son territoire de légitimité sont mal connus, ce qui favorise les incursions d&rsquo;autres professions, mais permet également de plus grandes possibilités d&rsquo;adoption. Si le sujet vous intéresse voir le livre &laquo;&nbsp;<a href="http://www.amazon.com/The-System-Professions-Division-Expert/dp/0226000699">The System of Professions</a>&nbsp;&raquo; &#8211; Abbot 1988 (merci Laurent pour la référence).</p>
<p><strong>La théorie</strong></p>
<p>Mais revenons à la formation. La présentation d&rsquo;Agile Avancée, selon Alistair, s&rsquo;articule autour de cinq thèmes :</p>
<ul>
<li>Artisanat</li>
<li>Gestion de flux</li>
<li>Eveil de Soi</li>
<li>Acquisition de connaissances</li>
<li>Jeu coopératif</li>
</ul>
<p>Il nous a distribué une feuille A4 recto de modèles se rapportant à ces thèmes. Ce support est très dense et synthétise plusieurs ouvrages dont son livre &laquo;&nbsp;<a href="http://www.amazon.fr/Agile-Software-Development-Cooperative-Game/dp/0321482751">Agile Software Development: The Cooperative Game</a>&laquo;&nbsp;. La suite de la formation était une confrontation de nos expériences issues des ateliers avec ces modèles. L&rsquo;idée étant d&rsquo;étudier les pratiques et la théorie vécues par des humains (self-awareness).</p>
<p style="text-align: center;"><a href="http://alistair.cockburn.us/Crystal+3-Step+Model"><img src="http://alistair.cockburn.us/get/2793" alt="practices theory self-awareness" width="357" height="184" /></a></p>
<p>Un modèle du thème Gestion de flux, inspiré du lean nous a interpellé. Il considère que l&rsquo;ensemble des décisions d&rsquo;une organisation constitue le stock à réduire. Pour fluidifier la chaîne de valeur, il faut localiser les goulots d&rsquo;étranglement provoqués par une accumulation de décisions non actées.</p>
<p style="text-align: center;"><a href="http://alistair.cockburn.us/What+engineering+has+in+common+with+manufacturing+and+why+it+matters"><img src="http://alistair.cockburn.us/get/1890" alt="Design = manufacturing if Inventory = Decisions" width="576" height="432" /></a><br />
©Alistair Cockburn</p>
<p><strong>Connaître ses défauts</strong></p>
<p>Nous avons commencé par un atelier en groupe de 3 dans lequel nous devions répondre à la question :</p>
<blockquote><p>pourquoi l&rsquo;agilité est-elle moins efficiente que la cascade ou le cycle en V ?</p></blockquote>
<p>&laquo;&nbsp;<em>Je ne vois pas</em>&nbsp;&raquo; n&rsquo;était pas une bonne réponse selon Alistair. Nous avons apprécié ce contre-pied d&rsquo;entrée de jeu, cette nécessité de faire une auto-critique avant d&rsquo;aller plus loin. Pour les curieux, sont sorties entre autres réponses :</p>
<ul>
<li>il y a plus de réunions avec plus de monde</li>
<li>répéter c&rsquo;est coûteux</li>
<li>payer des gens autonomes et compétents coûte plus cher</li>
<li>la collaboration est plus difficile que le suivi d&rsquo;un processus</li>
</ul>
<p><strong>Savoir découper fin</strong></p>
<p>Nous avons pratiqué l&rsquo;exercice du carpaccio autour du thème de l&rsquo;acquisition de connaissance. Il s&rsquo;agit de découper de manière la plus fine possible une expression de besoin en tranches démontrables, utiles et livrables à l&rsquo;utilisateur. Nous devions ensuite coder nos histoires avec des itérations de 9 minutes, démo à l&rsquo;appui. La manière qu&rsquo;il a eu de présenter le problème nous a mis un peu de pression (portables fermés, silence, déballage des sujets sous blister, annonce du langage choisi par les binômes), et a avivé un esprit de compétition entre les binômes. Il a ainsi pu mettre un peu en évidence nos égos, et nous faire réfléchir avec cette question faussement naïve qu&rsquo;il a posée lors de débrief :</p>
<blockquote><p>qu&rsquo;est-ce que vous avez à y gagner ?</p></blockquote>
<p><strong>La transmission d&rsquo;idées c&rsquo;est compliqué</strong></p>
<p>Nous avons trouvé une autre source de réflexion en faisant l&rsquo;atelier <a href="http://alistair.cockburn.us/The+Draw-This-Drawing+Game">Draw this drawing game</a> :</p>
<ul>
<li>Former des groupes de minimum 3 personnes</li>
<li>Créer 2 rôles par équipe : les Artistes et les Donneurs d&rsquo;ordres</li>
<li>1 des Donneurs d&rsquo;ordres sera le Messager, c&rsquo;est à dire qu&rsquo;il apportera les instructions aux Artistes</li>
<li>Les Donneurs d&rsquo;ordres spécifieront un dessin à reproduire le plus fidèlement possible par les Artistes</li>
<li>Contrainte : Les Donneurs d&rsquo;ordres sont séparés des Artistes et le Messager n&rsquo;a pas le droit de parler aux Artistes. La communication se fera par indication purement textuelle</li>
</ul>
<p>Nous l&rsquo;avons fait trois fois de suite avec des images de plus en plus difficile à reproduire. Entre chaque session, nous avons eu 5 minutes pour discuter sur notre mode d&rsquo;organisation. Lors de la dernière session, nous avons eu le droit de nous regrouper et parler sans indications gestuelles pour dessiner une photo de takoyaki explosé.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://frieddoughho.com/wp-content/uploads/IMG_3048.jpg" alt="takoyaki explosé" width="288" height="384" /></p>
<p>Ce que nous en avons retenu ;</p>
<ul>
<li>la difficulté de communiquer même en face à face</li>
<li>savoir être audacieux, quitte à être à la limite des règles (comme disait Alistair &laquo;&nbsp;<em>don&rsquo;t be fired, don&rsquo;t go to jail, anything else is possible</em>&laquo;&nbsp;)</li>
</ul>
<p><strong>Le jeu de la corde</strong></p>
<p>Petit intermède animé par Géry Derbier, nous avons fait un atelier d&rsquo;animation/construction d&rsquo;équipe : prenez quelques personnes (6-8), une corde fermée, demandez-leur de tenir la corde avec les 2 mains, puis de former une figure géométrique les yeux fermés et sans lâcher la corde (même avec une main) en 7 ou 8 minutes. Ex un carré à 6, un triangle équilatéral à 7. À la fin on pose la corde et on discute de ce qui s&rsquo;est passé. C&rsquo;est très intéressant de voir les dynamiques qui se mettent en place, les réflexions entre les participants.</p>
<p style="text-align: center;"><a title="IMGP8129.jpg de bamthomas, sur Flickr" href="http://www.flickr.com/photos/31719094@N04/7983420385/"><img class="aligncenter" src="http://farm9.staticflickr.com/8315/7983420385_83f359f58b.jpg" alt="IMGP8129.jpg" width="331" height="500" /></a></p>
<p>Cette formation de un jour et demi nous a donnée l&rsquo;envie de sortir des limites qu&rsquo;on s&rsquo;était nous-même fixés, à l&rsquo;image de <a href="http://alistair.cockburn.us/Oath+of+Non-Allegiance">l&rsquo;engagement de non allégeance d&rsquo;Alistair</a> qui pousse à l&rsquo;ouverture de toutes les écoles de pensées. Nous conseillons aux agilistes expérimentés cette formation qui dure 3 jours. Il conseille de la faire 3 fois afin de bien digérer le condensé théorique et d&rsquo;expérimenter 3 fois les applications avec des personnes différentes.</p>
<p>Bruno et David</p>
]]></content:encoded>
			<wfw:commentRss>http://www.barreverte.fr/agile-avance-alistair-cockburn/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Binômer avec un clavier dvorak et un clavier azerty</title>
		<link>http://www.barreverte.fr/binomer-avec-un-clavier-dvorak-et-un-clavier-azerty</link>
		<comments>http://www.barreverte.fr/binomer-avec-un-clavier-dvorak-et-un-clavier-azerty#comments</comments>
		<pubDate>Mon, 27 Aug 2012 12:32:41 +0000</pubDate>
		<dc:creator>Jean-Philippe Caruana</dc:creator>
				<category><![CDATA[geekeries]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[bonnes pratiques]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[programmation]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://www.barreverte.fr/?p=2674</guid>
		<description><![CDATA[Nous avons récemment succombé à la geekerie du moment : un clavier Type Matrix dvorak. Sous Linux, la commande setxkbmap permet de changer le mapping de son clavier. Ainsi, pour passer en Dvorak avec la composition pour les accents (3 touches pour écrire &#8230; <a href="http://www.barreverte.fr/binomer-avec-un-clavier-dvorak-et-un-clavier-azerty">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Nous avons récemment succombé à la geekerie du moment : un clavier <a href="http://typematrix.com/" target="_blank">Type Matrix</a> dvorak.</p>
<div id="attachment_2679" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.barreverte.fr/wp-content/uploads/2012/08/tmx-2030_gallery-1.png"><img class="size-medium wp-image-2679" title="tmx-2030_gallery-1" src="http://www.barreverte.fr/wp-content/uploads/2012/08/tmx-2030_gallery-1-300x135.png" alt="Clavier Type Matrix 2030 dvorak" width="300" height="135" /></a><p class="wp-caption-text">Clavier Type Matrix 2030 dvorak</p></div>
<p>Sous Linux, la commande <tt>setxkbmap</tt> permet de changer le mapping de son clavier. Ainsi, pour passer en Dvorak avec la composition pour les accents (3 touches pour écrire <tt>é</tt> : compose (le Alt de droite), apostrophe, e), il faut écrire :</p>
<p><script src="https://gist.github.com/3314899.js?file=dvorak"></script></p>
<p>Après une période d&rsquo;apprentissage, nous sommes assez contents, mais tout le monde n&rsquo;est pas prêt ou n&rsquo;a pas forcément envie de faire cet effort.</p>
<p>Dans un premier temps, j&rsquo;ai donc mappé sur le raccourci <tt>Windows + F5</tt> une commande de basculement dvorak/azerty. (NB: La touche Windows s&rsquo;appelle Start sur mon clavier)</p>
<p>J&rsquo;utilise <a href="http://lxde.org/">LXDE</a> comme gestionnaire de fenêtres, un mapping se rajoute ainsi dans le fichier <tt>~/.config/openbox/lxde-rc.xml</tt> :</p>
<p><script src="https://gist.github.com/3314957.js?file=lxde-rc.xml"></script></p>
<p>Le script de bascule <tt>~/bin/switch_dv_fr</tt> est le suivant :</p>
<p><script src="https://gist.github.com/3315019.js?file=switch_dv_fr.sh"></script></p>
<p>(<tt>notify-send</tt> permet d&rsquo;afficher une notification dans Linux)</p>
<p>Ce n&rsquo;était toujours pas satisfaisant, car il fallait taper une combinaison de touches avant de se passer le clavier. Heuereusement, avec Linux il est possible d&rsquo;avoir deux claviers branchés avec deux mappings différents. Le programme <tt>xinput</tt> permet de configurer les périphériques d&rsquo;entrée. Pour obtenir la liste de tous les périphériques branchés sur sa machine, il suffit de taper <tt>xinput list</tt>. Chez moi cela donne :</p>
<p><script src="https://gist.github.com/3315089.js?file=xinput list"></script></p>
<p>On constate que mon clavier Type Matrix possède l&rsquo;identifiant 12 et mon autre clavier (un HID 046a:0023) le 9. Du coup, maintenant que je connais le nom de mes claviers, je peux trouver leurs identifiants et les passer à <tt>setxkbmap</tt> grâce à l&rsquo;option <tt>--device</tt>. Le script final donne :</p>
<p><script src="https://gist.github.com/3314811.js?file=configure_keyboards"></script></p>
<p>Nous pouvons désormais binômer sur mon poste avec deux claviers différents !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.barreverte.fr/binomer-avec-un-clavier-dvorak-et-un-clavier-azerty/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Retour sur le format de rétrospective dit &#171;&#160;La randonnée&#160;&#187;</title>
		<link>http://www.barreverte.fr/retour-sur-le-format-de-retrospective-dit-la-randonnee</link>
		<comments>http://www.barreverte.fr/retour-sur-le-format-de-retrospective-dit-la-randonnee#comments</comments>
		<pubDate>Wed, 06 Jun 2012 10:26:39 +0000</pubDate>
		<dc:creator>David Boissier</dc:creator>
				<category><![CDATA[agilité]]></category>
		<category><![CDATA[rétrospective]]></category>

		<guid isPermaLink="false">http://www.barreverte.fr/?p=2591</guid>
		<description><![CDATA[Jeune padawan dans le coaching d&#8217;équipe, la rétrospective de Sprint est un exercice que j&#8217;appréhende souvent car son format doit pouvoir s&#8217;adapter à la situation passée. Un Sprint passé fut en échec car deux stories sur trois ne furent pas &#8230; <a href="http://www.barreverte.fr/retour-sur-le-format-de-retrospective-dit-la-randonnee">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Jeune padawan dans le coaching d&rsquo;équipe, la rétrospective de Sprint est un exercice que j&rsquo;appréhende souvent car son format doit pouvoir s&rsquo;adapter à la situation passée.</p>
<p>Un Sprint passé fut en échec car deux stories sur trois ne furent pas terminées. Le format de la timeline aurait pu être utilisé pour avoir la composante temporelle et trouver les causes racines mais je souhaitais que l&rsquo;équipe voit l&rsquo;accumulation des problèmes rencontrés au cours de l&rsquo;itération.<br />
Il était mercredi soir, le lendemain avait lieu la rétro. Autant dire que cela commençait à sentir le roussi.</p>
<p>Dans le RER, je lisais l&rsquo;adaptation en manga du roman &laquo;&nbsp;Le sommet des Dieux&nbsp;&raquo; (merci JP pour le prêt) &#8211; roman qui rappelle furieusement certains passages de <em>Premier de cordée</em> de <em>Roger Frison Roche</em>. Outre la beauté des paysages de montagnes retranscrits à travers le crayon de Taniguchi, le récit est également d&rsquo;une fluidité exemplaire lors des scènes d&rsquo;escalade. C&rsquo;est après une &laquo;&nbsp;grimpette&nbsp;&raquo; qui finit mal que j&rsquo;ai eu une idée sur le format de rétro :<span id="more-2591"></span></p>
<ul>
<li>[1 min] Former des groupes de 3 ou 4 personnes</li>
<li>[1 min] Chaque groupe prend un postIt géant et 1 feutre</li>
<li>[10 min] Chaque groupe trace une courbe de dénivelé (sachant que la courbe idéale est plate).
<ul>
<li>L&rsquo;axe horizontal représente le temps (l&rsquo;itération),</li>
<li>L&rsquo;axe vertical représente la difficulté ressentie des obstacles rencontrés.</li>
</ul>
</li>
<li>[5 min] Chaque groupe explique sa courbe</li>
<li>[10 min] Sur un tableau blanc, l&rsquo;équipe va extraire les sujets de discussions et voter (2, 3 ou plus selon les disponibilités)</li>
<li>[60 minutes] Discussions autour des sujets votés par l&rsquo;équipe</li>
</ul>
<p>Jeudi matin, j&rsquo;ai proposé de diviser l&rsquo;équipe en deux groupes et d&rsquo;appliquer le format ci-dessus. Nous avons obtenu des résultats assez homogènes (par souci de compacité de l&rsquo;article, un seul graphe est affiché ici) :</p>
<p><a href="http://www.barreverte.fr/wp-content/uploads/2012/05/20120217-GatherData1.jpg"><img class="aligncenter size-full wp-image-2600" title="20120217-GatherData" src="http://www.barreverte.fr/wp-content/uploads/2012/05/20120217-GatherData1.jpg" alt="" width="865" height="634" /></a></p>
<p>Les premiers sommets correspondent aux problèmes rencontrés sur deux stories non validées. En effet, elles comportaient des hypothèses fonctionnelles qui n&rsquo;étaient pas encore confirmées par le client alors que nous les avions engagées sur le Sprint. Nous avons dû relancer (et patienter) avant de pouvoir poursuivre leur développement.</p>
<p>Ensuite le graphe a surtout mis en évidence l&rsquo;accumulation des problèmes en fin de Sprint ainsi que leur non-résolution :</p>
<ul>
<li>Beaucoup de réunions impliquant la présence de l&rsquo;expert fonctionnel furent programmées en fin de Sprint. Ce dernier a été fortement ralenti dans ses tâches de validation des deux stories en question,</li>
<li>L&rsquo;équipe a consommé beaucoup d&rsquo;énergie dans la réparation des environnements de recette et de benchmarks. L&rsquo;expert fonctionnel a dû patienter que la plateforme de recette fonctionne pour exécuter certains cas de tests.</li>
</ul>
<p>Nous avons engagé les actions suivantes :</p>
<ul>
<li>Communiquer au client que l&rsquo;expert fonctionnel n&rsquo;accepte plus les réunions sur les deux derniers jours du Sprint afin qu&rsquo;il puisse valider les stories &laquo;&nbsp;plus sereinement&nbsp;&raquo;,</li>
<li>Rajouter un statut <strong>Non Engageable</strong> pour les stories dont le chiffrage se base sur des hypothèses non validées par le client.</li>
</ul>
<p>En conclusion, ce format est intéressant car il a incité l&rsquo;équipe à se rappeler de manière chronologique les obstacles rencontrés et à mesurer son ressenti à chaque instant du Sprint. Il est aussi adapté pour des Sprints réussis. En effet, on peut réussir factuellement un Sprint et en avoir &laquo;&nbsp;bavé&nbsp;&raquo; tout au long de l&rsquo;itération.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.barreverte.fr/retour-sur-le-format-de-retrospective-dit-la-randonnee/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Affichage firefox sans couleurs</title>
		<link>http://www.barreverte.fr/affichage-firefox-sans-couleurs</link>
		<comments>http://www.barreverte.fr/affichage-firefox-sans-couleurs#comments</comments>
		<pubDate>Mon, 04 Jun 2012 16:32:45 +0000</pubDate>
		<dc:creator>Bruno Thomas</dc:creator>
				<category><![CDATA[geekeries]]></category>
		<category><![CDATA[binômage]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[trucs et astuces]]></category>
		<category><![CDATA[vnc]]></category>

		<guid isPermaLink="false">http://www.barreverte.fr/?p=2620</guid>
		<description><![CDATA[VNC est un bon outil pour binômer à distance (il faut une bonne liaison réseau), mais il peut avoir des impacts assez étonnants sur le poste de travail : plus de répétition des touches raccourcis clavier cassés exécution de commandes &#8230; <a href="http://www.barreverte.fr/affichage-firefox-sans-couleurs">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>VNC est un bon outil pour binômer à distance (il faut une bonne liaison réseau), mais il peut avoir des impacts assez étonnants sur le poste de travail :</p>
<ul>
<li>plus de répétition des touches</li>
<li>raccourcis clavier cassés</li>
<li>exécution de commandes impromptues</li>
</ul>
<p>Pendant un binômage VNC, sur une tâche de développement d&rsquo;écran Web sous firefox (avec firebug, webdevelopper), mon affichage n&rsquo;avait plus les couleurs des sites :<br />
<a href="http://www.barreverte.fr/wp-content/uploads/2012/06/capture_affichage_ff.png"><img src="http://www.barreverte.fr/wp-content/uploads/2012/06/capture_affichage_ff-300x249.png" alt="" title="capture_affichage_ff" width="300" height="249" class="aligncenter size-medium wp-image-2622" /></a></p>
<p>Après avoir cherché un moment, j&rsquo;ai pu rétablir l&rsquo;affichage original en faisant about:config dans la barre d&rsquo;url, et puis en double cliquant sur le paramètre
<pre>browser.display.use_document_color</pre>
<p> le passant de false à true.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.barreverte.fr/affichage-firefox-sans-couleurs/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Retour sur la QCon 2012</title>
		<link>http://www.barreverte.fr/retour-sur-la-qcon-2012</link>
		<comments>http://www.barreverte.fr/retour-sur-la-qcon-2012#comments</comments>
		<pubDate>Mon, 09 Apr 2012 15:20:22 +0000</pubDate>
		<dc:creator>Bruno Thomas</dc:creator>
				<category><![CDATA[agilité]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[evenements]]></category>
		<category><![CDATA[conférences]]></category>
		<category><![CDATA[London]]></category>
		<category><![CDATA[QCon]]></category>

		<guid isPermaLink="false">http://www.barreverte.fr/?p=2449</guid>
		<description><![CDATA[Un petit retour sur la QCon pour animer un peu ce blog qui ne bouge plus beaucoup ces derniers temps, pour cause de nouveaux projets pour la plupart des rédacteurs. Nous avions exploré de nouveaux domaines (TDD javascript, noSQL), qui &#8230; <a href="http://www.barreverte.fr/retour-sur-la-qcon-2012">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Un petit retour sur la QCon pour animer un peu ce blog qui ne bouge plus beaucoup ces derniers temps, pour cause de nouveaux projets pour la plupart des rédacteurs. Nous avions exploré de nouveaux domaines (TDD javascript, noSQL), qui ont donné des articles, nous implémentons maintenant ces technologies. Nous vous dirons après l&rsquo;épreuve de la production si cela fonctionne vraiment.</p>
<p><a title="IMGP6040.jpg de bamthomas, sur Flickr" href="http://www.flickr.com/photos/31719094@N04/6970465401/"><img src="http://farm8.staticflickr.com/7049/6970465401_8b0a1fb137.jpg" alt="IMGP6040.jpg" width="500" height="331" /></a></p>
<p>Bref, nous sommes allés à la <a href="http://qconlondon.com/london-2012/">QCon de Londres</a> qui se déroulait entre les 7 et 9 mars. Comme lors d&rsquo;un <a title="Alors, cette QCon 2010 ?" href="http://www.barreverte.fr/alors-cette-qcon-2010">précédent retour</a>, l&rsquo;organisation est toujours aussi impeccable, <a title="QEII" href="http://maps.google.fr/maps?f=q&amp;source=s_q&amp;hl=fr&amp;q=queen+elizabeth+2&amp;aq=&amp;sll=51.500168,-0.129057&amp;sspn=0.003066,0.006636&amp;vpsrc=6&amp;ie=UTF8&amp;t=m&amp;st=112682123204788070687&amp;rq=1&amp;ev=zi&amp;split=1&amp;z=18&amp;jsv=400d&amp;mpnum=1003&amp;radius=0.17&amp;vps=11&amp;ei=oQRhT-ejAsrLjgekj_mLBA&amp;num=10&amp;abstate=A:actbar-saveto">le lieu</a> agréable, et les intervenants de haut niveau. Vous nous direz, pour le tarif (environ 1200€) c&rsquo;est normal.</p>
<p>Voici quelques orateurs remarquables :</p>
<ul>
<li><a href="http://martinfowler.com/">Martin Fowler</a> : &laquo;&nbsp;grande gueule&nbsp;&raquo; comme il se définit lui même, créateur de tendances et de <a href="http://www.thoughtworks.com/">ThoughtWorks</a></li>
<li><a href="http://homepages.inf.ed.ac.uk/wadler/">Philip Walder</a> : professeur d&rsquo;informatique théorique à l&rsquo;université d’Édimbourg. Auteur de nombreuses publications autour de la programmation fonctionnelle.</li>
<li><a href="http://damienkatz.net/">Damien Katz</a> : créateur de <a href="http://couchdb.apache.org/">CouchDB</a> et fondateur de <a href="http://www.couchbase.com/">Couchbase</a></li>
<li>Rich Hickey : créateur du langage <a href="http://clojure.org/">Clojure</a></li>
<li><a href="http://armstrongonsoftware.blogspot.com/">Joe Armstrong</a> : créateur d&rsquo;<a href="http://www.erlang.org/">Erlang</a>, abonné à la QCon</li>
<li><a href="http://blog.dannorth.net/">Dan North</a> : agitateur agile à l&rsquo;origine du BDD</li>
<li>Steeve Freeman : pionnier d&rsquo;XP</li>
<li><a href="http://www.kitchensoap.com">John Allspaw</a> : concepteur des infrastructures Salon, InfoWorld, Friendster, et Flickr. Auteur de <a href="http://oreilly.com/catalog/9780596518585/">The Art of Capacity Planning</a> et <a href="http://shop.oreilly.com/product/0636920000136.do">Web Operations</a> chez O&rsquo;Reilly</li>
</ul>
<p><span id="more-2449"></span></p>
<p>Par rapport à l&rsquo;édition de Londres 2010 nous avons remarqué une augmentation importante du nombre de personnes présentes : la salle plénière a été doublée par une extension fermée il y a 2 ans. 2 espaces &laquo;&nbsp;lounge&nbsp;&raquo; également (pour les collations, cafés, boissons entre les conférences), il y a 2 ans il n&rsquo;y en avait qu&rsquo;un.</p>
<p>Dans les temps forts, il y a eu l&rsquo;affluence inattendue (en tout cas par l&rsquo;organisation et  l&rsquo;orateur lui-même) pour la session &laquo;&nbsp;<a href="http://homepages.inf.ed.ac.uk/wadler/papers/oopsla/oopsla.pdf">Faith, Evolution, and Programming Languages: from Haskell to Java</a>&nbsp;&raquo; de Philip Walder. Une salle remplie, avec un grand nombre de personnes assises à même le sol. Pour une gageure : une présentation drôle et passionnante sur le lambda calcul et comment réconcilier le monde Haskell et Java. La première chose à souligner c&rsquo;est l&rsquo;utilisation d&rsquo;un langage &laquo;&nbsp;mainstream&nbsp;&raquo; comme Java pour parler de la programmation fonctionnelle. Cela évite le débat stérile du langage adopté par les masses versus le langage conceptuellement pur. Mais le plus intéressant c&rsquo;était l&rsquo;éclairage de la durée de construction de la connaissance sur ces technologies qui évoluent très rapidement. Une mise en perspective du monde de l&rsquo;urgence économique avec ses racines culturelles (© Regis Debray). C&rsquo;est probablement quelque chose comme une quête de sens qui fait le succès de ce type de présentation.</p>
<p><a title="IMGP6056.jpg de bamthomas, sur Flickr" href="http://www.flickr.com/photos/31719094@N04/6824350750/"><img src="http://farm8.staticflickr.com/7066/6824350750_9835daf581.jpg" alt="IMGP6056.jpg" width="500" height="331" /></a></p>
<p>Autre salle bondée, lors la présentation du jeune <a href="zachholman.com/">Zach Holman</a>, hacker chez GitHub, qui venait parler du <a href="http://zachholman.com/posts/how-github-works/">fonctionnement de GitHub</a> dans le track &laquo;&nbsp;Working Distributed&nbsp;&raquo;. Une culture nouvelle de société, sans horaires, sans réunions, sans managers (ou très peu), voire même sans bureaux. Hormis les dédouanements entendus en sortant : &laquo;&nbsp;<em>c&rsquo;est bien mais chez nous c&rsquo;est pas possible parce qu&rsquo;on a des clients</em>&laquo;&nbsp;, ou encore &laquo;&nbsp;<em>super mais chez nous avec l&rsquo;équipe d&rsquo;intégration ça ne marcherait jamais</em>&laquo;&nbsp;, ce qui était intéressant c&rsquo;était :</p>
<ul>
<li>le monde présent, indiquant peut-être un intérêt pour des manières de travailler radicalement différentes</li>
<li>l&rsquo;organisation autour d&rsquo;un objectif : faire en sorte que les employés &laquo;&nbsp;kiffent&nbsp;&raquo;. Cela rejoint le sujet de l&rsquo;amélioration de la <a href="http://www.youtube.com/watch?v=u6XAPnuFjJc">motivation intrinsèque</a> en promouvant l&rsquo;autonomie, la vision commune, l&rsquo;efficacité.</li>
</ul>
<p>Pour le moins bien, nous avons été déçus par une présentation prometteuse de <a href="http://qconlondon.com/dl/qcon-london-2012/slides/AshishThusoo_BigDataArchitecturesAtFacebook.pdf">BigData chez facebook</a>, qui s&rsquo;est révélée difficilement compréhensible du fait de l&rsquo;accent de Ashish Thusoo, ainsi que des concepts tellement élevés qu&rsquo;il n&rsquo;y avait pas grand chose à en retirer. Egalement, la <a href="http://qconlondon.com/dl/qcon-london-2012/slides/AryaAsemanfar_RunningOneOfTheWorldsLargestRealTimeServicesTwitter.pdf">Timeline chez Twitter</a> avec un Arya Asemanfar semblant s&rsquo;ennuyer gravement à sa propre présentation.</p>
<p><a title="IMGP6046.jpg de bamthomas, sur Flickr" href="http://www.flickr.com/photos/31719094@N04/6970468071/"><img src="http://farm8.staticflickr.com/7184/6970468071_a684bd52de.jpg" alt="IMGP6046.jpg" width="500" height="331" /></a></p>
<p>Lors des différentes présentations, nous avons trouvé que des thèmes étaient prégnants :</p>
<p><strong>Persistance polyglotte, BigData &amp; NoSQL</strong></p>
<p>De petits besoins de persistance de données pour lesquels des fichiers (éventuellement indexés) convenaient, les sites internet ont grossis, utilisant ensuite des bases de données (mysql le plus souvent), qui sont devenues clusters, et puis se sont révélées insuffisantes. L&rsquo;utilisation croissante d&rsquo;internet a poussé des sociétés à se concentrer sur des technologies adaptées au stockage d&rsquo;énormes volumes de données.</p>
<p>Ces technologies ne sont plus polyvalentes comme pouvaient l&rsquo;être des SGBDR, c&rsquo;est ce qu&rsquo;indiquait <a href="http://practicalcloudcomputing.com/">Siddharth Anand</a> venu parler des infrastructures de données chez <a href="http://www.linkedin.com">Linkedin</a>. Il parlait d&rsquo;&nbsp;&raquo;ADN des bases NoSQL&nbsp;&raquo;. C&rsquo;est la raison pour laquelle, un gros site pourra être amené à en utiliser plusieurs. C&rsquo;était la keynote d&rsquo;introduction de la QCon par Martin Fowler et Rebecca Parson sur &laquo;&nbsp;The Data Panorama&nbsp;&raquo;, très proche de l&rsquo;article &laquo;&nbsp;<a href="http://martinfowler.com/bliki/PolyglotPersistence.html">Polyglot persistence</a>&nbsp;&raquo; dont nous avons <a title="Persistance polymorphe" href="http://www.barreverte.fr/persistance-polymorphe">déjà parlé</a>.</p>
<p>Chez linkedin, ils utilisent oracle, ils ont développé une base clé/valeur qu&rsquo;ils ont ouvert : <a href="http://project-voldemort.com/">voldemeort</a>. Expresso, autre base développée par Linkedin fournit des timelines consistentes (qui se base sur mysql). Ils maintiennent la cohérences entre les copies de données avec des systèmes de réplication comme databus ou kafka cf <a href="http://engineering.linkedin.com/technology">Linkedin Technology</a>, et <a href="http://qconlondon.com/dl/qcon-london-2012/slides/SiddharthAnand_DataInfrastructureLinkedIn.pdf">les slides</a> de sa présentation.</p>
<p>Une chose intéressante, c&rsquo;est de voir comment ils ont adapté l&rsquo;infrastructure à l&rsquo;existant: oracle. Ils ont aussi utilisé des solutions ad hoc, pour des données temporaires, comme de simples fichiers indexés. Ils travaillent actuellement à supprimer Oracle.</p>
<p><a href="http://hadoop.apache.org/">Hadoop</a>, très utilisé dans ce domaine (par linkedin, facebook, twitter, eHarmony, Yahoo!, &#8230;), a été présenté par <a href="http://parand.com/say/">Parand Tony Darugar</a>. C&rsquo;est le &laquo;&nbsp;linux de la manipulation de grands volumes de donnés&nbsp;&raquo;, i.e. :</p>
<ul>
<li>HDFS (hadoop file system) : système de réplication de données avec une API REST</li>
<li>un framework de calculs distribués</li>
<li>un modèle de programmation Map/Reduce</li>
</ul>
<p><strong>Les nuages</strong></p>
<p>3 tracks (série de sessions d&rsquo;une journée) abordent ce sujet : <a href="http://qconlondon.com/london-2012/tracks/show_track.jsp?trackOID=562">Cloud architectures, API&rsquo;s and tools</a>, <a href="http://qconlondon.com/london-2012/tracks/show_track.jsp?trackOID=567">Plateform as a service (PaaS) &#8211; Practical cloud computing for developers</a>, et <a href="http://qconlondon.com/london-2012/tracks/show_track.jsp?trackOID=573">Cloud development and beyond</a>. C&rsquo;est d&rsquo;ailleurs un sujet proche du big data, puisque des infrastructures telles que Hadoop se basent sur la scalabilité horizontale : les données sont réparties sur un grand nombre de nœuds qui sont vus comme une seule machine par les API&rsquo;s.</p>
<p>Nous avons également entendu parler de cloud dans des sessions n&rsquo;ayant rien à voir comme &laquo;&nbsp;<a href="http://qconlondon.com/dl/qcon-london-2012/slides/JodiMoran_ZeroToTenMillionDailyUsersInFourWeeksSustainableSpeedIsKing.pdf">Zero to 10 million daily users in four weeks ; sustainable speed is king</a>&laquo;&nbsp;, où <a href="http://qconlondon.com/london-2012/speaker/Jodi+Moran">Jodi Moran</a> qui développe avec son équipe des jeux pour facebook vantait les mérites de <a href="http://aws.amazon.com/">Amazon Web Services</a> (AWS) notamment pour améliorer le time to market et les coûts, en bénéficiant des composants du cloud (queues, bases de données, plateforme web), et en supprimant les opérations.</p>
<p><a href="http://markmcgranaghan.com/">Mark McGranagham</a> nous a parlé de haute disponibilité à <a href="http://www.heroku.com/">Heroku</a> un cloud pour Ruby (au départ). Ils ont par exemple repris des principes d&rsquo;Erlang comme l&rsquo;<a href="http://www.erlang.org/documentation/doc-4.9.1/doc/design_principles/sup_princ.html">arbre de supervision</a>, le déploiement par partie, et l&rsquo;envoi de messages entre processus indépendants (modèle <a href="http://fr.wikipedia.org/wiki/Communication_inter-processus">IPC</a>).</p>
<p><a title="IMGP6011.jpg de bamthomas, sur Flickr" href="http://www.flickr.com/photos/31719094@N04/6970457471/"><img src="http://farm8.staticflickr.com/7065/6970457471_745dd2e86b.jpg" alt="IMGP6011.jpg" width="500" height="331" /></a></p>
<p><strong>L&rsquo;architecture revisitée</strong></p>
<p>Dans ce nouveau contexte, de haute disponibilité, de répartition des mémoires et des unités de calcul, l&rsquo;architecture doit s&rsquo;adapter. Elle doit autoriser le déploiement incrémental, la suppressions de fonction en ligne, la visibilité en temps réel de l&rsquo;état du système, un time to market constant au fil du temps, et bien sûr supporter l&rsquo;augmentation de trafic.</p>
<p>Une architecture monolithique, même si elle présente des avantages (la simplicité par exemple), aura du mal dans le temps à pouvoir continuer de satisfaire ces contraintes. C&rsquo;était le sens de l&rsquo;intervention de Stéfan Tilkov dans sa session &laquo;&nbsp;<a href="http://qconlondon.com/dl/qcon-london-2012/slides/StefanTilkov_BreakingTheMonolithTowardsASystemOfSystemsArchitecture.pdf">Breaking the monolith</a>&laquo;&nbsp;. Son propos était de considérer un système comme un ensemble de connexions/compositions de fonctions, et de voir le développement de ce système comme une redéfinition permanente des frontières des fonctions : la &laquo;&nbsp;modularisation&nbsp;&raquo;.</p>
<p>Jesper Richter-­Reichhelm de Wooga (jeux pour facebook) <a href="http://qconlondon.com/dl/qcon-london-2012/slides/JesperRichter-Reichhelm_GamesForTheMassesHowDevOpsAffectsArchitectureDesign.pdf">explique également</a> comment la collaboration dev-op a pu influencer l&rsquo;architecture et leur permettre de passer d&rsquo;une architecture classique ruby/mysql (webapps stateless, état en base) vers du erlang stateful côté serveur (pour éviter les aller-retours en base), déléguant à des workers en ruby en communiquant avec du <a href="http://www.zeromq.org/">zeroMQ</a> et en introduisant une <a title="Une courte introduction à Redis" href="http://www.barreverte.fr/une-courte-introduction-a-redis">base Redis</a>. Cela leur permet de tenir 14 milliards de requêtes par mois.</p>
<p>Des changements aussi profonds sont des remaniement d&rsquo;architecture, sujet abordé par Michael Stall dans &laquo;&nbsp;<a href="http://qconlondon.com/dl/qcon-london-2012/slides/MichaelStal_NothingIsPermanentExceptChangeHowSoftwareArchitectsCanEmbraceChange.pdf">Nothing is Permanent except Change</a> &#8211; How Software Architects can embrace Change&nbsp;&raquo;. Nous avions aussi présenté <a href="http://remaniement.barreverte.fr/">une session</a> sur ce sujet aux XPdays Bénélux et à l&rsquo;agile conférence.</p>
<p>Enfin, Dan North approche l&rsquo;architecture différemment : en terme de compromis.</p>
<p><a title="IMGP6013.jpg de bamthomas, sur Flickr" href="http://www.flickr.com/photos/31719094@N04/6970458585/"><img src="http://farm8.staticflickr.com/7204/6970458585_3095567f08.jpg" alt="IMGP6013.jpg" width="500" height="331" /></a></p>
<p><strong>Les compromis en informatique</strong></p>
<p>C&rsquo;est un sujet qui est revenu dans plusieurs présentations et est au cœur de NoSQL. Dan North avec ses qualités de showman et son sens de la provocation remettait en cause des domaines de l&rsquo;ordre du sacré de l&rsquo;agilité comme le TDD, l&rsquo;automatisation du build ou le principe <a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself">DRY</a>, en éclairant toute décision du point de vue du compromis :</p>
<ul>
<li>pour le TDD : le coût v.s. la non régression. Veut-on un feedback des défauts ou un feedback des utilisateurs ?</li>
<li>DRY : la factorisation v.s. le couplage</li>
<li>automatisation du build : rapidité et absence de tâches répétitives v.s. la souplesse et la compréhension de l&rsquo;application</li>
</ul>
<p>Le <a href="http://www.julianbrowne.com/article/viewer/brewers-cap-theorem">théorème de Brewer (CAP)</a> précise que dans une architecture distribuée, on ne peut pas avoir à la fois des données consistantes (Consistency), toujours disponibles (Availability), et réparties (Partition tolerance). NoSQL et le cloud dont on a beaucoup entendu parler à cette QCon sont donc aussi une histoire de compromis.</p>
<p><strong>Entraînement à l&rsquo;échec</strong></p>
<p>Un dernier thème était récurrent, c&rsquo;était l&rsquo;impossibilité d&rsquo;éviter l&rsquo;échec. Lors de la présentation sur Heroku, <a href="http://markmcgranaghan.com/">Mark McGranagham</a> a insisté sur le fait qu&rsquo;ils avaient beaucoup appris de leurs échecs. <a href="http://www.kitchensoap.com/">John Allspaw</a> lors de la keynote du dernier jour (<a href="http://qconlondon.com/dl/qcon-london-2012/slides/JohnAllspaw_ResilientResponseInComplexSystems.pdf">resilient response in complex system</a>) nous disait que facebook, twitter, amazon, blackberry, avaient eu des échecs en production. Quelle que soit la qualité des devs, ops, des infrastructures, des processus de construction d&rsquo;un service, des méthodes, cela arrivera. Il faut s&rsquo;y préparer. &laquo;&nbsp;<a href="http://blog.empathybox.com/post/19574936361/getting-real-about-distributed-system-reliability">Getting Real About Distributed System Reliability</a>&laquo;&nbsp;, un excellent article d&rsquo;un lead developer de Linkedin explique en détail pourquoi même les systèmes répartis comme HDFS sont sujets aux pannes.</p>
<p>John Allspaw donnait les pistes suivantes :</p>
<ul>
<li>apprendre d&rsquo;autres domaines qui ont de l&rsquo;expérience de gestion d&rsquo;incident dans des domaines où la haute disponibilité est vitale : le contrôle aérien, l&rsquo;aéronavale, les centrales électriques par exemple</li>
<li>définir des procédures, des responsabilités différentes, lors des incidents, et s&rsquo;entraîner : faire des simulations, maîtriser tous les outils de crise (bash, wireshark, &#8230;)</li>
<li>mettre en place une organisation apprenante, en sortant d&rsquo;une culture du reproche, pour se concentrer sur les faits et les comportements</li>
</ul>
<p>Un entraînement radical est d&rsquo;échouer continuellement pour s&rsquo;entraîner, c&rsquo;est ce que font Netflix avec le <a href="http://techblog.netflix.com/2010/12/5-lessons-weve-learned-using-aws.html">Chaos Monkey</a>. C&rsquo;est un démon qui tue aléatoirement des instances ou services au sein de leur architecture, afin de tester la résilience du système <img src='http://www.barreverte.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Voici les aspects qui nous ont marqués, si vous avez participé à la QCon et que vous pensez qu&rsquo;il manque un point essentiel, merci de nous faire un feedback.</p>
<p><strong>Notes</strong> :</p>
<p>Jour 1:</p>
<ul>
<li><a href="http://www.barreverte.fr/wp-content/uploads/2012/04/QCon-keynote.pdf">QCon keynote</a></li>
<li><a href="http://www.barreverte.fr/wp-content/uploads/2012/04/Breaking-the-monolyth.pdf">Breaking the monolyth</a></li>
<li><a href="http://www.barreverte.fr/wp-content/uploads/2012/04/High-avalability-at-Heroku.pdf">High avalability at Heroku</a></li>
<li><a href="http://www.barreverte.fr/wp-content/uploads/2012/04/how-software-architects-can-embrace-change.pdf">how software architects can embrace change</a></li>
<li><a href="http://www.barreverte.fr/wp-content/uploads/2012/04/sustainable-speed-is-king.pdf">sustainable speed is king</a></li>
<li><a href="http://www.barreverte.fr/wp-content/uploads/2012/04/decisions-decisions.pdf">decisions, decisions</a></li>
</ul>
<p>Jour 2:</p>
<ul>
<li><a href="http://www.barreverte.fr/wp-content/uploads/2012/04/Simple-made-easy.pdf">Simple made easy</a></li>
<li><a href="http://www.barreverte.fr/wp-content/uploads/2012/04/The-evolution-of-Paas.pdf">The evolution of Paas</a></li>
<li><a href="http://www.barreverte.fr/wp-content/uploads/2012/04/architecture-for-failure.pdf">architecture for failure</a></li>
<li><a href="http://www.barreverte.fr/wp-content/uploads/2012/04/Timelines-@-Twitter.pdf">Timelines @ Twitter</a></li>
<li><a href="http://www.barreverte.fr/wp-content/uploads/2012/04/big-data-architecture-at-facebook.pdf">big data architecture at facebook</a></li>
<li><a href="http://www.barreverte.fr/wp-content/uploads/2012/04/the-monkeys-and-the-firehose.pdf">the monkeys and the firehose</a></li>
</ul>
<p>Jour 3:</p>
<ul>
<li><a href="http://www.barreverte.fr/wp-content/uploads/2012/04/resilient-response-in-complex-systems.pdf">resilient response in complex systems</a></li>
<li><a href="http://www.barreverte.fr/wp-content/uploads/2012/04/faith-evolution-and-programming-languages-from-Haskell-to-Java.pdf">faith evolution and programming languages from Haskell to Java</a></li>
<li><a href="http://www.barreverte.fr/wp-content/uploads/2012/04/how-github-works.pdf">how github works</a></li>
<li><a href="http://www.barreverte.fr/wp-content/uploads/2012/04/aint-no-cure-for-the-distributed-blues.pdf">ain&rsquo;t no cure for the distributed blues</a></li>
<li><a href="http://www.barreverte.fr/wp-content/uploads/2012/04/data-infrastructure-@-linkedin.pdf">data infrastructure @ linkedin</a></li>
<li><a href="http://www.barreverte.fr/wp-content/uploads/2012/04/Hadoop-Scalable-infrastructure-for-big-data.pdf">Hadoop Scalable infrastructure for big data</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.barreverte.fr/retour-sur-la-qcon-2012/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Retour sur les XPdays Bénélux</title>
		<link>http://www.barreverte.fr/retour-sur-xpdays-benelux</link>
		<comments>http://www.barreverte.fr/retour-sur-xpdays-benelux#comments</comments>
		<pubDate>Sat, 31 Dec 2011 14:24:38 +0000</pubDate>
		<dc:creator>Bruno Thomas</dc:creator>
				<category><![CDATA[agilité]]></category>
		<category><![CDATA[evenements]]></category>
		<category><![CDATA[xpdays]]></category>

		<guid isPermaLink="false">http://www.barreverte.fr/?p=2415</guid>
		<description><![CDATA[Un petit mot sur les xpdays bénélux auxquels nous avons participé avec JP les 1er et 2 décembre dernier. Première chose, l&#8217;organisation, impeccable avec ces bonnes idées : tableaux de programme de la journée avec des cartes à emporter. Pochette &#8230; <a href="http://www.barreverte.fr/retour-sur-xpdays-benelux">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Un petit mot sur les <a href="http://www.xpday.be/">xpdays bénélux</a> auxquels nous avons participé avec JP les 1er et 2 décembre dernier.</p>
<p><a href="http://www.barreverte.fr/wp-content/uploads/2011/12/IMGP52681.jpg"><img class="aligncenter size-large wp-image-2425" title="IMGP5268" src="http://www.barreverte.fr/wp-content/uploads/2011/12/IMGP52681-1024x678.jpg" alt="" width="640" height="423" /></a></p>
<p>Première chose, l&rsquo;organisation, impeccable avec ces bonnes idées : tableaux de programme de la journée avec des cartes à emporter. Pochette transparente de taille A6 avec le programme et de même taille que les cartes. Le lieu est un peu perdu à 30km au nord de Bruxelles, mais c&rsquo;est dans la nature, les salles sont spacieuses avec de la lumière.</p>
<p><span id="more-2415"></span></p>
<p><a href="http://www.barreverte.fr/wp-content/uploads/2011/12/IMGP5264.jpg"><img class="aligncenter size-large wp-image-2428" title="IMGP5264" src="http://www.barreverte.fr/wp-content/uploads/2011/12/IMGP5264-1024x678.jpg" alt="" width="640" height="423" /></a></p>
<p>&laquo;&nbsp;Rise and Fall of an Agile company&nbsp;&raquo; par Jan De Baere. J&rsquo;ai retenu que dans une société de service, l&rsquo;agilité a été mise en place avec difficulté pendant 3 ans. À force de travailler ensemble, en utilisant des outils issus de l&rsquo;agilité, ils étaient capable de dire en allant chez un client</p>
<blockquote><p>Ah! Il y avait quelqu&rsquo;un de chez nous dans cette pièce il y a peu</p></blockquote>
<p>Ils ont créé une identité d&rsquo;entreprise. Puis le directeur a été changé et en peu de temps (à l&rsquo;échelle de la semaine), elle a été perdue. Pour Jan De Baere, cette identité était basée sur la confiance. C&rsquo;est la raison pour laquelle elle était fragile. Cela m&rsquo;a interrogé sur les capacités d&rsquo;apprentissage d&rsquo;une organisation. Comment capitaliser la connaissance d&rsquo;une entreprise au delà de la construction d&rsquo;un lien de confiance ?</p>
<p>2 sessions intéressantes de <a href="http://gojko.net/">Gojko Azic</a> : &laquo;&nbsp;<a href="http://visualisingquality.org">Visualising Quality</a>&nbsp;&raquo; et &laquo;&nbsp;Product Management using <a href="http://gojko.net/effect-map/">Effect Mapping</a>&laquo;&nbsp;. Il nous dit que l&rsquo;absence de bug est différent de la qualité. Ce qu&rsquo;il cherche à faire c&rsquo;est mettre en évidence la distance entre l&rsquo;informatique et le métier. On se rapproche du lean et du PDCA en choisissant des métriques et en expérimentant des solutions, même si elles ne sont pas informatiques. Il utilise 2 outils pour cela :</p>
<ul>
<li><a href="http://googletesting.blogspot.com/2011/10/google-test-analytics-now-in-open.html">ACC matrix</a> : une mise en regard des risques (métier) de features avec leur couverture en tests. De cette manière on peut optimiser le retour sur investissement des tests</li>
<li><a href="http://gojko.net/effect-map/">Effect Mapping</a> : il s&rsquo;agit d&rsquo;une mind-map avec au centre le &laquo;&nbsp;pourquoi&nbsp;&raquo; avec objectif chiffré, puis l&rsquo;étage suivant est le &laquo;&nbsp;qui&nbsp;&raquo; peut nous aider, puis &laquo;&nbsp;comment&nbsp;&raquo; et &laquo;&nbsp;quoi&nbsp;&raquo;. Une solution informatique n&rsquo;intervient éventuellement qu&rsquo;avec le quoi. Il propose de faire l&rsquo;atelier avec les gens du métier en petits groupes pour stimuler la créativité de chacun</li>
</ul>
<p>Ce qui m&rsquo;a plu dans ces session de Gojko Azic, c&rsquo;est la recherche de l&rsquo;efficacité fonctionnelle, quitte à ne pas faire de programme informatique, ou à en faire le moins possible (ex: meilleur taux coût/valeur d&rsquo;une appli SMS pour la réservation de place de spectacle par rapport au développement d&rsquo;une application iphone).</p>
<p>&laquo;&nbsp;Test Drive your application end to end&nbsp;&raquo; de Lars Vonk et Sander Nieuwenhuizen. C&rsquo;est une présentation relative au livre de Nat Pryce &laquo;&nbsp;<a href="http://www.growing-object-oriented-software.com/">Growing Object-Oriented Software</a> Guided by Tests&nbsp;&raquo;. Cette problématique de tests fonctionnels bout en bout est récurrente. Nous sommes d&rsquo;ailleurs dans ce sujet avec un nouveau projet qui démarre actuellement. Notre soucis qui n&rsquo;a pas été adressé par cette présentation c&rsquo;est la possibilité de lancer 2 navigateurs, et de tester les interactions entre les 2.</p>
<p>&laquo;&nbsp;Jaccob&rsquo;s Ladder&nbsp;&raquo; par Arnaud Bailly et Christophe Thibaut. Une présentation de la <a href="http://fr.wikipedia.org/wiki/Th%C3%A9orie_des_cat%C3%A9gories">théorie des Catégories</a>. Ça m&rsquo;a mis la tête à l&rsquo;envers, comme quand on m&rsquo;explique les monades. Maintenant je sais au moins d&rsquo;où ça vient. J&rsquo;ai bien aimé l&rsquo;application de cette théorie à de l’algorithmique du monde objet java. En plus du lien sur l&rsquo;origine des concepts de programmation fonctionnelle, j&rsquo;ai trouvé que cela procurait une nouvelle approche du design.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.barreverte.fr/retour-sur-xpdays-benelux/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Une courte introduction à Haskell</title>
		<link>http://www.barreverte.fr/une-courte-introduction-haskell</link>
		<comments>http://www.barreverte.fr/une-courte-introduction-haskell#comments</comments>
		<pubDate>Mon, 05 Dec 2011 12:40:30 +0000</pubDate>
		<dc:creator>Jean-Baptiste Potonnier</dc:creator>
				<category><![CDATA[haskell]]></category>
		<category><![CDATA[fonctionnel]]></category>
		<category><![CDATA[introduction]]></category>

		<guid isPermaLink="false">http://www.barreverte.fr/?p=2314</guid>
		<description><![CDATA[J&#8217;ai entendu parler d&#8217;Haskell pour la première fois à l&#8217;université. J&#8217;entendais que c&#8217;était un langage très élégant, amusant et bien plus avancé qu&#8217;OCaml. Mais OCaml me donnait déjà bien du mal, et c&#8217;était ce dernier qui était demandé pour les &#8230; <a href="http://www.barreverte.fr/une-courte-introduction-haskell">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>J&rsquo;ai entendu parler d&rsquo;Haskell pour la première fois à l&rsquo;université. J&rsquo;entendais que c&rsquo;était un langage très élégant, amusant et bien plus avancé qu&rsquo;OCaml. Mais OCaml me donnait déjà bien du mal, et c&rsquo;était ce dernier qui était demandé pour les examens et les projets de programmation. Je n&rsquo;étais donc pas prêt à apprendre Haskell à ce moment.</p>
<p>Plus tard, par curiosité, j&rsquo;ai regardé quelques projets écrits en Haskell. Je suis alors tombé sur <a href="http://xmonad.org/">xmonad</a>, un gestionnaire de fenêtres spartiate, mais avec des idées intéressantes, comme l&rsquo;agencement automatique. J&rsquo;ai aussi découvert la bibliothèque <a href="http://legacy.cs.uu.nl/daan/download/parsec/parsec.html">Parsec</a>, qui permet d&rsquo;écrire des parseurs très simplement, et dont la lecture du code m&rsquo;a convaincu que la notion de fonction était une abstraction vraiment puissante.<br />
<span id="more-2314"></span><br />
Lors de mon premier contact avec du code Haskell, je n&rsquo;ai pas été très enthousiaste :</p>
<ul>
<li>Cela ne ressemblait à aucun langage que je connaissais, on aurait dit une peu de l&rsquo;anglais mathématique.</li>
<li>Après quelques tentatives de modification du code, je me faisais insulter par le compilateur&#8230;</li>
</ul>
<p>Mais ma curiosité était piquée. J&rsquo;ai toujours été intrigué par les langages que je ne comprends pas. De plus, il y avait une promesse de concision, vu qu&rsquo;il me semblait que l&rsquo;on puisse faire beaucoup avec peu de lignes.</p>
<h2>Qu&rsquo;est-ce que Haskell ?</h2>
<p>Haskell est d&rsquo;abord un langage de comité, composé de mathématiciens et d&rsquo;informaticiens désireux de faire des expériences en programmation fonctionnelle, et aussi de créer un langage utilisable pour écrire des applications. Le langage étant en quelque sorte expérimental, il est en perpétuelle évolution. Impossible donc d&rsquo;écrire une documentation ou un livre sans être instantanément démodé. Haskell est donc stabilisé en 1998 en tant que Haskell 98. Ce qui met fin également au comité, mais pas à la vie du langage, bien au contraire.</p>
<p>Quelques traits caractéristiques du langage :</p>
<ul>
<li>Fonctionnel : l&rsquo;abstraction de base est la fonction.</li>
<li>Pur : pas d&rsquo;effets de bord.</li>
<li>Paresseux (<em>lazy</em>) : l&rsquo;évaluation se fait lorsque l&rsquo;on a besoin d&rsquo;une valeur, à la différence de la plupart des autres langages, où les arguments d&rsquo;une fonction sont évalués avant l&rsquo;appel de celle-ci. Ceci permet par exemple de manipuler des structures de données de taille infinie.</li>
</ul>
<p>Ces caractéristiques en font un langage singulier, pas forcément facile à appréhender. Le coté fonctionnel pur en font un langage de choix pour la programmation parallèle, bien qu&rsquo;il n&rsquo;ai pas été conçu pour cela au départ. Certaines start-up choisissent également ce langage en misant sur un avantage décisif par rapport à la concurrence. Ainsi, <a href="http://www.tsurucapital.com/en/">Tsurucapital</a> annonce sur sa page d&rsquo;accueil:<br />
<cite><br />
We use the Haskell programming language almost exclusively since we believe it gives the best combination of high-level cleanliness, execution safety and high performance.<br />
</cite><br />
Haskell est bien entendu aussi utilisé par des mathématiciens, mais excelle dans des taches plus communes, comme l&rsquo;écriture de DSL, ou plus récemment dans la programmation web (<a href="http://www.yesodweb.com/">Yesod</a>, <a href="http://snapframework.com/">Snap</a>)</p>
<h2>Environnement de développement</h2>
<p>J&rsquo;utilise <a href="http://www.haskell.org/ghc/"><code>ghc</code></a>, le compilateur Haskell le plus utilisé et les plus avancé à l&rsquo;heure actuelle. Ghci est livré avec <code>ghci</code>, un interpréteur Haskell bâti autour de ghc. Il existe très certainement un package pour votre OS.</p>
<p>Si vous le souhaitez, vous pouvez essayer d&rsquo;autres environnements:</p>
<ul>
<li><a href="http://hackage.haskell.org/platform/">Haskell Platform</a> qui est constitué de ghc et d&rsquo;un ensemble de bibliothèques d&rsquo;usage fréquent.</li>
<li><a href="http://www.haskell.org/hugs/">Hugs</a> est un environnement qui est aussi populaire dans le monde des débutants en Haskell.</li>
</ul>
<p>Après avoir installé ghc (ou Haskell Platform), vous pourrez exécuter un fichier en utilisant la commande <code>runhaskell</code>, ou bien le charger dans d&rsquo;interpréteur en utilisant la commande <code>ghci</code>.</p>
<p>Une fois dans l&rsquo;interpréteur, le <em>Prelude</em> (ensemble des bibliothèques de base) est chargé et vous vous retrouvez en mode interactif.</p>
<h2>Fonctions</h2>
<p>En Haskell, une fonction prend en entrée des valeurs, et retourne une<br />
valeur (qui peut bien entendu être une fonction). Une fonction ne peut pas provoquer d&rsquo;effets de bord. Par conséquent, le résultat d&rsquo;une fonction ne dépend que de ses paramètres. En d&rsquo;autres termes, la notion d&rsquo;état n&rsquo;existe pas. La déclaration d&rsquo;une fonction consiste en une <em>équation</em>, signifiant que la partie à gauche du signe <code>=</code> est équivalent à la partie droite.</p>
<p>La commande <code>:t</code> vous sera certainement utile dans l’interpréteur. Elle permet d&rsquo;afficher le type d&rsquo;une expression. Par exemple, si je veux connaître le type de la fonction <code>length</code> :<br />
<script type="text/javascript" src="https://gist.github.com/1388622.js?file=type-length.hs"></script><br />
 Cela se lit comme suit: &laquo;&nbsp;Quel que soit le type a, la fonction length prend en argument une liste de a, et retourne un entier&nbsp;&raquo;.</p>
<h2>Transformer les éléments d&rsquo;une liste</h2>
<p>Une opération très fréquente lorsque l&rsquo;on programme est de parcourir une liste en appliquant une fonction à chacun de ses éléments. C&rsquo;est ce que permet la fonction <code>map</code>.<br />
<script type="text/javascript" src="https://gist.github.com/1388622.js?file=map.hs"></script><br />
La description du type nous montre que les arguments sont :</p>
<ol>
<li>Une fonction qui, pour toute valeur de type a, retourne une valeur de type b</li>
<li>Une liste de valeurs de type a</li>
</ol>
<p>La valeur de retour est une liste de valeurs de type b.</p>
<p>Dans notre exemple où l&rsquo;on multiplie par deux les éléments d&rsquo;une liste d&rsquo;entiers, les types a et b se trouvent être égaux.</p>
<h2>Filtrer une liste</h2>
<p>Un autre traitement très fréquent en programmation est de filtrer les éléments d&rsquo;une liste selon un prédicat. C&rsquo;est ce que propose la fonction <code>filter</code>.<br />
<script type="text/javascript" src="https://gist.github.com/1388622.js?file=filter.hs"></script><br />
 La lecture du type nous informe que les arguments sont :</p>
<ol>
<li>Un prédicat, c&rsquo;est à dire une fonction à un argument qui retourne un booléen</li>
<li>Une liste d&rsquo;éléments</li>
</ol>
<p>On constate aussi que les éléments de la liste résultat sont de même types que les éléments de la liste en paramètre. Ce qui est conforme à ce que nous attendons : la liste est simplement filtrée, les valeurs ne sont pas transformées.</p>
<h2>Fonctions anonymes</h2>
<p>Il est possible de déclarer une fonction sans nom. Par exemple, pour une fonction qui double la valeur de son argument, on peut écrire <code>\ x -&gt; 2 * x</code>. Ce qui est pratique lorsque l&rsquo;on a besoin d&rsquo;une fonction, mais que l&rsquo;on ne veut pas prendre la peine de la définir, parce qu&rsquo;elle est très petite ou triviale.<br />
<script type="text/javascript" src="https://gist.github.com/1388622.js?file=anonyme.hs"></script><br />
A ceux qui se poseraient la question, le caractère <code>\</code> a été choisi pour la définition de fonctions anonymes car il ressemble (un peu) au caractère λ.</p>
<h2 id="style-sans-point-pointless">Style &laquo;&nbsp;sans point&nbsp;&raquo; (<em>pointless</em>)</h2>
<p>La fonction <code>(.)</code> permet de composer deux fonctions. Il faut lire le point comme le &laquo;&nbsp;rond&nbsp;&raquo; en mathématiques. Ainsi <code>f(g x)</code> est équivalent à <code>(f . g) x</code>.<br />
De plus, une fonction s’écrivant <code>h x = (f . g) x</code> peut aussi s&rsquo;écrire &laquo;&nbsp;sans point&nbsp;&raquo; <code>h = f . g</code><br />
Une source de confusion (et aussi de blagues) vient du terme <em>pointless</em>. Pourquoi appelle-t-on ce style &laquo;&nbsp;sans point&nbsp;&raquo;, alors que justement on utilise le point ? En réalité, dans cette expression, le point ne fait pas référence au caractère, mais à l’argument d&rsquo;une fonction (en anglais mathématique, on appelle cela le point). Et effectivement, dans une expression <em>pointless</em>, on n&rsquo;écrit pas les arguments d&rsquo;une fonction lorsqu&rsquo;on la définit.</p>
<h2 id="compréhension-de-liste-list-comprehension">Compréhension de liste (<em>list comprehension</em>)</h2>
<p>Les compréhensions de liste sont déjà connues des développeurs Python ou Erlang. Les programmeurs Scala pourront aussi trouver des similarités avec le <code>for</code> de ce langage.</p>
<p>La compréhension de liste permet de transformer et de filtrer des listes dans une même expression. On peut le voir comme une combinaison de <code>filter</code> et de <code>map</code>.</p>
<p>La syntaxe est très inspirée de la notation de définition des ensembles en mathématiques. Par exemple, nous définissons ici la &laquo;&nbsp;liste des élément x multipliés par 10, pour tout x dans la liste des entiers de 1 à 10 tels que x est impair&nbsp;&raquo;:<br />
<script type="text/javascript" src="https://gist.github.com/1388622.js?file=comprehension.hs"></script><br />
Les compréhensions de liste sont un élément syntaxique très intéressant pour l&rsquo;expressivité et la clarté du code. Nous n&rsquo;avons fait ici qu&rsquo;effleurer les possibilités qu&rsquo;elles offrent.</p>
<h2>Pour aller plus loin</h2>
<ul>
<li><a href="http://book.realworldhaskell.org/read/">Real world Haskell</a>, un livre en ligne assez didactique.</li>
<li><a href="http://en.wikibooks.org/wiki/Haskell">Le wiki book Haskell</a>, une bonne référence pour apprendre.</li>
<li><a href="http://learnyouahaskell.com/chapters">Learn You a Haskell for Great Good!</a>, très progressif, mais un peu trop verbeux à mon avis.</li>
</ul>
<p>Si vous avez apprécié cet article, sachez que d&rsquo;autres sont en préparation. Nous aborderons la déclaration des type de données afin de modéliser une version simplifiée de réseau social, ainsi que d&rsquo;autre manière de manipuler les listes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.barreverte.fr/une-courte-introduction-haskell/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Persistance polymorphe</title>
		<link>http://www.barreverte.fr/persistance-polymorphe</link>
		<comments>http://www.barreverte.fr/persistance-polymorphe#comments</comments>
		<pubDate>Tue, 29 Nov 2011 09:06:19 +0000</pubDate>
		<dc:creator>Bruno Thomas</dc:creator>
				<category><![CDATA[architecture]]></category>
		<category><![CDATA[NoSQL]]></category>

		<guid isPermaLink="false">http://www.barreverte.fr/?p=2278</guid>
		<description><![CDATA[Il y a quelques temps, lorsqu&#8217;un projet informatique démarrait, une question d&#8217;architecture qui se posait systématiquement, était &#171;&#160;quelle base de données (relationnelle) utilisons-nous ?&#160;&#187;, et la subsidiaire (en langage objet), &#171;&#160;quel mapping relationnel/objet ?&#160;&#187;. La réponse était d&#8217;ailleurs souvent &#171;&#160;hibernate/mysql&#160;&#187; &#8230; <a href="http://www.barreverte.fr/persistance-polymorphe">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Il y a quelques temps, lorsqu&rsquo;un projet informatique démarrait, une question d&rsquo;architecture qui se posait systématiquement, était &laquo;&nbsp;quelle base de données (relationnelle) utilisons-nous ?&nbsp;&raquo;, et la subsidiaire (en langage objet), &laquo;&nbsp;quel mapping relationnel/objet ?&nbsp;&raquo;. La réponse était d&rsquo;ailleurs souvent &laquo;&nbsp;hibernate/mysql&nbsp;&raquo; dans le monde java.</p>
<p>Le mouvement NoSQL est issu d&rsquo;un besoin de stockage de données important, scalable, performant, et robuste sans avoir toutes les fonctionnalités d&rsquo;une base relationnelle. Ces besoins ont été ceux de gros sites comme google, facebook, twitter, amazon, linkedin, sourceforge, github&#8230;</p>
<p>Si certains discours ont été excessifs au départ (comme souvent lors d&rsquo;une inversion de tendance), c&rsquo;est en réaction à des années de domination du monde relationnel dans le domaine de la persistance, et aux difficultés des développeurs à s&rsquo;interfacer avec ces systèmes. A présent <a href="http://nosql-database.org/">beaucoup de produits</a> ont été développés offrant de réelles alternatives au monde des SGBDR :</p>
<ul>
<li>le stockage par famille de colonnes (<a href="http://hbase.apache.org/">hbase</a>, <a href="http://cassandra.apache.org/">cassandra</a>, <a href="http://hypertable.org/">hypertable</a>)</li>
<li>bases orientées document (<a href="http://www.mongodb.org/">MongoDB</a>, <a href="http://couchdb.apache.org/">CouchDB</a>, <a href="http://code.google.com/p/terrastore/">Terrastore</a>)</li>
<li>bases clé-valeur/tuples (<a href="http://redis.io/">Redis</a>, <a href="http://wiki.basho.com/">Riak</a>, <a href="http://code.google.com/p/maxtable/">Maxtable</a>)</li>
<li>bases orientées graphe (<a href="http://neo4j.org/">Neo4J</a>, <a href="http://www.kobrix.com/">HyperGraphDB</a>)</li>
</ul>
<p><span id="more-2278"></span><br />
Et les autres types de bases qui existaient avant le mouvement NoSQL comme bases objets (<a href="http://www.versant.com/">Versant</a>, <a href="http://www.objectivity.com/">Objectivity</a>), les bases XML (<a href="http://exist-db.org/">eXist</a>, <a href="http://www.xmlmind.com/qizx/">Qizx</a>), qui bénéficieront peut-être d&rsquo;un regain d&rsquo;intérêt. Tant mieux. Au sujet des précurseurs, nous pouvons citer d&rsquo;ailleurs <a href="http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html">BerkeleyDB</a> (1986), base clé-valeur utilisée sur un nombre de projet impressionnant, et <a href="http://www.erlang.org/doc/man/mnesia.html">mnésia</a>, base de tuples/records <a href="http://www.erlang.org/">erlang</a>.</p>
<p>Grâce à ce mouvement, aux nouveaux produits, aux besoins des sites internet de gros volume, au delà du mouvement NoSQL, une nouvelle vision du stockage des données apparaît : c&rsquo;est le <strong>fractionnement des modes de stockage vers une persistance aux formes multiples</strong>. La programmation polyglotte représentait le choix du meilleur langage en fonction du besoin, nous avions vu cela par exemple <a title="Alors, cette QCon 2010 ?" href="http://www.barreverte.fr/alors-cette-qcon-2010">à la Qcon en 2010</a>. La <strong>persistance polymorphe, consiste à choisir le meilleur moyen de stockage de données en fonction de son usage</strong>, et d&rsquo;en avoir éventuellement plusieurs pour un seul module applicatif.</p>
<p>Par exemple twitter <a href="http://engineering.twitter.com/2011/11/spiderduck-twitters-real-time-url.html">a créé un module de chargement de page web</a> pour les urls présentes dans les tweets. Appelé SpiderDuck, il utilise HBFS construit sur Hadoop, lui-même fondé sur Hbase, et Cassandra. HBFS sert à stocker les informations récupérées sur les sites pointés par les url. Cassandra sert à stocker les métadonnées des url. A noter également qu&rsquo;ils utilisent memcached (qui est une structure de données clé/valeur en mémoire), pour cacher les fichiers robots.txt des sites.</p>
<p>D&rsquo;autres fonctions d&rsquo;une application paraissent assez proches des modèles proposés par ces bases. Par exemple :</p>
<ul>
<li>Redis pour le stockage de paramètres de session pour ses performances, sa simplicité et le format adapté clé/valeur</li>
<li>MongoDB pour l&rsquo;aggrégation de logs car il fait du <a href="http://en.wikipedia.org/wiki/Shard_%28database_architecture%29">sharding</a> (partitionnement de données par enregistrement pour les répartir sur plusieurs serveurs). Également pour le stockage de modèle (au sens MVC) en Json</li>
<li>Neo4j pour stocker des données sociales (ex facebook avec les graphes par &laquo;&nbsp;amis&nbsp;&raquo;)</li>
<li>Riak pour stocker un grand nombre de données sensibles avec réplication sur plusieurs noeuds (cf la notion de <a href="http://www.allthingsdistributed.com/2008/12/eventually_consistent.html">Eventually Consistent</a>)
</ul>
<p>Cette multiplicité technologique a un coût en complexité, comme l&rsquo;introduction de plusieurs langages dans un projet. Martin Fowler l&rsquo;évoque dans <a href="http://martinfowler.com/bliki/PolyglotPersistence.html">Polyglot Persistence</a>, un très bon article sur le sujet. Mais cet investissement sera remboursé par l&rsquo;intégration plus aisée de ces bases avec le code, la scalabilité horizontale des données, la performance, et les possibilités offertes en terme de découplage entre différentes parties du code.</p>
<p>Récemment nous avons travaillé sur la séparation de nos binaires et de nos configurations. Nous avons cherché comment stocker les paramètres extrinsèques de nos applications (ceux qui sont gérés par les opés: urls, nom d&rsquo;hôtes, ports, etc.). Nous avons exploré plusieurs possibilités (fichiers sous git, cassandra, mongodb). Nous n&rsquo;avons pas encore fait le choix, mais il est peu probable que nous utilisions au final notre base mysql. En effet, le mode relationnel est assez éloigné de l&rsquo;état actuel des paramètres qui sont en fichiers properties. Et puis la gestion de l&rsquo;historique de nos paramètres est à faire par programmation avec ce mode de stockage (alors que certaines bases apportent cette fonction en natif).</p>
<p>Nous avons testé MongoDB qui permet de stocker du json avec plusieurs clés (en javascript) :</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">db.<span style="color: #660066;">configurations</span>.<span style="color: #660066;">insert</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
     env<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;itg&quot;</span><span style="color: #339933;">,</span>
     version<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;1.0.9&quot;</span><span style="color: #339933;">,</span>
     appli<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;pse&quot;</span><span style="color: #339933;">,</span>
     params<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;param1&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;valeur1&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;param2&quot;</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;valeur2&quot;</span><span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>et faire des requêtes :</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">db.<span style="color: #660066;">configurations</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'env'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'itg'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Autre solution que nous avons exploré, c&rsquo;est Redis pour conserver des structures de données comme des listes, des sets triés, etc. Nous évitons ainsi le mapping qui existait entre les paradigmes du monde des langages de programmation et du monde relationnel. Retrouvez <a title="Une courte introduction à Redis" href="http://www.barreverte.fr/une-courte-introduction-a-redis">une courte introduction à Redis sur barreverte</a>.</p>
<p>C&rsquo;est donc de nouvelles perspectives qui sont ouvertes. Il ne s&rsquo;agit pas de mettre les bases relationnelles au rebut, mais de les utiliser pour des données &laquo;&nbsp;froides&nbsp;&raquo;, dont les accès sont peu fréquents ; ou encore pour des données structurées, conservées sur une durée importante, et dont nous ne connaissons pas l&rsquo;usage, comme le reporting, les données décisionnelles, juridiques, financières.</p>
<p>La prochaine fois que vous avez besoin de données persistantes, à vos explorations et prototypes, utilisez la meilleure base pour votre environnement (langage de programmation utilisé, structures à stocker, expressivité et souplesse offerte par le langage de requête, utilisation d&rsquo;index, architecture plateforme, etc.) ! Nous essayerons de parler plus précisément de ce sujet sur ce blog.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.barreverte.fr/persistance-polymorphe/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Une courte introduction à Redis</title>
		<link>http://www.barreverte.fr/une-courte-introduction-a-redis</link>
		<comments>http://www.barreverte.fr/une-courte-introduction-a-redis#comments</comments>
		<pubDate>Mon, 21 Nov 2011 10:33:37 +0000</pubDate>
		<dc:creator>Jean-Philippe Caruana</dc:creator>
				<category><![CDATA[Bases de données]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[changement de paradigme]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[redis]]></category>

		<guid isPermaLink="false">http://www.barreverte.fr/?p=2233</guid>
		<description><![CDATA[Quand il s&#8217;agit de faire persister ses données, la seule option qui semble disponible est d&#8217;utiliser un SGBDR (une base de données relationnelle, telle que MySQL ou Oracle). Mais on se rend parfois compte qu&#8217;un seul outil ne peut résoudre &#8230; <a href="http://www.barreverte.fr/une-courte-introduction-a-redis">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Quand il s&rsquo;agit de faire persister ses données, la seule option qui semble disponible est d&rsquo;utiliser un SGBDR (une base de données relationnelle, telle que MySQL ou Oracle). Mais on se rend parfois compte qu&rsquo;un seul outil ne peut résoudre tous les problèmes. Ainsi, si on ne dispose que de marteaux, on aura tendance à voir des clous partout.</p>
<p>Le mouvement NoSQL (comme Not Only SQL), nous propose des alternatives : bases clefs-valeurs, bases orientées document, bases orientées colonnes, bases orientées graphe ; <a href="http://cassandra.apache.org/">Cassandra</a>, <a href="http://www.mongodb.org/">MongoDB</a>, <a href="http://redis.io/">Redis</a>, <a href="http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html">Dynamo</a>, <a href="http://wiki.basho.com/Riak.html">Riak</a>, <a href="http://labs.google.com/papers/bigtable.html">Big Table</a>, <a href="http://project-voldemort.com/">Voldemort</a> sont souvent utilisés par les sites à gros trafic et à tendance &laquo;&nbsp;sociale&nbsp;&raquo; qui font le buzz : Google, Amazon, Facebook, Twitter, LinkedIn.</p>
<p>Aujourd&rsquo;hui, nous allons explorer <strong>redis</strong>, ses principes, son API et ce qu&rsquo;on peut en faire. Dans un prochain article, nous verrons une utilisation typique en écrivant un clone de twitter simple et sans prétention.<br />
<span id="more-2233"></span><br />
Redis est une base de données open source de type clefs-valeurs mono-threadée. C&rsquo;est en gros une grosse HashMap, mais avec des données structurées que nous allons détailler : des chaînes de caractères, des listes, des hash, des set, des set triés. L&rsquo;utilisation de redis est très simple et la vitesse de lecture et d&rsquo;écriture est vertigineuse (plus de 100 000 insertions par seconde sur mon petit poste de travail). Toutes les opérations sont atomiques, vous ne risquez pas d&rsquo;avoir des soucis de concurrence d&rsquo;accès à vos données. Par contre, il est impossible de requêter les valeurs comme on le fait habituellement avec un WHERE en MySQL, mais avec un peu d&rsquo;astuce, d&rsquo;habitude et de dénormalisation de vos données, on arrive très vite à nos fins en demandant &laquo;&nbsp;la bonne clef&nbsp;&raquo;. Il faut également savoir que vous êtes limités par la taille de votre RAM car redis garde toutes ses données en mémoire (c&rsquo;est aussi pour cela que c&rsquo;est très rapide). Ne vous effrayez cependant pas, redis sauvegarde régulièrement (avec la possibilité d&rsquo;un paramétrage poussé) ses données sur le disque et supporte également la réplication sur de multiples serveurs.</p>
<p>Si vous avez besoin de sauvegarder de grands volumes de données, vous pouvez stocker les données les moins lues dans un MySQL et garder les données volatiles et fréquemment lues dans redis, c&rsquo;est même une configuration souvent rencontrée actuellement</p>
<p>Enfin, l&rsquo;installation de redis est très simple : sur Ubuntu, le paquet s&rsquo;appelle <em>redis-server</em>. Le serveur démarre immédiatement l&rsquo;installation et un client en ligne de commande est  disponible : <em>redis-cli</em>. C&rsquo;est avec cette interface que nous allons faire nos tests et découvrir redis. Vous pouvez également utiliser <em>redis-bench </em>pour constater la vitesse de redis sur votre machine. Parcourons dès à présent les différents types de données de stockage.</p>
<h2>String</h2>
<p>C&rsquo;est le type le plus simple : à une clef, on peut y associer une valeur. Cette valeur peut-être une string de tout type (json, valeur d&rsquo;une image jpeg), mais aussi un entier. La limite est de 1 Go. Les principales commandes associées sont SET, GET, INCR, DECR, et GETSET.</p>
<pre>redis 127.0.0.1:6379&gt; SET compteur 10
OK
redis 127.0.0.1:6379&gt; INCR compteur
(integer) 11
redis 127.0.0.1:6379&gt; INCR compteur
(integer) 12
redis 127.0.0.1:6379&gt; GET compteur
"12"
redis 127.0.0.1:6379&gt; GETSET compteur 123
"12"
redis 127.0.0.1:6379&gt; GET compteur
"123"</pre>
<pre>redis 127.0.0.1:6379&gt; SET clef valeur
OK
redis 127.0.0.1:6379&gt; GET clef
"valeur"</pre>
<h2>Listes</h2>
<p>Les listes de redis sont des listes liées (linked list). Cela veut dire que même si vous avez des millions d&rsquo;enregistrement dans une liste, cela sera toujours aussi rapide d&rsquo;insérer un élément en tête ou en queue de liste. La contrepartie de cette vitesse est l&rsquo;accès à un élément dans la liste par son index. Les utilisateurs de ArrayList ou LinkedList en java connaissent bien cette différence. Les principales commandes commencent en général par <strong>L</strong> comme List et sont RPUSH et LPUSH (et leurs amies xPOP) qui permettent respectivement d&rsquo;ajouter un élément en fin ou en début de liste, LRANGE pour obtenir une partie des éléments de la liste, LINDEX pour obtenir un seul élément de la liste, LLEN pour obtenir la taille de la liste.</p>
<p><script type="text/javascript" src="https://gist.github.com/1373390.js">// <![CDATA[</p>
<p>// ]]&gt;</script>Comme vous pouvez le remarquer, le résultat sort dans l&rsquo;ordre dans lequel les données ont été rentrées, par besoin de ORDER BY de MySQL.</p>
<h2>Hash</h2>
<p>Une hash permet de stocker dans un même enregistrement plusieurs couples de clef/valeurs. Les commande de hash commencent&#8230; par un <strong>H</strong> comme Hash. On y trouve (vous avez déjà deviné je parie) HSET, HGET, HLEN, mais aussi HGETALL pour obtenir tous les couples clef-valeur, HINCRBY pour incrémenter un compteur dans la hash, HKEYS et HVALS pour obtenir toutes les clefs ou valeurs et HDEL pour faire le ménage.</p>
<pre>redis 127.0.0.1:6379&gt; HSET nosql redis "clef/valeur"
(integer) 1
redis 127.0.0.1:6379&gt; HSET nosql mongodb document
(integer) 1
redis 127.0.0.1:6379&gt; HSET nosql riak "fault tolerant"
(integer) 1
redis 127.0.0.1:6379&gt; HGET nosql redis
"clef/valeur"
redis 127.0.0.1:6379&gt; HGETALL nosql
1) "redis"
2) "clef/valeur"
3) "mongodb"
4) "document"
5) "riak"
6) "fault tolerant"
redis 127.0.0.1:6379&gt; HKEYS nosql
1) "redis"
2) "mongodb"
3) "riak"
redis 127.0.0.1:6379&gt; HVALS nosql
1) "clef/valeur"
2) "document"
3) "fault tolerant"
redis 127.0.0.1:6379&gt; HLEN nosql
(integer) 3</pre>
<h2>Sets</h2>
<p>Les Sets sont des collections d&rsquo;objets non ordonnées. Les commandes commencent toutes avec un <strong>S</strong> comme Set, parmi celles-ci on trouve SADD pour ajouter une valeur à un set, SCARD pour obtenir la taille (cardinalité) d&rsquo;un set, et surtout les commandes SINTER, SUNION, SDIFF qui permettent respectivement d&rsquo;obtenir l&rsquo;intersection, l&rsquo;union et la différences entre 2 sets. Ces commandes existent en version &laquo;&nbsp;STORE&nbsp;&raquo; ; ainsi SINTERSTORE permet de stocker dans un nouveau set l&rsquo;intersection de 2 autres. Dans l&rsquo;exemple suivant, nous allons modéliser ce qui se trouve au supermarché du coin et ce que j&rsquo;ai dans mon frigo (oui, certains éléments peuvent surprendre) :</p>
<pre>redis 127.0.0.1:6379&gt; SADD supermarche pommes
(integer) 1
redis 127.0.0.1:6379&gt; SADD supermarche poires
(integer) 1
redis 127.0.0.1:6379&gt; SADD supermarche scoubidous
(integer) 1
redis 127.0.0.1:6379&gt; SADD monFrigo beurre
(integer) 1
redis 127.0.0.1:6379&gt; SADD monFrigo pommes
(integer) 1
redis 127.0.0.1:6379&gt; SADD monFrigo TddByExample
(integer) 1
redis 127.0.0.1:6379&gt; SCARD monFrigo
(integer) 3
redis 127.0.0.1:6379&gt; SINTER supermarche monFrigo
1) "pommes"
redis 127.0.0.1:6379&gt; SUNION supermarche monFrigo
1) "scoubidous"
2) "pommes"
3) "poires"
4) "TddByExample"
5) "beurre"
redis 127.0.0.1:6379&gt; SDIFF supermarche monFrigo
1) "scoubidous"
2) "poires"</pre>
<h2>Sets triés</h2>
<p>Les sets triés (Sorted Set) sont similaires à des Sets mais ajoutent une notion de score aux valeurs ajoutées aux Set, ce qui permet de faire des tris. Les commandes commencent toutes par <strong>Z </strong>comme Zorted Set. On trouve donc les Zéquivalents des commandes précédentes, à savoir ZADD, ZCARD, ZINTER, ZUNION, ZDIFF mais aussi ZRANGE, ZRANGEBYSCORE et ZRANK qui tirent parti des scores des données stockées.</p>
<pre>redis 127.0.0.1:6379&gt; ZADD savants 1564 "Galilee"
(integer) 1
redis 127.0.0.1:6379&gt; ZADD savants 1643 "Isaac Newton"
(integer) 1
redis 127.0.0.1:6379&gt; ZADD savants 1571 "Johannes Kepler"
(integer) 1
redis 127.0.0.1:6379&gt; ZADD savants 1879 "Albert Einstein"
(integer) 1
redis 127.0.0.1:6379&gt; ZADD savants 1858 "Max Planck"
(integer) 1
redis 127.0.0.1:6379&gt; ZADD savants 1887 "Erwin Schrodinger"
(integer) 1
redis 127.0.0.1:6379&gt; ZRANGE savants 0 -1
1) "Galilee"
2) "Johannes Kepler"
3) "Isaac Newton"
4) "Max Planck"
5) "Albert Einstein"
6) "Erwin Schrodinger"
redis 127.0.0.1:6379&gt; ZREVRANGE savants 0 -1
1) "Erwin Schrodinger"
2) "Albert Einstein"
3) "Max Planck"
4) "Isaac Newton"
5) "Johannes Kepler"
6) "Galilee"
redis 127.0.0.1:6379&gt; ZREVRANGE savants 0 -1 WITHSCORES
 1) "Erwin Schrodinger"
 2) "1887"
 3) "Albert Einstein"
 4) "1879"
 5) "Max Planck"
 6) "1858"
 7) "Isaac Newton"
8 ) "1643"
 9) "Johannes Kepler"
10) "1571"
11) "Galilee"
12) "1564"</pre>
<p>Ce qui est intéressant, c&rsquo;est de pouvoir faire des requêtes sur les scores du set :</p>
<pre>redis 127.0.0.1:6379&gt; ZRANGEBYSCORE savants -inf 1800
1) "Galilee"
2) "Johannes Kepler"
3) "Isaac Newton"
redis 127.0.0.1:6379&gt; ZRANGEBYSCORE savants 1800 2010
1) "Max Planck"
2) "Albert Einstein"
3) "Erwin Schrodinger"</pre>
<p>On peut imaginer des tas d&rsquo;applications de calcul de poids de tags dans un blog par exemple (avec in ZINCRBY du nombre d&rsquo;occurrences du tag dans un corpus) ou à des fins de statistiques. Toutes ces commandes de lecture/écriture sont très rapides.</p>
<h2>Bref !</h2>
<p>A cette courte présentation, il faudrait ajouter les possibilité suivantes que nous n&rsquo;explorerons pas dans le cadre de cet article :</p>
<ul>
<li>une API Pub/Sub qui permet de poster et de recevoir des messages sur des &laquo;&nbsp;channels&nbsp;&raquo; ; cela peut paraître hors sujet mais cela permet d&rsquo;avoir un petit système de messaging pour pas cher (pas besoin d&rsquo;installer un serveur RabbitMQ en plus de votre base Redis). Pourquoi pas ;</li>
<li>donner une durée de vie à une clef (avec les commandes EXPIRE clef secondes ou EXPIREAT clef timestamp) : permet de laisser redis purger ses données sans avoir à écrire des scripts de purge ou de l&rsquo;utiliser comme cache distribué ;</li>
<li>passer une série de commandes dans une transaction (MULTI et EXEC) avec la possibilité de l&rsquo;éxécuter seulement si la clef change (avec WATCH à la place de EXEC);</li>
<li>utiliser plusieurs bases de données (16 disponibles) avec SELECT n ;</li>
<li>brancher un ou plusieurs slaves (tous sur le master ou les uns à la suite des autres, en cascade) : la réplication est extrêmement rapide ;</li>
<li>scripter des commandes dans le serveur avec le langage Lua, ce qui nous permet d&rsquo;apprendre un nouveau langage par la même occasion !</li>
</ul>
<p>Si vous avez de très nombreux accès en lecture par rapport à vos écritures, ce qui est le cas pour une vaste majorité de sites tel que twitter, vous pouvez multiplier les slaves pour accéder à vos données en lecture de manière très rapide et ne garder qu&rsquo;un seul master pour toutes vos écritures. Ainsi, vos temps de réponses seront très faibles et vos utilisateurs seront époustouflés par la vitesse de votre site.</p>
<p>Enfin, comme redis est open source, on constate rapidement que :</p>
<ul>
<li>c&rsquo;est bien écrit</li>
<li>le code est lisible</li>
<li>c&rsquo;est court (moins de 20 000 lignes de C)</li>
<li>il y a des tests unitaires</li>
</ul>
<p>Tout ceci rassure, donne confiance dans un produit qui est encore amené à évoluer (scripting, clustering, réplication, performances&#8230;). La blogosphère parle souvent de redis, des tutoriaux sont publiés régulièrement et de nombreux clients sont supportés.</p>
<h2>Clients</h2>
<p>Il existe de nombreux <a href="http://redis.io/clients">clients</a> redis dans de nombreux langages, vous trouverez forcément votre bonheur :</p>
<ul>
<li><a href="https://github.com/antirez/hiredis">C</a> / <a href="https://github.com/mrpi/redis-cplusplus-client">C++ </a>/ <a href="https://github.com/ServiceStack/ServiceStack.Redis">C#</a></li>
<li><a href="https://github.com/ragnard/redis-clojure">Clojure</a></li>
<li><a href="https://github.com/xetorthio/jedis">Java</a></li>
<li><a href="https://github.com/debasishg/scala-redis">Scala</a></li>
<li><a href="https://github.com/japerk/erldis">Erlang</a></li>
<li><a href="https://github.com/ezmobius/redis-rb">Ruby</a></li>
<li><a href="https://github.com/andymccurdy/redis-py">Python</a></li>
<li><a href="http://hackage.haskell.org/package/redis">Haskell</a></li>
<li><a href="https://github.com/alphazero/Go-Redis">Go</a></li>
<li><a href="https://github.com/nrk/redis-lua">Lua</a></li>
</ul>
<hr />
<p>Quelques liens :</p>
<ul>
<li>le site de <a href="http://redis.io/">redis</a>, avec sa <a href="http://redis.io/commands">documentation</a> et son <a href="http://github.com/antirez/redis">code source</a></li>
<li><a href="http://antirez.com/post/short-term-redis-plans.html">Short term Redis plans</a> où l&rsquo;auteur détaille l&rsquo;avenir de Redis</li>
<li><a href="http://antirez.com/post/take-advantage-of-redis-adding-it-to-your-stack.html">How to take advantage of Redis by just adding it to your stack</a> où l&rsquo;auteur de Redis donne de nombreux exemples d&rsquo;utilisation</li>
<li>l&rsquo;excellent article <a href="http://martinfowler.com/bliki/PolyglotPersistence.html">Polyglot Persistence</a>, par Martin Fowler</li>
<li><a href="http://openmymind.net/2012/1/23/The-Little-Redis-Book/">the little redis book</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.barreverte.fr/une-courte-introduction-a-redis/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
