Innovation Pédagogique et transition
Institut Mines-Telecom

Une initiative de l'Institut Mines-Télécom avec un réseau de partenaires

Evaluation formative en ligne

19 avril 2016 par François Kany Retours d’expériences 1830 visites 0 commentaire

Application à l’apprentissage du langage Python en Classes Préparatoires aux Grandes Ecoles

Nous décrivons la conception et la mise en place d’un site Internet dédié à l’évaluation automatique de programmes écrits en Python. Ce serveur utilise de nombreuses technologies (Linux, Nginx, PostgreSQL, Django, PySandBox). Nous présentons le bilan de six mois d’utilisation de ce site dans le cadre de l’apprentissage de l’informatique, en France, en première et deuxième années après le Baccalauréat. Cette forme d’évaluation formative a permis de rendre les élèves actifs et de créer de l’émulation entre les étudiants.

Introduction

L’évaluation formative est une forme d’évaluation qui modifie profondément le statut de l’erreur et l’implication de l’élève dans le processus d’apprentissage. L’intérêt de cette forme d’évaluation a été souligné par de nombreux auteurs [Allal]. Premier point : l’erreur fait partie intégrante de l’acte d’apprendre (un élève qui ne ferait jamais d’erreurs serait soit un génie, soit un tricheur) ; un élève - à la différence d’un diplômé - doit donc avoir le droit de se tromper. Le deuxième point découle du premier : comme l’élève sait qu’il a droit à l’erreur, il n’a pas la peur de l’échec, il apprend de ses erreurs, il prend confiance en lui et peut mesurer ses propres progrès.

L’évaluation formative prend une dimension supérieure lorsque l’évaluation est réalisée soit par l’élève lui-même (auto-évaluation formative ou évaluation formatrice [Nunziati]), soit de façon automatique et instantanée. L’élève devient alors le pilote de son propre processus d’apprentissage.

Les nouveaux programmes [BO] de Classes Préparatoires aux Grandes Écoles (CPGE) [1] réintroduisent de véritables cours d’informatique dans l’enseignement du tronc commun. Même si les programmes sont contraignants au niveau des contenus, la loi [loi] autorise l’enseignant à avoir une certaine liberté pédagogique. Dans ce cadre, l’enseignement de l’informatique a été introduit dans six classes en utilisant l’évaluation formative automatique.

Des exemples de sites d’évaluation en ligne

De nombreux sites Internet permettent d’apprendre l’informatique, par soi-même, en résolvant des problèmes d’algorithmique ou de mathématiques. Ces sites reposent - in fine - sur les mêmes processus que l’évaluation formatrice décrite en introduction.

Parmi les sites les plus célèbres, citons : France-IOI [FranceIOI] ; Sphere Online Judge [SOLJ], Project Euler [Euler], Code Academy [CodeAcademy],...

Le site des Olympiades d’informatique [FranceIOI] est un excellent site pour les élèves de collège et lycée. Néanmoins, il n’est pas tout à fait adapté pour des élèves de CPGE. Même si, à partir des niveaux 3 et 4, les exercices deviennent intéressants, la progression des niveaux 1 et 2 est un peu lente. A contrario, pour les niveaux 5 et 6, les contraintes de temps sont vraiment strictes pour un langage interprété comme Python. Ces exercices nécessitent de savoir coder à la perfection en utilisant toutes les astuces de Python. Le programme de CPGE est clair, il ne s’agit pas de former des spécialistes en Python (capables de redéfinir la fonction input ou la fonction print pour gagner quelques centièmes de secondes). Le but est d’apprendre l’algorithmique, Python n’est que le langage support.

Le site de l’ISEN-La Croix Rouge Brest.

