Le demi-cercle (épisode 14 -- Poussière)
Old programs read like quiet conversations between a well-spoken research worker and a well-studied mechanical colleague, not as a debate with a compiler. Who’d have guessed sophistication bought such noise? — Dick Gabriel
Tandis que tu t'installes sur l'unique chaise restée vide dans la salle qui sert régulièrement de Dojo de Programmation, Oleg effectue les derniers réglages sur le rétroprojecteur, et lance un éditeur de texte. Il annonce :
- Pour ce soir, une session un peu spéciale, si vous êtes d'accord. Suite à nos discussions de la dernière fois, je vous propose d'aborder le sujet du code legacy, en mob programming. Tu réponds : - Excellent ! Je suis preneur.
Ton voisin de droite dans le demi-cercle, un grand barbu avec une chemise à carreaux, s’exclame : - Tu n'aurais pas quelque chose qui nous changerait de l'ordinaire ? Je me mange du legacy toute la journée ! - Il ne tient qu'à toi de proposer un autre sujet, dit Oleg, en souriant. Mais j'ai l'impression que le code legacy est très à la mode en ce moment… - Oui, ça se fait beaucoup, c'est très tendance… interrompt un des participants. - …depuis 30 ans, on dirait, ajoute quelqu'un sur ta gauche.
Oleg charge un fichier source dans l’éditeur et déclare : - Attendu que personne dans le groupe ne propose de sujet supplémentaire, je vous propose donc de jouer avec ce « truc »…
Le rétro-projecteur affiche un fragment de code source assez dense. Oleg attend quelque secondes, puis affiche les trente lignes suivantes. Et ainsi de suite.
- Mon dieu, s'exclame un des participants, mais c'est du C ! - Cool ! - On peut voir les tests ?
Oleg imite un rire sardonique et répond : - Désolé. Pas de tests.
Quelqu’un soupire. Quelqu’un d’autre gémit. - Tu peux aller moins vite sur le défilement s’il te plaît ? - Y en a pour combien de pages comme ça ? - Des pages et des pages on dirait…
Tu scrutes le code, en remuant dans ta tête les quelques connaissances du langage C qu’il te reste de l’école.
C’est une pièce pas très grande, mais très encombrée. Il fait très sombre. Tout ce qui se trouve là est recouvert d’une épaisse couche de poussière. On arrive à deviner vaguement quelques outils çà et là, des sortes de leviers attachés au sol — qui commandent quoi ? — ainsi qu’une multitude de caisses et de boites, certaines convenablement rangées (le long d’un mur, peut-être), d’autres éparpillées sur l’unique passage au centre de la pièce, d’autres encore posées en équilibre sur une pile de sacs. Cette pile de sacs, qui s’élève jusqu’à deux mètres, bouche le passage sur la gauche. Certains sacs ont gardé leur forme initiale à quatre coins, certains sont éventrés et ont laissé choir une quantité invraisemblable de tout petits cubes. On voudrait se baisser pour ramasser un de ces cubes et voir de quelle sorte de cube il s’agit — peut-être se sont des toutes petites boites ? Mais la quantité de poussière qui les recouvre incite à la (répugnance) prudence.
Oleg se lève et inscrit une adresse sur le tableau blanc derrière lui en disant : - À toutes fins utiles, voici l'adresse où vous pouvez trouver ce code.
Trois participants posent leur laptop sur leur genoux et commencent à examiner le code de leur côté. Les commentaires fusent.
- Ce truc fait des printf à n'en plus finir. - Mais qu'est-ce que ça fait ? Qu'est-ce que ça fait ? - Ça fait des entrées-sorties. - Oui, évidemment, mais à part ça ? - Vous avez vu le struct au début du fichier ? Vous en pensez quoi ?
Victor, le plus agé des participants, le nez plongé dans son écran, diagnostique : - C'est du C, mais écrit par quelqu'un qui ne connaît pas bien le C.
Une alarme sonne sur le téléphone d'Oleg. Oleg dit : - On change de Driver !
Aurélie, une participante que tu ne connaissais pas, s'installe au clavier. Elle attend les instructions des navigateurs, mais le groupe semble manquer de concentration pour l'instant. Après quelques secondes, elle demande : - Qu'est-ce qu'on fait ?
Sans lever les yeux de son écran, Victor continue : - Il y a une gestion de liste chaînée. Le programme insère des enregistrements en comparant le nouvel enregistrement avec toute la liste, comme pour un tri par insertion…
Oleg, qui s'est levé à nouveau, s'adresse à l'ensemble du groupe : - Les gens : qu'est-ce qu'on fait ?
Tu pose la question qui te tracasse depuis cinq minutes : - La dernière fois, on codait en TDD. Aujourd'hui on a déjà du code, mais pas de test. Qu'est-ce que vous faites dans ce cas là ?
Oleg répond sans se départir de son sourire : - C'est au groupe de décider.
Quelqu'un lance : - Il faut écrire des tests.
Et la discussion repart : - Oui mais quand on ne sait pas ce qu'est censé faire le programme ? - C'est pour cela qu'on écrit des tests. - Alors là, je ne vois pas.
Aurélie, toujours au clavier, demande : - Je veux bien écrire un test, mais avec quel outil ?
L'alarme sonne. Un des participants, qui était jusqu'ici plongé dans une intense conversation avec son portable, lance : - Il y a un outil qui permet de faire des tests, c'est très minimal, juste deux macros, mais je ne vois pas pourquoi ça ne marcherait pas. Je peux être Driver ? - On ne dit pas non. - Vas-y.
Il s'installe au clavier, puis tape les deux lignes en questions. Victor anticipe : - Il va te falloir un fichier make.
Quelqu'un parmi les navigateurs soupire : - Oh mon dieu, make…
Aurélie demande : - C'est quoi le problème avec make ? - Non rien. C'est juste… tellement ancien.
Il te semble que tu commences à saisir l'intention derrière la proposition de sujet faite par Oleg. Je suis sûr qu'il a lui même contocté ce programme infernal.
Victor guide le driver dans la fabrication d'un Makefile. On décide de coder un exemple minimal.
check("2 and 2 should be 4", (2+2)==4);
Le test passe. L'alarme sonne. Le driver suivant recharge le code amené par Oleg et demande : - Maintenant qu'est-ce qu'on fait ? - On écrit un premier test de caractérisation.
Tu demandes : qu'est-ce qu'un test de caractérisation ?
Ton voisin explique : - C’est un test qui essaye d'exécuter une partie du code, par exemple qui appelle une fonction, sans préconception de ce que sera le résultat du test, donc par exemple, avec une valeur attendue de -1. Une fois que le test s'exécute, et que tu obtiens un résultat, tu inscris ce résultat dans le test, à la place de la valeur -1.
Son voisin complète l'explication : - En gros, tu viens de caractériser une partie du code, en capturant une valeur produite à l'exécution.
Le voisin de son voisin penche la tête vers toi et complète encore : - En gros, tu prêches le faux pour avoir le vrai.
J'ai rien compris.
Tu lèves le pouce pour faire signe que tu as compris, et tu te concentres sur le code. On change encore de Driver.
La petite équipe a investi la pièce et commence à installer son matériel d'intervention. On pourrait croire qu'elle va manquer d’espace pour faire son travail, mais tu constates que jusque là, pas un objet original n'a été déplacé. Tout ce qui est inanimé reste intouché. C'est à croire que même la poussière ne bouge pas. L'équipe s'immobilise un temps dans l'obscurité silencieuse.
Oleg observe le groupe en souriant.
Victor dit : - C'est couplé. Y a rien à faire. - On ne pourrait pas scanner la sortie ? - Comment tu veux faire ça ? - On lance le programme en redirigeant la sortie standard vers un fichier. Ensuite on parse le fichier avec script. Ou bien on fait un diff avec un fichier de référence. - C'est l'usine à gaz ton truc. - Mais ça peut marcher. Au début le fichier de référence est vide. Au fur et à mesure des exécutions, on complète le fichier de référence. Caractérisation.
Oleg demande : - Est-ce qu'on peut faire ça dans une timebox ? - Deux fois 10 minutes, alors.
La proposition est validée. Le groupe s'y met. Après vingt minutes, on n'a toujours pas capturé de sortie, parce qu'à l'exécution, le programme demande des entrées que personne ne sait fournir. Oleg observe toujours le groupe avec le même sourire narquois.
Quelqu'un s’exclame : - Mais qu'on découple ce truc, enfin ! - Je voudrais t'y voir. Comment on fait ?
Il te vient une idée. Mais l'alarme sonne, et c'est à ton tour de prendre le clavier. Tu te lèves en disant : - J'ai une idée…
Oleg t'interrompt : - Alors reste assis. Quelqu'un d'autre peut prendre la place ? On a surtout besoin d'une idée, juste là maintenant.
Tu te rassois. Tu expliques : - Tout le code est criblé d'appels aux fonctions d'entrées / sorties, on ne peut rien manipuler. Mais, par exemple — reviens en ligne 616, s'il te plaît… - OK. - …Si dans cette partie on remplace ces appels par des appels aux fonctions équivalentes d'entrées et sorties sur chaîne de caractères… - Hé mais c'est pas idiot ton idée ! - …Alors on peut préparer des entrées dans le code de test, et vérifier les sorties également dans le code de test. - Ça se tient !
Le driver demande : - Comment on fait ?
Victor énonce : - sscanf au lieu de scanf, sprintf au lieu de printf, et strcmp pour comparer les chaînes… - Vu comme ça, OK.
Le Driver remplace quelques appels à printf par des appels à sprintf. Puis il est remplacé par lui-même par le Driver suivant.
Les navigateurs échangent avec fluidité. - Ouais mais : il nous faut des buffers assez long pour tester toute la sortie… - T'inquiètes pas: on peut s'arrêter au premier passage à la ligne, avec un exit bien placé. - Comme tu y vas ! On est censé tester le code, pas le bidouiller. - De toute façon, la sortie produite par le test ne dépassera pas le millier de lignes. - Quand même. - Un millier de lignes ? Qu'est-ce qui te fait dire ça ? - La lecture du code. - Mais encore ? - Il y a un appel récursif à la fonction qui produit le calcul des chiffres en sortie, recpropvalue(). Franchement, si la sortie fait plus de milles lignes le programme aura explosé la pile avant de saturer notre buffer, donc ce n'est pas grave.
Le Driver gémit : - Euh… On en est où ?
Encore 10 minutes, soit deux tours de Driver, et le premier test est lancé.
Une lumière un peu faible diffuse soudain dans le fond de la pièce un halo verdâtre, électrique. Tout est encore pratiquement intraduisible, comme enfoncé dans le passé. La lumière se contente d'ajouter un léger relief à chaque objet. C'est comme la photo, prise au microscope électronique, d'un objet ainsi rendu méconnaissable, parce que grossi mille fois. Il ne faudrait qu'un grand zoom arrière pour que cette chaîne de montagnes floconneuses redevienne familière et minuscule : on verrait alors qu’il s’agissait d’une simple agraphe, ou de la moitié d'un trombone.
- Bon, dit l'un des navigateurs. On avance à pas de fourmi dans ce fouillis. - On est trop près de la route, dit Victor. - Qu'est-ce que tu veux dire par là ? - Il y a tellement de lignes de code pour chaque chose : insérer un enregistrement, le comparer aux autres, passer à l'enregistrement suivant, écrire un résultat… qu'on perd la vue d'ensemble. - N'empêche, on ne sait toujours pas ce que ça fait, ce programme.
Encore quelques tours de Driver, et il est bientôt vingt heures trente. On a en tout trois tests :
zero line in input should yield 0
one line with 1 1 1 should yield 1
two lines with 1 1 1 and 2 2 2 should yield 3
Oleg propose un debrief rapide. Le groupe forme un petit cercle près de la sortie de la salle.
Le débrief commence par une plainte : - Sans rire, Oleg, dis-nous le fin de mot de l'affaire. Il fait quoi ce programme ? - Franchement, je ne peux pas. Ce ne serait pas profitable, dit Oleg en riant. - Mais ce serait charitable. - Vous vous en êtes bien sortis !
Tu tentes une pique : - La vérité, c'est qu'Oleg ne se souvient même plus du programme qu'il a écrit.
Rires sarcastiques. Oleg s’adresse à toi : - En tout cas, excellent le coup du sprintf. - Tu trouves ! - Ah oui : idée géniale, dit Victor. Je préfère nettement l'idée de détourner les entrées / sortie de l'intérieur du programme plutôt que de l'extérieur. - Moi pas, dit quelqu’un d’autre. Regarde dans quel état on a mis le code. C'est une boucherie. - Mais non. C'est du pontage. - C'est toujours mieux que de fouiller une log de mille lignes à la recherche d'un résultat intelligible… - Ça se discute en fait… - Oui mais là, j'ai mon métro. Salut tout le monde !
Stéphanie t'a laissé une part de quiche sur la table. Elle sourit. Le chat surveille la quiche depuis le sommet du réfrigérateur. Stéphanie dit : - Tu n'as pas l'air de revenir du boulot. Tu es tout excité. - Je reviens du Dojo. - Ah! Le Dojo. Comment c'était ? - Je crois que j'ai compris un truc.
(à 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