Un vieil adage auquel de nombreux programmeurs adhèrent est "Il faut un certain type d'esprit pour apprendre la programmation, et tout le monde ne peut pas le faire."
Maintenant, je suis sûr que nous avons tous nos propres preuves anecdotiques, mais cela a-t-il été étudié scientifiquement?
Une autre étude, Enquêter sur la viabilité des modèles mentaux détenus par les programmeurs débutants :
Cet article décrit une enquête sur la viabilité des modèles mentaux utilisés par les programmeurs débutants à la fin d'une première année Java. Les résultats qualitatifs identifient la gamme de modèles mentaux de valeur et d'affectation de référence détenus L'analyse quantitative révèle qu'environ un tiers des étudiants possédaient des modèles mentaux non viables d'attribution de valeur et seulement 17% des étudiants possédaient un modèle mental viable d'affectation de référence. De plus, en termes de comparaison entre le mental des participants modèles et leur performance dans les évaluations en cours et l'examen final, il a été constaté que les étudiants avec des modèles mentaux viables ont obtenu de bien meilleurs résultats que ceux avec des modèles non viables. Ces résultats sont utilisés pour proposer une approche plus "constructiviste" de l'enseignement de la programmation basée sur l'intégration du "conflit cognitif" et de la visualisation du programme.
Voir aussi recherches ultérieures des mêmes auteurs de l'étude Sheep vs Goats (qui n'a jamais été réellement publiée, pour être clair). Leur dernière et plus récente étude sur ce sujet de 2009 est Méta-analyse de l'effet de la cohérence sur le succès dans l'apprentissage précoce de la programmation (pdf).
Un test a été conçu pour examiner apparemment les connaissances d'un étudiant sur le travail et la séquence avant un premier cours de programmation, mais en fait, il a été conçu pour saisir leurs stratégies de raisonnement. Une expérience a trouvé deux populations distinctes d'étudiants: l'une pourrait construire et appliquer systématiquement un modèle mental d'exécution de programme; l'autre semblait soit incapable de construire un modèle, soit d'en appliquer un de manière cohérente. Le premier groupe a obtenu de bien meilleurs résultats à l'examen de fin de cours que le second en termes de réussite ou d'échec. Le test ne prévoit pas très précisément les niveaux de performance, mais en combinant le résultat de six répétitions de l'expérience, cinq au Royaume-Uni et une en Australie, nous montrons que la cohérence a un effet important sur la réussite de l'apprentissage précoce pour programmer - mais l'expérience de programmation en arrière-plan, d'autre part, a peu ou pas d'effet.
Oui, il existe un article en ligne assez célèbre conçu pour déterminer plus ou moins "Qui est conçu pour être programmeur".
ne étude cognitive de l'apprentissage précoce de la programmation - Prof Richard Bornat, Dr Ray Adams
Tous les professeurs de programmation trouvent que leurs résultats affichent une "double bosse". C'est comme s'il y avait deux populations: celles qui peuvent [programmer] et celles qui ne peuvent pas [programmer], chacune avec sa propre courbe en cloche indépendante.
Presque toutes les recherches sur la programmation de l'enseignement et de l'apprentissage se sont concentrées sur l'enseignement: changer la langue, changer le domaine d'application, utiliser un IDE et travailler sur la motivation. Rien de tout cela fonctionne, et la double bosse persiste.
Nous avons un test qui sélectionne la population qui peut programmer, avant le début du cours. On peut séparer la double bosse. Vous ne croyez probablement pas cela, mais vous le ferez après avoir entendu le discours. Nous ne savons pas exactement comment/pourquoi cela fonctionne, mais nous avons de bonnes théories.
Voici n article de blog de Jeff Atwood qui interprète les résultats et met certaines choses en contexte.
Malgré les énormes changements qui ont eu lieu depuis que l'informatique électronique a été inventée dans les années 1950, certaines choses restent obstinément les mêmes. En particulier, la plupart des gens ne peuvent pas apprendre à programmer: entre 30% et 60% des effectifs de chaque département universitaire en informatique échouent au premier cours de programmation.
Les enseignants expérimentés sont fatigués mais ne sont jamais inconscients de ce fait; les débutants brillants qui croient que les anciens ont dû mal le faire apprennent la vérité par une amère expérience; et il en est ainsi depuis près de deux générations, depuis le début du sujet dans les années 60.
Tout le monde peut être programmeur. Considérez la facilité avec laquelle les gens saisissent les feuilles de calcul. Considérez avec quelle facilité Alan Kay initie les enfants à la programmation au moyen d'expériences et d'explorations dans un environnement programmable.
Les gens peuvent étudier la réussite dans des cours de niveau collégial et conclure que "certaines personnes ne sont pas aptes à apprendre la programmation". Cependant, une telle conclusion dépasse gravement les limites des preuves observées. Combien d'échecs pourraient être attribués à la façon dont la programmation est enseignée (trop abstraite?), Ou quel style de programmation est enseigné (trop impératif?), Ou à l'environnement de programmation (compilation, pas de rétroaction immédiate?).
Il est bien entendu que les gens saisissent les abstractions plus facilement après avoir déjà travaillé avec plusieurs instances concrètes - c'est-à-dire que nous ne pouvons pas apprendre quelque chose jusqu'à ce que nous le sachions presque déjà. Commencer par l'abstrait est donc une façon complètement stupide d'enseigner la programmation. Beaucoup de gens qui trébuchent sur des "modèles mentaux" préconçus prospéreraient s'ils étaient enseignés dans un environnement plus concret avec des commentaires en temps réel (par exemple comme dans le Kahn Academy for CS ) puis encouragés à grimper le échelle d'abstraction quand ils sont prêts pour cela. Programmation apprenable est un essai récent de Bret Victor attire l'attention sur les défis environnementaux inutiles auxquels les programmeurs sont confrontés dans l'apprentissage.
Dans certains cas, ce sont les élèves qui échouent dans leurs cours. La paresse intellectuelle et l'ignorance volontaire existeront dans n'importe quel grand groupe d'humains. Les gens intelligents ne font pas exception, comme peut en témoigner toute personne qui s'est disputée avec une manivelle brillante. Mais, surtout pour la programmation et les mathématiques, ce sont souvent les classes qui échouent aux élèves.
C'est peut-être anecdotique, mais quand j'ai enseigné la programmation d'introduction à quelques centaines d'étudiants en arts libéraux, je n'ai trouvé aucune "double bosse". Il me semblait qu'ils étaient tous très capables, bien que certains aient travaillé plus dur que d'autres, et très peu ont essayé de se frayer un chemin.
Beaucoup a à voir avec la façon dont il est enseigné.
Beaucoup a aussi à voir avec le désir - certains ne trouvent pas la programmation la moins intéressante. Mais même ainsi, ils peuvent l'apprendre s'ils font un effort honnête.
Quand j'ai commencé, il était courant de passer un "test d'aptitude" avant de décrocher un poste de programmeur. Il n'y avait pas autant de diplômés en informatique, il était donc courant de recruter dans d'autres disciplines.
Les tests étaient similaires à ce que vous voyez sur IQ tests (quel est le prochain numéro de la séquence, etc.).
La preuve anecdotique était que même si tous ceux qui ont réussi le test ne sont pas devenus un bon programmeur, personne qui a échoué au test mais qui a été embauché pour d'autres raisons n'est jamais devenu un bon programmeur.
Malheureusement, les drones RH n'ont pas compris ces tests (et ont échoué quand ils les ont passés!), Donc le recrutement de nos jours dépend des choses que les drones RH comprennent - bonnes compétences universitaires, de communication et de port de costumes.
C'est à peu près la raison pour laquelle les grands départements informatiques ont beaucoup de gens qui sont grands dans les spectacles PowerPoint et très peu de bons programmeurs.
On peut faire des études sur les capacités d'abstraction ou d'autres connaissances utiles, mais la définition de la programmation n'est pas claire, et je pense que la citation n'est pas pertinente, car il existe des façons opposées de considérer la programmation:
Le premier type: les langages de programmation sont (ou devraient être) une sorte de langage humain conçu pour décrire une tâche à exécuter par l'ordinateur, de sorte que tous ceux qui parlent devraient pouvoir programmer. Cela s'appelle le scripting, BASIC, le système de composition TeX , etc ... Le langage ou le système n'a pas d'importance, c'est la façon dont leurs créateurs et les gens l'ont regardé: "Cher programme/ordinateur, veuillez imprimer mon nom" , plutôt que "Obtenez-moi un espace de la taille de onze caractères, puis donnez-moi l'adresse de cet espace, puis laissez-moi le stocker, puis entrez onze caractères dans cette mémoire que vous pouvez retirer de mon tampon clavier (mais n'oubliez pas de le nettoyer, etc. "
Dans ce cas, il est clair que l’étude serait plutôt "toutes les langues ne peuvent pas être assimilées rapidement?".
D'un autre côté, les langages de programmation ne sont qu'un moyen de décrire comment un ordinateur fonctionne ou comment il devrait fonctionner, comment il devrait être "connecté" si vous pensez aux ordinateurs des années 50. Par conséquent, le programmeur ne peut rien faire, même s'il "parle" parfaitement le langage de programmation, si son intelligence ne peut pas atteindre ce niveau d'abstraction où vous voyez des octets stockés en mémoire, des chaînes comme pointeurs, etc., puis revenir sur terre pour le relier au problème. Par conséquent, tous les humains ne peuvent pas programmer (en langage d'assemblage ...).
En dehors de cela, vous aurez besoin de toutes les qualités requises pour travailler et produire quelque chose: savoir très bien ce que vous voulez, le rendre facile à comprendre/à compléter/à réviser, à vous concentrer sur vos objectifs, etc ... Mais comme un architecte, un écrivain, un musicien, un prothésiste prostituée… ahh, etc.
Mais la plupart des humains ont de bonnes capacités d'abstraction, en particulier les enfants. Certaines écoles allemandes enseignent Haskell aux préadolescents (des langages de programmation comme Pascal ou Delphi sont enseignés dans toutes les écoles allemandes).
Je dirais donc qu'il est très difficile de répondre à la question, et toute réponse (ou étude) risque d'être sans objet.
Vous trouverez une analyse très brève de la façon dont les gens apprennent la programmation dans l'article Teach Yourself Programming in Ten Years de Peter Norvig. Il semble penser qu'il n'y a pas de programmeur né.
Pour ceux qui citent l'étude de Dehnadi et Bornat sur la double bosse ou les chèvres contre les moutons, il vaut la peine de consulter Modèles mentaux et aptitude à la programmation par Caspersen et al (2007) dans lequel ils tentent de le reproduire:
Prédire la réussite des étudiants participant à des cours de programmation d'introduction est un domaine de recherche actif depuis plus de 25 ans. Jusqu'à récemment, aucune variable ou test n'avait de pouvoir prédictif significatif. Cependant, Dehnadi et Bornat affirment avoir trouvé un test simple pour la capacité de programmation à séparer proprement les moutons programmeurs des caprins non programmeurs. Nous présentons brièvement leur théorie et leur instrument de test.
Nous avons répété leur test dans notre contexte local afin de vérifier et peut-être de généraliser leurs résultats, mais nous n'avons pas pu montrer que le test prédit la réussite des étudiants dans notre cours d'initiation à la programmation.
Sur la base de cet échec de l'instrument de test, nous discutons diverses explications de nos résultats différents et suggérons une méthode de recherche à partir de laquelle il peut être possible de généraliser les résultats locaux dans ce domaine. De plus, nous discutons et critiquons le test d'aptitude à la programmation de Dehnadi et Bornat et concevons des instruments de test alternatifs.
Il y a plusieurs années, j'ai suivi plusieurs cours qui comprenaient la théorie du leadership militaire. Une partie de la théorie était qu'il existe un continuum de leadership, de ceux qui sont des leaders naturels à ceux qui ne pouvaient pas conduire un chien en laisse. L'idée était que les gens étaient répartis sur ce continuum de leadership dans une courbe en cloche, la plupart des gens étant quelque part entre les deux extrêmes. Mis à part quelques-uns à l'extrême extrême "ne pouvait pas conduire un chien", presque tout le monde pouvait apprendre l'art du leadership. L'effort requis pour transformer quelqu'un en leader dépendait de l'endroit où il était assis dans le continuum.
Je soupçonne que la programmation a un continuum et une distribution similaires. Il y aura ceux qui l'obtiendront sans effort et ceux qui ne pourraient jamais l'obtenir si leur vie en dépendait. Mais ce sont les rares à la fin de la courbe en cloche. La plupart des gens sont assis entre ces extrêmes sur le continuum. Ils peuvent apprendre à programmer, mais l'effort requis pour les enseigner dépendra de leur position dans le continuum.
Je ne suis pas sûr que ce soit juste de la programmation. J'ai vu le même genre de phénomène avec des gens qui apprenaient simplement à utiliser des ordinateurs. De retour à l'université, j'étais assistante de laboratoire dans un laboratoire qui accueillait un cours d'initiation à l'informatique pour les personnes âgées.
En deux semaines, j'ai pu identifier ceux qui l'obtiendraient et ceux qui ne le feraient pas avec une précision de 100%. Soit vous avez accepté que c'est ainsi que l'ordinateur fonctionne, soit vous vous êtes cogné la tête pour toute la classe. Il n'y avait pas de terrain d'entente. (Le fait qu'il s'agissait d'un cours pour seniors signifiait que nous avions beaucoup de batteurs de tête, ce qui rendait le schéma beaucoup plus évident.)