Les nouvelles technologies pour l’enseignement des mathématiques
Intégration des TICE dans l’enseignement des mathématiques

MathémaTICE, première revue en ligne destinée à promouvoir les TICE à travers l’enseignement des mathématiques.

Automatisation de la création d’exercices aléatoires Python dans LaboMep

Patrick Raffinat s’attache à améliorer le prototype qu’il a réalisé en 2019 et qui permet de développer des exercices aléatoires Python dans la plate-forme pédagogique LaboMep.

Article mis en ligne le 10 mars 2021
dernière modification le 12 octobre 2021

par Patrick Raffinat

A) Introduction

En 2019, j’ai élaboré un prototype permettant de développer des exercices aléatoires Python dans la plate-forme pédagogique LaboMep (voir article). Il a été adopté quasiment tel quel par Sésamath, afin de proposer rapidement une dizaine de ressources aux utilisateurs de LaboMep (et de remplir certaines obligations contractuelles avec un éditeur de manuels scolaires). Comme rien n’a évolué depuis un an et demi (ni amélioration de l’outil, ni création de nouvelles ressources), je me remets à l’ouvrage pour tenter de débloquer une situation plutôt paradoxale :

  • d’un côté, il y a peu de développeurs J3P (Javascript & Parcours Pédagogique Personnalisé), et les deux seuls qui savent utiliser l’outil Python sont très occupés (nouveaux modules informatiques au lycée…).
  • d’un autre côté, cela fait plus d’un an que des collègues proposant leur candidature pour devenir développeurs de ressources (mathématiques ou Python) sont priés d’attendre l’arrivée de la prochaine version de J3P.

J’ai donc décidé de faire évoluer le prototype Python que j’avais proposé en 2019 :

  • en permettant une meilleure factorisation du code Javascript des diverses ressources Python : en clair, les développeurs de ressources pourront écrire des programmes plus courts, plus lisibles et nécessitant un moins long apprentissage du « modèle conceptuel J3P ».
  • en remplaçant l’interpréteur Python initial par un interpréteur plus complet (plus de librairies mathématiques) accompagné d’une console Python, suggestion qui m’a été faite par un membre du comité de rédaction de MathémaTICE (Cyril Guieu).

En outre, la pénurie en développeurs J3P m’a conduit à imaginer une alternative permettant quand même la mise à disposition des élèves de nouveaux exercices Python :

  • je proposerai une ressource générique dans LaboMep dont un des paramètres est l’adresse d’un fichier externe (par exemple un document Google Drive) que peut construire tout enseignant connaissant Python [1]
  • il suffira ensuite à tout enseignant (ayant un compte dans LaboMep) d’instancier la ressource générique (grâce à l’interface permettant de paramétrer n’importe quelle ressource mathématique de LaboMep), puis de la proposer à ses élèves.

B) Création de ressources par des développeurs J3P

Introduction

Quand je m’étais auto-formé à J3P en 2019 pour initier le développement de ressources Python, je n’avais pas cherché à rationaliser le processus de création de ressources Python pour diverses raisons :

  • comme Sésamath pouvait ne pas être intéressé par mon prototype Python, ma préoccupation première a été de fournir quelques exemples opérationnels.
  • je n’avais pas une compréhension suffisante du « modèle conceptuel J3P » : par exemple, je souhaitais mettre à disposition une méthode permettant de créer l’interface graphique d’une ressource Python quelconque, mais il m’aurait fallu pour cela certaines informations sur les objets de classe « parcours pédagogique ».

En intégrant la liste de diffusion j3p-sections@sesamath.net, j’ai découvert avec intérêt que Sésamath cherchait à sécuriser le processus de création de ressources pédagogiques (en général, pas spécialement pour Python), donc à promouvoir une programmation plus modulaire pour y parvenir.