Nous avons mis en place un serveur très similaire à celui de France-IOI mais avec des problèmes conformes au programme de CPGE. À la différence de France-IOI, pour éviter les tricheries, les exercices sont évalués en aveugle : l’élève ne sait pas avec quels paramètres d’entrée les algorithmes sont testés ; il ne sait pas qu’elles ont été les réponses de son algorithme. (Sur le site de France-IOI, les élèves sont guidés ; le serveur indique les différences entre la valeur obtenue lors du test et la valeur attendue par le serveur. Les élèves ont la faculté de tricher en demandant à leur algorithme d’afficher les paramètres d’entrée. Comme le serveur indique la valeur attendue, les élèves peuvent écrire un programme sous la forme : « pour tels paramètres d’entrée, afficher tels résultats » sans coder l’algorithme général qui répond à la problématique).

En revanche, comme sur France IOI, le serveur indique les erreurs survenues lors de l’interprétation du code Python afin de guider les élèves dans le débogage.

Architecture du projet

Les caractéristiques techniques du projet sont résumées dans la table 1.

Table 1 Caractéristiques techniques du projet

Fonctionnalité Technologie utilisée
Fournisseur d’accès OVH
Serveur privé virtuel (VPS) OpenStack (Python)
Système d’exploitation Debian 8
Base de données PostgreSQL
Serveur d’application WSGI Gunicorn
Service de contrôle des processus (pour redémarrer automatiquement le serveur) Supervisor
Serveur web (pour servir les fichiers HTML et les fichiers statiques) Nginx
Langage support Python 2.7
Framework Django (Python)
Evaluation « sécurisée » de code PySandBox

Le choix de Django [Django], framework très populaire, s’est imposé pour plusieurs raisons : il est écrit en Python ; une fois la phase d’apprentissage assimilée, il permet de coder rapidement : le développeur n’a pas à se préoccuper de la partie fastidieuse (authentification des utilisateurs, gestion des mots de passe, création de l’interface d’administration,...) et peut se concentrer sur l’essentiel. Le projet représente 1400 lignes de Python ; Django en génère automatiquement la majorité ; le cœur du projet représente 500 lignes de Python.

Les codes soumis par les étudiants sont évalués dans une « sandbox » [PySandBox]. Même si cette solution n’est pas parfaitement sécurisée [PythonDev], elle permet de limiter l’accès aux bibliothèques externes de Python et d’éviter qu’un élève ne tente d’introduire un code malicieux. De plus, PySandBox permet d’arrêter de force l’évaluation d’un programme au bout d’un certain délai afin d’éviter que le code d’un élève ne boucle indéfiniment et ne paralyse le serveur.

Base de données

Architecture de la base de données

L’architecture de la base de données est représentée sur la figure 1.

Figure 1 Architecture de la base de données.

Contenu de la base de données

La base de données contient 188 élèves répartis sur 6 classes : 2 math sup intégrées (MPSI) ; 1 math sup à concours (PTSI) ; 2 math spé intégrées (PSI) ; 1 math spé à concours (PT).

Elle contient actuellement 147 exercices. Les exercices orientés « algorithmique » sont répartis dans des listes thématiques : les variables, les tests, les boucles, les listes, les chaînes de caractères, les algorithmes numériques, les algorithmes de tri, les parcours de graphes,... Les exercices orientés « simulation numérique » sont répartis dans d’autres listes : l’arithmétique, les probabilités, l’électricité, la mécanique,... Chaque exercice impose à l’élève de coder une fonction avec un certain nom, un certain nombre de paramètres d’entrée (avec leur type) et un certain nombre de sorties (avec leur type). Tous les types sont possibles (integer, float, list, string,...) . Il est également possible de passer une lambda-fonction en paramètre d’entrée ce qui est particulièrement utile pour les algorithmes numériques : pour l’algorithme de Newton, on peut ainsi passer en argument l’expression de la fonction et de sa dérivée.

La base contient 613 tests (soit, en moyenne, 4,2 tests par exercice).

