Le demi-cercle (épisode 29 -- Aménagement)
Remember, code is your house, and you have to live in it. Michael Feathers
Story 437 En tant qu'utilisateur, je voudrais créer un budget-type exportable d'une société à l'autre, afin de reprendre facilement une activité. --- /?\ jusqu’où va l’exportation : données de répartition / descriptif des rubriques / tout le référentiel ? /?\
Est-ce parce que les choses se défont imperceptiblement ? Est-ce parce que nous n'y mettons pas assez de soin ? S'il fallait impérativement y mettre tout le soin possible, combien de temps prendrait chaque changement dans cette base de code ? Est-ce qu'il s'agit seulement de la base de code d'ailleurs ? Nous accumulons des fonctionnalités dans cette application, comme on empile les dossiers dans une armoire. Pas sûr que l'armoire soit faite exactement pour ça à l'origine, mais on fait avec. Tous ces nouveaux besoins, cette nouvelle logique, ces changements imprévus, il faut bien mettre ça quelque part. Nous les rangeons là. En attendant mieux. Et au fur et à mesure, et parfois même très brutalement, les choses se détériorent. La conception, qui était pourtant limpide sur le papier, ne va plus. La voie qu'on avait imaginée, ("pour chaque nouvelle feature il suffira d'ajouter un plug-in après adaptation de la base") s'avère impraticable. Il est trop tard pour changer de direction, bien sûr. On n'a plus le temps. Et si on avait le temps, la démarche pour changer la conception serait elle-même sujette à discussion. Pour ce qu’on en sait, n’importe quelle personne extérieure à l’équipe, du seul fait qu’elle (n’habite pas cet immeuble) ne connaît pas l’application, pourrait remettre tout en cause après un simple coup d’œil. Cette armoire, cette façon spécifique d’ajouter toutes ces fonctionnalités, elles ont pour ainsi dire créé une habitude, un geste. Et tu voudrais soudain que toute l'équipe prenne le recul nécessaire pour se défaire du geste, et revenir sur l'idée de l'armoire, et pourquoi pas, réadapter la forme de la pièce. Voire l'architecture de l'immeuble.
Comme tu y vas.
Tu dis : - Je propose qu'on commence la 437 ensemble, en mob programming, avec le projecteur.
Jérémie répond : - Je ne sais pas si c'est une bonne idée. Il y a des points de conception, tu as vu ? - J'ai vu. C'est justement pour ça que je propose qu'on la commence de cette manière.
Audrey dit : - Oui. Je suis d'accord. - Bon, dit Jérémie, si vous insistez.
Vous arrangez le projecteur ainsi que les tables de manière à ce que chacun puisse lire le code projeté sur le mur, et que chacun soit visible des autres. Hugo demande : - Du coup je veux bien prendre le clavier, ça va m'aider à mieux comprendre comment vous faites. - Parfait, dit Jérémie.
Tu t'installes derrière la table. Farid, qui vient juste d'arriver, salue tout le monde puis s'installe à ta gauche.
Audrey rappelle, à l'intention d'Hugo, les règles de base. Le driver a le clavier. Il est à l'écoute des navigateurs et implémente leurs décisions. Elle se tourne vers les autres et dit : - Je suggère qu'on prenne le clavier à tour de rôle. Ça permettra à chacun de participer, y compris Hugo.
Jérémie fait une grimace : - Il vaudrait mieux qu'il s'imprègne du code existant dans un premier temps, non ? - Oui, répond Audrey, je suis d'accord; et je ne suis pas sûre que la place de driver soit la meilleure pour ça. - OK.
Tu règles une alarme sur ton téléphone. Hugo ouvre l’EDI et demande : - Où est-ce que je vais à partir d’ici ?
Farid : Est-ce que tu peux créer un fichier todo ? Juste un fichier texte. Pour commencer il vaut mieux qu’on s’écrive une liste de tout ce qu’il y a à faire. C’est un peu compliqué, cette story. Jérémie : Un peu compliqué, et un peu incomplet, aussi. J’ai plein de questions. Farid : Oui, moi aussi. Je les ai consignées dans la story d’ailleurs. Audrey : Oui, justement. On va en parler. Toi : Est-ce qu’on a un exemple de cas d’export ? Ça sert à quoi ? Audrey : Disons, par exemple, qu’un client veut créer une nouvelle société. Mais cette société il ne la crée pas ex nihilo. Jérémie : Tu veux dire une nouvelle Societe
ou une nouvelle entreprise ? Audrey : Hein ? Jérémie : Tu veux dire : le client veut créer une nouvelle instance de l’application, entièrement paramétrée pour une nouvelle Societe
? Ou bien tu parles en général ? Audrey : Qu’est-ce que ça change ? Jérémie : J’essaie de savoir si tu parles des entités du modèle de la base de données, ou si tu parles d’un scénario métier réel. Audrey : Ah. Eh bien, oui, le but est de créer une nouvelle instance. Mais avec certaines données budgétaires déjà existantes. Jérémie : Normalement, c’est le travail des consultants, ce genre d’installation. Hugo : De quels consultants vous parlez ? Farid : Les consultants XXL, ce sont les personnes qui sont chargées d’aider au paramétrage de l’application et de réaliser des adaptations spécifiques pour certains clients. C’est vrai qu’il faut que tu les rencontre. Audrey : Charlène passe cette après-midi, tu peux t’incruster à notre réunion, Hugo. Elle t’expliquera en quoi ça consiste. Hugo : OK. En attendant, mon fichier todo est prêt. Qu’est-ce qu’on y met ? Jérémie : Attendez, j’ai toujours des questions, moi. Audrey : Vas-y. Jérémie : De quelles données budgétaires déjà existantes on parle ? Audrey : Eh bien, toutes les données qui suffiraient pour créer un premier exercice ? Jérémie : C’est une question ? Tu ne sais pas ? Audrey : Comme je dis toujours, vous êtes cordialement invités aux réunions de backlog grooming. Jérémie : Oui. Mais bon, ce qui manque ici, c’est un exemple. Audrey : Eh bien allons-y. Créons un exemple. Farid : Bonne idée. Hugo : Eh bien, on n’est pas rendu. Toi : Je propose qu’on commence par un cas extrêment simple. Le client veut exporter un budget-type composé d’une seule rubrique standard, dont il n’a modifié aucune caractéristique.
Tous, sauf Hugo qui garde ses mains posées sur le clavier, lèvent le pouce. Hugo note sur la todo : exporter un budget-type composé d’une seule rubrique.
Toi : Ensuite, exporter un budget-type comportant plusieurs rubriques standard Jérémie : OK. Ensuite, c’est là que j’ai une question : jusqu’ici on exporte des budgets fabriqués avec des rubriques standard. Quid des rubriques créés par l’utilisateur ? Audrey : Eh bien je suppose que l’on doit les exporter aussi. Jérémie : Ça signifie exporter la table des rubriques. Audrey : Soit. Toi : Donc : exporter un budget-type composé de rubriques utilisateur. Farid : Je pense qu’on a assez de travail pour les 2 heures qui viennent, non ? Si vous êtes d’accord on peut commencer. Audrey : OK. Hugo : Donc, je fais quoi ? Audrey : La première chose à faire, c’est d’écrire un test. Hugo : De quel genre de test tu parles ? Audrey : Un bout de code qui appelle le bout de code que l’on s’apprête à écrire, et qui vérifie que ce code a bien le comportement attendu. Hugo : Mais attendez. Ces fichiers d’export, qu’est-ce que l’utilisateur va en faire ? Farid : Bonne question. Jérémie : Oh, on ne t’a pas dit, mais l’application permet déjà d’intégrer des données de références. Ça fait partie des tâches d’installation. Hugo : Est-ce qu’on a déjà une fonction pour importer ces données ? Je n’ai pas vu de menu qui parle de ça. Jérémie : Ça ne se fait pas par un menu de l’application, mais via un script… Ah oui mais non. Mince. Hugo : Quoi ? Audrey : Quoi ? Jérémie : On n’a pas de script d’import de budget-types. Il faut aussi en écrire un. Farid : Oui. Ça fait partie de mes questions… Toi : Mais ça n’empêche pas de commencer notre fonction d’export. Hugo : Comment est-ce que tu vas tester ton export sans un moyen d’importer ce que tu as exporté ? Toi : Eh bien en vérifiant que le fichier produit est bien formé… Hugo : Oui, mais ça ne prouve rien. Jérémie : Importer le fichier, ça ne prouverait rien non plus. Hugo : C’est là où je ne suis pas d’accord. Ça permettrait de s’assurer qu’on a fait tout le travail. Si on rencontre un problème en important le fichier, c’est que notre programme d’export n’est pas bien ficelé. Jérémie : Ou bien que notre programme d’import n’est pas bien ficelé.
Ton téléphone déclenche l’alarme.
Hugo : Je dois changer de place ? C’est ça ? Farid : Oui. Je prends ta place.
Ils échangent leur places.
Hugo : Où est-ce qu’on en est ? Audrey : On en est au test. On veut exporter un budget-type contenant une rubrique standard. Comment est-ce qu’on saura que notre code réalise cela correctement ? Toi : Il produira un fichier CSV correctement formé, contenant une ligne de données, elle-même contenant le code rubrique, et le montant assigné à cette rubrique. Jérémie : Vu que l’on va utiliser les fonctions standard pour écrire du texte dans un fichier, il suffit de faire nos tests sur le texte lui-même. Hugo : Vous n’avez pas de librairie pour produire des fichiers CSV ? Où bien vous voulez réinventer la roue ? Toi : Tu as raison. Farid : Oui, je pense qu’on peut en trouver une facilement, j’ai eu une discussion avec un gars du projet Parady qui l’a utilisée, je vais la retrouver… Audrey : Cool ! Je n’y avais pas pensé. Hugo : Et moi qui croyait qu’on allait se mettre à coder. Mais en fait on ne fait que discuter. On perd du temps ! Audrey : C’est vrai qu’on discute. Mais si l’objet de la discussion, c’est : comment éviter le travail inutile, alors on ne perd pas de temps. Farid : En plus, la librairie est fournie avec des helpers de test ! Jérémie (scrute son écran tout en navigant entre les liens) : C’est ce que je vois. On a juste à faire quelque asserts sur l’objet CSVData
, et on a notre test.
La porte s’ouvre. Maria entre dans le bureau.
Maria : Bonjour à tous ! Je voulais m’assurer que ça se passe bien pour Hugo. Ton PC est opérationnel ? Plus d’histoires d’accréditations ? Plus d’obstacles ? Hugo : Bonjour. Non, c’est OK. Merci. Maria : Je vois que vous êtes en pleine formation… Je ne vous retarde pas plus. Jérémie : Ce n’est pas une formation… Audrey : Jérémie : les asserts ? Où est-ce que tu en es ?
Comprimés dans une pièce particulièrement étroite qui semble faire office de vestibule, cinq agents font le point sur la situation. Alors qu’ils s’apprêtent à ouvrir la double porte du fond afin d’investir l’étage, ils savent d’expérience qu’à moins de remanier celui-ci complètement, d’abattre des cloisons, de revoir de fond en comble les différents circuits, ils n’arriveront pas à leur fin, qui est de le réhabiliter pour de nouveaux usages. Ils entrent. - On avance facilement. Ça devrait se faire sans problème… - On voit que tu es nouveau. - Pourquoi pas ? Il a peut-être raison… - En tout cas c’est rafraîchissant. - Tu ne connais pas la loi de l’encombrement maximum… À mesure qu’ils progressent dans cette série d’espaces autrefois adaptés, fonctionnels, pertinents à défaut d’être parfaitement réglementés, leur voix se perd dans le silence étouffé des cloisons.
(à suivre) Episodes Précédents : 1 -- Si le code pouvait parler 2 -- Voir / Avancer 3 -- Communication Breakdown 4 -- Driver / Navigator 5 -- Brown Bag Lunch 6 -- Conseils à emporter 7 -- Crise / Opportunité 8 -- Le Cinquième Étage 9 -- Que faire ? 10 -- Soit... Soit... 11 -- Boîtes et Flêches 12 -- Le prochain Copil 13 -- La Faille 14 -- Poussière 15 -- L'hypothèse et la Règle 16 - Déplacements 17 -- Jouer et ranger 18 -- Arrangements 19 -- Mise au point 20 -- Expérimentation 21 -- Échantillons 22 -- Non-conclusions 23 -- Non-décisions 24 -- Épisode neigeux 25 -- Fusions et confusions 26 -- Débarquement 27 -- Tempête 28 -- Embardée