<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Codingly &#187; Agile</title>
	<atom:link href="http://codingly.com/tag/agile/feed/" rel="self" type="application/rss+xml" />
	<link>http://codingly.com</link>
	<description>Par Romain Verdier</description>
	<lastBuildDate>Fri, 27 Jan 2012 13:42:50 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='codingly.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/62c090a2ec42be744d871177bd874854?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Codingly &#187; Agile</title>
		<link>http://codingly.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://codingly.com/osd.xml" title="Codingly" />
	<atom:link rel='hub' href='http://codingly.com/?pushpress=hub'/>
		<item>
		<title>L&#8217;effet Tetris en informatique</title>
		<link>http://codingly.com/2008/05/20/leffet-tetris-en-informatique/</link>
		<comments>http://codingly.com/2008/05/20/leffet-tetris-en-informatique/#comments</comments>
		<pubDate>Tue, 20 May 2008 19:16:04 +0000</pubDate>
		<dc:creator>Romain Verdier</dc:creator>
				<category><![CDATA[Posts]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Algorithmie]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[Methodes]]></category>
		<category><![CDATA[Refactoring]]></category>

		<guid isPermaLink="false">http://romainverdier.wordpress.com/?p=50</guid>
		<description><![CDATA[Quand on est au niveau 3, ça va, on peut encore placer les pièces comme on le veut. Je veux dire par là qu&#8217;il est possible de les placer de façon presque optimale, pour faire un gros bloc bien compact sur la gauche de l&#8217;écran en attendant une grande barre pour dégager 4 lignes d&#8217;un [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codingly.com&amp;blog=3510695&amp;post=50&amp;subd=romainverdier&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Quand on est au niveau 3, ça va, on peut encore placer les pièces comme on le veut. Je veux dire par là qu&#8217;il est possible de les placer de façon presque optimale, pour faire un gros bloc bien compact sur la gauche de l&#8217;écran en attendant une grande barre pour dégager 4 lignes d&#8217;un coup. Les 4 lignes d&#8217;un coup, ça s&#8217;appelle un <a href="http://en.wikipedia.org/wiki/Tetris">Tetris</a>, d&#8217;ailleurs.</p>
<p><img src="http://romainverdier.files.wordpress.com/2008/05/tetris.jpg?w=720" alt="Tetris" class="alignleft wp-image-51 image-border" />Lorsqu&#8217;on arrive au niveau 10, par exemple, il devient plus dur d&#8217;enchainer les Tetris. Je suis certain qu&#8217;on peut trouver un japonais sur YouTube qui y parvient en chantant le générique de Naruto à l&#8217;envers, mais nous ne nous laisserons pas distraire pas les exceptions de ce genre aujourd&#8217;hui. Au niveau 10, on ne peut pas enchainer les Tetris, c&#8217;est tout. Pourtant, il y a pas mal de gens qui arrivent à tenir un moment au niveau 10, jusqu&#8217;au niveau 11 même, et <a href="http://fr.youtube.com/watch?v=jwC544Z37qo">beaucoup plus loin encore</a>.</p>
<p>Parce qu&#8217;ils ne cherchent pas à enchainer les Tetris, justement. S&#8217;ils essayaient, le temps de réflexion nécessaire au placement de chaque pièce serait largement supérieur à celui qui leur serait accordé. Les pièces tomberaient alors les unes après les autres sans avoir été pilotées, en formant un petit tas famélique qui atteindrait rapidement le haut de l&#8217;écran.</p>
<p>La conclusion est la suivante : <em>Le choix d&#8217;une solution &#8220;assez bonne&#8221; peut s&#8217;avérer plus rentable que d&#8217;investir beaucoup de temps et d&#8217;efforts dans la recherche d&#8217;une solution &#8220;très bonne&#8221;, ou &#8220;parfaite&#8221;</em>.</p>
<p>Et ça a même un nom : l&#8217;<a href="http://fr.wikipedia.org/wiki/Effet_Tetris">effet (ou stratégie) Tetris</a>. On en trouve quelques bons exemples d&#8217;application dans le monde de l&#8217;informatique.<br />
<span id="more-50"></span></p>
<h3>Les heuristiques</h3>
<p><img src="http://romainverdier.files.wordpress.com/2008/05/pvc.jpg?w=720" alt="PVC" class="alignright wp-image-51 image-border" />Lorsque j&#8217;ai découvert les <a href="http://fr.wikipedia.org/wiki/Algorithme_g%C3%A9n%C3%A9tique">algorithmes génétiques</a>, j&#8217;ai été complètement bluffé. Ils permettent d&#8217;apporter des réponses non-optimales (mais exploitables) à des problèmes auxquels il n&#8217;existe aucune méthode de résolution déterministe capable d&#8217;être mise en application. Généralement, c&#8217;est parce que nous ne disposons pas de la puissance de calcul nécessaire. Les algorithmes génétiques &#8211; et plus globalement les <a href="http://fr.wikipedia.org/wiki/M%C3%A9taheuristique">métaheuristiques</a> et les <a href="http://fr.wikipedia.org/wiki/Heuristique">heuristiques</a> &#8211; sont donc une illustration parfaite de l&#8217;effet Tetris. Si je prends l&#8217;exemple très scolaire du <a href="http://fr.wikipedia.org/wiki/Probl%C3%A8me_du_voyageur_de_commerce">voyageur de commerce</a> qui doit visiter N villes en optimisant son trajet, on peut constater que :</p>
<ul>
<li>La façon de trouver le meilleur chemin est simple : on les mesure tous et on prend le plus court. Seulement, on est confronté à une explosion combinatoire puisque pour N villes il y a (N-1)! trajets possibles. Cette méthode, permettant de trouver <strong>la</strong> solution du problème, nécessite un investissement trop important. La plupart du temps, elle n&#8217;est donc pas rentable, voire inenviseagable.</li>
<li>
Les algorithmes génétiques permettent de trouver une solution &#8220;acceptable&#8221;. On ne peut pas savoir si la solution trouvée est la meilleure solution, mais on sait qu&#8217;il s&#8217;agit d&#8217;une bonne solution. L&#8217;effet Tetris est remarquable ici, puisque dans ce cas, l&#8217;approche conduisant à déterminer rapidement une bonne solution est quasiment toujours préférable à celle qui donnerait la meilleure solution.                                                                                                         </li>
</ul>
<p>C&#8217;est une méthode qui est utilisée en <a href="http://fr.wikipedia.org/wiki/Intelligence_artificielle">IA</a>, et dans pas mal d&#8217;autres domaines dans lesquels on préfère obtenir une réponse approchée rapidement plutôt qu&#8217;une réponse exacte au bout d&#8217;une heure. C&#8217;est peut-être pour ça que mes péons étaient aussi cons dans Age Of Empires.</p>
<h3>Méthodes Agiles et refactoring</h3>
<p>A un autre niveau, mais toujours dans l&#8217;ingénierie logicielle, les méthodes agiles et les idées qu&#8217;on y associe généralement sans pour autant qu&#8217;elles en soient originaires peuvent faire penser à la stratégie Tetris. Dans un processus <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a>, par exemple, on invite à faire en sorte qu&#8217;un test unitaire donné passe, avant de procéder à une phase de refactoring. On privilégie ainsi la résolution <strong>fonctionnelle</strong> du problème avant sa résolution <strong>parfaite</strong>, qui impliquerait que le test passe <strong>et</strong> que la solution technique &#8211; l&#8217;implémentation &#8211; soit également idéale, si tant est que cela soit possible.</p>
<p><img src="http://romainverdier.files.wordpress.com/2008/05/perfectsoftware.jpg?w=720" alt="Perfect Software" class="alignleft wp-image-51 image-border" />Avec un peu de pratique on se rend compte qu&#8217;effectivement, en adoptant ce modèle itératif, on arrive à réaliser des solutions qui sont plus simples que celles qui auraient résulté d&#8217;une longue phase d&#8217;analyse préliminaire. Les périodes de refactoring successives ont entre autres pour but de garantir la qualité du design, et de ne pas compromettre les éventuelles évolutions ultérieures.</p>
<p>Il existe d&#8217;autres principes, comme <a href="http://en.wikipedia.org/wiki/KISS_principle">KISS</a> (<em>Keep It Stupid Simple</em>) ou <a href="http://en.wikipedia.org/wiki/You_Ain%27t_Gonna_Need_It">YAGNI</a> (<em>You Ain&#8217;t Gonna Need It</em>) qui semblent également reconnaitre une certaine pertinence à la stratégie Tetris. En rappelant au développeur qu&#8217;il n&#8217;est pas nécessaire d&#8217;anticiper à outrance ou d&#8217;imaginer des solutions qui ne répondent à aucun besoin réel, on lui évite de voir son travail et son effort balayés au cours de l&#8217;évolution du projet. Mieux, on évite que le projet lui-même soit pollué et complexifié sans raison.</p>
<p>Pour revenir à l&#8217;effet Tetris, essayons de détailler le parallèle :</p>
<ul>
<li>Le niveau 10 correspond assez souvent au contexte dans lequel un projet informatique professionnel s&#8217;inscrit. Il y a des enjeux, des contraintes, des obligations, des engagements, de l&#8217;argent, de la pression, des deadlines, etc. En comparaison, le niveau 3, c&#8217;est l&#8217;implémentation de la classe <em>Date</em> en 2 semaines par des élèves de première année. (Qui gère les années bissextiles.)</li>
<li>Le passage au niveau 11 peut être considéré comme la réussite de la première version du projet. Ah, si tout était aussi évident, etc.</li>
<li>Vouloir dégager les lignes 4 par 4, ça correspond à vouloir mettre en place dès le début du projet une solution complexe capable de répondre à tous les besoins en s&#8217;appuyant sur une architecture idéale. C&#8217;est presque impossible, en fonction de la nature du projet. Donc, dans le meilleur des cas, on arrive à survivre jusqu&#8217;au niveau 11, mais l&#8217;écran est tellement encombré que le niveau 12 est à oublier (la version 2.0 du projet, si vous suivez&#8230;). Le reste du temps, on n&#8217;arrive même pas à passer le niveau 10.</li>
<li>Au contraire, rester raisonnable et chercher à faire disparaitre les lignes une par une, ça ressemble beaucoup aux itérations et au refactoring. On ne place pas les pièces de façon à préparer un éventuel Tetris : on les place de façon à garder l&#8217;écran dégagé. La plupart du temps, on y parvient en éliminant une ligne à la fois, mais parfois on se surprend à pouvoir en faire disparaitre 2 ou 3 d&#8217;un coup. Le parallèle que l&#8217;on peut faire avec le <a href="http://softwareengineering.vazexqi.com/articles/2006/10/08/ddd-breakthrough">Refactoring Breakthrough</a> dont parle <a href="http://blog.sym-link.com/">Evans</a> dans <a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215">Domain Driven Design</a> est assez étonnant.</li>
</ul>
<h3>Conclusion</h3>
<p>Ok, le dernier exemple peut être considéré comme une digression en ce sens où il s&#8217;agit plus d&#8217;une métaphore que d&#8217;une illustration de l&#8217;effet Tetris. Mais il est intéressant de voir que le principe est à la base de nombreuses techniques et méthodes. Evidemment, si on sort du domaine de l&#8217;informatique, de nouvelles observations peuvent être conduites.</p>
<p>Que pensez-vous de la communication orale chez les humains, et plus précisément des dialogues, à ce sujet ?</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/romainverdier.wordpress.com/50/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/romainverdier.wordpress.com/50/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/romainverdier.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/romainverdier.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/romainverdier.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/romainverdier.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/romainverdier.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/romainverdier.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/romainverdier.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/romainverdier.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/romainverdier.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/romainverdier.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/romainverdier.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/romainverdier.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/romainverdier.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/romainverdier.wordpress.com/50/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codingly.com&amp;blog=3510695&amp;post=50&amp;subd=romainverdier&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codingly.com/2008/05/20/leffet-tetris-en-informatique/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cb0ee4bde49708f4be24a02a5d59e52e?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">Romain</media:title>
		</media:content>

		<media:content url="http://romainverdier.files.wordpress.com/2008/05/tetris.jpg" medium="image">
			<media:title type="html">Tetris</media:title>
		</media:content>

		<media:content url="http://romainverdier.files.wordpress.com/2008/05/pvc.jpg" medium="image">
			<media:title type="html">PVC</media:title>
		</media:content>

		<media:content url="http://romainverdier.files.wordpress.com/2008/05/perfectsoftware.jpg" medium="image">
			<media:title type="html">Perfect Software</media:title>
		</media:content>
	</item>
	</channel>
</rss>