Les tests sont statiques : les questions (paramètres d’entrée des fonctions) et les réponses (sortie des fonctions) sont stockées dans la base. Cette solution a été préférée à des tests dynamiques (où les questions seraient générées de façon aléatoire et les réponses seraient comparées à l’exécution d’un algorithme solution). On peut ainsi minimiser les temps de calcul et, donc, les temps de latence pour l’utilisateur. Afin de faciliter la comparaison avec les réponses de la base de données, l’énoncé de l’exercice demande à l’élève d’arrondir ses résultats de type float à 5 décimales ou bien de renvoyer les chaînes de caractères en majuscules ou bien de trier les résultats de type list dans un certain ordre. Ainsi, que le résultat demandé soit de type integer, float, list, string,... , le serveur se contente de vérifier l’égalité stricte entre la réponse de l’élève et la réponse de la base de données.

Dès qu’un élève fait une soumission de code pour résoudre un exercice particulier, son code précédent est effacé [2] et son score recalculé. Si un élève fait plusieurs essais, on ne compte donc qu’une seule soumission par exercice. Conformément aux principes de l’évaluation formative, les tentatives multiples ne sont pas pénalisées.

Pour chaque exercice, l’élève peut voir la liste des élèves qui ont déjà résolu (ou tenter de résoudre) l’exercice. La liste est triée par score décroissant et dans l’ordre chronologique croissant.

Utilisation

Les élèves de CPGE ont officiellement une heure de Travaux Dirigés (TD) par semaine. Le site d’évaluation en ligne est utilisé dans ce cadre. Les modalités peuvent changer suivant les séances.

  • De septembre à la Toussaint, les élèves de deuxième année l’utilisent en parcours libre pour effectuer des révisions.
  • Lors de certaines séances de TD, le sujet est imposé : tous les élèves doivent résoudre les mêmes exercices.
  • De temps à autre, j’organise des « sprints » : je mets en ligne un exercice à une certaine heure et les élèves doivent le résoudre le plus rapidement possible. Contrairement à un devoir surveillé, je réponds aux questions, j’aide à déboguer les erreurs de syntaxe, je donne des indices à toute la classe à intervalles réguliers (toutes les 20 ou 30 minutes). La notation est simple : le premier à valider tous les tests a 20/20. Un exemple de « sprint » est donné dans la table 2. On voit que le sujet a été donné à 15H30, la première soumission entièrement correcte a été postée à 16H20, la deuxième à 16H21 (il y avait en réalité moins d’une vingtaine de secondes entre le premier et le deuxième). La dernière a posté sa solution, le lendemain, à 17H48.

Table 2 Exemple de sprint. Start : nov. 13, 2015, 3:30 après-midi

Initiales Date Note
OB nov. 13, 2015, 4:20 après-midi 20
FP nov. 13, 2015, 4:21 après-midi 19
RJ nov. 13, 2015, 4:28 après-midi 18
BF nov. 13, 2015, 4:35 après-midi 17
GLT nov. 13, 2015, 4:39 après-midi 16
LD nov. 13, 2015, 4:40 après-midi 15
MLG nov. 13, 2015, 4:45 après-midi 14
VG nov. 13, 2015, 4:47 après-midi 13
... ... ...
FC nov. 14, 2015, 5:48 après-midi ...

Bilan

Le bilan en chiffres

En six mois, à raison d’une heure de TD par semaine, ce sont 5.649 soumissions qui ont été effectuées ; soit une moyenne de 30 exercices par élève. 23.033 tests ont été réussis ; soit une moyenne de 122,5 tests par élève. Cette moyenne ne correspond pas à la moyenne du nombre d’exercices (30) multipliée par la moyenne des tests par exercice (4,2) car les élèves de deuxième année se sont concentrés sur des exercices de révision (avec un peu plus de tests par exercice) alors que les élèves de première année ont commencé par des exercices de base (avec un peu moins de tests par exercice).

L’interface administration de Django permet d’accéder facilement à la base de données si l’enseignant souhaite des statistiques plus fines.

Le bilan pédagogique

Indéniablement, cette méthode d’évaluation formative est positive.

Les élèves ne sont plus passifs ; ils ne peuvent pas faire semblant de travailler ; ils doivent être productifs à chaque séance. Quelques fois, je montre au vidéo-projecteur le classement général avec le total des points (les élèves n’ont, eux, accès qu’aux classements par exercice).

