Observations principales
- L'apprentissage est essentiel pour les programmeurs, mais l'esprit humain fonctionne différemment de celui d'un ordinateur.
- Comprendre comment les humains apprennent peut vous aider à apprendre plus efficacement.
- L'Internet et les LLM n'ont pas rendu l'apprentissage obsolète ; l'apprentissage est essentiel et prend du temps.
- L'expertise modifie votre façon de penser, ce qui vous permet de résoudre les problèmes plus facilement, mais peut également entraver votre capacité à enseigner.
Ce n'est pas parce que nous apprenons que nous comprenons comment nous apprenons. Une enquête menée aux États-Unis a révélé que la majorité des croyances sur la mémoire allaient à l'encontre du consensus scientifique : Les gens ne comprennent pas intuitivement comment fonctionnent la mémoire et l'apprentissage [37].
Prenons l'exemple des styles d'apprentissage. Les défenseurs des styles d'apprentissage affirment qu'un enseignement efficace correspond aux styles préférés des apprenants - les apprenants visuels regardent, les apprenants auditifs écoutent et les apprenants kinesthésiques agissent. Une étude réalisée en 2020 a révélé que 89 % des personnes pensent que les styles préférés des apprenants devraient dicter l'enseignement, bien que les chercheurs sachent depuis plusieurs décennies que ce n'est pas le cas [28]. Bien que les apprenants aient des styles préférés, un enseignement efficace correspond au contenu, et non aux styles d'apprentissage. Un cours de sciences devrait utiliser des graphiques pour présenter les données plutôt que des descriptions verbales, quel que soit le style d'apprentissage visuel ou auditif, tout comme les cours de cuisine devraient utiliser des activités pratiques plutôt que la lecture, que les apprenants préfèrent un style kinesthésique ou non.
Des décennies de recherche en psychologie cognitive, en éducation et en programmation de l'éducation permettent de mieux comprendre comment nous apprenons. Les dix sections suivantes de cet article présentent des résultats de recherche sur l'apprentissage qui s'appliquent aux développeurs logiciels et discutent de leurs implications pratiques. Ces informations peuvent vous aider à apprendre par vous-même, à enseigner aux jeunes employés et à recruter du personnel.
1. La mémoire humaine n'est pas constituée de bits
La mémoire humaine est au cœur de l'apprentissage. Comme l'expliquent Kirschner et Hendrick, "l'apprentissage signifie qu'une modification a été apportée à la mémoire à long terme d'une personne" [20]. Les développeurs logiciels connaissent bien l'incroyable puissance de la mémoire informatique, qui permet de stocker une série de bits et de retrouver plus tard cette même série de bits. Bien que la mémoire humaine soit similaire, elle n'est ni aussi précise ni aussi fiable.
En raison de la complexité biologique de la mémoire humaine, la fiabilité est une question complexe. Avec la mémoire informatique, nous utilisons deux opérations fondamentales : la lecture et l'écriture. La lecture de la mémoire informatique ne la modifie pas et le temps qui s'écoule entre les écritures et les lectures n'a pas d'importance. La mémoire humaine à long terme n'est pas aussi stérile. La mémoire humaine semble avoir une opération de "lecture et mise à jour", dans laquelle le fait d'aller chercher un souvenir peut à la fois le renforcer et le modifier - un processus connu sous le nom de reconsolidation. Cette modification est plus probable pour les souvenirs récemment formés. En raison de ce potentiel de modification, un fait n'existe pas dans un état binaire de définitivement connu ou inconnu ; il peut exister dans des états intermédiaires. Nous pouvons oublier des choses que nous savions auparavant, et la connaissance peut être peu fiable, surtout lorsqu'elle est récente.
Une autre caractéristique curieuse de la mémoire humaine est la "diffusion de l'activation " [1] : nos souvenirs sont stockés dans des voies neuronales interconnectées. Lorsque nous essayons de nous souvenir de quelque chose, nous activons une voie de neurones pour accéder à l'information ciblée. Cependant, l'activation n'est pas limitée à une seule voie. Une partie de l'énergie d'activation se propage à d'autres voies connectées, comme la chaleur rayonnant d'un tuyau d'eau chaude. Cette activation diffuse laisse les voies connexes prêtes à être activées pendant des heures [1].
L'activation diffuse a une incidence négative sur la mémoire [1] et une incidence positive sur la résolution de problèmes [32]. L'activation diffuse signifie que des informations connexes, mais imprécises, peuvent être confondues avec l'information cible, ce qui signifie que notre rappel de l'information peut ne pas être fiable. Cependant, l'activation diffuse est également associée à la résolution de problèmes basée sur la perspicacité, ou "moments d'émerveillement". Comme les voies restent amorcées pendant des heures, le fait de s'éloigner d'un problème pour travailler sur un autre, qui a sa propre activation, permet à deux zones sans rapport de se connecter au milieu. Lorsque deux zones auparavant sans rapport se connectent, des solutions créatives et uniques aux problèmes peuvent apparaître. C'est la raison pour laquelle les promenades, les douches ou tout autre moyen de s'éloigner d'un problème peuvent vous aider à le résoudre.
En résumé, la mémoire humaine ne fonctionne pas par simple stockage et récupération à partir d'un emplacement spécifique, comme c'est le cas pour la mémoire des ordinateurs. La mémoire humaine est plus fragile et moins fiable, mais elle peut aussi offrir de grands avantages en matière de résolution de problèmes et de compréhension approfondie en reliant les connaissances entre elles. Nous reviendrons plus en détail sur ce point dans les sections suivantes, en particulier sur la récupération d'éléments de la mémoire et le renforcement des souvenirs.
2. La mémoire humaine est composée d'un système limité et d'un système illimité
La mémoire humaine comprend deux composantes principales qui sont pertinentes pour l'apprentissage : la mémoire à long terme et la mémoire de travail. La mémoire à long terme est l'endroit où les informations sont stockées de façon permanente et est fonctionnellement illimitée [1] ; en ce sens, elle fonctionne un peu comme le disque de stockage d'un ordinateur. La mémoire de travail, en revanche, est utilisée pour raisonner consciemment sur les informations afin de résoudre des problèmes [2] ; elle fonctionne comme les registres d'une unité centrale, stockant une quantité limitée d'informations en temps réel pour permettre l'accès et la manipulation.
La mémoire de travail est limitée et sa capacité est à peu près fixée à la naissance [2]. Bien qu'une capacité de mémoire de travail élevée soit liée à une intelligence générale plus élevée, la capacité de la mémoire de travail n'est pas la condition sine qua non de la performance [22]. Une capacité plus élevée permet un apprentissage plus rapide, mais notre mémoire à long terme illimitée élimine les limites de ce que nous pourrions finalement apprendre au total [1]. Les programmeurs experts peuvent avoir une capacité de mémoire de travail faible ou élevée, mais c'est le contenu de leur mémoire à long terme qui fait d'eux des experts.
Au fur et à mesure que l'on se familiarise avec un sujet, on regroupe les informations en morceaux [a]. Le regroupement permet aux différents éléments d'information d'agir comme un seul élément d'information dans la mémoire de travail. Par exemple, lors de l'apprentissage d'une adresse électronique, un domaine familier, tel que gmail.com, est traité comme un seul élément d'information au lieu d'une chaîne de caractères aléatoire, telle que xvjki.wmt. Pour reprendre notre analogie avec l'ordinateur, les registres de notre mémoire de travail/CPU ne nous permettent de stocker que cinq pointeurs vers des morceaux dans la mémoire à long terme/le disque, mais il n'y a pas de limite à la taille des morceaux, de sorte que la stratégie optimale consiste à augmenter la taille des morceaux en s'exerçant à utiliser l'information et à résoudre des problèmes.
Lors de l'apprentissage de nouveaux outils ou de nouvelles compétences, il est important de comprendre la charge cognitive, ou la capacité de la mémoire de travail, exigée par la tâche. La charge cognitive comprend deux parties : la charge intrinsèque et la charge extrinsèque. La charge intrinsèque correspond au nombre d'informations ou d'éléments intrinsèquement nécessaires pour accomplir la tâche ; elle ne peut être modifiée qu'en changeant la tâche. En revanche, la charge cognitive étrangère est constituée d'informations inutiles qui font néanmoins partie de l'exécution de la tâche. Le format de présentation est un exemple de la manière dont la charge cognitive externe peut varier. Si vous mettez en œuvre un schéma de base de données, il est plus facile d'utiliser un diagramme avec des tables et des attributs qu'une simple description en français. Cette dernière présente une charge cognitive supplémentaire plus importante car vous devez transformer mentalement la description en un schéma, alors que le diagramme peut être mis en correspondance directement (voir la figure 1). La charge extrinsèque est généralement plus élevée pour les débutants, car ils ne peuvent pas distinguer facilement les informations intrinsèques des informations extrinsèques.
Figure 1. Deux façons de présenter la même description de schéma de base de données avec une charge cognitive supplémentaire différente.
Lorsqu'une personne est confrontée à une tâche qui semble dépasser ses capacités, il est important de reconnaître qu'il est possible d'y remédier en réorganisant la tâche. La décomposition du problème en éléments plus petits qui peuvent être traités et découpés en morceaux permettra finalement à la personne de résoudre des problèmes complexes. Ce principe doit être appliqué à votre propre pratique lorsque vous êtes confronté à des problèmes à la limite ou au-delà de vos compétences actuelles, mais il est particulièrement pertinent lorsque vous travaillez avec des développeurs juniors et des recrues.
3. Les experts reconnaissent, les débutants raisonnent
L'une des principales différences entre les débutants et les experts est que ces derniers ont déjà tout vu. La recherche sur les experts en échecs a montré que leur principal avantage est leur capacité à se souvenir et à reconnaître l'état de l'échiquier, ce qui leur permet de décider comment réagir plus rapidement et avec moins d'efforts [15] . Kahneman [19,b] décrit la cognition comme étant divisée en "système 1" et "système 2" (prouvant ainsi que les développeurs ne sont pas les seuls à avoir du mal à nommer les choses). Le système 1 est rapide et axé sur la reconnaissance, s'appuyant sur la reconnaissance des formes dans la mémoire à long terme, tandis que le système 2 est plus lent et axé sur le raisonnement, nécessitant davantage de traitement dans la mémoire de travail. Cela fait partie d'une idée générale connue sous le nom de théories à double processus [34].
Les développeurs experts peuvent raisonner à un niveau plus élevé en ayant mémorisé des modèles communs dans le code du programme, ce qui libère leur cognition.
Les développeurs experts peuvent raisonner à un niveau plus élevé en ayant mémorisé (généralement de manière implicite, par expérience) des modèles communs dans le code du programme, ce qui libère leur cognition [4]. Les "modèles de conception" dans la programmation, similaires aux éléments discutés précédemment, en sont un exemple. Un expert peut immédiatement reconnaître qu'un morceau de code particulier exécute un algorithme de tri, tandis qu'un débutant peut lire ligne par ligne pour essayer de comprendre le fonctionnement du code sans avoir une vue d'ensemble.
Le corollaire est que les débutants peuvent devenir des experts en lisant et en comprenant beaucoup de code. Les experts se constituent une bibliothèque mentale de modèles qui leur permet de lire et d'écrire du code plus facilement à l'avenir. Le fait de voir du code C purement impératif peut ne s'appliquer que partiellement au code fonctionnel de Haskell, de sorte que le fait de voir une variété de paradigmes de programmation aidera davantage. Dans l'ensemble, cette correspondance de modèles est la raison pour laquelle lire et travailler avec plus de code, et plus de types de code, augmentera la compétence en programmation.
4. La compréhension d'un concept passe de l'abstrait au concret et vice-versa
La recherche montre que les experts traitent les concepts de manière différente des débutants. Les experts utilisent des termes génériques et abstraits qui recherchent les concepts sous-jacents et ne se concentrent pas sur les détails, tandis que les débutants se concentrent sur les détails de surface et ont des difficultés à relier ces détails à la situation dans son ensemble. Ces différences affectent la façon dont les experts raisonnent, mais aussi la façon dont ils apprennent.
Par exemple, lorsqu'ils expliquent une fonction variadique en Python à quelqu'un qui ne connaît pas le concept, les experts peuvent dire qu'il s'agit d'une fonction qui peut prendre un nombre variable d'arguments. Un débutant peut se concentrer sur des détails tels que la syntaxe exacte de la déclaration et de l'appel de la fonction et peut penser que le fait de passer un seul argument est un cas particulier. Un expert peut plus facilement comprendre ou prévoir les détails lorsqu'on lui explique le concept.
Lorsque vous apprenez un nouveau concept, vous bénéficiez des deux formes d'explication : les caractéristiques abstraites et les détails concrets accompagnés d'exemples. Plus précisément, vous aurez intérêt à suivre la vague sémantique, un concept défini par le scientifique australien Karl Maton [25], comme l'illustre la figure 2.
Figure 2. La vague sémantique pour les fonctions variadiques.
En suivant la vague sémantique, vous passez continuellement de la définition abstraite à plusieurs exemples divers du concept. Plus les exemples sont variés, mieux c'est. Même les exemples erronés sont utiles lorsqu'ils sont comparés aux exemples corrects pour comprendre pourquoi ils sont erronés [23], comme le fait de voir une variable mutable étiquetée comme non-constante lorsqu'on essaie d'apprendre ce qu'est une constante. Ce processus s'appelle l'unpacking (déballage).
Grâce à ces divers exemples, vous pouvez ensuite (re)visiter la définition abstraite et construire une compréhension plus profonde du concept. La compréhension approfondie découle de la reconnaissance de la façon dont les multiples détails des exemples sont liés au concept abstrait de la définition, un processus appelé "repacking".
La résolution de problèmes est (à tort) considérée comme une compétence générique. Or, ce n'est pas ainsi que fonctionne la résolution de problèmes dans le cerveau.
La programmation implique souvent l'apprentissage de concepts abstraits. Face à un concept abstrait à apprendre, tel que les fonctions, les gens cherchent souvent des instanciations concrètes du concept à examiner, par exemple la fonction abs qui renvoie la valeur absolue d'un nombre [17]. L'une des difficultés est que plus les concepts deviennent abstraits (des valeurs aux variables/objets en passant par les fonctions/classes, les fonctions d'ordre supérieur/métaclasses et enfin la théorie des catégories), plus la distance avec un exemple concret augmente. Ce qui est rassurant, c'est qu'à mesure que nous apprenons des concepts abstraits, ils deviennent plus concrets pour nous. Au départ, une fonction est un concept abstrait, mais après une longue pratique, elle devient un élément (ou un morceau) concret pour nous et nous pouvons apprendre le niveau d'abstraction suivant.
5. L'espacement et la répétition sont importants
Combien de fois avez-vous entendu dire qu'il ne faut pas bachoter pour un examen ? Sauf, bien sûr, si vous voulez tout oublier le lendemain. Ce conseil est basé sur l'un des effets les plus prévisibles et les plus persistants de la psychologie cognitive : l'effet d'espacement [10]. Selon l'effet d'espacement, les êtres humains apprennent mieux les concepts de résolution de problèmes en étalant leur pratique sur plusieurs sessions, plusieurs jours et, idéalement, plusieurs semaines.
La raison pour laquelle l'espacement fonctionne est due à la relation entre la mémoire à long terme et la mémoire de travail décrite précédemment dans cet article. Lorsque les apprenants s'entraînent à résoudre des problèmes, ils mettent en pratique deux compétences. D'abord, faire correspondre les informations du problème à un concept qui peut le résoudre (comme une boucle de filtrage), et ensuite, appliquer le concept pour résoudre le problème (comme écrire la boucle). La première compétence nécessite l'activation de la voie neuronale correcte vers le concept dans la mémoire à long terme [5]. Si les apprenants résolvent de manière répétée le même type de problème, comme les problèmes de boucle "for-each", cette voie vers la mémoire à long terme reste active et ils ne s'exercent pas à la première compétence. Bien que le fait d'intercaler différents types de problèmes, tels que les problèmes en boucle et les problèmes conditionnels, puisse être utile, les voies prennent du temps pour revenir à la ligne de base, d'où la nécessité d'espacer les exercices pour tirer le meilleur parti du temps de pratique [10]. En outre, le cerveau a besoin de repos pour consolider les nouvelles informations traitées afin de pouvoir les appliquer à de nouveaux problèmes.
Allant à l'encontre de ce principe éprouvé, les bootcamps de codage intensifs exigent des apprenants qu'ils concentrent leur pratique de la résolution de problèmes sur des sessions non espacées. Bien que cela ne soit pas idéal, les chercheurs sur l'effet d'espacement savent depuis le début que la plupart des apprenants préfèrent toujours s'entraîner en un minimum de temps [10]. Pour les personnes dont la seule option viable pour apprendre la programmation est de participer à des bootcamps intensifs, nous pouvons appliquer la recherche sur l'espacement pour maximiser leurs résultats.
Pour structurer une journée d'apprentissage, les apprenants doivent limiter les séances d'apprentissage à 90 minutes ou moins [21]. L'équilibre neurochimique du cerveau rend la concentration difficile au-delà de cette durée [21]. Après chaque séance d'apprentissage, prenez au moins 20 minutes pour vous reposer [21]. Reposez-vous vraiment en allant vous promener ou en vous asseyant tranquillement, sans travailler sur d'autres tâches, sans naviguer sur Internet ou sans discuter avec d'autres personnes. Le repos accélère le processus de consolidation, qui se produit également pendant le sommeil.
Dans le cadre d'une séance d'apprentissage, il existe quelques stratégies permettant d'optimiser l'efficacité. Tout d'abord, randomisez l'ordre du type de problème à résoudre afin que différents concepts soient activés dans la mémoire à long terme [5]. Sachez toutefois que le fait de randomiser l'ordre améliore les résultats de l'apprentissage, mais demande plus d'efforts [6]. La deuxième stratégie consiste à faire de courtes pauses à intervalles aléatoires pour améliorer la consolidation de la mémoire. Une pause de 10 secondes toutes les 2 à 5 minutes est recommandée [18].
6. Internet n'a pas rendu l'apprentissage obsolète
La disponibilité des connaissances en programmation a changé avec l'avènement de l'internet. Les connaissances sur la syntaxe ou les API ne sont plus enfouies dans des ouvrages de référence, mais à portée de main. Plus récemment, des outils alimentés par l'IA tels que ChatGPT, Codex et GitHub Copilot rempliront même ces détails (la plupart du temps avec précision) à votre place. Cela soulève une question évidente : Pourquoi vaut-il la peine d'apprendre des détails - ou quoi que ce soit d'autre - si les connaissances sont disponibles sur Internet en quelques secondes ?
Nous apprenons en stockant des éléments de connaissance dans notre mémoire à long terme et en établissant des liens entre eux [1]. Si les connaissances ne sont pas présentes dans le cerveau, parce que vous ne les avez pas encore bien apprises, le cerveau ne peut pas former de connexions entre elles, de sorte que les niveaux supérieurs de compréhension et d'abstraction ne sont pas possibles [1]. Si, chaque fois que vous avez besoin d'un morceau de code pour effectuer une jointure de base de données, vous le recherchez en ligne, l'insérez et passez à autre chose, il est peu probable que vous appreniez beaucoup de choses sur les jointures. La sagesse de s'appuyer sur l'internet ou l'IA diffère selon que l'on est débutant ou expert : Il existe une distinction essentielle entre un débutant qui n'a jamais appris les détails et qui manque donc de connexions mémorielles, et un expert qui a appris la structure profonde mais qui recherche les détails fins oubliés [1].
Certaines données suggèrent même que la recherche sur l'internet est moins efficace pour mémoriser les informations. Une étude a montré que l'on se souvenait moins bien d'une information trouvée sur Internet (par rapport à un livre physique) [11]. Une autre étude a montré qu'une recherche immédiate sur l'internet entraînait une moins bonne mémorisation de la même information par la suite, par rapport au fait d'essayer d'abord de penser à la réponse avant de recourir à la recherche [14]. Il semble que la recherche puisse priver le cerveau des avantages de l'effet de renforcement de la mémoire que procure le rappel des informations.
Il y a aussi la question de la charge cognitive évoquée plus haut. Une recherche sur l'internet exige une forme de changement de contexte pour le cerveau ; son attention limitée et sa mémoire de travail doivent passer de la tâche en cours (programmation) à une nouvelle tâche cognitive (recherche sur l'internet et sélection d'un résultat ou évaluation d'un résultat généré par l'IA). Si les connaissances requises sont plutôt mémorisées, non seulement l'accès est beaucoup plus rapide (comme l'utilisation d'un cache par rapport à la recherche sur un disque dur), mais cela évite également la perte cognitive liée au changement de contexte et au filtrage des informations superflues lors de la recherche. Il y a donc de multiples raisons de mémoriser des informations, même si elles sont disponibles sur l'internet.
7. La résolution de problèmes n'est pas une compétence générique
La résolution de problèmes est un aspect important de la programmation. Une idée courante (mais incorrecte) dans le développement de logiciels est d'enseigner directement la résolution de problèmes comme une compétence spécifique, qui peut ensuite être appliquée à différents aspects du développement (conception, débogage, etc.). Ainsi, la résolution de problèmes est (à tort) conçue comme une compétence générique. Or, ce n'est pas ainsi que fonctionne la résolution de problèmes dans le cerveau.
Si l'homme dispose de certaines compétences génériques en matière de résolution de problèmes, celles-ci sont beaucoup moins efficaces que les compétences spécifiques à un domaine, telles que la capacité à déboguer des programmes. Bien que nous puissions apprendre à raisonner, nous n'apprenons pas à résoudre des problèmes en général. Nous apprenons plutôt à résoudre des problèmes de programmation, à planifier le meilleur coup aux échecs ou à créer un modèle de tricot. Chacune de ces compétences est distincte et n'influence pas les autres. La recherche sur les échecs n'a révélé que peu ou pas d'effets de l'apprentissage de cette discipline sur d'autres compétences scolaires et cognitives, et il en va de même pour l'enseignement de la musique et l'entraînement cognitif [36]. Cette incapacité à transférer les compétences en matière de résolution de problèmes explique pourquoi l'"entraînement cérébral" est inefficace pour développer l'intelligence générale [29].
La seule exception à cette règle semble être les compétences spatiales. Les compétences spatiales nous permettent de visualiser des objets dans notre esprit, comme une forme de Tetris, et de manipuler mentalement ces objets, comme faire tourner une forme de Tetris. L'entraînement de ces compétences génériques peut améliorer l'apprentissage dans d'autres disciplines. Ce phénomène est si inhabituel qu'il a suscité une grande consternation dans les sciences cognitives et les sciences de l'apprentissage [24]. Pourtant, l'entraînement spatial améliore les performances dans toute une série de compétences non verbales, indépendamment des capacités initiales, de l'âge ou du type de tâche d'entraînement [40]. Des travaux récents ont même démontré que l'entraînement spatial peut améliorer l'efficacité des développeurs de logiciels professionnels, probablement parce qu'ils sont encore en train d'apprendre de nouveaux concepts [30]. Même avec cette étrange exception, la meilleure façon d'apprendre à résoudre des problèmes de programmation reste de s'entraîner à résoudre des problèmes de programmation plutôt que de chercher des avantages en termes de performances dans l'apprentissage des échecs ou d'autres formations cognitives.
Il y a ici une implication secondaire pour le recrutement. Une idée très répandue pour sélectionner les candidats à la programmation consistait à leur proposer des casse-tête, comme la manière de peser un avion gros porteur. Comme Google l'a découvert en 2013, c'est une perte de temps [7] - il n'y a pas de correspondance fiable entre la résolution de problèmes dans le monde des casse-tête et la résolution de problèmes dans le monde de la programmation. Si vous voulez juger de la capacité à programmer, évaluez la capacité à programmer.
8. L'expertise peut être problématique dans certaines situations
Nous avons discuté des nombreuses façons dont l'expertise profite à l'apprentissage et à la performance. Cependant, le fait d'être un expert peut également entraîner des problèmes.
Les programmeurs utilisent des outils et des aides pour être plus efficaces, tels que les systèmes de contrôle de version ou les IDE. Ces outils peuvent avoir des effets différents sur les débutants et les experts. Les débutants peuvent être dépassés par la quantité d'options disponibles dans les outils professionnels (en raison d'une charge cognitive accrue) et peuvent bénéficier de conseils adaptés aux débutants sur la manière d'utiliser l'outil. Cependant, les experts trouvent ces mêmes conseils plus distrayants qu'utiles, car ils savent déjà ce qu'il faut faire. C'est ce qu'on appelle l'effet inverse de l'expertise : les conseils et les guides qui aident les débutants peuvent gêner les experts et les rendre moins productifs.
Les programmeurs apprennent généralement plusieurs langages de programmation au cours de leur carrière. La connaissance de plusieurs langages peut être bénéfique une fois qu'ils sont maîtrisés, mais le transfert de connaissances d'un langage de programmation à un autre peut parfois conduire à des connaissances erronées. Par exemple, un programmeur peut apprendre ce qu'est l'héritage en Java, où une méthode remplace une méthode parent tant que les signatures correspondent, et transférer ces connaissances en C++, où le remplacement d'une méthode parent nécessite en outre que la méthode parent soit déclarée virtuelle. Ce type de différences - où les caractéristiques sont similaires dans la syntaxe mais différentes dans la sémantique entre les langues - entrave spécifiquement le transfert de connaissances [39].
Les experts aident souvent à former les débutants, mais les experts qui n'ont pas l'expérience de la formation des autres ne se rendent souvent pas compte que les débutants pensent différemment. Ils ne parviennent donc pas à adapter leurs explications à une personne dont le modèle mental est différent. C'est ce que l'on appelle le problème de l'angle mort de l'expert : la difficulté de voir les choses avec les yeux d'un débutant une fois que l'on est devenu un expert. Il est possible de surmonter ce problème en écoutant attentivement les débutants expliquer leur compréhension actuelle et en adaptant les explications en conséquence.
Parfois, cependant, les connaissances deviennent tellement automatisées qu'il est difficile pour les experts de les verbaliser [1]. Ces connaissances automatisées expliquent pourquoi les experts ont des intuitions sur la manière de résoudre les problèmes ou expliquent leur processus en disant : "Je sais, c'est tout". Dans ces cas de connaissances tacites, les débutants peuvent mieux apprendre à l'aide de matériel pédagogique conçu pour les aider, souvent appelé enseignement par échafaudage, ou auprès d'un pair plutôt que d'un expert. Un pair mieux informé (mais encore relativement novice) est une ressource très précieuse pour combler le fossé entre les débutants et les experts. Il peut aider le débutant à développer de nouvelles connaissances et l'expert à redécouvrir des connaissances automatisées.
9. Les facteurs prédictifs de l'aptitude à la programmation ne sont pas clairs
La réussite de l'apprentissage de la programmation, comme la plupart des activités, repose sur un mélange d'aptitudes intrinsèques et de pratique. Certains pensent qu'il s'agit uniquement d'aptitudes - le point de vue "on est né avec" - et d'autres pensent qu'il s'agit presque entièrement de pratique - l'idée des "10 000 heures", selon laquelle seule une pratique suffisante est nécessaire pour acquérir une expertise. Ces deux points de vue extrêmes sont erronés et, dans cette section, nous examinerons les preuves des effets différents des aptitudes et de la pratique.
De nombreuses recherches ont été menées pour tenter de prédire l'aptitude à la programmation, mais peu de résultats fiables ont été obtenus. Les tentatives d'élaboration d'un test prédictif de l'aptitude à la programmation n'ont généralement pas abouti. Les recherches ont montré que tous les éléments suivants ne permettent pas de prédire l'aptitude à la programmation : le sexe, l'âge, la filière universitaire, la race, les performances antérieures en mathématiques, l'expérience antérieure avec un autre langage de programmation, les perceptions de la science informatique et la préférence pour les sciences humaines ou les sciences [35]. Une industrie de tests d'aptitude à la programmation a vu le jour dans les années 1960, mais comme le résume Robins [33], la précision prédictive était médiocre et les tests sont tombés en désuétude.
Les preuves de l'importance des années d'expérience, qui sont liées à la pratique, sont mitigées. Il existe une corrélation entre la réputation des programmeurs sur Stack Overflow et leur âge : Les personnes plus âgées ont une meilleure réputation [27]. Cependant, une étude récente n'a trouvé qu'un faible lien entre les années d'expérience et la réussite d'une tâche de programmation parmi les programmeurs qui étaient relativement au début de leur carrière [31], ce qui suggère que les aptitudes peuvent avoir un effet plus important que l'expérience, du moins au début de la carrière des programmeurs.
Comme dans la plupart des domaines, deux facteurs prédisent faiblement la réussite en programmation précoce : l'intelligence générale et la capacité de la mémoire de travail [4]. Ces facteurs représentent grosso modo les capacités de raisonnement et la quantité d'informations qu'un apprenant peut traiter en même temps. En tant que tels, ils prédisent le taux d'apprentissage plutôt que les capacités absolues. Une sous-mesure de ces deux facteurs, le raisonnement spatial, est un prédicteur plus fort de la réussite en programmation, même s'il reste assez modéré [30]. Le raisonnement spatial prédit également la réussite dans d'autres domaines scientifiques et mathématiques [24], il n'est donc pas spécifique à la programmation. En outre, ces corrélations faibles à modérées disparaissent largement avec l'augmentation de l'expérience, pour diverses raisons. Ainsi, les personnes intelligentes ne feront pas toujours de bons programmeurs, et les bons programmeurs n'ont pas besoin d'être dotés d'une intelligence générale élevée.
En bref, il est très difficile de prédire qui sera capable de programmer, surtout à long terme. Les programmeurs peuvent provenir de n'importe quel milieu ou groupe démographique, et les liens avec d'autres facteurs (tels que l'intelligence) sont généralement éphémères face à l'expérience. Par conséquent, lors du recrutement de nouveaux programmeurs, il n'existe pas de raccourci pour identifier les capacités de programmation, ni de "profils de candidats" fiables pour sélectionner les candidats en fonction de leurs capacités de programmation.
10. Votre état d'esprit compte
L'idée d'un clivage binaire dans la capacité de programmation est très ancienne : Soit on sait programmer, soit on ne sait pas. De nombreuses théories concurrentes sont à l'origine de cette idée. L'une des théories les plus convaincantes est l'idée de l'élan d'apprentissage [33], selon laquelle chaque sujet dépend des sujets précédents, de sorte qu'une fois que vous avez pris du retard, vous aurez du mal à le rattraper. Une théorie moins convaincante est l'idée d'un "gène du geek" (on naît avec ou sans), qui a peu de preuves empiriques [26]. Comme nous l'avons vu dans la section précédente, nous avons récemment compris que les différences d'aptitude à la programmation étaient dues à des différences d'expérience antérieure [16]. Des apprenants qui peuvent sembler similaires (par exemple, dans la même classe, avec le même diplôme, complétant le même bootcamp) peuvent avoir des connaissances et des compétences très différentes, les plaçant en avance ou en retard en termes d'élan d'apprentissage ou, dans un instantané de temps, leur donnant l'impression d'être "nés avec" ou non. Un effet similaire est constaté dans tous les domaines hautement techniques qui sont enseignés de manière facultative avant l'université (par exemple, la science de l'information, la physique et l'ingénierie) [9].
La vision binaire et ses effets sur l'enseignement et l'apprentissage ont été étudiés dans toutes les disciplines universitaires dans le cadre de recherches sur l'état d'esprit fixe et l'état d'esprit de croissance [12]. L'état d'esprit fixe s'aligne sur une vision des aptitudes selon laquelle les capacités des individus sont innées et immuables. Appliqué à l'apprentissage, cet état d'esprit signifie que si une personne éprouve des difficultés à accomplir une nouvelle tâche, c'est qu'elle n'est pas faite pour cela. À l'inverse, l'état d'esprit de croissance s'aligne sur le point de vue de la pratique, selon lequel les capacités des individus sont malléables. Appliqué à l'apprentissage, cet état d'esprit signifie que si une personne éprouve des difficultés à accomplir une nouvelle tâche, elle peut la maîtriser avec suffisamment d'entraînement.
Les tentatives d'élaboration d'un test prédictif de la capacité de programmation n'ont généralement pas abouti.
Comme le décrivent Cheryan et al [9], aucun des deux points de vue extrêmes n'est vrai. Par exemple, pratiquement tout le monde peut apprendre des notions de physique, même s'il n'est pas doué au départ. Cependant, pratiquement personne ne peut obtenir le prix Nobel de physique, même s'il s'entraîne beaucoup. Entre ces deux extrêmes, nous essayons souvent de déterminer les limites de nos capacités. Lorsque les enseignants et les apprenants abordent de nouvelles tâches avec un état d'esprit de croissance, ils ont tendance à persister à travers les difficultés et à surmonter l'échec de manière plus cohérente [12].
Bien que les preuves de cet effet soient solides et intuitives, la recherche suggère qu'il peut être difficile de changer l'état d'esprit d'une personne pour qu'elle soit plus orientée vers la croissance [8]. En particulier, il existe deux idées fausses très répandues sur la manière de promouvoir un état d'esprit de croissance, qui s'avèrent inefficaces. La première idée fausse consiste à récompenser l'effort plutôt que la performance parce que l'état d'esprit de croissance favorise la pratique plutôt que l'aptitude. Mais les apprenants ne sont pas stupides ; ils savent quand ils ne progressent pas, et les enseignants qui louent les efforts improductifs ne sont pas utiles. Au contraire, l'effort ne doit être récompensé que lorsque l'apprenant utilise des stratégies efficaces et qu'il est sur la voie de la réussite [13]. La deuxième idée fausse est que lorsqu'une personne aborde une tâche avec un état d'esprit de croissance, elle conservera cet état d'esprit tout au long de la tâche. En réalité, lorsque nous sommes confrontés à des revers et à des échecs, nous nous orientons vers un état d'esprit fixe, car nous ne savons pas exactement où se situent les limites de nos capacités. Nous devons donc nous entraîner à surmonter les revers et les échecs pour conserver un état d'esprit de croissance [13].
L'orientation vers un objectif est un concept lié aux mentalités fixes et de croissance. Elle se divise en deux catégories : l'approche et l'évitement. L'orientation vers un objectif "d'approche" implique de vouloir bien faire, ce qui engendre des comportements d'apprentissage positifs et efficaces : travailler dur, chercher de l'aide et essayer des sujets nouveaux et stimulants. En revanche, l'orientation "d'évitement" implique d'éviter l'échec. Cela entraîne des comportements négatifs et inefficaces : étudier de manière désorganisée, ne pas chercher d'aide, s'inquiéter des résultats et éviter les défis. Il est important que les apprenants puissent faire des erreurs sans être sévèrement sanctionnés si l'on veut les orienter vers l'"approche" plutôt que vers l'"évitement".
Les personnes intelligentes ne font pas toujours de bons programmeurs, et les bons programmeurs n'ont pas besoin d'avoir une intelligence générale élevée.
Lorsque vous apprenez une nouvelle compétence ou que vous formez quelqu'un à une nouvelle compétence, n'oubliez pas qu'aborder les tâches avec un état d'esprit de croissance est efficace, mais que c'est aussi une compétence à développer. Malheureusement, nous ne pouvons pas simplement dire aux gens d'adopter un état d'esprit de croissance et d'en récolter les fruits. Au lieu de cela, nourrissez cette compétence en demandant ou en fournissant un retour d'information honnête sur le processus d'apprentissage et l'efficacité des stratégies. Les mentors doivent féliciter leurs protégés pour les progrès qu'ils réalisent et accepter qu'ils fassent des erreurs sans les réprimander. Pour les apprenants, réfléchissez à la manière dont les compétences se sont améliorées au cours des dernières semaines ou des derniers mois lorsque vous doutez de vos progrès. En outre, il faut s'attendre à ce qu'un état d'esprit de croissance se transforme en un état d'esprit fixe face à l'échec, mais il peut aussi se redévelopper et se renforcer avec la pratique. Il est normal de se sentir découragé, mais cela ne signifie pas que vous le serez toujours. Si vous avez envie d'abandonner, faites une pause, allez vous promener, réfléchissez à vos stratégies, puis réessayez.
Résumé
Les développeurs de logiciels doivent continuellement apprendre afin de suivre l'évolution rapide du secteur. Pour apprendre quoi que ce soit, y compris la programmation, il faut mémoriser des éléments. La mémoire humaine est d'une complexité fascinante. Bien qu'elle présente certaines similitudes avec l'architecture des ordinateurs, il existe des différences essentielles qui la font fonctionner de manière tout à fait différente. Dans cet article, nous avons expliqué les connaissances scientifiques actuelles sur le fonctionnement de la mémoire humaine, le fonctionnement de l'apprentissage, les différences entre les débutants et les experts, et nous avons relié tout cela aux mesures pratiques que les développeurs logiciels peuvent prendre pour améliorer leur apprentissage, leur formation et leur recrutement.
Recommandations. Nous avons divisé nos recommandations en deux catégories : celles qui concernent le recrutement et celles qui concernent la formation et l'apprentissage.
En ce qui concerne le recrutement, nous formulons les recommandations suivantes :
- Il n'existe pas de bons indicateurs des capacités de programmation. Les stéréotypes fondés sur le sexe, la race ou d'autres facteurs ne sont pas étayés par des preuves. Si vous voulez savoir si les candidats programment bien, examinez leurs travaux antérieurs ou testez-les sur des tâches de programmation authentiques. Pour insister sur un point précis : Ne testez pas les candidats avec des casse-tête.
- Au moins chez les jeunes développeurs, le nombre d'années d'expérience n'est peut-être pas une mesure très fiable des capacités.
- Une recommandation connexe de Behroozi et al [3] est de demander aux candidats de résoudre les problèmes d'entretien dans une pièce, seuls, avant de présenter la solution, car la pression supplémentaire exercée par un recruteur qui observe ou exige de parler pendant la résolution du problème augmente la charge cognitive et le stress d'une manière qui nuit à la performance.
En ce qui concerne l'apprentissage et la formation, nous formulons les recommandations suivantes :
- Lire beaucoup de code permet de devenir un programmeur plus efficace.
- Les experts ne sont pas toujours les meilleurs pour former les débutants.
- L'apprentissage prend du temps, y compris entre les sessions d'apprentissage. Le bachotage intensif n'est pas efficace, mais la répétition espacée l'est.
- De même, passer du temps loin d'un problème peut aider à le résoudre.
- Ce n'est pas parce que vous pouvez le trouver par le biais d'une recherche sur Internet ou d'un outil d'IA générative que l'apprentissage est devenu obsolète.
- Utilisez des exemples pour passer de concepts abstraits à des faits concrets pouvant être appris.
- Chercher à réussir (plutôt qu'éviter l'échec) et croire que les capacités sont modifiables sont des facteurs importants de résilience et d'apprentissage.
Pour en savoir plus. De nombreux ouvrages sur l'apprentissage sont axés sur l'éducation formelle ; ils s'adressent aux enseignants des écoles et aux professeurs d'université. Cependant, les principes sont applicables partout, y compris dans le domaine du développement professionnel. Nous recommandons trois ouvrages :
- Why Don't Students Like School ? de Daniel T. Willingham, qui explique de manière succincte et lisible de nombreux principes de la mémoire et du fonctionnement du cerveau.
- The Programmer's Brain de Felienne Hermans et al [c] fait le lien entre ces concepts et la programmation et décrit comment les techniques d'apprentissage et de révision utilisées à l'école peuvent encore s'appliquer au développement professionnel.
- How Learning Happens : Seminal Works in Educational Psychology and What They Mean in Practice de Paul A. Kirschner et Carl Hendrick [20] propose un tour d'horizon des articles influents, en les expliquant dans un langage simple, ainsi que les implications et les liens entre eux.
Les articles cités peuvent également servir de lectures complémentaires. Si vous êtes un développeur logiciel, vous n'aurez peut-être pas accès à tous ces documents ; les membres de l'ACM qui disposent de l'option bibliothèque numérique auront accès aux documents de l'ACM, bien que bon nombre de nos références proviennent d'autres disciplines. Pour les articles plus récents, de nombreux auteurs fournissent des PDF gratuits sur leur site web ; vous pouvez essayer de rechercher le titre exact sur le web pour trouver ces PDF. De nombreux auteurs sont également heureux de vous fournir une copie si vous les contactez directement.
Remerciements
Nous sommes reconnaissants à Greg Wilson, qui a joué un rôle déterminant dans l'élaboration et la relecture de ce document, ainsi qu'à nos autres relecteurs : Philip Brown, Kristina Dietz, Jack Parkinson, Anthony Robins et Justin Thurman. Ce travail est financé en partie par la National Science Foundation sous la forme d'une subvention #1941642. Les opinions, résultats et conclusions ou recommandations exprimés dans ce document sont ceux des auteurs et ne reflètent pas nécessairement les opinions de la National Science Foundation.
Regardez les auteurs parler de ce travail dans la vidéo exclusive de Communications.
Références
1. Anderson, J.R. Cognitive Psychology and its Implications. Macmillan (2005).
2. Baddeley, A. Working memory. Science 255, 5044 (1992), 556–559.
3. Behroozi, M., Shirolkar, S., Barik, T., and Parnin, C. Does stress impact technical interview performance? In Proceedings of the 28th ACM Joint Meeting on European Software Engineering Conf. and Symp. on the Foundations of Software Engineering (2020), 481–492; https://bit.ly/3Sj3AHn
4. Bergersen, G.R. and Gustafsson, J.-E. Programming skill, knowledge, and working memory among professional software developers from an investment theory perspective. J. of Individual Differences 32, 4 (2011), 201.
5. Bjork, R.A. and Allen, T.W. The spacing effect: Consolidation or differential encoding? J. of Verbal Learning and Verbal Behavior 9, 5 (1970), 567–572.
6. Bjork, R.A. and Bjork, E.L. Desirable difficulties in theory and practice. J. of Applied Research in Memory and Cognition 9, 4 (2020), 475.
7. Bryant, A. In head-hunting, big data may not be such a big deal. The New York Times (June 2013); https://nyti.ms/3Msdraa.
8. Burgoyne, A.P., Hambrick, D.Z., and Macnamara, B.N. How firm are the foundations of mind-set theory? The claims appear stronger than the evidence. Psychological Science 31, 3 (2020), 258–267; https://bit.ly/3MsdPp4
9. Cheryan, S., Ziegler, S.A., Montoya, A.K., and Jiang, L. Why are some STEM fields more gender balanced than others? Psychological Bulletin 143, 1 (2017), 1.
10. Dempster, F.N. The spacing effect: A case study in the failure to apply the results of psychological research. American Psychologist 43, 8 (1988), 627.
11. Dong, G. and Potenza, M.N. Behavioural and brain responses related to Internet search and memory. European J. of Neuroscience 42, 8 (2015), 2546–2554; https://bit.ly/49loGL6
12. Dweck, C.S. Mindset: The New Psychology of Success. Random House (2006).
13. Dweck, C.S. and Yeager, D.S. Mindsets: A view from two eras. Perspectives on Psychological Science 14, 3 (2019), 481–496.
14. Giebl, S. et al. Thinking first versus Googling first: Preferences and consequences. J. of Applied Research in Memory and Cognition (2022); https://bit.ly/3QlXun5
15. Gobet, F. and Simon, H.A. The roles of recognition processes and look-ahead search in time-constrained expert problem solving: Evidence from grand-master-level chess. Psychological Science 7, 1 (1996), 52–55; https://bit.ly/40oT4jY
16. Grabarczyk, P., Nicolajsen, S.M., and Brabrand, C. On the effect of onboarding computing students without programming-confidence or experience. In Proceedings of the 22nd Koli Calling Intern. Conf. on Computing Education Research (2022), 1–8.
17. Hazzan, O. Reducing abstraction level when learning abstract algebra concepts. Educational Studies in Mathematics 40, 1 (Sept. 1999), 71–90; https://bit.ly/49lZd4f
18. Huberman, A. Teach & learn better with a "neuroplasticity super protocol". Neural Network (Oct. 2021).
19. Kahneman, D. Thinking, Fast and Slow. Macmillan, 2011.
20. Kirschner, P.A. and Hendrick, C. How Learning Happens: Seminal Works in Educational Psychology and What They Mean in Practice. Routledge (2020).
21. Kleitman, N. Basic rest-activity cycle—22 years later. Sleep 5, 4 (1982), 311–317.
22. Kyllonen, P.C. and Christal, R.E. Reasoning ability is (little more than) working-memory capacity?! Intelligence 14, 4 (1990), 389–433.
23. Margulieux, L. et al. When wrong is right: The instructional power of multiple conceptions. In Proceedings of the 17th ACM Conf. on Intern. Computing Education Research (2021), 184–197.
24. Margulieux, L.E. Spatial encoding strategy theory: The relationship between spatial skill and STEM achievement. In Proceedings of the 2019 ACM Conf. on Intern. Computing Education Research, 81–90; 10.1145/3291279.3339414.
25. Maton, K. Making semantic waves: A key to cumulative knowledge-building. Linguistics and Education 24, 1 (2013), 8–22; https://bit.ly/3tXhvZt.
26. McCartney, R. et al. Folk pedagogy and the geek gene: geekiness quotient. In Proceedings of the 2017 ACM SIGCSE Technical Symp. on Computer Science Education (2017), 405–410.
27. Morrison, P. and Murphy-Hill, E. Is programming knowledge related to age? An exploration of stack overflow. In 2013 10th Working Conf. on Mining Software Repositories (MSR), 69–72; https://bit.ly/3Sp5Mgv.
28. Newton, P.M. and Salvi, A. How common is belief in the learning styles neuromyth, and does it matter? A pragmatic systematic review. Frontiers in Education (2020), 5; https://bit.ly/47h0Jmo.
29. Owen, A.M. et al. Putting brain training to the test. Nature 465, 7299 (2010), 775–778.
30. Parkinson, J. and Cutts, Q. Relationships between an early-stage spatial skills test and final CS degree outcomes. In Proceedings of the 53rd ACM Technical Symp. on Computer Science Education 1, (2022), 293–299; 10.1145/3478431.3499332.
31. Peitek, N. et al. Correlates of programmer efficacy and their link to experience: A combined EEG and eye-tracking study. In Proceedings of the 30th ACM Joint European Software Engineering Conf. and Symp. on the Foundations of Software Engineering (Nov. 2022), 120–131.
32. Raufaste, E., Eyrolle, H., and Mariné, C. Pertinence generation in radiological diagnosis: Spreading activation and the nature of expertise. Cognitive Science 22, 4 (1998), 517–546; https://bit.ly/3sidUoq
33. Robins, A. Learning edge momentum: A new account of outcomes in CS1. Computer Science Education 20, 1 (2010), 37–71.
34. Robins, A.V. Dual process theories: Computing cognition in context. ACM Trans. Comput. Education 22, 4 (Sept. 2022); 10.1145/3487055.
35. Rountree, N., Rountree, J., Robins, A., and Hannah, R. Interacting factors that predict success and failure in a CS1 course. ACM SIGCSE Bulletin 36, 4 (2004), 101–104.
36. Sala, G. and Gobet, F. Does far transfer exist? Negative evidence from chess, music, and working memory training. Current Directions in Psychological Science 26, 6 (2017), 515–520; 10.1177/0963721417712760.
37. Simons, D.J. and Chabris, C.F. What people believe about how memory works: A representative survey of the U.S. population. PLOS ONE 6, 8 (Aug. 2011), 1–7; 10.1371/journal.pone.0022757.
38. Thalmann, M., Souza, A.S., and Oberauer, K. How does chunking help working memory? J. of Experimental Psychology: Learning, Memory, and Cognition 45, 1 (2019), 37.
39. Tshukudu, E. and Cutts, Q. Understanding conceptual transfer for students learning new programming languages. In Proceedings of the 2020 ACM Conf. on Intern. Computing Education Research, 227–237; 10.1145/3372782.3406270.
40. Uttal, D.H. et al. The malleability of spatial skills: A meta-analysis of training studies. Psychological Bulletin 139, 2 (2013), 352.
Auteurs
Neil C.C. Brown is a senior research fellow at King's College London, U.K.
Felienne F.J. Hermans is a professor at Vrije Universiteit Amsterdam, The Netherlands.
Lauren E. Margulieux (lmargulieux@gsu.edu) is an associate professor at Georgia State University, Learning Sciences, Atlanta, GA, USA
Notes de bas de page
a. This is not an informal description: the technical term is actually "chunks."
b. Parts of Kahneman's book were undermined by psychology's "replication crisis," which affected some of its findings, but not the idea of system 1 and 2.
c. Full disclosure: This is written by one of the authors although the other authors recommend it as well.
More online: A List of full references and supplementary information is available at https://bit.ly/3G2NPNl.
Ce travail est soumis à une licence Creative Commons Attribution-NonCommercial International 4.0.
La Bibliothèque numérique est publiée par l'Association for Computing Machinery. Copyright © 2024 ACM, Inc.
Source : "10 Things Software Developers Should Learn about Learning", par Neil C. C. Brown, Felienne F. J. Hermans, Lauren E. Margulieux (publié dans Communications of the ACM)
Et vous ?
Quel est votre avis sur le sujet ?
Voir aussi :
10 vérités difficiles à avaler que l'on ne vous dira pas sur le métier d'ingénieur logiciel, par Mensur Durakovic, ingénieur logiciel
Ce que tout programmeur doit savoir #1 : L'idempotence, par Berkan Sasmaz, ingénieur logiciel