đšâđ« 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é