Le fait que la correction soit réalisée par une machine évite toute contestation ; les élèves apprennent la rigueur : un simple espace, une simple minuscule à la place d’une majuscule, une simple faute de frappe,... et la machine refuse d’obéir !

Le fait d’afficher un classement pour chaque exercice crée une émulation (même entre élèves de l’ISEN et de la Croix-Rouge qui ne se connaissent pas). En particulier, deux élèves de deuxième année (FP à l’ISEN et POHB à la Croix Rouge) se livrent à une compétition féroce pour être le premier à résoudre les nouveaux exercices. L’expérience montre que les techniques du jeu (gamification) comme les points, les bonus,... sont des ressorts puissants pour motiver les élèves.

Les meilleurs élèves n’hésitent à prolonger leur travail bien au delà des séances prévues dans l’emploi du temps (voir table 3).

Table 3 Exemple d’heures de soumission de FP et POHB (élèves de deuxième année) et WB et FT (élèves de première année).

InitialesDateExercice
POHB oct. 18, 2015, 12:39 matin Partition - 1
POHB oct. 18, 2015, 12:40 matin Partition - 2
FP janv. 6, 2015, 12:42 matin Fraction rationnelle
FT nov. 27, 2015, 12:23 matin Table de multiplication
FT nov. 27, 2015, 1:50 matin Conversion base 10 -> base b
FT dec. 2, 2015, 1:51 matin Intervalle - 2
FT dec. 2, 2015, 1:59 matin Liste de courses
WB dec. 2, 2015, 2:16 matin Triangle rectangle
FT dec. 2, 2015, 2:37 matin Retour à l’entrée d’un labyrinthe
WB janv. 14, 2016, 2:50 matin Conversion base 10 -> base b
WB janv. 14, 2016, 3:21 matin Variations de stocks
WB janv. 14, 2016, 3:57 matin Participant à une fête

Cette émulation a également fonctionné au sein des quatre classes de prépa intégrées alors qu’habituellement (en mathématiques, en physique, en sciences de l’ingénieur), il n’y a pas vraiment d’esprit de compétition dans ces classes car il n’y pas l’enjeu des concours.

L’esprit de compétition est poussé à son paroxysme dans l’épreuve de « sprint ». Les très bons élèves, qui se battent pour les premières places, codent vraiment dans une ambiance fébrile. Lorsque le serveur donne son verdict et valide tous les tests d’un élève, la salle de cours résonne d’un grand « Yes ! » digne d’une enceinte sportive.

Il y a peu de tricheries (auparavant, lorsque j’utilisais France-IOI, les élèves s’échangeaient couramment les codes via une DropBox). Je pense que le fait qu’il y ait un classement par exercice change beaucoup de choses : un élève qui a passé du temps à développer lui-même un code ne souhaite pas le divulguer. Il comprend que, si la pratique devait se généraliser, ceci pourrait se retourner contre lui sur un autre exercice. Il pourrait être dépassé dans le classement par un plagiaire. Ainsi, sans que j’ai eu besoin de définir de règles, les élèves gardent jalousement leurs programmes.

L’affichage du classement par exercice motive également les élèves faibles. Lorsqu’un étudiant voit qu’un problème a déjà été résolu par une centaine d’élèves, il se dit que l’exercice doit être faisable et il le cherche. (Le site du projet Euler fonctionne également sur ce ressort mais à une autre échelle : on peut voir que le premier exercice a été résolu par plus de 500.000 personnes). Comme, pour un exercice donné, un élève a la possibilité de faire autant de soumissions qu’il le désire sans être sanctionné, tout le monde est incité à proposer son code. En changeant le statut de l’erreur, l’évaluation formative pousse les élèves à être actifs.

Le choix des exercices a également son importance. Certains algorithmes sont volontairement ludiques (ex : Pledge pour sortir d’un labyrinthe, résolution de Sudoku,...) pour que les élèves s’approprient la problématique et soient vraiment intéressés pour trouver la solution. Par exemple, lorsqu’un élève - après plusieurs séances - arrive enfin à sortir d’un labyrinthe, une véritable explosion de joie éclate dans la salle. Encore un ressort de la gamification.

