L'Agilitateur - Mot-clé - softwareballCréation de logiciels : de l'agilité à l'artisanat2021-10-09T15:11:31+02:00urn:md5:7668924f626a6543fa389f1b4e47e529DotclearDuplication de code, refactoring et YAGNIurn:md5:abf537a67242b6878e3bfa9fce66dd392013-11-25T08:13:00+01:002013-11-25T08:29:02+01:00Olivier AzeauEn françaissoftwareball<p>En développement logiciel, la <a href="http://fr.wikipedia.org/wiki/Duplication_de_code">duplication de code</a> est un problème courant que l'on résout classiquement lors d'une étape de <a href="http://fr.wikipedia.org/wiki/Refactorisation">refactorisation</a>. Pour cela, encore faut-il identifier une duplication comme telle et accepter le coût de la refactorisation. En l'occurrence supprimer une duplication peut faire apparaître une abstraction que l'on jugera éventuellement, en se référant au principe <a href="http://fr.wikipedia.org/wiki/YAGNI">YAGNI</a> (You Aren't Gonna Need It), inutile.</p>
<p>La séquence "Right Angles" du jeu <a href="http://www.softwareball.org/">Soft(ware)Ball</a> permet de se confronter à ce dilemme.</p> <p>Cette séquence consiste à faire circuler un ballon en passant par les points A, B, C, D, E et F de l'aire de jeu dessinée ci-dessous.<br />
<br />
<img src="https://agilitateur.azeau.com/public/softwareball/rightangles1.png" alt="rightangles1.png" style="display:block; margin:0 auto;" title="rightangles1.png, nov. 2013" /></p>
<p><br />
La difficulté réside dans la découverte progressive de ce parcours. Lors de la première étape, on ne connaît l'existence que des points A et B et le trajet du ballon se limite à aller du point A au point B. Lors de la deuxième étape, on découvre le point C, puis le point D apparaît dans la troisième étape, etc.<br /></p>
<p>Lors de la première étape, la majorité des équipes<sup>[<a href="https://agilitateur.azeau.com/post/2013/11/25/Duplication-de-code%2C-refactoring-et-YAGNI#pnote-492-1" id="rev-pnote-492-1">1</a>]</sup> va au plus simple : un composant, appelons-le Nathan est positionné sur le point A et un autre composant, Emma, est positionné sur le point B.<br />
Nathan est programmé avec la règle : "Quand je reçois la balle, je l'envoie à Emma". Cela coûte 2 points et c'est le mieux que l'on puisse faire pour remplir le contrat.<br />
Emma n'a pas besoin d'être programmée car elle attrape implicitement la balle que Nathan lui envoie.<br />
<br />
<img src="https://agilitateur.azeau.com/public/softwareball/rightangles3.png" alt="rightangles3.png" style="display:block; margin:0 auto;" title="rightangles3.png, nov. 2013" /></p>
<p><br />
Lors de la 2ème étape, le point C apparaît et, là encore, la majorité des équipes va au plus simple. On rajoute un composant "Lucas" sur le point C et on programme Emma avec la règle "Quand je reçois la balle, je l'envoie à Lucas" qui coûte 2 points supplémentaires.<br />
<br />
<img src="https://agilitateur.azeau.com/public/softwareball/rightangles4.png" alt="rightangles4.png" style="display:block; margin:0 auto;" title="rightangles4.png, nov. 2013" /></p>
<p><br />
On peut continuer cette approche "facile" jusqu'au bout<sup>[<a href="https://agilitateur.azeau.com/post/2013/11/25/Duplication-de-code%2C-refactoring-et-YAGNI#pnote-492-2" id="rev-pnote-492-2">2</a>]</sup> et aboutir à la programmation suivante pour un coût total de 12 points :</p>
<ul>
<li>Nathan : "Quand je reçois la balle, je l'envoie à Emma"</li>
<li>Emma : "Quand je reçois la balle, je l'envoie à Lucas"</li>
<li>Lucas : "Quand je reçois la balle, je l'envoie à Lola"</li>
<li>Lola : "Quand je reçois la balle, je l'envoie à Enzo"</li>
<li>Enzo : "Quand je reçois la balle, je l'envoie à Chloé"</li>
<li>Chloé : "Quand je reçois la balle, je l'envoie à Nathan"</li>
</ul>
<p><br />
<img src="https://agilitateur.azeau.com/public/softwareball/rightangles5.png" alt="rightangles5.png" style="display:block; margin:0 auto;" title="rightangles5.png, nov. 2013" /></p>
<p>La plupart des équipes, toutefois, choisissent, à un moment donné de refactoriser le code pour supprimer une duplication en introduisant un programme "Quand je reçois la balle, je l'envoie au composant qui est situé à ma gauche" ou "Quand je reçois la balle, je l'envoie au composant qui est situé à ma droite". Chacune d'entre elles coûte 3 points mais elles sont réutilisables sans aucun coût supplémentaire.<br />
<br />
Par exemple, lors de la quatrième étape, on voit facilement<sup>[<a href="https://agilitateur.azeau.com/post/2013/11/25/Duplication-de-code%2C-refactoring-et-YAGNI#pnote-492-3" id="rev-pnote-492-3">3</a>]</sup> que Emma et Lola font exactement la même chose. Une équipe qui déciderait de refactoriser à ce moment là terminerait avec la programmation suivante pour un coût total de 9 points :</p>
<ul>
<li>Nathan : "Quand je reçois la balle, je l'envoie au composant qui est situé à ma gauche" (avec auparavant "Quand je reçois la balle, je l'envoie à Emma" utilisé jusqu'à la 5ème étape)</li>
<li>Emma : "Quand je reçois la balle, je l'envoie au composant qui est situé à ma gauche" (avec auparavant "Quand je reçois la balle, je l'envoie à Lucas" utilisé jusqu'à la 3ème étape)</li>
<li>Lucas : "Quand je reçois la balle, je l'envoie à Lola"</li>
<li>Lola : "Quand je reçois la balle, je l'envoie au composant qui est situé à ma gauche"</li>
<li>Enzo : "Quand je reçois la balle, je l'envoie au composant qui est situé à ma gauche"</li>
<li>Chloé : "Quand je reçois la balle, je l'envoie au composant qui est situé à ma gauche"</li>
</ul>
<p>Le meilleur score possible permet de terminer avec seulement un coût total de 5 points. Pour cela, il faut commencer le refactoring dès la 2ème étape (alors qu'on ne sait même pas s'il va être utile...)</p>
<ul>
<li>Etape 1 :
<ul>
<li>Nathan : "Quand je reçois la balle, je l'envoie à Emma" (2 points)</li>
</ul></li>
<li>Etape 2 :
<ul>
<li>Nathan : "Quand je reçois la balle, je l'envoie à Emma"</li>
<li>Emma : "Quand je reçois la balle, je l'envoie au composant qui est situé à ma gauche" (3 points)</li>
</ul></li>
<li>Etape 3 :
<ul>
<li>On déplace Nathan au point C, Emma au point D, Lola au point B et Lucas au point A (et positionné perpendiculairement à (AB)) ce qui nous permet de réutiliser l'ensemble des programmes déjà disponibles</li>
<li>Lucas : "Quand je reçois la balle, je l'envoie au composant qui est situé à ma gauche"</li>
<li>Lola : "Quand je reçois la balle, je l'envoie au composant qui est situé à ma gauche"</li>
<li>Nathan : "Quand je reçois la balle, je l'envoie à Emma"</li>
<li>Emma : rien</li>
</ul></li>
<li>...</li>
<li>Etape 6 :
<ul>
<li>Lucas : "Quand je reçois la balle, je l'envoie au composant qui est situé à ma gauche"</li>
<li>Lola : "Quand je reçois la balle, je l'envoie au composant qui est situé à ma gauche"</li>
<li>Nathan : "Quand je reçois la balle, je l'envoie à Emma"</li>
<li>Emma : "Quand je reçois la balle, je l'envoie au composant qui est situé à ma gauche"</li>
<li>Enzo : "Quand je reçois la balle, je l'envoie au composant qui est situé à ma gauche"</li>
<li>Chloé : "Quand je reçois la balle, je l'envoie au composant qui est situé à ma gauche"</li>
</ul></li>
</ul>
<p><img src="https://agilitateur.azeau.com/public/softwareball/rightangles6.png" alt="rightangles6.png" style="display:block; margin:0 auto;" title="rightangles6.png, nov. 2013" />
<br />
J'ai pu observer des équipes utilisant toutes entre 8 et 12 points pour arriver au bout de cette séquence.<br />
A chaque fois, la question de la refactorisation s'est rapidement posée et les réponses ont été variées : choix de code factorisé en passant à une approche plus générique ou attente de ce qui viendra après.<br />
A chaque fois, ces choix ont été collectifs avec des intentions opposées exprimées au sein de l'équipe.<br />
<strong>Cela montre que la notion de code dupliqué n'a pas une définition unique pour tout le monde, surtout si la suppression de la duplication induit un coût non négligeable.</strong></p>
<p>Pour ceux qui voudraient tenter l'expérience, cette séquence peut se jouer en environ une heure (20 minutes de présentation+30 minutes de jeu+10 minutes de debriefing). Le matériel (présentation du jeu, cartes, feuille de score) est disponible sur le site <a href="http://www.softwareball.org/">Soft(ware)Ball</a>. C'est d'ailleurs une bonne façon de découvrir le jeu avant d'attaquer des séquences plus difficiles.</p>
<div class="footnotes"><h4 class="footnotes-title">Notes</h4>
<p>[<a href="https://agilitateur.azeau.com/post/2013/11/25/Duplication-de-code%2C-refactoring-et-YAGNI#rev-pnote-492-1" id="pnote-492-1">1</a>] J'ai fait jouer cette séquence lors des <a href="http://agiletour-montpellier.fr/">Agile Tour Montpellier</a>, <a href="http://agiletourbordeaux.okiwi.org/">Agile Tour Bordeaux</a>, <a href="http://sessions.agile-grenoble.org/program#session_detail_76">Agile Grenoble</a>.</p>
<p>[<a href="https://agilitateur.azeau.com/post/2013/11/25/Duplication-de-code%2C-refactoring-et-YAGNI#rev-pnote-492-2" id="pnote-492-2">2</a>] une équipe l'a fait</p>
<p>[<a href="https://agilitateur.azeau.com/post/2013/11/25/Duplication-de-code%2C-refactoring-et-YAGNI#rev-pnote-492-3" id="pnote-492-3">3</a>] ce fut le cas pour toutes les équipes qui ont joué cette séquence</p></div>