Le Refactoring comme modÚle de couplage homme-machine : technique, sémiotique, mémoire

✒ Enzo SandrĂ© · 📆 05/02/2024 · 🎓 ThĂšse · #ïžâƒŁ Façonnage de code

đŸ‘šâ€đŸ« Un de mes anciens professeurs, Ophir Paz, a publiĂ© sa thĂšse il y a presque 2 ans. C’est dense, j’ai donc choisi de la rĂ©sumer par chapitres. J’ignore volontairement les premiers chapitres, introductifs, afin de dĂ©buter par le troisiĂšme, qui mĂȘle sĂ©miotique et dĂ©veloppement.

Chapitre 3 : Différents niveaux de sens

⌚ Comprendre du code a tout du parcours initiatique ! Il ne suffit pas de comprendre ce que font les instructions pas Ă  pas pour en saisir le sens. A vrai dire, celui qui en reste au niveau instructionnel ne fait qu’effleurer la surface. Avec l’expĂ©rience, un dĂ©veloppeur dĂ©chiffre le sens invariant de groupes d’instructions, c’est-Ă -dire la fonction attachĂ©e habituellement Ă  une construction donnĂ©e. Par exemple, la plupart des dĂ©veloppeurs savent qu’une boucle for oĂč l’indice est une position dans un tableau sert Ă  itĂ©rer sur celui-ci.

🧠 La majoritĂ© du sens que porte un code est encore au-delĂ  : il s’agit du sens social. Que signifie un bloc de code pour l’équipe qui doit la maintenir ? Quel est son rĂŽle dans le projet, c’est Ă  dire par rapport au contexte : expĂ©rience des dĂ©veloppeurs, exigences, histoire du code, etc. La part dĂ©terminante de la signification d’un code se trouve ici.

💣 Ce chapitre m’a permis d’affiner ma dĂ©finition du Principe de Moindre Surprise (Principle of Least Astonishment en anglais). Respecter ce principe, c’est Ă©crire du code ayant un sens social compatible avec le sens invariant communĂ©ment admis des instructions qu’il contient.

Chapitre 4 : Grammaire de construction

đŸ€ą Un code peut ĂȘtre syntactiquement valide, c’est-Ă -dire compilable, sans pour autant ĂȘtre socialement convenable au sein d’une communautĂ© de dĂ©veloppeurs. Le phĂ©nomĂšne Ă  l’oeuvre est le mĂȘme qu’en français ou dans toute autre langue : “Combien d’annĂ©es avez-vous ?” sonne mal, on lui prĂ©fĂ©rera “Quel Ăąge avez-vous ?”. De mĂȘme for(int i=0 ; i<10 ; i = 1 + i) dissonne.

đŸ—Łïž Ophir Paz dĂ©cortique ce phĂ©nomĂšne en utilisant les grammaires de construction, une branche de la linguistique. Pour les auteurs de cette Ă©cole, les locuteurs d’une langue apprennent et manipulent des constructions, c’est-Ă -dire des appairages forme-sens. L’expression “Comment vas-tu ?” lorsque l’on salue quelqu’un de familier n’est pas Ă  interprĂ©ter littĂ©ralement. De mĂȘme, l’incrĂ©mentation d’un pointeur (*p++) possĂšde un sens invariant pour les dĂ©veloppeurs C++ chevronnĂ©s : celui de parcourir un tableau sĂ©quentiellement.

😕 Ces constructions ont un sens instructionnel clair, qui sera exĂ©cutĂ© par le compilateur, mais aussi un sens invariant non-prĂ©dictible, c’est Ă  dire ne pouvant pas ĂȘtre dĂ©duit des seules instructions. C’est un problĂšme pour le profane, qui lit un code qu’il n’a pas les codes pour comprendre. A cela s’ajoute un sens social, connu des seuls dĂ©veloppeurs, pouvant contredire le sens invariant communĂ©ment admis par la profession.

đŸȘ„ Ainsi, pour comprendre un programme, il ne suffit pas de partager les sources. Il faut Ă©galement possĂ©der des connaissances concernant les expressions idiomatiques rĂ©pandues au sein de la communautĂ©. Les programmes sont Ă©crits Ă  l’aide de ces constructions et en partant du principe que le futur lecteur les connaĂźt Ă©galement. De mĂȘme pour les constructions plus confidentielles, propres Ă  une Ă©quipe de dĂ©veloppement, mĂȘme si ces derniĂšres doivent ĂȘtre limitĂ©es afin de garder le code reprenable.

Chapitre 5 : SĂ©miotique constructive du code

📡 En 1949, Claude Shannon propose son modĂšle de communication Ă©ponyme. Il rĂ©gna sur la psychologie de la programmation pendant un demi-siĂšcle, continuĂ© par les approches cognitivistes. Son postulat de base est la symĂ©trie du message entre Ă©metteur et destinataire. AppliquĂ© au dĂ©veloppement de logiciels, ce modĂšle voit le programmeur comme le rĂ©cepteur de spĂ©cifications non-ambigues, qu’il est chargĂ© de traduire en code non-ambigu destinĂ© Ă  une machine.

