Introduction

Depuis la fin Août 2020, j’ai commencé à apprendre à mon fils à coder. Ce billet est un premier retour d’expérience sur cette apprentissage après presque 2 mois. L’occasion de faire le point, prendre du recul, de partager cela avec d’autres informaticiens ou informaticiennes qui seraient dans une démarche similaire et idéalement de pouvoir avoir un échange sur le sujet.

Contexte

Mon fils a 11 ans, il vient d’entrer en 5ème au collège. Entre le collège, la pratique de la musique au conservatoire et une pratique hébodmadaire d’un sport, il a peu de temps et de bande-passante intellectuelle à consacrer à l’apprentissage de la programmation. De mon côté, l’ambition n’est pas d’un faire un codeur mais de lui inculquer des bases et de lui donner une culture informatique.

Dans son collège, c’est scratch qui est utilisé même si pour l’instant, tant dans son année de 6ème (certes perturbé par le Coronavirus) que dans le début de son année de 5ème, il n’a pas eu l’occasion d’en faire.

Nous avions déjà, il y a peut-être 1 an, essayé scratch mais cela ne l’avais pas forcément accroché. Et il me semblait qu’il était important qu’il soit demandeur de son côté. En effet, c’est une activité en plus de tout le reste, il n’était pas question de mon point de vue que cela soit une activité imposée.

L’intérêt de mon fils à l’égard de l’informatique a commencé à changer avec l’arrivée d’un téléphone portable (qui devenait nécessaire pour qu’il puisse nous contacter en cas d’urgence) et d’un peu plus de temps à faire des jeux vidéos (pas qu’il y joue tant que cela, et nous règlementons la chose, mais là cela a commencé à l’intéresser un peu plus). Il est donc devenu demandeur d’en apprendre plus sur l’informatique et la programmation. Et comme le dit un proverbe bouddhiste, Quand l’élève est prêt, le maître apparaît.

Démarche pédagogique

En parlant de démarche pédagogique, je survends propablement la chose : je n’ai pas formalisé la démarche en avance et préparer de manière très cadrée les cours. Néanmoins, cela ne signifie pas que je n’avais pas une idée de ce que je voulais faire et d’où je voulais aller.

Je ne voulais pas que mon fils le vive comme un enseignement scolaire, je voulais l’initier aux joies de la programmation et lui montrer l’aspect créatif de cette activité. Il était donc nécessaire à mes yeux que cela ne soit pas trop cadré avec la nécessité de coller à son rythme plutôt que de tenter de lui en imposer un. Après tout, il apprend la programmation pour son plaisir. Certes, cela peut lui servir mais que cela lui soit utile, c’est juste un sous-produit.

La seule contrainte que l’on s’est imposée, c’est d’avoir un rythme d’une séance d’informatique d’environ une heure par semaine.

Déjà le mettre à la page

La première chose que je lui ai fait faire, avant de vraiment se mettre à programmer, c’est une page HTML simple. Ce n’est pas de la programmation, mais cela permet d’introduire la notion de langage et d’interprétation de ce langage ici par le navigateur. Il y a un effet visuel et un retour d’information rapide sur ce que l’on fait. Cela permet aussi une première prise en main du navigateur, d’un éditeur de texte et de se rendre compte que les langages informatiques sont moins souples que les langages humains.

Mon petit Python

Même si cela m’a effleuré l’esprit, Javascript ne me semblait pas un bon choix pour un premier langage. Je suis très loin d’être un détracteur de Javascript et le langage s’est très grandement amélioré ses dernières années, mais il ne me semblait pas adapté comme premier langage.

Scratch, c’est très bien et la dimension visuelle est très sympa mais finalement cela protège trop l’apprenant de la réalité du code. Mon objectif est d’inculquer à mon fils non seulement des notions de programmation mais également de le rendre plus dégourdi avec les ordinateurs. A mon sens scratch n’offre pas nécessairement cela.

Je connaissais un peu Python et ce langage est à la fois très abordable tout en étant versatile et représentant un investissement sur le long terme. Sans parler de la présence d’une REPL via l’interpréteur de Python et de la possibilité de faire des scripts. Et comme mon fils a une passion pour l’herpétologie, utiliser un langage qui a le nom d’un serpent était forcément séduisant.

