Proposer un exercice Python à exécuter dans le navigateur
Une tâche de programmation, c’est un fichier, quelques lignes qui expliquent ce qu’il faut faire et, éventuellement, des tests qui vérifient que le code fonctionne. Vous l’écrivez une fois et la distribuez à autant de classes que vous voulez ; chaque élève reçoit sa propre copie, qu’il peut modifier, voire casser, sans conséquence. Tout ce qui suit vaut aussi pour les tâches Java, Go, Node, TypeScript sur Node et Bash ; la page sur les langages indique ce qui change.
Rédiger l’exercice
Dans le module, cliquez sur « Nouvelle tâche » puis sur la carte Python : un éditeur s’ouvre avec le code de départ d’un côté et les consignes de l’autre. Les consignes peuvent contenir des titres, des listes et des blocs de code, pour que vos exemples soient mis en forme comme tels.
Ce que vous laissez dans le fichier est le point de départ de chaque élève : un squelette avec une docstring, une fonction à moitié écrite ou un fichier vide.
- Ajouter la tâche. Dans l’onglet « Tâches » du module, cliquez sur « Nouvelle tâche » : les cartes s’ouvrent juste en dessous, une par type, regroupées sous Code, Schéma, Quiz ou Lab, si bien qu’un quiz ou un lab se crée lui aussi en un clic une fois son groupe choisi ; Échap ou « Fermer » les referme. Un module qui n’a encore aucune tâche affiche les cartes d’emblée. Cliquez sur la carte Python : la tâche s’ouvre sous le nom untitled-python ; vous pouvez la renommer à tout moment avec le crayon à côté de son nom, en haut de l’éditeur. La page « Tâches » propose les mêmes cartes, mais vous y choisissez d’abord le cours et le module : c’est pratique quand vous savez ce que vous voulez écrire avant d’avoir décidé dans quel module le ranger.
- Écrire le code de départ. C’est ce que chaque élève voit lorsqu’il ouvre la tâche pour la première fois.
- Rédiger les consignes. Expliquez ce que vous attendez des élèves, à côté du code plutôt que sur une feuille à part.
- La distribuer. Choisissez certains élèves ou toute la classe. Chacun reçoit sa propre copie.

