L’enseignement du langage Python au lycée

Cette année scolaire, Kid est rentré au lycée. Il a donc eu son PC portable prêté par la région et a commencé les cours Python. Dans mon article précédent, je vous ai présenté les outils, c’est à dire avant tout EduPython. Dans cet article, il est temps de s’intéresser à l’enseignement.

L’année scolaire touche à sa fin. Kid a rendu les livres hier. Je peux donc établir un bilan sur toute l’année. Car pour être honnête, ça fait des mois que je prévois de publier cet article. Initialement, je voulais prendre du recule, je l’ai repensé plusieurs fois car il m’a toujours été impossible d’être positif.

Et oui, le bilan est très décevant. Il y a pour cela plusieurs facteurs. L’enseignant est le problème le plus évident, mais le problème est partagé avec les textes de référence.

Pour juger l’enseignement, je n’étais évidemment pas en classe. Je me suis basé sur le retour du Kid ainsi que les manuels, les cours et les sujets d’exercice. J’ai pu voir les codes proposés et la pratique. C’est avec ces derniers que j’ai commencé à être très critique. Python est un langage qui se veut rendre accessible la programmation. Qui simplifie des concepts. Dans l’enseignement, certains aspects du cours compliquent des notions simples et d’autres sont carrément faux.

Des cours imprécis voir faux

Parlons tout de suite de ce point.

Lorsqu’on enseigne quelque chose de nouveau, il est important de bien poser les bases et les concepts. Et dans le cas du code, le comportement. L’extrait du document suivant leur a été distribué parmi les premiers cours. Il illustre de manière quasi-exhaustive le problème.

En informatique, on s’efforce d’avoir de la rigueur. D’ailleurs, les cours de programmation ne sont pas exactement destinés à enseigner la programmation mais l’algorithmique. La communauté Python en particulier définit son vocabulaire afin d’éviter les interprétations. Ce schéma comporte donc beaucoup d’inexactitudes :

  • Une fonction n’est pas un programme et encore moins, dans le domaine Python, un script. Dans le monde Python, le script est le programme principal, celui qu’on exécute. J’avais d’ailleurs détaillé ce vocabulaire.
  • Les variables des fonctions sont appelés des paramètres. Les arguments, c’est le nom donné aux données. On définit une fonction avec ses paramètres, on l’appelle en lui fournissant des arguments. D’ailleurs, il y a même une FAQ.
  • Si on veut être rigoureux, ce qui est appelé mot spécifique sont des mots clefs (ou encore mot réservé).
  • Le mot clef return ne permet pas l’affichage. Il arrête l’exécution de la fonction et retourne la valeur à sa droite.

Sur ce dernier point, c’est d’autant plus source à confusion que l’expérimentation a dû avoir eu lieu (si elle a eu lieu) sur le shell intéractif qui lui affiche le retour de l’instruction… La conséquence est que l’élève n’intègre pas l’importance d’être vigilant à ce que fait la fonction et ce qu’elle retourne. Je l’expérimente en formation (avec un public connaissant déjà le développement) et démontre que cette confusion est une des sources principales d’erreurs dans leur code ou d’incompréhension du comportement.

Les cours commençaient déjà sur de mauvaises bases. Lorsque j’ai exprimé mon avis sur X, j’ai eu une question intéressante : que disent les textes officiels ? Car en effet, un enseignant suit les textes.

Les références, les textes officiels

J’ai commencé par feuilleter le manuel scolaire (livre de Math, édition didier). L’imprécision du vocabulaire y est aussi présente. La structure du code est pour sa part assez juste mais un détail me chiffonnait à propos du contenu.

J’ai voulu vérifier à un plus haut niveau : les programmes sont cadrés, ils sont définis par publication au Journal Officiel. Le contenu du programme actuel de mathématiques est dans le Bulletin officiel spécial n°1 du 22 janvier 2019. Le chapitre qui nous intéresse est Algorithmique et programmation. Ok, l’objectif est avant tout l’enseignement de l’algorithmique et c’est très bien.

Mais dans le détail, là aussi on y va des imprécisions voir des erreurs. Dès la première ligne du contenu :

Contenus
– Variables informatiques de type entier, booléen, flottant, chaîne de caractères.
[…]
Capacités attendues
– Choisir ou déterminer le type d’une variable (entier, flottant ou chaîne de caractères).

En Python, le type concerne la valeur, pas la variable ! Python est un langage dynamique, le type de la donnée associée à une variable peut changer ! Et dans un langages déclaratif, le type concerne toujours la valeur.

Un autre problème est que dans les types enseignés, il n’y a, officiellement, pas les listes… C’est pourtant un type fondamental qui permet de comprendre la notion de collection de données ainsi que la logique de parcours et d’indexation. Ne pas aborder les listes, c’est comme considérer que la première année d’enseignement d’une langue, on n’abordera pas le pluriel…

Le paradoxe est que les listes sont un type tellement commun que le for en Python est destiné avant tout à leur parcours. Ce point en particulier me permet de revenir à l’enseignement.

Un enseignement discutable.

Python est un langage qui se veut simplifier les tâches communes. Mais quand on ne comprends pas l’objectif, on complique une choses qui doit être simples. Kid est rentré avec cet énoncé lors des cours sur les boucles.

Pour rappel, en Python, l’instruction for est destinée à itérer sur des séquences et en général des listes. Mais comme vu précédemment, les séquences ne sont pas dans les textes.

L’instruction for étant adaptée pour répéter un nombre fini de fois une action, nous avons la fonction range(n) qui génère une suite de n valeurs de 0 à n – 1. L’exclusion de la borne supérieure prête des fois à confusion mais pour répéter une action n fois, il n’y en a pas : on écrit for i in range(n):.