On est donc parti sur l’apprentissage de la programmation avec Python.

La dernière séance

Ci-après, un tableau qui fait une synthèse de nos différentes séances jusqu’à présent avec les concepts

Numéro de séance Concepts et fonctions/mot-clés abordés
1 interpréteur, print, input, variable, initialisation, type, str, int, concaténation, boucle, while, compteur de boucle
2 Reprise des notions vues à la séance précédente, opérateurs mathématiques (addition et division)
3 Reprise des notions vues à la séance précédente, alternatives avec if et else, boucle avec for, liste/tableau
4 Reprise des notions vues à la séance précédente, range
5 Reprise des notions vues à la séance précédente, définition de fonction avec def, division euclidienne, notion de booléens
6 Reprise des notions vues à la séance précédente, module et import, génération de nombres aléatoires
7 Reprise des notions vues à la séance précédente, tests unitaires, TDD

Et un autre tableau avec les thèmes des exercices pour chaque séance.

Numéro de séance Concepts et fonctions/mot-clés abordés
1 hello world et hello world dans une boucle avec demande du nom de la personne à qui dire bonjour
2 Amélioration du Hello World dans une boucle et calcul de moyenne d’une série de notes rentrées de manière interactive
3 Déterminer si un entier est pair et somme d’une liste de nombre entiers
4 Reprise de l’exercice sur la somme d’entiers mais avec range
5 Mise sous forme de fonction de l’exercice pour déterminer si un nombre est pair, permutation du contenu de variables
6 Permutation circulaires de 3 nombres et simulateur de dé à 6 faces
7 Fonctions de bases pour implémenter le jeu de dés “Le Trop Gourmand” (une variante du 5000)

En écrivant le premier tableau, ma première réaction a été :

Well that escalated quickly

C’est tout l’intérêt de ce type de billet, c’est qu’il permet une prise de recul. Cela peut paraître beaucoup de notions d’un coup, mais on peut évoquer une notion et commencer à l’utiliser sans en expliquer tous les détails. Ainsi, je n’ai pas matraqué les notions, elles ont été introduites pour le besoin de l’activité et sont répétées et ré-expliquées dès que et tant que nécessaires. Je ne suis pas dans une logique d’apprentissage effréné de Python mais d’une sensibilisation au raisonnements pour trouver une solution à un problème en programmation.

On a donc commencé en douceur avec le classique Hello World. Il me semblait nécessaire de rapidement poser les bases pour pouvoir faire en sorte que mon fils interagisse avec le programme. On a donc commencé par introduire print puis input afin de pouvoir entrer des données pour alimenter le programme. Et au début via l’interpréteur puis assez rapidement en utilisant un éditeur de texte (Visual Studio Code avec les plugins Python qui vont bien… c’est plus qu’un simple éditeur de texte, on est d’accord, mais mon fils n’a pas besoin de la savoir !) et en exécutant les scripts avec l’interpréteur directement.

Chaque séance suivante a commencé par un rappel de ce qu’on avait vu à la séance précédente, et une petite réexplication des points clés. Nous avons construit sur les concepts et exercices précédents : certains exercices ont été faits de manières différentes plusieurs fois ou on a amélioré une implémentation précédente. C’est mon fils qui a fait (quasiment) toute la saisie du code mais bien sûr avec mon assistance ou mon guidage : travail maïeutique pour l’aider à formuler une idée de solution et assistance pour l’implémenter (notamment sur la syntaxe). Encore une fois, mon objectif n’est pas un premier temps de le rendre autonome pour développer en Python (cela viendra avec le temps et la pratique) mais c’est de le faire réfléchir et formuler des solutions à des problèmes que l’on se pose en informatique.

L’approche a été très expérimentale avec un accent mis sur l’inocuité des erreurs : on teste ses idées au fur et à mesure, ce n’est pas grave de se tromper ou de ne pas faire juste du premier coup. On analyse l’erreur ou le comportement exhibé par le programme et on corrige. Au contraire les erreurs nous font avancer car elles nous permettent de mieux comprendre ce qui se passe. C’est vite devenu un réflexe : tester rapidement le code, voir ce qui se passe, essayer de comprendre et revenir sur le code. Et cela a été un élément très important : avoir un feedback rapide donne à l’enfant le sentiment d’avancer et évite les frustrations.