Formation synchrone et asynchrone

En présentiel

Les séances de TD sont très dynamiques, pour les élèves, comme pour l’enseignant. Il y a, par moment, une dizaine de mains qui se lèvent simultanément pour demander de l’aide ; le professeur doit alors réagir vite. Il est essentiel que l’enseignant ait suffisamment d’entraînement pour repérer et régler les erreurs de syntaxe en moins de 10 secondes (sinon le dixième élève qui demande de l’assistance commencera à s’impatienter). Il est également important de se rappeler parfaitement des 147 algorithmes pour trouver rapidement les erreurs plus graves. Quand je vois qu’une erreur de logique est faite trois ou quatre fois de suite, j’interromps la séance et je fais un point au tableau pour toute la classe.

A distance

L’enthousiasme des élèves a un revers pour l’enseignant. Les élèves n’hésitent pas à me contacter par courrier électronique 7 jours sur 7 (et pratiquement 24H sur 24H) pour demander de l’assistance (voir table 4).

Table 4 Exemple d’échange de mails avec POHB.

SenderDate
POHB 21/09/2015 19:50
kany 21/09/2015 19:54
POHB 21/09/2015 21:49
kany 21/09/2015 22:25
POHB 24/09/2015 21:14
kany 25/09/2015 07:51
POHB 27/09/2015 12:09
kany 27/09/2015 12:36
POHB 16/10/2015 23:52
kany 17/10/2015 06:25
POHB 17/10/2015 19:36
kany 18/10/2015 00:16
POHB 18/10/2015 09:36
kany 18/10/2015 11:28
POHB 20/10/2015 14:48
kany 20/10/2015 15:37
POHB 20/10/2015 18:54
POHB 20/10/2015 19:08
POHB 20/10/2015 19:10
POHB 21/10/2015 18:23
kany 21/10/2015 20:03
POHB 22/10/2015 17:03
kany 22/10/2015 19:06
POHB 22/10/2015 23:32
kany 23/10/2015 08:08
POHB 23/10/2015 11:47
POHB 08/11/2015 12:41
POHB 08/11/2015 13:30
kany 11/11/2015 23:52

Lors de ces échanges de mails, il ne s’agit pas de donner directement la solution à l’élève mais plutôt de lui donner des indices pour résoudre le problème ou bien de lui montrer un contre-exemple pour qu’il comprenne pourquoi son algorithme est faux.

Evolutions possibles

À court terme, la première évolution consiste à étoffer la base d’exercices pour balayer l’ensemble du programme de CPGE.

Pour le moment, lorsqu’un élève soumet un programme qui boucle indéfiniment, le processus d’évaluation du code est arrêté brutalement au bout de quelques secondes. Si plusieurs élèves soumettent simultanément des programmes avec des while infinis, le temps de latence pour les autres utilisateurs peut atteindre 10 à 15 secondes. On pourrait obliger les élèves à tester leur code sur leur PC personnel avant de les soumettre au serveur en bloquant une minute l’adresse IP d’un étudiant soumettant une boucle infinie. L’idée n’est pas du tout de modifier l’esprit de l’évaluation formative : les erreurs font partie du processus d’apprentissage, il n’est pas question de pénaliser un élève qui se trompe. L’idée est plutôt d’encourager l’élève à faire un minimum de vérifications avant de répondre.

L’ISEN de Brest est une école d’ingénieurs faisant partie d’une fédération (HEI-ISA-ISEN) regroupant une dizaine d’établissements répartis sur le territoire français avec 1.800 élèves en formation. On pourrait envisager de généraliser cette évaluation formative à l’ensemble de ces étudiants. Néanmoins, actuellement, le site est hébergé sur un unique serveur virtuel et l’évaluation des codes se fait de façon synchrone. Comme, à un instant donné, il n’y a au maximum que trente à soixante élèves connectés, le serveur tient parfaitement la charge. Si le dispositif devait passer à l’échelle, il faudrait envisager deux modifications assez simples. D’une part, l’évaluation des codes devrait se faire de façon asynchrone (ce qui est assez facile à faire en Python à l’aide de la bibliothèque threading). D’autre part, la charge de calculs devrait être répartie sur plusieurs serveurs virtuels (ce qui est parfaitement possible grâce à la technologie OpenStack qui permet de créer des serveurs à la volée (on the fly) dès qu’un serveur commence à s’essouffler).