Oui, on peut indiquer la borne inférieur par range(min, max) ce qui fera max – min itérations… C’est un usage quand on a besoin d’une suite d’entiers ou d’indices, mais nous sommes dans un cas simple où on veut répéter n fois une action, donc range(n) et c’est tout !

Dans cet exemple, l’auteur a imposé inutilement la borne minimum et on sent dans le but d’avoir un compteur d’itération. Compteur compréhensible par l’humain (de 1 à n et non de 0 à n – 1). Sauf que dans cet exemple, on s’en fiche… La conséquence est que je vois les gamins se compliquer la vie avec les valeurs de la fonction range() alors qu’elle est écrite pour justement ne pas se la compliquer.

Cet exemple illustre le problème de ne pas avoir vu les listes et plus généralement les séquences. Mais récemment, je viens de trouver un autre code qu’ils ont produit. Un exercice sur Turtle :

from turtle import *

str = "agadadaagagadagagadadaagagadadagadadaagagadadagadadaagagadaa"

mot=list(str.strip())

for i in range(0, len(mot)):
    if mot[i] == 'a':
        forward(10)
    elif mot[I] == 'g':
        right(90)
    elif mot[i]=='d':
        left(90)
    i = i + 1

Et là, il y a une accumulation… On passe sur le Wildcard import qui est à proscrire ou le nom de la variable str qui masque le type. Cet exemple illustre l’incompréhension des séquences et confirme le mauvais enseignement du for. Ce code est une transposition classique de la logique C. Ce qui est dommage, c’est que l’on passe à coté de l’algo qui est « Pour chaque caractère de la chaine » qui se traduit en anglais par « for each character in string ». Il est passé à coté du fait qu’une chaine de caractères est aussi une séquence. et en Python par cette écriture plus Pythonique du code :

import turtle as t

mot = "agadadaagagadagagadadaagagadadagadadaagagadadagadadaagagadaa"

mot = mot.strip().lower()

for lettre in mot:
    if lettre == 'a':
        t.forward(10)
    elif lettre == 'g':
        t.right(90)
    elif lettre == 'd':
        t.left(90)
    i = i + 1

Ma question sur la motivation des enseignants

L’enseignement de Python au lycée est une catastrophe. Le cours est de piètre qualité et les enfants finissent l’année de 2de sans comprendre l’intérêt. Est-ce la responsabilité de l’enseignant ? L’enseignante de SNT est la prof principale de Kid et j’ai pu la rencontrer lors de la remise du bulletin du premier trimestre. J’ai eu l’occasion d’échanger quelques mots. Et comme je m’y attendais, elle a dû se former à Python en autodidacte, en recherchant les informations par elle même. C’est donc cohérent qu’elle puisse avoir des connaissances imparfaites. Pour la petite histoire, lors de l’échange, elle m’a dit être preneuse de tout retour, ce que j’ai fait. Je me doute que beaucoup d’enseignants sont dans la même situation qu’elle.

Mais depuis, je n’ai pas eu d’autre échange (à peine sur celui que je lui ai envoyé). Et ce que j’ai vu par la suite n’a fait qu’empirer (les boucles ont été vu après). Mais en plus du contenu, je ne comprends pas les méthodes. Vous voyez déjà un aperçu dans l’illustration précédente : la pratique du code a, pendant plusieurs cours, été réalisée sur papier… Ce n’est même pas une question de moyens car les élèves ont un portable fourni par la région. Que l’on écrive une algo en pseudo-code, je veux bien, mais du code final sans pouvoir expérimenter, c’est ne pas comprendre ce que l’on enseigne.

Ajoutons des exercices incompréhensibles sans but, sans illustration de ce qu’apporte la programmation. Le livre de maths a quelques exos intéressant mais l’enseignant ne les a pas du tout exploité.

Je veux bien comprendre que cette matière ai été imposée à des enseignants qui ne la connaissent pas et qu’ils ont dû pour beaucoup s’auto-former. Mais le choix de Python a une certaine cohérence. Les calculatrices dans les filières générales se programment en Python, le langage fait parti des mathématiques et il permet d’illustrer des concepts (le rapport d’une suite de Fibonacci et le Nombre d’Or par exemple).

Je veux bien comprendre le manque de formation mais mais j’ai du mal à m’en contenter à une époque où il y a beaucoup d’initiatives très efficaces pour enseigner la programmation (voir mes articles sur Hour of Code) et même des fondations qui proposent beaucoup d’outils (voir ce que fait la fondation Raspberry Pi). j’ai l’impression qu’elles sont ignorées par le système éducatif Français et surtout les enseignants.

En conclusion

En conclusion, même si il y a de la bonne volonté de la part de l’enseignant, l’apprentissage de la programmation et de Python est loin d’être au niveau que l’on pourrait attendre. Ce qui est d’autant plus frustrant d’une part parce que l’enseignement de la programmation a depuis longtemps démontré apporter une capacité à raisonner pour résoudre un problème et d’autre part parce que la programmation est de plus en plus nécessaire pour n’importe quelle activité.

Nous aurons donc à nouveau une inégalité ici entre ceux dont les parents compenseront le manque de l’Éducation Nationale et les autres.

Si vous avez aimé ce post, n’hésitez pas à laisser un commentaire ci-dessous ou sur la page Facebook 😉

À propos de... Darko Stankovski

iT guy, photographe et papa 3.0, je vous fais partager mon expérience et découvertes dans ces domaines. Vous pouvez me suivre sur les liens ci-dessous.

Vous aimerez aussi...

Laisser un commentaire