Lors de la dernière séance effectuée, comme la notion de fonction avait été introduite, j’ai essayé d’introduire l’approche TDD : on réfléchit sur les entrées et les sorties de la fonction et ce qu’on attend d’elle en travaillant sur les tests, on vérifie que le test est en échec (“Never trust a test you haven’t personally seen fail."), on écrit l’implémentation et on vérifie sa validité avec le test. Et on recommence. C’est tout l’intérêt de la TDD, c’est un cycle rapide avec un retour rapide. Avec pytest que nous avons utilisé pour écrire nos tests, on a les résultats des tests qui apparaissent en rouge quand ils sont en échec et en vert quand cela est ok. Ce feedback rapide et cette manière collaborative de réfléchir à la solution et de la concevoir a bien convenu à mon fils.

Hic sunt dracones

Je m’attendais a plus de difficultés que ce que nous avons rencontrées. En partant sur Python et la ligne de commande par rapport à l’utilisation de scratch, je craignais que mon fils n’accroche pas et perde vite de l’intérêt s’il n’y avait qu’un retour textuel. J’ai été agréablement surpris que finalement des interactions via la console lui suffise. Au final, mon sentiment est que de pouvoir expérimenter rapidement et interagir avec le programme ont été suffisants pour le maintenir interessé et engagé dans la séance.

Python est très lisible et se lit presque comme un texte en anglais… mais c’est là où le bât blesse : mon fils est au début du collège, il démarre en anglais. Je lui traduit les mots mais c’est vrai que cela représente un obstacle de plus pour comprendre que nous n’aurions pas eu avec scratch.

Une heure par semaine cela fait peu, il y a un gros travail de répétitions à chaque séance. Cela me semble normal, cela fait beaucoup à retenir et sans y être exposé avec une fréquence quotidienne, ce n’est pas simple pour un enfant de se rappeler de tout cela, surtout qu’il doit absorber beaucoup d’autres connaissances diverses par ailleurs.

Probablement qu’avec scratch, cela eût été plus simple avec l’interface visuelle qui propose les éléments pour construire le programme plutôt que de devoir se les rappeler. Développer une réelle autonomie en Python lui prendra donc probablement du temps, j’en suis conscient. Cependant comme expliqué précédemment, mon objectif pédagogique est une initiation au raisonnement algorithmique et une familiarisation à l’outil informatique. Et de ce point de vue-là, mon fils est maintenant beaucoup plus à l’aise avec l’utilisation de l’ordinateur, il a appris quelques raccourcis clavier (pour sauvegarder ou faire des copier-coller :-D) et sait maintenant à quoi correspond un underscore (j’essaie d’utiliser blanc souligné mais underscore m’échappe souvent !), il utilise un éditeur de texte et le terminal de commandes. En utilisant un environnement comme scratch, cela aurait probablement simplifié les choses en masquant certaines difficultés techniques qu’au final il arrive à gérer.

Bilan

Après 7 séances mon fils reste intéressé et nous avançons doucement. Il va falloir consolider tout ce qui a été vu petit à petit, mais au fond on a le temps. Il y a le projet lointain de vouloir faire un jeux d’aventure en mode texte. Cela nourrit sa motivation même s’il a bien compris que cela prendrait du temps et cela nourrit les idées de séances.

Il est très agréable de voir sa joie quand il résoud un problème et de le voir s’amuser avec les programmes que nous avons codé ensemble. C’est rafraichissant.

Ces séances permettent également d’ouvrir sur des sujets en relation mais pas forcément liés à l’écriture du code lui-même. Ainsi, un enfant en début de collège n’a pas encore forcément vu comment calculer une moyenne ou n’a vu que rapidement la division euclidienne. C’est l’occasion de faire un point explicatif sur ces sujets. Plus largement cela permet de faire des apartés sur des sujets comme les nombres (pseudo-)aléatoires ou les booléens, et sans rentrer dans les détails de semer des germes de savoir. Bref, cela permet d’élargir sa vision et de montrer les liens entre les sujets et les différentes matières, ce qui est un premier pas vers l’appréhension de la complexité du monde, sans la nier ou en avoir peur.