- Une étude du MIT montre que la compréhension du code s’appuie davantage sur le réseau à demandes multiples utilisé pour résoudre des problèmes complexes que sur le traitement du langage
- Dans une expérience d’IRMf où les participants lisaient du code Python et ScratchJr, le réseau du langage de l’hémisphère gauche, notamment l’aire de Broca, a à peine réagi
- La lecture de code mobilise le même réseau que les tâches mathématiques et logiques, mais les sous-régions activées au sein de ce réseau ne sont pas exactement les mêmes
- ScratchJr a activé légèrement davantage le réseau à demandes multiples droit, ce que les chercheurs comparent à la latéralisation à droite des tâches de navigation spatiale
- Plutôt que d’enseigner la programmation uniquement comme des mathématiques ou comme une langue, il faut des méthodes pédagogiques propres à l’apprentissage du code
La lecture de code montre une activité cérébrale différente de la lecture du langage
- Apprendre à programmer ressemble à l’apprentissage d’une nouvelle langue
- Il faut acquérir de nouveaux symboles et termes
- Il faut organiser correctement le code pour indiquer à l’ordinateur ce qu’il doit exécuter
- Il faut l’écrire assez clairement pour que d’autres programmeurs puissent le lire et le comprendre
- Pourtant, lors de la lecture de code informatique, les régions cérébrales chargées du traitement du langage ne se sont pas activées
- À la place, c’est principalement le réseau à demandes multiples (multiple demand network), utilisé pour les tâches cognitives complexes, qui s’est activé
- Ce réseau intervient aussi dans des tâches comme les problèmes de mathématiques ou les mots croisés
- La lecture de code n’était pas non plus totalement identique aux problèmes de mathématiques ou de logique
- Même au sein du réseau à demandes multiples, elle semblait s’appuyer davantage sur des zones différentes de celles utilisées par les tâches mathématiques et logiques
- Anna Ivanova estime que la compréhension du code informatique relève plutôt de « quelque chose en soi », ni du langage ni des mathématiques ou de la logique
La programmation est-elle plus proche du langage ou des mathématiques ?
- L’équipe d’Evelina Fedorenko étudie depuis longtemps la relation entre le langage et les autres fonctions cognitives
- La question centrale était de savoir si d’autres fonctions dépendent du réseau du langage du cerveau
- Ce réseau du langage comprend l’aire de Broca et d’autres régions de l’hémisphère gauche
- Des travaux antérieurs du laboratoire de Fedorenko ont montré que la musique et les mathématiques n’activent pas ce réseau du langage
- La programmation informatique étant une invention relativement récente, il semblait difficile de considérer que les humains disposent d’un mécanisme inné dédié à la programmation
- Les points de vue sur l’apprentissage de la programmation se répartissaient en deux grands camps
- L’idée qu’il faut être bon en mathématiques pour bien programmer
- L’idée que, du fait des similarités entre le code et le langage, les capacités linguistiques pourraient être plus pertinentes
Expérience d’IRMf : lecture de code Python et ScratchJr
- Les langages étudiés étaient Python et ScratchJr, connus comme des langages de programmation très lisibles
- ScratchJr est un langage de programmation visuel conçu pour les enfants à partir de 5 ans
- Les participants étaient de jeunes adultes maîtrisant le langage sur lequel ils étaient testés
- Les participants voyaient des fragments de code dans un scanner d’imagerie par résonance magnétique fonctionnelle (IRMf)
- La tâche consistait à prédire quelle action le code allait produire
Résultat : le réseau à demandes multiples est central, plus que les régions du langage
- Les régions du langage du cerveau ont peu, voire pas du tout, réagi au code
- Les tâches de code ont principalement activé le réseau à demandes multiples
- L’activité de ce réseau est répartie dans les lobes frontal et pariétal
- Il est généralement mobilisé dans les tâches où il faut garder simultanément plusieurs informations en tête
- Il est lié à la capacité d’exécuter diverses tâches mentales
- Ivanova explique que ce réseau intervient dans presque toute activité cognitivement exigeante où il faut « réfléchir intensément »
- Des études antérieures ont montré que les problèmes de mathématiques et de logique reposent surtout sur les zones à demandes multiples de l’hémisphère gauche
- Les tâches de navigation spatiale sont connues pour activer davantage l’hémisphère droit que le gauche
Différences selon les langages de code et effet de l’expertise
- L’équipe du MIT, avec Marina Bers, a obtenu des résultats montrant que la lecture de code active à la fois les parties gauche et droite du réseau à demandes multiples
- ScratchJr a activé légèrement davantage la partie droite que la gauche
- Aucune région cérébrale exclusivement dédiée à la programmation n’a été identifiée
- Il reste toutefois possible qu’une activité cérébrale spécialisée se développe chez les personnes ayant beaucoup plus d’expérience en codage
- Fedorenko indique que, chez des programmeurs experts ayant codé 30 ou 40 ans dans un langage donné, on pourrait observer une spécialisation ou une cristallisation d’une partie du système à demandes multiples
- Chez des personnes comme les participants de cette étude, habituées au codage et capables d’exécuter efficacement les tâches, mais avec une expérience relativement limitée, une telle spécialisation n’a pas été observée
Implications éducatives et article associé
- Un article compagnon d’une équipe de Johns Hopkins University, publié dans le même numéro d’eLife, rapporte lui aussi que la résolution de problèmes de code active non pas les régions du langage, mais le réseau à demandes multiples
- Ces résultats ne suffisent pas à déterminer s’il faut enseigner le codage comme une compétence fondée sur les mathématiques ou sur le langage
- Dans le processus d’apprentissage de la programmation, le système du langage et le système à demandes multiples peuvent tous deux intervenir
- Mais une fois apprise, la programmation ne semble pas dépendre des régions du langage
- Ivanova estime que les enseignants en informatique devraient développer leurs propres approches pour enseigner le code de la manière la plus efficace
- Article associé : Comprehension of computer code relies primarily on domain-general executive brain regions
1 commentaires
Avis sur Hacker News
Il semble manquer le lien vers l’article scientifique ; il s’agit très probablement de https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7738192/pdf/eli...
L’étude explique que des programmeurs, dans un scanner fMRI, regardaient des fragments de code et prédisaient quel comportement ce code produirait, mais la capacité à écrire du code et celle à comprendre le code écrit par quelqu’un d’autre me semblent être deux compétences différentes
Plutôt que de comprendre ce qui est écrit, c’est davantage un travail consistant à déduire ce que cela signifie
Bill et Tom sont allés dans un magasin de chaussures ; Bill a acheté des chaussures noires à 23,56 dollars, et Tom des chaussures rouges à 40,30 dollars. Ensuite, ils sont allés à l’épicerie ; Tom a acheté du pain à 3,50 dollars et du lait à 5,99 dollars, et Bill a aussi acheté du pain mais pas de lait.
L’activité cérébrale nécessaire pour répondre à cette question précise est différente de celle nécessaire pour répondre à « qu’ont fait Tom et Bill ? », et modifier l’histoire existante, par exemple « ajoute un passage où Bill va chez le coiffeur après le magasin de chaussures », est encore tout autre chose, puisqu’il faut analyser la grammaire et maintenir la cohérence
vue d’ensemble !== détails !== rédaction !== modification d’un contenu existant ; si l’étude n’a pas posé de manière équivalente ces quatre types de compréhension pour les récits comme pour le code, elle me paraît incomplète
L’article non plus ne parle pas de l’écriture de code en elle-même, mais ne la relie à la lecture que dans la mesure où le code écrit doit être compréhensible par d’autres
Ce qui m’étonne davantage, c’est que quelqu’un ayant de l’expérience avec les langages de programmation ait pu penser qu’on obtiendrait vraiment ce genre de résultat
Concevoir un langage de programmation pour qu’il ressemble superficiellement à un langage humain est l’une des erreurs de débutant classiques en conception de langage. Il suffit de voir le paradigme « do what I mean » de Perl et la confusion qui a suivi
La différence importante est qu’un langage de programmation relève moins de la communication que de la construction d’un objet. Cela s’apparente davantage à fabriquer des formules, des algorithmes, des structures de données ou l’architecture de plusieurs composants ; c’est pourquoi, en programmation, une grande partie de la pensée porte moins sur les détails syntaxiques que sur les propriétés implicites de ce qui est construit
On peut faire des choses similaires en langage humain, avec des recettes, des documents juridiques, des définitions mathématiques, des règles de jeu de société ou des instructions pour LLM, mais le langage humain peut aussi servir à des formes de communication aux objectifs totalement différents
Il serait plus intéressant de comparer l’activité cérébrale lors de la lecture de code et de langage humain formalisé, ou lors de la lecture de langage humain formalisé et non formalisé
Apprendre un langage de programmation ressemble à l’apprentissage d’une compétence spécifique ; il vaut mieux avoir un cerveau de programmeur, ou plutôt de l’intérêt pour cela. En revanche, apprendre une langue humaine est totalement différent et beaucoup plus difficile, et se fait en grande partie de manière semi-consciente, si bien que le « travail » au sens ordinaire rapporte très peu
La visualisation que j’utilise pour me représenter les structures de données n’est pas très différente de celle que j’utilise pour imaginer les scènes d’un livre
D’après l’article en lien, lire du code active les zones du cerveau mobilisées pour raisonner soigneusement sur un problème inconnu
Il suppose aussi que cela pourrait ne pas se généraliser aux personnes ayant 30 ans d’expérience en programmation, et je comprends que beaucoup d’études académiques soient menées sur des étudiants. Mais le simple fait de comparer cela au traitement du langage naturel, domaine dans lequel les sujets ont des décennies d’expérience, ne rend-il pas la comparaison invalide ?
En tant que programmeur autodidacte ayant une formation en linguistique théorique et ayant étudié à l’université plusieurs langues assez différentes de ma langue maternelle, ce résultat ne me surprend pas. Il existe clairement des similarités à certains niveaux, mais la ressemblance entre les langues humaines et le code informatique est souvent exagérée, et cela ressemble à un vestige d’une linguistique plus primitive qui se focalisait étroitement sur la grammaire
Même s’il y a dans le dépôt du code qu’ils n’ont jamais vu, le fait de connaître le style, les conventions et la manière dont ce code s’insère dans le programme global devrait avoir un effet important sur la façon dont il est perçu
Si l’on n’est pas familier avec la programmation, il est logique que la zone des problèmes inconnus s’active. Il serait intéressant d’étudier si cette zone s’active parce que le domaine est inconnu, ou si elle continue de s’activer, même avec de l’expérience, quand on traite cet objet qu’est le code
Quand on lit du code, on traite généralement quelque chose que l’on ne connaît pas au départ, donc cela pourrait toujours rester, dans une certaine mesure, quelque chose d’inconnu ; à l’inverse, la lecture de code elle-même peut devenir familière au point de ne plus fonctionner ainsi
Pour faire une comparaison équitable, il faudrait que les sujets aient de l’expérience à la fois en traitement du langage naturel et en programmation, mais comme il est difficile de trouver des personnes également familières avec les deux domaines, il faudra probablement se contenter de sujets « suffisamment familiers avec le code »
C’est exactement pour cela que l’avenir m’inquiète quand les gens disent qu’« il suffira de demander à l’IA en langage courant et elle le fera »
Je n’ai pas envie de passer 8 heures par jour à échanger en texte ou en parole ordinaires. Ce serait trop épuisant. En revanche, manipuler un langage de programmation pendant 8 heures, c’est amusant
Il faudra pouvoir dire, comme avec
unsafeen Rust : « ici, je sais ce que je fais, ne me gêne pas ». Ensuite, l’IA pourra vérifier l’exactitude des parties écrites par l’humain au moyen de tests ou d’autres méthodesOn le fait déjà dans une certaine mesure, mais aujourd’hui c’est plutôt l’humain qui vérifie le code généré par l’IA, et à mon avis il reste encore beaucoup de chemin avant d’inverser les rôles
Lex Fridman a récemment interviewé le linguiste Edward Gibson, et ils ont beaucoup parlé de la façon dont le cerveau traite le langage
Il y était aussi question du fait que la lecture de code mobilise des zones du cerveau complètement différentes de celles du langage
#426 https://lexfridman.com/podcast/
Il me semble qu’Evelina Fedorenko, l’autrice de cet article, est l’épouse d’Edward
Pour moi, c’est un ensemble de compétences totalement différent
Je tiens une chaîne YouTube principalement consacrée à la lecture de code : https://www.youtube.com/@ants_are_everywhere
J’essaie de lire et de comprendre, sans préparation, le code de projets open source populaires ; c’est un peu comme le déchiffrage à vue en musique
L’explication selon laquelle les chercheurs n’ont quasiment pas observé de réaction au code dans les aires du langage, mais plutôt une activation surtout du multiple demand network, réparti entre les lobes frontal et pariétal, me semble plausible. Ce réseau est sollicité dans les tâches où il faut maintenir plusieurs informations en tête simultanément, et il est associé à la capacité à exécuter divers travaux mentaux
Bien sûr, il y a du langage, mais on ne consacre peut-être pas assez d’effort au traitement linguistique lui-même pour que cela apparaisse dans le signal fMRI. Souvent, je garde en tête plusieurs choses à la fois : ce que fait le code, ce que l’auteur essaie de faire, le contexte de l’auteur, la façon dont des logiciels similaires fonctionnent, etc.
J’ai étudié les mathématiques, mais cela ne ressemble pas vraiment non plus à lire un texte ou à faire des maths
Il faut un certain temps pour « charger » tout ça en tête, et c’est un peu comme un exercice d’équilibre où il faut sans cesse empêcher l’ensemble de s’écrouler
Si on m’interrompt au milieu, j’ai l’impression de perdre l’équilibre et que tout se disperse, puis il faut tout ramasser à nouveau, ce qui demande du temps et de l’effort. Quand ça arrive plusieurs fois d’affilée, c’est extrêmement frustrant
Paul Graham en parle dans son texte sur le maker schedule et le manager schedule : (2009) https://paulgraham.com/makersschedule.html
La sensation est exactement la même, et le schéma consistant à maintenir plusieurs choses à la fois en tête aussi
Au regard des neurosciences modernes et de l’imagerie cérébrale, on en conclut donc que lire du code revient fondamentalement à retrouver conscience sous zolpidem pendant un coma
Enfant et adolescent, j’ai joué de quelques instruments, mais je n’étais pas doué pour le déchiffrage. J’ai entendu dire que les aptitudes musicales et la programmation sont souvent corrélées, mais je ne serais jamais devenu musicien professionnel. En revanche, j’ai construit une bonne carrière dans la programmation
Ça ne m’étonne pas du tout. Lire du code est différent de lire de la prose, différent aussi de faire des mathématiques, et se rapproche davantage de l’assemblage d’un puzzle dans sa tête
Pour comprendre ce que fait du code, il faut relier, substituer et traduire en temps réel énormément de choses : fonctions, symboles, variables, instructions, abstractions, etc. C’est pourquoi lire du code peut parfois être plus complexe que d’en écrire à partir de zéro
En réalité, leur seul point commun est qu’on les appelle tous les deux des « langages »
C’est un ensemble d’instructions machine décrivant ce que l’ordinateur doit faire, et il ne peut pas, ni ne devrait, devenir la métaphore d’autre chose comme dans les aires du langage
Pour moi, lire du code ressemble à regarder un schéma d’engrenages et à se demander : « Le pignon A tourne-t-il dans le sens antihoraire ou horaire ? »
En termes de ressenti, c’est plus proche de l’analyse d’un mécanisme que de la compréhension du langage
On le voit aussi au fait qu’il n’y a pas de voix narrative dans ma tête quand je lis du code
Quand j’essaie de lire du code, un bruit de fond où je peux reconnaître des mots, comme de la parole ou la musique d’une langue familière, me distrait et m’agace. Je ne peux pas non plus parler en codant, sinon ma frappe se dérègle
Je préfère aussi largement les langages proches de phrases anglaises, comme Ruby, aux langages riches en symboles comme Rust, ou en abréviations et opérateurs comme Haskell. Bien sûr, chez d’autres développeurs, d’autres circuits cérébraux s’activeront
Le code difficile à lire est souvent pénible à traiter, probablement parce que le rythme de cette narration est rompu et ne s’écoule pas naturellement
Quand j’explique le fonctionnement de quelque chose, je suis généralement le même rythme que cette narration, ce qui m’aide à expliquer de façon concise et à transmettre rapidement des connaissances
Cela dit, c’est clairement différent de la voix narrative que j’ai en lisant un roman. Cela tient sans doute à la présence ou non d’un langage émotionnel entre les deux. C’est peut-être comparable au fait que certaines personnes ont un monologue intérieur et d’autres non, ou aux différences de niveau de détail avec lequel on peut imaginer des objets sans les voir réellement
Par « la même », j’entends qu’elle fonctionne de la même manière et qu’elle « sonne » de la même façon ; bien sûr, la grammaire et le vocabulaire suivent la langue des signes utilisée. En pratique, les mêmes zones du cerveau sont activées
Cela semble indiquer que la voix narrative n’est pas un simple « écho sonore », mais le processus même de compréhension. Comme lorsqu’on lit un texte
Le jugement sur les boucles, en particulier, nécessite de modifier temporairement le code de façon itérative
Je travaille principalement depuis chez moi et, quand je code, je mets généralement de la musique
Comme j’aime chanter en même temps, je passe toute la journée à mon bureau à coder en chantant
Mais quand je lis quelque chose, je suis absolument incapable de faire ça. Lire un texte tout en chantant une autre chanson est impossible, alors qu’en codant, c’est très facile