De plus en plus, sur le web, on s’interroge sur l’enseignement de la programmation à l’école.

Cela fait trente ans que je milite pour que nos enfants apprennent à programmer. Cette question est cependant assez complexe ; je jette ici quelques éléments qui pourront , je l’espère, s’ajouter à une réflexion sérieuse sur le sujet.

Parmi ces éléments, je traiterai des apprentissages particuliers en programmation et des embûches à ces apprentissages. Je répondrai à la question «pourquoi programmer à l’école» et donnerai quelques éléments à considérer dans le choix d’un langage. Puis je proposerai une piste d’application.

Ce que l’élève apprend


Qu’est-ce que l’élève apprend en programmant un ordinateur ? Je ne m’embarrasserai pas ici des apprentissages et savoirs plus évidents du genre : le raisonnement logique, comprendre des langages informatiques modernes ou savoir se débrouiller avec une machine.

Je crois que l’élève, en programmant, devient concepteur c’est-à-dire un créateur. Il apprend aussi, à adapter et remixer (s’il a accès aux codes sources des programmes qu’il étudie) le travail des autres. De simple consommateur, il devient un consommacteur.

L’élève apprend à travailler par projet. Non seulement doit-il le mener à terme, mais il doit structurer son travail en fonction des besoins particuliers nécessaires à sa réalisation. Il apprend que les connaissances ne sont pas en silo ; qu’il doit aussi bien réfléchir (pensée logique) que bien écrire (pensée communicationnelle). Il apprend aussi à être à l’écoute des utilisateurs, car un programme, c’est fait pour être utilisé par de vraies personnes. L’élève apprend aussi à résoudre des problèmes à l’aide de la pensée computationnelle, cette grande oubliée dans notre système d’éducation. Pour comprendre cette pensée, je copie ici cet extrait d’un billet de Rémi Sussan.

«[...] La pensée scientifique traite de pommes et d’oranges et se demande comment ces pommes et ces oranges peuvent être différentes ou semblables. Le sujet de la pensée mathématique, ce sont les sphères, avec les aires et volumes qu’elles possèdent (…). La pensée computationnelle cherche à comprendre comment un groupe peut couper et partager une pomme afin que chaque personne soit sûre qu’elle a obtenu une juste part de la pomme.» - Gerald Sussman Plus loin, on y lit : “la pensée computationnelle invente les abstractions qu’elle manipule”.

Si la programmation apporte tant, pourquoi donc ne l’apprend-on pas à l’école ?

Les embûches à ces apprentissages en milieu scolaire


Plusieurs embûches bloquent la possibilité d’organiser un apprentissage de la programmation à l’école. J’en cite quelques-unes :

-L’aconnaissance des enseignants. Parce que fort peu d’enseignants savent comment programmer un ordinateur, ces derniers ne se sentent absolument pas compétents pour enseigner cette matière aux élèves.

- La mauvaise expérience de plusieurs avec l’ordinateur. En effet, plusieurs enseignants, qu’on le veuille ou non, sont extrêmement malhabiles avec la machine. Bien que plusieurs savent écrire à l’aide d’un traitement de texte, envoyer un courriel et facebooker, peu contrôlent vraiment ce qu’ils font. Je n’ai jamais vu un enseignant utiliser les expressions régulières pour modifier et adapter un texte, que ce soit au niveau de la mise en forme ou du contenu. Même la construction de macro est, je crois, bien mystérieuse pour l’immense majorité d’entre eux.

- Le programme de formation. La lourdeur du contenu du programme de formation de l’école québécoise étant très chargée, il ne reste plus vraiment de temps pour enseigner la programmation informatique.

- L’insécurité engendrée par les projets personnels des élèves. C’est peut-être bête à dire, mais comment peut-on aider un élève qui doit réaliser un projet dont on n’a pas la «solution». Dans les faits, c’est souvent trente élèves dans une classe qui peuvent boguer en tout temps sur en des endroits particuliers les uns des autres.