Ajouter des tests qui corrigent à votre place
Vous pouvez joindre des tests à toute tâche qui exécute un programme : pytest pour Python, JUnit 5 pour Java, go test pour Go, et l’outil de test intégré à Node pour JavaScript et TypeScript. En Bash, un test est un script qui réussit lorsqu’il se termine sans erreur. L’élève appuie sur « Exécuter les tests » et voit lesquels réussissent ; vous voyez le même résultat sur sa page, sans avoir à le lui demander.
Les tests peuvent être cachés, et c’est tout l’intérêt pour une évaluation : l’élève voit que quatre tests sur six réussissent, mais pas les assertions en échec : l’exercice garde donc tout son intérêt.
Cacher les tests ne laisse pas l’élève sans moyen de vérifier son travail. Son onglet « Tests » devient alors une zone vide qui lui appartient, enregistrée avec sa copie, et il dispose de deux boutons : « Exécuter mes tests » lance son programme sur cette zone sans rien enregistrer, et « Exécuter les tests cachés » lance les vôtres, ce qui détermine la réussite ou l’échec affiché dans sa liste de tâches. Ses propres tests ne peuvent jamais modifier ce résultat, et les paquets de la tâche sont installés dans les deux cas. Si vous affichez vos tests plus tard, ils remplacent la zone de l’élève à sa prochaine ouverture de la tâche.
Fournir un fichier de données si besoin
Une tâche peut inclure un fichier de données que le programme doit lire : un CSV de relevés, par exemple, ou un fichier texte dont il faut compter les mots. À l’exécution, ce fichier se trouve dans le même dossier que le code de l’élève : `open('data.csv')` fonctionne donc comme prévu.
Ce fichier doit être du texte brut, ce que la plateforme détermine en lisant son contenu et non en se fiant à son nom : une image renommée data.csv est refusée, alors qu’un fichier texte sans extension est accepté. Une marque d’ordre des octets (BOM), qu’Excel ajoute à chaque CSV exporté, est supprimée pour que la première ligne se lise correctement. Un élève peut joindre son propre fichier de données à côté du vôtre, sur sa copie : un seul à la fois, donc en joindre un autre remplace le premier, et son nom doit être différent du vôtre. Un fichier de données pèse au plus 64 Ko.
Donner plusieurs fichiers à une tâche
Une tâche de programmation n’a pas à tenir dans un seul fichier. Ses fichiers forment une arborescence à côté de l’éditeur : « Nouveau fichier » et « Nouveau dossier » en créent un, « Importer » apporte des fichiers texte de votre ordinateur, et « Renommer ou déplacer » prend un chemin complet : lib/helpers.py place un fichier dans un dossier lib, d’où le programme l’importe. Une tâche contient jusqu’à 50 fichiers de 64 Ko au plus, 1 Mo en tout, et seulement du texte : un fichier importé est vérifié en le lisant, si bien qu’une image renommée data.csv est refusée. Chaque fichier s’ouvre dans son propre langage : README.md en Markdown, un .csv en texte brut.
Le programme est le fichier marqué « L’exécution part d’ici », et vous pouvez lui aussi le renommer ou le placer dans un dossier. Son extension reste celle du langage, et un programme Java, C#, Haskell ou Kotlin garde son nom où qu’il aille. « Retirer » enlève un fichier aussitôt, avec « Annuler » à côté pendant quelques secondes. Un dossier existe tant qu’il contient un fichier : un nouveau dossier commence donc par son premier fichier. Dans l’arborescence, les flèches passent d’un fichier à l’autre et ouvrent ou ferment les dossiers, Entrée ouvre un fichier, F2 le renomme et Suppr le retire.
Distribuer la tâche copie chaque fichier chez chaque élève, qui voit la même arborescence et peut modifier chaque fichier sur sa copie. Il ne peut ajouter ses propres fichiers que si la tâche en autorise plusieurs, et les fichiers que vous lui avez donnés gardent leur nom. Les fichiers d’entraînement et les bacs à sable ont la même arborescence. Il n’y a toujours qu’un seul fichier de tests et qu’une seule liste de paquets, un fichier en haut de l’arborescence marqué « Paquets », décrit dans « Les langages disponibles pour une tâche ». Une page web et une tâche SQL ne peuvent pas recevoir de fichiers supplémentaires, car leurs volets sont ce qui les compose. Pour un exercice qui doit rester un seul fichier, décochez « Plusieurs fichiers » dans les paramètres de la tâche ; les fichiers qu’elle contient déjà sont conservés et peuvent toujours être renommés et déplacés.
Les projets avec des dossiers, et les vrais fichiers de paquets qu’ils utilisent, ont leurs propres pages dans ce manuel, tout comme le chargement d’une tâche entière depuis un dépôt Git.
Un notebook, pour la science des données
Choisissez Notebook quand vous créez une tâche et vous obtenez un notebook Jupyter : des cellules de texte et des cellules de Python, dans un fichier qui s’ouvre dans Jupyter, VS Code ou Colab. Vous ajoutez, déplacez et supprimez des cellules, et vous modifiez une cellule de texte en Markdown.
Exécuter lance toutes les cellules de code depuis le début, dans l’ordre, dans un processus propre, et affiche la sortie de chaque cellule sous elle : le texte affiché, la valeur de sa dernière ligne, un tableau pandas et une figure matplotlib. Les cellules partagent leurs variables comme dans Jupyter, mais rien n’est conservé d’une exécution à l’autre : ce que voit l’élève est ce que fait réellement le notebook. Si une cellule échoue, l’exécution s’arrête là, nomme la cellule et la ligne, et indique que les suivantes n’ont pas été exécutées.
Ce qui est enregistré, ce sont les cellules et jamais leurs sorties : un notebook ne peut donc pas montrer un résultat que son code ne produit plus. Un nouveau notebook déclare pandas, numpy et matplotlib dans requirements.txt, en haut de son arborescence ; retirez ce dont la tâche n’a pas besoin, car chaque paquet ralentit la première exécution. Une tâche qui apporte des paquets dispose d’au moins 30 secondes, sauf si vous fixez vous-même une limite.
Les tests cachés fonctionnent comme pour un programme : les cellules de code sont réunies en un seul fichier Python et vos tests appellent par leur nom les fonctions du notebook. Le rendu, la notation, les groupes, les limites de temps et le reste sont ceux de n’importe quel programme.
Vous pouvez aussi exécuter une cellule à la fois. Chaque cellule de code a son propre bouton Exécuter, et Maj+Entrée exécute la cellule puis passe à la suivante. Un noyau actif garde les variables d’une cellule à l’autre : on charge des données dans une cellule et on s’en sert dans la suivante sans les recharger. Tout exécuter lance toutes les cellules de code dans l’ordre, et Redémarrer le noyau oublie tout et repart de zéro. Le bouton Exécuter de la page est différent : il part toujours de rien et exécute tout le notebook, ce qui vérifie qu’il se reproduit depuis le début. Un noyau s’arrête après 15 minutes d’inactivité, ou si une cellule dure plus d’une minute ou utilise trop de mémoire ; la cellule le dit et la suivante démarre un noyau propre. Un `input()` dans une cellule échoue dans cette cellule, et les lignes commençant par `%` ou `!` sont ignorées, avec un message, sauf `%pip install nom==1.2.3`, qui installe une version exacte d’un paquet de la liste approuvée : on ne peut pas ajouter de paquet à un noyau en cours d’exécution, donc le noyau redémarre et les variables des cellules précédentes disparaissent jusqu’à ce que vous les réexécutiez. Un paquet dont tous les étudiants ont besoin va plutôt dans requirements.txt. Interrompre arrête une cellule en cours en gardant le noyau et ses variables, et un tableau pandas est affiché comme un tableau.
Pour reprendre un notebook que vous avez déjà, appuyez sur Importer un .ipynb et choisissez le fichier : ses cellules remplacent celles de la page (l’historique restaure la version précédente) et ses sorties enregistrées sont laissées de côté. Un notebook écrit pour un autre langage, ou de plus de 200 cellules ou 60 Ko sans ses sorties, est refusé avec la raison. Exporter en .ipynb télécharge le notebook pour Jupyter, VS Code ou Colab, avec ce que les cellules affichent à ce moment-là.
Proposer une tâche à des groupes
Une tâche peut être proposée à des groupes plutôt qu’à des individus. Chaque groupe reçoit une seule copie, que n’importe lequel de ses membres peut modifier et rendre, et la note est celle du groupe. Vous formez les groupes dans l’onglet « Personnes » de la tâche, sous « Groupes » : automatiquement, à partir de tous les élèves du module ou de ceux qui sont en ligne à ce moment-là, ou à la main, en déplaçant chaque élève sous le titre de son groupe. Tout s’enregistre au fur et à mesure.
Une tâche de groupe n’est détenue que par l’intermédiaire d’un groupe : la distribuer à un élève qui n’est dans aucun groupe est refusé, et le message le nomme. Une tâche déjà distribuée individuellement ne peut pas devenir un travail de groupe tant que vous n’avez pas retiré ces élèves, et la case le précise. Un quiz ne peut pas être un travail de groupe.
Une seule personne écrit dans un fichier à la fois : il apparaît aux autres membres du groupe comme le sien, en lecture seule et avec son nom, tandis que les autres fichiers de la tâche restent modifiables, et un ordinateur portable refermé libère le fichier environ une minute plus tard. Rien n’est conservé par élève pour une tâche de groupe : ni copie séparée, ni note séparée, ni trace de qui l’a ouverte, et une prolongation accordée à un membre vaut pour tout le groupe.
Fixer une durée limite si vous le souhaitez
Toute tâche peut avoir une durée limite : cochez « Leur donner une limite de temps » dans les paramètres de la tâche et indiquez les minutes, quatre heures au maximum. Le chronomètre démarre la première fois que chaque élève ouvre la tâche et il est tenu par la plateforme : recharger la page ou effacer les cookies ne le relance pas, et vous qui ouvrez le travail pour le corriger n’en démarrez aucun.
Vous choisissez ce qui se passe une fois le temps écoulé : le dépassement est simplement enregistré, ou bien le travail est effectivement bloqué. Si la case reste décochée, le dépassement est signalé à l’élève et à vous, sans rien refuser ; cochez « Les arrêter une fois le temps écoulé » et les enregistrements et les rendus s’arrêtent à ce moment-là, sauf pour un quiz, toujours pris en compte et corrigé, même tardif. Dans les deux cas, rien de ce qui a été saisi n’est perdu, car l’éditeur enregistre automatiquement une seconde après la dernière frappe.
Renvoyer un travail redonne un chronomètre neuf à l’élève. Chaque liste de tâches, celle de l’élève comme celle de votre module, affiche un badge « Chronométré » avec les minutes avant même que quelqu’un ouvre la tâche, puisque c’est l’ouverture qui démarre le chronomètre.
Combien de temps une exécution peut durer
C’est autre chose que la durée limite : il s’agit du temps dont dispose un clic sur « Exécuter », ou une exécution des tests, avant que le programme soit interrompu. Sans réglage, c’est 10 secondes pour Python, Bash, Node et SQL, et 20 pour Java, Go et TypeScript sur Node, qui doivent d’abord compiler. Une tâche Go, Java ou TypeScript qui déclare des paquets en reçoit 45, pour que la première exécution ait le temps de les récupérer et de les construire.
Pour la modifier, réglez « Durée d’exécution maximale » dans les paramètres de la tâche, en secondes, 60 au plus ; 0 conserve la valeur par défaut ci-dessus. Une limite plus courte que la valeur par défaut est autorisée, si bien que « faire en sorte que ça se termine en deux secondes » est un exercice tout à fait légitime, et une valeur supérieure à 60 est refusée au lieu d’être abaissée en silence. Un élève ne peut pas demander une seconde de plus que ce que la tâche autorise.
Une exécution interrompue pour dépassement de temps le dit et conserve ce qu’elle avait déjà affiché. L’entrée standard est une zone sous le code, de 16 Ko au plus, et la sortie d’un programme qui affiche beaucoup trop de texte est tronquée, avec une mention qui l’indique.
Où se trouve tout ce qui concerne une tâche
Une tâche comporte quatre onglets. « Éditeur de tâche » sert à la rédiger. « Paramètres de la tâche » réunit ce qu’un élève peut voir et modifier, la durée d’exécution, « Demander à l’IA », la durée limite, la date limite et les notes. « Suivi » indique qui la détient et où en est le travail, et « Personnes » indique à qui elle est destinée, ses propriétaires et, pour un travail de groupe, les groupes.
Pas de bouton « Enregistrer »
Chaque paramètre est enregistré automatiquement un instant après sa modification, et « Enregistré » s’affiche à côté du champ concerné. Il en va de même sur toute la plateforme, et pas seulement sur cette page : les paramètres d’une tâche ou d’un module, les coordonnées et le tarif de votre établissement, les éditeurs de quiz et l’agenda de disponibilités d’un hôte.
Une valeur non valide est signalée à côté du champ dès la saisie, et rien n’est envoyé tant qu’elle ne peut pas être enregistrée. Lorsqu’un champ a une longueur maximale, le nombre de caractères restants s’affiche à l’approche de la limite, au lieu que le caractère suivant soit refusé sans prévenir.
Un bouton ne subsiste que là où l’action concerne quelqu’un d’autre. Enregistrer une prestation envoie une invitation aux clients nouvellement cochés, ce qui est irréversible : c’est donc une décision délibérée, et non une simple pause dans la saisie.
Questions fréquentes
- Les élèves peuvent-ils voir les tests ?
- Seulement si vous l’autorisez, avec « Tests visibles par les élèves » dans les paramètres de la tâche. Les tests cachés n’affichent qu’un nombre de réussites, ce qui convient à une évaluation, et l’élève peut tout de même écrire ses propres tests dans son onglet « Tests » ; pour l’entraînement, mieux vaut des tests visibles, car savoir lire un test qui échoue est une compétence en soi.
- Faut-il installer Python sur les postes des élèves ?
- Non. Le code s’exécute sur nos serveurs, dans un nouveau conteneur à chaque fois.
- Puis-je réutiliser un exercice avec la classe de l’an prochain ?
- Oui. Une tâche appartient à son auteur et non au module : vous pouvez donc la distribuer de nouveau, ou la proposer à un autre enseignant.
- Combien de temps un programme peut-il s’exécuter ?
- Dix secondes par défaut, vingt pour Java, Go et TypeScript sur Node, et jusqu’à une minute si vous le relevez dans la tâche.