đŸ˜¶â€đŸŒ«ïž Cette reprĂ©sentation, Ă  l’origine de la famille de mĂ©thodes Waterfall (contenant le Cycle en V) est empiriquement erronnĂ©e. Ni le code, ni les spĂ©cifications ne sont des messages symĂ©triques. Chaque dĂ©veloppeur appairera un sens diffĂ©rent aux formes qu’il lit. Les formes elles-mĂȘmes sont souvent polysĂ©miques (“grand” n’a pas le mĂȘme sens dans “un grand vin” et “un grand enfant”, de mĂȘme pour le mot clĂ© static en C).

🧠 Ophir Paz propose de dĂ©passer ce modĂšle Ă  l’aide d’une approche issue de la linguistique cognitive de Lakoff et Johnson, Ă  la frontiĂšre de la sĂ©miotique. Pour cette Ă©cole, notre cerveau agit comme un moteur d’infĂ©rence lorsqu’il lit un code. Il associe les symboles Ă  un sens en fonction du contexte, lui-mĂȘme constituĂ© des symboles entourant le premier et du contexte plus gĂ©nĂ©ral du projet. Le langage n’est pas un signal, il est la pensĂ©e elle-mĂȘme ! Nous apprenons et restituons nos connaissances par le biais de mĂ©taphores, qui ne sont pas de simples figures de style, mais l’incarnation de la pensĂ©e abstraite. La maniĂšre dont les enfants apprennent l’arithmĂ©tique, par analogie avec des collections d’objets ou les design patterns sont autant d’indices de la validitĂ© de ce modĂšle.

đŸ€ Chacun interprĂšte le code en fonction de son systĂšme de mĂ©taphores propre, difficilement reformatable. Travailler en Ă©quipe suppose donc une nĂ©gociation du sens entre les parties. Chacun doit miser sur ce que l’autre comprendra au moment d’écrire un code. Ne pouvant ĂȘtre dans tĂȘte de ses collĂšgues, chaque dĂ©veloppeur est amenĂ© Ă  Ă©voluer par essais et erreurs, Ă  ajuster la structure du code sans en changer le fonctionnement, afin de le clarifier pour autrui, mais Ă©galement pour soi, lorsque le temps aura effacĂ© une partie de notre mĂ©moire. Cette procĂ©dure, les dĂ©veloppeurs la nomment refactoring et Ophir Paz en donne une nouvelle comprĂ©hension.

Chapitre 6 : Le code en tant qu’outil

📚 Le code n’est pas seulement la traduction du besoin en un langage intelligible par une machine. C’est un objet technique Ă  part entiĂšre, forgĂ© Ă  partir de piĂšces plus simples, en perpĂ©tuelle Ă©volution. Parfois cet objet est rĂ©utilisĂ© en dehors de son cadre d’usage et devient un standard, Ă  l’instar des langages de programmation ou des bibliothĂšques populaires.

đŸŠŸ Le code n’est pas le logiciel, mais la prothĂšse permettant au dĂ©veloppeur qui s’en saisit de produire un logiciel. Il est l’interface entre le logiciel et les schĂ©mas mentaux dudit dĂ©veloppeur. Refactorer le code c’est aligner les grilles de lecture de chacun, afin que toute l’équipe comprenne bien la mĂȘme chose en lisant le code. Ce processus augmente la capacitĂ© Ă  travailler ensemble autour d’une oeuvre commune, gage de vĂ©locitĂ© et de rĂ©silience.

🧠 On se mĂ©prend sur ce phĂ©nomĂšne en pensant que seul le code s’amĂ©liore dans ce processus. Le dĂ©veloppeur en sort Ă©galement transformĂ©. L’invention de l’écriture n’a pas seulement permis de coucher sur support ce qui Ă©tait transmis oralement. De nouvelles formes d’expressions sont apparues et ont augmentĂ© les possibles offerts Ă  notre espĂšce et par voie de consĂ©quence le champ du concevable s’est dilatĂ©. On retrouve ce phĂ©nomĂšne Ă  plus petite Ă©chelle dans l’apprentissage des nouveaux dĂ©veloppeurs : ils apprennent par imitation d’une base de code existante, en appairant un sens qui leur est propre Ă  des constructions rĂ©currentes, afin de les rĂ©utiliser plus tard.

đŸ—Łïž La prochaine fois que vous verrez une Ă©quipe de developpement discuter au lieu de coder, n’ayez crainte, ils sont simplement en train d’augmenter leur productivitĂ© collective. Le principal produit de l’activitĂ© de dĂ©veloppement n’est pas le logiciel, mais le dĂ©veloppeur lui-mĂȘme. Cette paraphrase de FrĂ©dĂ©ric Le Play conclut ce rĂ©sumĂ© d’une thĂšse que j’ai eu plaisir Ă  lire.

SOURCE

Le refactoring comme modÚle du couplage homme-machine / Ophir Paz ; sous la direction de Jean-Baptiste Guignard. ThÚse de doctorat : Automatique, Productique, Signal et Image, Ingénierie cognitique : Bordeaux : 2022.

Enzo Sandré