{"id":287,"date":"2023-06-07T10:11:22","date_gmt":"2023-06-07T08:11:22","guid":{"rendered":"https:\/\/opatou.com\/?p=287"},"modified":"2023-06-30T18:30:33","modified_gmt":"2023-06-30T16:30:33","slug":"kata-tdd-string-calculator","status":"publish","type":"post","link":"https:\/\/opatou.com\/index.php\/2023\/06\/07\/kata-tdd-string-calculator\/","title":{"rendered":"Kata TDD &#8211; String Calculator"},"content":{"rendered":"\n<p>La mont\u00e9e en comp\u00e9tence dans les \u00e9quipes qu&#8217;on accompagne est essentielle! <\/p>\n\n\n\n<p>Le manifeste agile nous enseigne que : <\/p>\n\n\n\n<p>&#8220;Une attention continue \u00e0 l&#8217;excellence technique et \u00e0 une bonne conception renforce l\u2019Agilit\u00e9.&#8221;<\/p>\n\n\n\n<p>&#8220;La simplicit\u00e9 \u2013 c\u2019est-\u00e0-dire l\u2019art de minimiser la quantit\u00e9 de travail inutile \u2013 est essentielle.&#8221;<\/p>\n\n\n\n<p>&#8220;Les meilleures architectures, sp\u00e9cifications et conceptions \u00e9mergent d&#8217;\u00e9quipes autoorganis\u00e9es.&#8221;<\/p>\n\n\n\n<p>Animer un Kata TDD en entreprise est une excellente occasion d&#8217;illustrer ces 3 principes. J&#8217;ai donc pr\u00e9par\u00e9 le Kata String Calculator que je n&#8217;ai encore jamais anim\u00e9. Pour corser l&#8217;exercice les \u00e9quipes sont r\u00e9parties sur 3 sites : Toulouse, Bordeaux et Nantes et certains seront \u00e9videment en t\u00e9l\u00e9travail, j&#8217;ai donc pr\u00e9vu une salle \u00e9quip\u00e9e de Visio et pr\u00e9vu quelques points de resynchro pendant l&#8217;atelier tous les 15 minutes.<\/p>\n\n\n\n<p>D&#8217;autre part, j&#8217;essaie toujours de profiter de l&#8217;occasion d&#8217;un Kata de code pour le faire en pair programming et en associant un d\u00e9veloppeur \u00e0 non d\u00e9veloppeur (par exemple un PO, un Chef de Projet, un int\u00e9grateur ou m\u00eame un Managers). Peu importe, le bin\u00f4me en fait, ce qui importe c&#8217;est aussi de d\u00e9velopper la collaboration, de cr\u00e9er du lien et de croiser les exp\u00e9riences.<\/p>\n\n\n\n<p><strong>Aux Origine du TDD (Test Driven Development)<\/strong><\/p>\n\n\n\n<p>Le TDD est invent\u00e9 par Kent Back et formalis\u00e9 dans son livre \u00ab&nbsp;eXtreme Programing&nbsp;Explained\u00bb paru en 1999.<\/p>\n\n\n\n<p>Dans son livre il explique toute la d\u00e9marche d\u2019ing\u00e9nierie de d\u00e9veloppement et les pratiques associ\u00e9es. C&#8217;est une d\u00e9marche de conception (design) du code plut\u00f4t qu\u2019un moyen d\u2019\u00e9crire des tests unitaires. Le TDD est un mini cycle de d\u00e9veloppement constitu\u00e9 de 3 phases permettant un d\u00e9veloppement par toutes petites it\u00e9rations.<\/p>\n\n\n\n<p>Le TDD apporte plusieurs avantages \u00e0 la pratique du d\u00e9veloppement :<\/p>\n\n\n\n<p>\u2022Le code est souvent plus simple que lorsqu\u2019il est r\u00e9alis\u00e9 par une autre d\u00e9marche car il r\u00e9pond strictement aux exigences, ni plus, ni moins<\/p>\n\n\n\n<p>\u2022Le code est fortement couverts par les tests de par sa construction. Il est donc plus robuste.<\/p>\n\n\n\n<p>Ce n&#8217;est pas une recette magique, le TDD est facile \u00e0 comprendre en 5 minutes, mais n\u00e9cessite un d\u00e9clic de la personne pour passer \u00e0 la mise en pratique. Il faut donc s\u2019entrainer r\u00e9guli\u00e8rement avant de passer la mise en \u0153uvre quotidienne sur du code de production. C&#8217;est un peu comme si votre cerveau se mettait \u00e0 raisonner \u00e0 l&#8217;envers (ou plut\u00f4t \u00e0 l&#8217;endroit!)<\/p>\n\n\n\n<p>Le TDD ne co\u00fbte pas plus cher, m\u00eame si on pourrait croire qu&#8217;\u00e9crire plus de code (de test)  est un processus n\u00e9cessitant plus de temps. En r\u00e9alit\u00e9, on \u00e9crit moins de code de production et les tests \u00e9crits en TDD nous pr\u00e9munissent de beaucoup de r\u00e9gressions et de moins d&#8217;activit\u00e9 de debug du code lorsque l&#8217;on trouve une erreur\/anomalie. Le code \u00e9crit en TDD est aussi plus maintenable, et les r\u00e9gressions sont identifi\u00e9es tr\u00e8s rapidement (quelques millisecondes).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"614\" src=\"https:\/\/opatou.com\/wp-content\/uploads\/2023\/06\/CycleTDD-1024x614.png\" alt=\"Le cycle TDD est compos\u00e9 de 3 micro \u00e9tapes de d\u00e9veloppement : &quot;ROUGE : Ecrire un test en \u00e9chec&quot; par exemple v\u00e9rifier que 1 + 1 = 2, &quot;VERT : Faire passer le test&quot;, &quot;BLEU : remanier le code&quot;.\" class=\"wp-image-313\" srcset=\"https:\/\/opatou.com\/wp-content\/uploads\/2023\/06\/CycleTDD-1024x614.png 1024w, https:\/\/opatou.com\/wp-content\/uploads\/2023\/06\/CycleTDD-300x180.png 300w, https:\/\/opatou.com\/wp-content\/uploads\/2023\/06\/CycleTDD-768x460.png 768w, https:\/\/opatou.com\/wp-content\/uploads\/2023\/06\/CycleTDD-1536x921.png 1536w, https:\/\/opatou.com\/wp-content\/uploads\/2023\/06\/CycleTDD.png 1605w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">cycle de d\u00e9veloppement en TDD<\/figcaption><\/figure>\n\n\n\n<p><strong>Les lois de l&#8217;\u00e9criture du code en TDD<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Loi&nbsp;n<sup>o<\/sup>&nbsp;1<\/td><td>\u00c9crivez un test qui \u00e9choue avant d\u2019\u00e9crire le code de production correspondant.<\/td><\/tr><tr><td>Loi&nbsp;n<sup>o<\/sup>&nbsp;2<\/td><td>\u00c9crivez une seule assertion \u00e0 la fois, qui fait \u00e9chouer le test ou qui \u00e9choue \u00e0 la compilation.<\/td><\/tr><tr><td>Loi&nbsp;n<sup>o<\/sup>&nbsp;3<\/td><td>\u00c9crivez le minimum de code de production pour que l&#8217;assertion du test actuellement en \u00e9chec soit satisfaite.<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\">Les lois pour l&#8217;\u00e9crire du code en TDD<\/figcaption><\/figure>\n\n\n\n<p><strong>D\u00e9roul\u00e9 et animation du Kata String Calculator :<\/strong><\/p>\n\n\n\n<p>\u2022<em>Kata incr\u00e9mental pour simuler une situation m\u00e9tier r\u00e9elle<\/em>. <\/p>\n\n\n\n<p>\u2022<em>Suivez les \u00e9tapes dans l\u2019ordre mais ne lisez pas les \u00e9tapes suivantes avant d\u2019avoir pass\u00e9 \u00e9tape en cours!<\/em><\/p>\n\n\n\n<p>\u2022<em>On fait un petit point tous les \u00bc d\u2019heure sur l\u2019audio Teams<\/em><\/p>\n\n\n\n<p><strong>Step<\/strong><strong> 1<\/strong><strong> <\/strong><strong>:<\/strong><\/p>\n\n\n\n<p>Cr\u00e9ez un \u00ab&nbsp;calculateur de String&nbsp;\u00bb \u00e0 partir d\u2019une m\u00e9thode ayant la signature suivantes :<\/p>\n\n\n\n<p>&nbsp;<em> int add (String numbers)<\/em><\/p>\n\n\n\n<p>Cette m\u00e9thode peut prendre jusqu\u2019\u00e0 2 nombres, s\u00e9par\u00e9s par une virgule, et renverra leur somme.<\/p>\n\n\n\n<p><strong>Step<\/strong><strong> 2 :<\/strong><\/p>\n\n\n\n<p>Permettre \u00e0 la m\u00e9thode &#8220;<em>add(String )<\/em>&#8221; d\u2019ajouter une quantit\u00e9 inconnu de nombres<\/p>\n\n\n\n<p><strong>Step<\/strong><strong> <\/strong><strong>3<\/strong><strong> <\/strong><strong>:<\/strong><\/p>\n\n\n\n<p>Permettre \u00e0 la m\u00e9thode Add de g\u00e9rer les nouvelles lignes entre les nombre au lieu des virgules :<\/p>\n\n\n\n<p>\u2022Cette entr\u00e9e est <strong><font color=\"green\">OK<\/font><\/strong> : \u00ab&nbsp;<font color=\"red\">1\\n2,3<\/font>&nbsp;\u00bb r\u00e9sultat attendu : 6<\/p>\n\n\n\n<p>\u2022Cette entr\u00e9e est <strong><font color=\"red\">KO<\/font><\/strong> : \u00ab&nbsp;<font color=\"red\">1,\\n2<\/font>\u00bb<\/p>\n\n\n\n<p><strong>Step<\/strong><strong> 4 :<\/strong><\/p>\n\n\n\n<p>Permettre l\u2019usage de diff\u00e9rents d\u00e9limiteurs : \/\/[delimiter]\\n[numbers]<\/p>\n\n\n\n<p>Ex : \u00ab&nbsp;<font color=\"red\">\/\/;\\n3;1;2<\/font>&nbsp;\u00bb r\u00e9sultat attendu : 6<\/p>\n\n\n\n<p>\u00ab<font color=\"red\">\/\/|\\n1|3|2<\/font>&nbsp;\u00bb r\u00e9sultat attendu : 6<\/p>\n\n\n\n<p>La premi\u00e8re ligne est optionnelle. Les sc\u00e9narios pr\u00e9c\u00e9dents doivent toujours fonctionner.<\/p>\n\n\n\n<p><strong>Step<\/strong><strong> <\/strong><strong>5<\/strong><strong> <\/strong><strong>:<\/strong><\/p>\n\n\n\n<p>L\u2019appel \u00e0 la m\u00e9thode Add avec des nombres n\u00e9gatifs doit renvoyer une exception \u00ab&nbsp;n\u00e9gatifs non support\u00e9s&nbsp;\u00bb ainsi que le nombre n\u00e9gatif qui a \u00e9t\u00e9 pass\u00e9.<\/p>\n\n\n\n<p>Si plusieurs valeurs sont n\u00e9gatifs , ils doivent tous \u00eatre renvoy\u00e9s<\/p>\n\n\n\n<p><strong>Step<\/strong><strong> 6 :<\/strong><\/p>\n\n\n\n<p>Les nombres sup\u00e9rieurs \u00e0 1000 doivent \u00eatre ignor\u00e9s.<\/p>\n\n\n\n<p>Ajouter 1001 + 2 = 2<\/p>\n\n\n\n<p><strong>Step<\/strong><strong> <\/strong><strong>7 :<\/strong><\/p>\n\n\n\n<p>Les d\u00e9limiteurs peuvent contenir plusieurs caract\u00e8res avec le format suivant : \/\/[delimiteur]\\n par exemple :<\/p>\n\n\n\n<p>\u00ab<font color=\"red\">\/\/[sep]\\n2sep3sep1<\/font>&nbsp;\u00bb r\u00e9sultat attendu : 6<\/p>\n\n\n\n<p><strong>Step<\/strong><strong> 8 :<\/strong><\/p>\n\n\n\n<p>Permettre l\u2019usage de plusieurs d\u00e9limiteurs : \/\/[delimiteur1] [delimiteur2]\\n par exemple :<\/p>\n\n\n\n<p>\u00ab&nbsp;<font color=\"red\">\/\/[%][*]\\n2%3*1<\/font>&nbsp;\u00bb r\u00e9sultat attendu : 6<\/p>\n\n\n\n<p><strong>Step<\/strong><strong> 9 :<\/strong><\/p>\n\n\n\n<p>Assurez vous de pouvoir g\u00e9rer plusieurs d\u00e9limiteurs avec des longueurs de plus de 1 caract\u00e8re<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Les retours sur l&#8217;atelier :<\/strong><\/p>\n\n\n\n<p>Le temps \u00e9tait un peu court, il vaudrait mieux pr\u00e9voir 1h30 plut\u00f4t qu&#8217;1h.<\/p>\n\n\n\n<p>Il est important de prendre du temps pour le d\u00e9briefe en fin de session pour partager les diff\u00e9rentes solutions, chacun ayant produit une impl\u00e9mentation diff\u00e9rente des autres.<\/p>\n\n\n\n<p>Le nommage des tests est important, il permet de bien cibler quelle exigence fonctionnelle a subit une r\u00e9gression.<\/p>\n\n\n\n<p>Insister sur la partie &#8220;refactoring&#8221; du code pour s&#8217;assurer du bon nommage des variables, des classes, des m\u00e9thodes.<\/p>\n\n\n\n<p>La prochaine fois, j&#8217;insisterai en amont sur le besoin de disposer d&#8217;un projet &#8220;pr\u00eat&#8221; avec les tests unitaires qui fonctionnent. Un groupe a pass\u00e9 la moiti\u00e9 du temps \u00e0 modifier le pom.xml pour un probl\u00e8me de d\u00e9pendance vers la librairie des tests unitaires.<\/p>\n\n\n\n<p>Il est important de rester disponible pour chaque groupe afin de clarifier les exigences, qui m\u00eame si elles sont claires n\u00e9cessitent toujours des explications orales afin d&#8217;\u00e9viter de mauvaises interpr\u00e9tations.<\/p>\n\n\n\n<p><strong>ROTI de fin de session :<\/strong><\/p>\n\n\n\n<p>6 votes \u00e0 5 -1 vote \u00e0 4<\/p>\n\n\n\n<p>Le ROTI est d\u00e9fini comme &#8221; Retrun On Time Invested&#8221;, soit la valeur re\u00e7ue lors de l&#8217;atelier par rapport au temps investi. Une note de 1 signifie que la personne a perdu tout son temps rien avoir appris, tandis qu&#8217;une note de 5 signifie que la personne a re\u00e7ue beaucoup de valeur par rapport au temps investi, et qu&#8217;il aurait pu investir encore plus de temps lors de l&#8217;atelier. <\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>La mont\u00e9e en comp\u00e9tence dans les \u00e9quipes qu&#8217;on accompagne est essentielle! Le manifeste agile nous enseigne que : &#8220;Une attention continue \u00e0 l&#8217;excellence technique et \u00e0 une bonne conception renforce l\u2019Agilit\u00e9.&#8221; &#8220;La simplicit\u00e9 \u2013 c\u2019est-\u00e0-dire l\u2019art de minimiser la quantit\u00e9 de travail inutile \u2013 est essentielle.&#8221; &#8220;Les meilleures architectures, sp\u00e9cifications [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[7,77],"tags":[79,78],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/opatou.com\/index.php\/wp-json\/wp\/v2\/posts\/287"}],"collection":[{"href":"https:\/\/opatou.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opatou.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opatou.com\/index.php\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/opatou.com\/index.php\/wp-json\/wp\/v2\/comments?post=287"}],"version-history":[{"count":4,"href":"https:\/\/opatou.com\/index.php\/wp-json\/wp\/v2\/posts\/287\/revisions"}],"predecessor-version":[{"id":314,"href":"https:\/\/opatou.com\/index.php\/wp-json\/wp\/v2\/posts\/287\/revisions\/314"}],"wp:attachment":[{"href":"https:\/\/opatou.com\/index.php\/wp-json\/wp\/v2\/media?parent=287"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/opatou.com\/index.php\/wp-json\/wp\/v2\/categories?post=287"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opatou.com\/index.php\/wp-json\/wp\/v2\/tags?post=287"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}