Le demi-cercle (épisode 5 -- Brown Bag Lunch)
Jérémie arrive le premier, il s’installe près du rétroprojecteur et sort un sandwich d’un sac en papier craft.
- Donc si je comprends bien, tu nous proposes de passer la pause déjeuner sur le code d’XXL.. - Oui. En mode expérimentation, note bien. C’est juste un essai. - Ne t’embête pas à trouver des raisons, je te charrie, c’est tout.
Farid et Audrey s’installent à leur tour. Farid demande : - Est-ce que tu pourrais nous expliquer ce que tu entends, déjà, par Mob programming ? - Plutôt que de tenter des explications, je vous propose d’essayer, si vous êtes d’accord. - On est d’accord, dit Audrey. La question c’est : sur quoi ?
Le projecteur est en marche. Tu fouilles dans les répertoires sources du projet XXL, en disant : - Il nous faudrait une story qui ne soit pas commencée, je pense. - Prends la numéro 106.
Tu cliques sur un rectangle jaune et une pop-up s’ouvre
En tant qu’utilisateur, je souhaite pouvoir répartir le budget sur une période quelconque.
Jérémie fait remarquer : - C’est vague.
Audrey explique : - Aujourd’hui les budgets sont calculés sur la base du semestre. L’utilisateur entre un montant, et le programme répartit le mensuel en divisant par six. Ce qu’il faudrait, c’est pouvoir entrer un nombre de mois, et le montant serait réparti sur tous ces mois. - Un nombre de mois et aussi un mois de départ, tu veux dire ? - Ce n’est pas précisé. - Comment le programme doit-il déterminer le mois de départ ? Il le devine ? - Jérémie, tu aurais vraiment dû venir à cette réunion de backlog grooming. - J’avais piscine. - C’est pas drôle.
Respiration. Tu te dis « J’aurais dû commencer avec le kata bowling ». Tu dis : - En cas de besoin, on peut toujours appeler Charlène. - Ok. - Voilà comment on va s’organiser : la personne assise devant le clavier est le driver. Les autres participants sont des navigateurs. Le rôle du driver consiste à implémenter ce que les navigateurs lui disent d’implémenter. Le driver ne peut pas décider tout seul du code qu’il doit écrire, il attend les instructions de la part des navigateurs. Le driver ne pense pas.
- OK! Je peux être le driver ? dit Jérémie. - On va changer de driver toutes les dix minutes, de façon à ce que chacun essaie les deux rôles. - Alors prem’s! dit Jérémie.
Il s’installe à ta place devant le clavier.
Audrey se lance : - La première chose à faire, c’est regarder le code de la classe SemesterBudgetManager. Voilà. Va sur la méthode DefineBudget. Elle prend en argument le montant du budget. - Comment est-ce qu’elle sait sur quel semestre on travaille ? Demande Farid. - C’est un des champs de la classe.
Assis au fond de la salle de réunion, vous scrutez le code de la classe, non sans difficulté, du fait que Jérémie déplace la fenêtre de l’éditeur bien trop vite.
Farid dit : - C’est touffu comme code.
Audrey explique : - C’était une partie de la couche métier de l’appli Gramma qu’on a récupéré après que la boîte a racheté GM-Soft. - J’aurais pas écrit ça comme ça, dit Farid. - En fait, je suis étonnée que tu ne sois jamais entré dans ce code. - Peut-être, mais c’est pourtant le cas. J’ai assez de travail avec la partie Front, figure-toi.
Audrey s’adresse à Jérémie : - Il suffit d’ajouter un champ StartingMonth ou BeginMonth, quelque chose de ce genre. - StartingMonth ou BeginMonth ? demande Jérémie. - BeginMonth ne veut rien dire intervient Farid. Tant qu’à coder en Anglais... - Ça ne change pas le problème répond Jérémie : comment la classe va savoir que le mois de départ n’est pas déjà dans un budget ? - On n’a qu’à ajouter un paramètre dans le constructeur. - Ajouter un paramètre dans le constructeur ?
Ton portable sonne. Dix minutes se sont écoulées. Tu dis : - Je vais prendre le clavier. Jérémie, tu rejoins les navigateurs. Jérémie reprend : - Donc, comment est-ce que la classe va valider que le mois de départ n’est pas déjà budgeté ?
Audrey répond : - Ce n’est pas décrit dans la story. Mais je pense que si tu regardes dans la classe CalendarBudgetManager, il doit y avoir une méthode qui s’occupe de ça. ToF, ouvre la classe CalendarBudgetManager. Elle est dans le module Calendar.
Tu navigues dans les sous-répertoires. Tu vois cette base de code d’un œil différent soudain. C’est comme une lumière blafarde produite au milieu d’une pièce en décombres, après que l’équipe de secours a pu amener un groupe électrogène. On n’y voit pas très loin, mais au moins on peut partager un premier état des lieux.
Tu écoutes Farid et Jérémie débattre de la prochaine action à faire.
- Tu déclares un nouveau constructeur, différent du constructeur par défaut, qui prendra le mois de départ en paramètre. - Mais non ! Il y a des règles pour la persistance, tu ne peux pas bricoler des nouveaux constructeurs dès que l’envie t’en prend. - C’est temporaire. Le temps de comprendre comment on peut faire marcher cette classe avec la nouvelle story. - Temporaire, tu parles. Si tu vas par là, on est plus du tout dans la logique de départ. Et en plus, on met à mal le Single Responsibility Principle. - Rappelle-moi ce que c’est ?
Il le lui rappelle. Huit minutes ont passé, et tu n’as pas édité le code une fois. Audrey essaie de joindre Charlène pour avoir des compléments d’information, sans succès. Jérémie dit en regardant le code avec amertume : - C’est ni fait ni à faire, ton idée. - Ça ferait avancer le schmilblic au moins.
L’alarme sonne. Farid prend le clavier. Tu suggères : - Est-ce qu’on pourrait déjà faire tourner le code, en mettant un break et un print pour savoir ce qui se passe quand la méthode est lancée ? - Ok. On fait ça.
Farid pose un break, insère une commande de print. Ensuite, il lance l’application. L’application ne démarre pas, parce qu’un paramètre de l’environnement de recette n’est plus positionné. Vous cherchez le paramètre. Vous relancez deux fois par accident un script de reset des données de test, ce qui a pour effet de changer tous les résultats des calculs précédents, et de ce fait le poste de budget choisi pour le test ne peut plus être dévalidé et rebudgété.
Après trois tours de drivers, vous pouvez enfin lancer le calcul de budget. Le calcul est effectué, et le programme retourne au menu. Il n’est pas passé par le point d’arrêt posé par Farid.
Jérémie s’esclaffe. - Sans rire ! La méthode n’est jamais appelée. - Oh là là là là… - Remarque, ça ne m’étonne pas, parce que je me disais que ce code ne ressemble pas au code habituel de la couche métier. Il n’est pas formaté de la même façon. - Si ça se trouve, c’est du code mort. - On ferait bien de le supprimer dans ce cas-là.
Audrey intervient : - On ne touche à rien s’il vous plaît. J’ai passé assez de temps dans le bureau de Maria la semaine dernière. Je n’aimerais pas avoir à lui expliquer en long, en large et en travers, et en n’oubliant aucun détail, pourquoi on a des régressions sur le module Budget.
Tu considères l’étendue des dégâts. Ce groupe électrogène a une autonomie limitée. Il est déjà treize heures trente.
Jérémie expose une solution. - Ce qu’il faudrait, c’est revoir le modèle avec la Product Owner, et refaire complètement la conception du module. Pour bien faire, il faudrait revoir la conception de toute la couche métier en fait. - Comme si on allait avoir les moyens de se lancer dans une refonte. - Et du coup pour ma story ? On fait quoi ?
Tu proposes un tour de table avant de terminer la session.
Farid dit : - C’est intéressant, je pense que ça peut marcher, mais il faut un ordre du jour très clair. Et plus de précision dans les user story, aussi.
Jérémie dit : - L’intention est bonne, mais il faut être réaliste. Le design de l’appli ne se prête pas à ce genre d’expérience. Et franchement, il faudrait faire une analyse du code source pour détecter le code mort, et s’en débarrasser une bonne fois pour toute.
Audrey dit : - J’étais intéressée par l’idée, surtout après ce que j’avais vu au Dojo il y a deux semaines. Mais là, j’ai l’impression qu’on se contente de remarquer des problèmes sans pouvoir s’y attaquer. Et on n’est pas du tout d’accord sur les solutions possibles.
- On peut se mettre d’accord, dit Farid, c’est juste qu’il faut plus de temps. - Moi je ne suis pas d’accord, dit Jérémie. Si on n’a pas les mêmes principes à la base, autant travailler chacun sur son domaine de responsabilité, ce sera plus efficace. - Et rendez-vous à la fin ? demande Farid. Elle va être belle l’application. - Ça dépend de quel point de vue tu te places, rétorque Jérémie.
Audrey les interrompt d’un geste et te regarde. Tu dis : - Je suis un peu déçu. D’un côté, on discute enfin de cette fameuse couche métier, et ça faisait un certain temps que je trouvais cette discussion nécessaire. D’un autre côté, vu le temps qu’il nous faut à quatre rien que pour lancer une pauvre action de recalcul de budget… - … Et comprendre ce qui se passe ! - Et comprendre ce qui se passe, j’ai des doutes sur la démarche.
Jérémie se lève : - C’est pas le tout. Il faut que je retourne à ma technical story.
Le groupe fait le ménage et remet les chaises en place. Audrey est déjà dans le couloir, en route pour sa réunion de 14 heures.
Elle lance : - Éteignez en repartant !
(à suivre) Episodes Précédents : 1 -- Si le code pouvait parler 2 -- Voir / Avancer 3 -- Communication Breakdown 4 -- Driver / Navigator