Divers mails échangés sur cette liste m’ont permis de mieux comprendre le modèle complexe de J3P, et donc d’être en mesure techniquement de faire évoluer l’outil Python depuis de nombreux mois. Le facteur déclenchant pour passer à l’action a été le souhait de Cyril Guieu de devenir développeur de ressources algorithmiques : non seulement il est membre du comité de rédaction de MathémaTICE (gage de crédibilité de la motivation !), mais il a piqué ma curiosité en attirant mon attention sur un récent environnement Python prometteur (Basthon), dont il voulait savoir s’il était compatible avec J3P…

Exemple

Dans mon article de 2019, j’avais présenté une ressource de démonstration sur la résolution d’une équation du second degré. Elle comportait deux questions : calcul du discriminant (voir copie d’écran ci-dessous), puis calcul du nombre de solutions.

J’avais brièvement exposé le principe de vérification du programme de l’élève, à savoir remplacer les instructions de saisie (ici a, b et c) par divers jeux de tests précisés dans le code Javascript de la ressource. Un des avantages du nouvel interpréteur Python est qu’il facilite une formulation plus conforme aux programmes officiels du lycée (ni saisie ni affichage, grâce à une fonction « discriminant » et à une console Python).

Un nouveau processus de vérification, qui s’appuie sur les assertions Python, a été introduit dans J3P pour prendre en compte ce changement de formulation.

Mise en oeuvre

Je n’entrerai pas dans les détails de codage Javascript de l’exemple précédent (discriminant, puis nombre de solution d’une équation du second degré) : même si la programmation Javascript a été significativement allégée et clarifiée, elle ne peut être vulgarisée sans une présentation préalable du « modèle conceptuel J3P ».

Pour la très grande majorité des lecteurs, l’essentiel est de savoir qu’une des solutions retenues pour alléger et clarifier la programmation Javascript a été de stocker certaines informations dans des fichiers annexes (un par question). Il y a donc pour cette ressource de démonstration deux fichiers : un fichier pour le calcul du discriminant, et un pour le calcul du nombre de solutions. Par exemple, voici le contenu du fichier pour la seconde question (nombre de solutions) :

  1. #question ...
  2. def nombredesolutions(a,b,c) :
  3.         delta=b*b-4*a*c
  4.         ...
  5.         return nb_sol
  6.        
  7. #correction
  8. def nombredesolutions(a,b,c) :
  9.         delta=b*b-4*a*c
  10.         if (delta<0) :
  11.                 nb_sol=0
  12.         elif (delta==0) :
  13.                 nb_sol=1
  14.         else :
  15.                 nb_sol=2
  16.         return nb_sol
  17.  
  18. #assert
  19. assert nombredesolutions(1,1,2)==0,"calcul faux pour nombredesolutions(1,1,2)"
  20. assert nombredesolutions(2,6,4)==2,"calcul faux pour nombredesolutions(2,6,4)"
  21. assert nombredesolutions(-2,-4,-2)==1,"calcul faux pour nombredesolutions(-2,-4,-2)"

Télécharger

A chaque tentative de l’élève, les assertions sont ajoutées à son code Python avant que J3P n’exécute le tout via l’interpréteur Python. Plusieurs cas sont alors à prendre en compte :

  • si l’interpréteur détecte une erreur de type « AssertionError », J3P indique à l’élève que son programme fonctionne, mais donne une réponse inexacte pour le jeu de de données de la première assertion Python non vérifiée.
  • si l’interpréteur détecte un autre type d’erreur, J3P indique à l’élève la ligne de code qui a provoqué l’erreur.
  • si l’interpréteur ne détecte aucune erreur, cela signifie que les diverses assertions ont été vérifiées : J3P en déduit que l’élève a donné une bonne réponse, d’où l’importance pour le développeur de la ressource de bien choisir les jeux de données à tester.

Comme pour toute ressource mathématique, le nombre de tentatives autorisées peut être modifié par chaque enseignant grâce à un formulaire de paramétrage dans LaboMep. Si toutes les tentatives sont infructueuses, un corrigé est fourni à l’élève avant qu’il ne passe à la question suivante, voire à la ressource suivante puisque LaboMep permet de gérer des parcours pédagogiques personnalisés.