Conclusion

Les technologies Nginx/PostgreSQL/Django/PySandBox ont permis de mettre en place un système d’évaluation automatique de codes Python qui est simple, souple et qui peut passer à l’échelle.

Conformément aux principes de l’évaluation formative, les élèves ont la possibilité de se tromper sans être pénalisés. Ce changement du statut de l’erreur a des conséquences positives.

Les élèves sont actifs, les élèves ne trichent pas, le classement par exercice encourage les élèves faibles, les élèves prolongent le travail au delà des séances de TD. Il a de l’émulation au sein de la classe et entre classes qui ne se connaissent pas. Les demandes d’assistance démontrent que les élèves sont motivés pour résoudre les problèmes eux-mêmes.

Les épreuves de type « sprint » préparent les élèves à leur métier d’ingénieur ; ils apprennent à coder de façon efficace sous la pression du temps.

Bibliographie

Allal ALLAL, L. (1991). Vers une pratique de l’évaluation formative : matériel de formation continue des enseignants, Bruxelles : De Boeck-Wesmael.

Nunziati NUNZIATI, G. (1990). "Pour construire un dispositif d’évaluation formatrice", Cahiers Pédagogiques : Apprendre, n°280 janv. 1990, pp. 48-64.

BO Bulletin officiel spécial n° 3 du 30 mai 2013 http://www.education.gouv.fr/pid25535/bulletin\_officiel.html?cid\_bo=71586

loi Article L912-1-1 du Code de l’éducation. Loi n° 2005-380 du 23 avril 2005 - art. 48 JORF 24 avril 2005 http://www.legifrance.gouv.fr/affichCodeArticle.do?cidTexte=LEGITEXT000006071191\&idArticle=LEGIARTI000006525569

FranceIOI Les Olympiades internationales d’informatique (IOI) http://www.france-ioi.org/

SOLJ Sphere Online Judge http://www.spoj.com/

Euler Project Euler https://projecteuler.net/

CodeAcademy Code Academy https://www.codecademy.com/

Django Django https://www.djangoproject.com/

PySandBox PySandBox is a Python sandbox. By default, untrusted code executed in the sandbox cannot modify the environment. https://pypi.python.org/pypi/pysandbox/

PythonDev The PySandBox project is broken. https://mail.python.org/pipermail/python-dev/2013-November/130132.html

Annexe

Le mode d’emploi de l’installation du serveur se trouve en pièce-jointe (Eval_code_doc)

Article original : (c) Springer
Smart Education and E-Learning 2016
Editor : V. Uskov, R.J. Howlett and L.C. Jain
Title : On line formative assessment : Teaching Python in French CPGE

Licence : Copyright

Documents joints

Notes

[1Dans le système éducatif français, on peut accéder aux Écoles d’Ingénieurs par deux voies principales. D’une part, les CPGE à concours qui préparent les élèves à des concours en fin de niveau L2. D’autre part, les CPGE intégrées, qui sont implantées dans les écoles, qui recrutent au début du niveau L1 et qui permettent d’accéder au cycle Ingénieur sans passer par un concours en fin de L2.

[2On aurait pu garder la trace de tous les essais successifs afin d’effectuer des statistiques (ex : nombre de tentatives par exercice) ou bien afin d’effectuer des comparaisons entre différentes versions d’un même code ; mais ceci aurait alourdit la taille de la base de données.

Répondre à cet article

Qui êtes-vous ?
[Se connecter]
Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Suivre les commentaires : RSS 2.0 | Atom