- La question de paradigme. La programmation s’installe bien dans un paradigme d’apprentissage, mais assez mal dans un paradigme de l’enseignement. Dans ce dernier cas, le contrôle exercé par l’enseignant tend à diminuer (et à rendre ennuyants) les apprentissages de l’élève tels que décrits plus haut.

Ces embûches sont de taille. Est-ce que cela vaut la peine de surmonter ces difficultés ?

Pourquoi apprendre à programmer


Pour vouloir surmonter ces difficultés bien réelles, il faudrait que ça en vaille la peine. Est-ce que l’apprentissage de la programmation apporte des éléments importants que les autres matières ne peuvent offrir ?

Oui, il apporte une culture, des stratégies et attitudes essentielles à la vie moderne.

La programmation implique une différente «culture de l’erreur»; nous sommes maintenant habitués à des enseignants qui peuvent identifier rapidement les erreurs des élèves et peuvent les aider à les corriger.

En programmation, ce n’est plus du tout le cas. L’erreur a laissé place au bogue. Le bogue, c’est quelque chose qui ne fonctionne pas dans l’exécution du programme. Le bogue n’est pas une erreur classique. Débusquer un bogue est un art que, faute de formation, peu de gens possèdent.

Il y a aussi la stratégie de l’essai-erreur qui est relativement absente actuellement. En effet, par des essais qui, rapidement, peuvent s’exécuter, l’élève voit la réalisation de son projet avancer peu à peu. Il travaille à trouver des solutions qu’il met constamment à l’épreuve. Cette stratégie est difficile à vivre en apprentissage dans les matières traditionnelles. En mathématiques, il est à peu près impossible «d’essayer un p’tit peu» pour voir ce que leur solution donne. Il en va de même dans la rédaction d’un texte. On attend la plupart du temps d’avoir «terminé» avant de soumettre le texte à l’enseignant qui en dévoilera les erreurs. En ce sens, un élève, en apprentissage traditionnel, est toujours dépendant de son enseignant. En programmation, l’élève peut analyser et évaluer lui-même les avancées de son projet : ça marche ou ça ne marche pas.

La culture de la «version suivante». En programmation, un projet n’est jamais terminé. Cela se traduit par la mise en oeuvre de différentes versions du projet. On commence par produire une première version. On l’améliore ensuite pour en produire éventuellement une seconde, laquelle, à son tour, sera améliorée, etc. Dans les cours de maths, lorsqu’un élève trouve une bonne solution, il n’essaie pas de l’améliorer par la suite. Désirer apporter des changements favorables à son texte est aussi une rareté. Mais en programmation, cette culture de la Version Suivante est constamment présente. Retravailler son oeuvre, n’est-ce pas une attitude que l’on juge souhaitable ?

Par quel langage de programmation commencer ?


Fortement insipiré par Mitchel Resnick, je crois qu'un langage bien choisi devrait avoir un plancher bas, un plafond haut et des murs larges.

1- Un plancher bas (sans escaliers). Le langage choisi doit permettre à l’élève de réaliser de petits projets de débutant sans avoir à maîtriser beaucoup de notions préalables (escaliers). Un élève doit pouvoir se lancer rapidement dans la réalisation de son idée.

2- Un plafond haut. Cela signifie qu’à l’aide du langage en question, on peut à peu près tout faire : le programme n’impose pas de limites sérieuses à la qualité des projets des élèves. Autrement dit, un élève PEUT réaliser à peu près n’importe quoi à l’aide de ce langage. Un langage de programmation pour les 8 à 88 ans quoi !

3- Des murs larges. Un élève peut réaliser plusieurs types de projets et non pas seulement des projets du genre jeux, par exemple. Il peut faire des tutoriels, des animations, des histoires, des présentations, du graphisme, des mathématiques, etc. selon ses goûts et ses aspirations.

