IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

10 choses que les développeurs logiciels devraient apprendre sur l'apprentissage
Un article scientifique de Neil C. C. Brown, Felienne F. J. Hermans et Lauren E. Margulieux

Le , par Anthony

300PARTAGES

16  0 
L'apprentissage est nécessaire pour les développeurs logiciels. Le changement est perpétuel : de nouvelles technologies sont fréquemment inventées et les anciennes technologies sont constamment mises à jour. Ainsi, les développeurs n'apprennent pas à programmer une seule fois - au cours de leur carrière, ils apprendront de nombreux nouveaux langages de programmation et de nombreux frameworks.

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...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de jmbichot
Membre à l'essai https://www.developpez.com
Le 03/02/2024 à 13:02
Merci pour le travail de cet article précis, argumenté, avec ses nombreuses sources
5  0 
Avatar de ElPedro
Membre du Club https://www.developpez.com
Le 04/02/2024 à 17:00
C'est l'un des articles qui m'a le plus plu en presque 20 ans sur ce site.
J'y retrouve par ailleurs 4 conseils que je donne à mes étudiants au début de leur année, tant mieux.
Bravo et merci.
5  0 
Avatar de unanonyme
Membre éclairé https://www.developpez.com
Le 29/12/2023 à 20:12
Bonjour,

un bon billet, intéressant à lire.

Bonne journée.
4  0 
Avatar de topic
Nouveau membre du Club https://www.developpez.com
Le 05/02/2024 à 13:47
Article extremement intéressant mais publié en pleines vacances de fin d'année, j'ai failli passer à côté.
Je ne sais pas qui remercier pour l'avoir fait remonter dans les publications.
1  0 
Avatar de depth1
Candidat au Club https://www.developpez.com
Le 21/02/2024 à 8:59
Très intéressant.
Merci pour ce billet et bon apprentissage à tous les devs :-)
1  0 
Avatar de G'Optimus
Membre régulier https://www.developpez.com
Le 27/02/2024 à 19:02
Bonsoir,

Je trouve cet article hyper important.
1  0