C) Création d’exercices par instanciation d’une ressource générique dans LaboMep

Introduction

La pénurie en développeurs J3P m’a conduit à imaginer une alternative permettant quand même la mise à disposition des élèves de nouveaux exercices Python. A l’heure où j’écris cet article, elle n’est testable que sur mes pages professionnelles.

Ma démarche peut sembler curieuse, mais je rappellerai que je tente d’améliorer les choses sans être mandaté par Sésamath pour cela, même si j’en ai évidemment informé quelques collègues de la liste de diffusion de J3P : la fin de l’histoire est du ressort de Sésamath, et j’espère qu’elle sera aussi heureuse que pour le prototype Python que j’avais mis au point en 2019 dans les mêmes conditions…

Quand un développeur J3P veut créer une nouvelle ressource (ou plus rarement un nouvel outil), il suit le processus suivant :

  • avec un émulateur J3P sur son ordinateur, il programme (en Javascript) et fait ses tests localement
  • il transfère ses fichiers sur le serveur de développement de Sésamath (ou, dans mon cas, sur mes pages professionnelles) afin que d’autres collègues puissent également faire des tests
  • seuls quelques administrateurs ont ensuite le pouvoir de transférer le code dans LaboMep, et ils doivent être très vigilants car une mauvaise décision (ou une erreur de manipulation) peut, par effet de bord dans le pire des cas, perturber le bon fonctionnement d’autres ressources mises à disposition d’un million d’élèves inscrits

Comme ce processus est assez lourd à mettre en œuvre et, qu’en plus, aucun développeur J3P n’est actuellement disponible, j’ai eu l’idée … de m’en passer !!! J’explique comment dans la section suivante...

Le principe de fonctionnement

Avant de renter dans les détails, il faut savoir que toute ressource pédagogique est paramétrable et qu’on peut en modifier les paramètres en se connectant à LaboMep comme formateur : pour plus d’informations, voir cet article de référence d’Yves Biton. Par exemple (voir copie d’écran), on peut préciser des informations sur 2 fractions à additionner (a/b+c/d) : valeurs possibles pour les numérateurs (a et c) et les dénominateurs (b et d), somme irréductible ou non…

Les paramètres d’une ressource pouvant être textuels, j’ai décidé d’exploiter cette possibilité en créant une ressource (nommée « genericbasthon »), dont un des paramètres est le nom d’un fichier distant (contenant les différentes questions, solutions et assertions Python). Voici deux exemples de fichiers distants (avant qu’ils ne soient recodés)

  • exemple 1 : 3 exercices (discriminant, périmètre d’un rectangle, surface d’un rectangle) sur des calculs élémentaires
  • exemple 2 : 3 exercices (minimum de deux nombres, maximum, nombre de solutions) sur les instructions conditionnelles

Pour des raisons pratiques, ces fichiers distants sont recodés avec l’encodage « base64 » (tester en ligne), et stockés dans des documents « Google Drive » publics : en effet, ceux-ci peuvent être lus par un programme Javascript (langage de programmation de J3P), ce qui n’est pas le cas de la plupart des fichiers distants pour des raisons de sécurité (voir « Cross-origin resource sharing »).

Le recours à « Google Drive » ne sera plus nécessaire si Sésamath décide de mettre à disposition une zone de dépôt de fichiers distants…

Démo en ligne

Il est possible de tester la ressource « genericbasthon » sur mes pages professionnelles, à partir de l’adresse suivante : http://raffinat.perso.univ-pau.fr/test/j3p_raffinat/j3p.html . Dans la page qui apparaît alors, on entre les informations suivantes, avant de valider :

Il reste à compléter le formulaire de paramétrage de la ressource [2] , le champ « url » étant facultatif si on préfère les exercices proposés par défaut par la ressource générique.

Dans le cas présent, J3P va choisir aléatoirement 2 exercices parmi 3 (minimum de deux nombres, maximum, nombre de solutions).