Le langage qui aujourd’hui remplit le mieux ces trois critères est sans nul doute Scratch du MIT. Le langage LOGO n’est pas loin, quoique le plancher soit un peu plus haut que celui de Scratch. Les murs sont aussi moins larges en LOGO.

Squeak est aussi un langage pédagogiquement bien intéressant, mais encore là, le plancher est assez haut. Les enseignants avec lesquels j’ai travaillé ont grandement préféré Scratch à Squeak, car ils étaient capables d’aider plus rapidement les élèves. Ils se sentaient beaucoup plus dépourvus dans Squeak.

Le HTML5 couplé au Javascript est certainement passionnant. Mais le JavaScript, quoique relativement simple, est un langage complet qui demande beaucoup d’investissement, car son plancher est relativement haut si on le compare, par exemple, au LOGO ou a Scratch.

À mon avis, SCRATCH est le langage à privilégier au primaire et au secondaire.

Et le «comment» ?


Si vous relisez les embûches, sans doute trouvez-vous impossible d’ajouter au curriculum d’une école l’apprentissage de la programmation. Et, effectivement, cette mission est sans doute impossible. Mais si je me laisse aller à rêver un petit peu, voici ce que je propose. Au secondaire I, II et III, je suggère de passer de la mathématique à la mathématie.

Papert définit la mathématie (Mathland en anglais) comme un pays dans lequel, pour déambuler, pour vivre, pour communiquer, on doit s’exprimer à l’aide des mathématiques. Un peu comme un enfant naissant en Italie apprend l’italien tout «naturellement.»

Il s’agit donc d’éliminer complètement les cours de mathématiques pour les remplacer par des cours de programmation. En effet, toutes les notions mathématiques de ces niveaux (et plus encore) se retrouvent en programmation.

Cette élimination n’affectera pas la mise en place des trois compétences en maths :

a) Résoudre des problèmes mathématiques : en programmant, TOUT est un problème. De plus, pour le résoudre, nécessairement, l’élève doit mettre en oeuvre les composantes de cette compétence.

b) Raisonner à l’aide de concepts mathématiques. Encore là, en programmant, on doit nécessairement raisonner correctement, sinon un bogue apparaît. Et dans une foule de problèmes, on doit faire appel à des concepts profonds en mathématiques : plan cartésien, nombre entier, rationnels, réels, les variables, les fonctions, opérateurs logiques (ou, et, non), etc.

c) Communiquer. Tout programme est une communication. On communique en écrivant un script vigoureux, rigoureux et compréhensible. Il y a aussi communication (interprétation d’un message) lorsqu’on lit le script d’une tierce personne ou lorsqu’on désire remixer un programme.

Toujours est-il qu’au niveau de l’approche par compétence, tout est pour le mieux !

L’idée d’abandonner les cours de math risque de jeter une certaine ombre sur le propos de ce billet. Pourtant, si vous avez appris la programmation, pensez-y un peu avant de rejeter cette possibilité. Je sais bien qu’actuellement les enseignants de maths n’y comprennent à peu près rien en programmation, mais j’estime qu’en un an ou deux, on pourrait assez facilement les former à cet égard. L’apprentissage de la programmation à des fins pédagogiques n’est pas aussi complexe qu’on semble le penser. Car, il ne faut pas l’oublier, on ne veut pas faire des programmeurs de nos élèves, mais bien des personnes compétentes en résolution de problèmes de toutes sortes. Créer des abstractions, n’est-ce pas là une activité humaine souhaitable et potentiellement utile pour comprendre, interpréter et s’adapter aux incertitudes du monde de demain ?

Vous ai-je permis d’avoir une meilleure idée sur les avantages et les écueils reliés à la programmation informatique scolaire ? Ne croyez-vous pas, comme moi, que l’apprentissage de la programmation, avec toute la richesse qu’il apporte, vaut la peine qu’on tente d’en dépasser les embûches ? Qu’en pensez-vous ?