SofusPy est une application en ligne permettant de créer et d’exécuter des programmes visuels ou des programmes Python. Cette passerelle entre la programmation par blocs (au collège) et Python (au lycée) propose notamment :
de nombreux blocs adaptés à l’enseignement des mathématiques
de programmer en Python soit directement, soit en s’appuyant sur un traducteur de blocs en Python
une tortue (utilisable en programmation visuelle ou en Python)
un utilitaire permettant de passer de Scratch à Python (voir article)
Depuis sa version initiale en 2017 (voir article), SofusPy a connu plusieurs évolutions importantes qui seront résumées dans cet article. Elles peuvent être testées à partir de ma page web consacrée à Blockly (voir lien) ou celle de l’IREM de la Réunion (voir lien).
Deux versions y sont proposées :
la première (illustrée ci-dessus) permet de voir simultanément l’éditeur visuel (partie gauche de l’écran) et l’éditeur textuel (partie droite), avec une barre de séparation mobile pour ajuster leur largeur en fonction des besoins
la seconde, adoptée dans mes articles antérieurs parce que je n’arrivais pas à rendre mobile cette barre de séparation, permet de voir soit l’éditeur visuel soit l’éditeur textuel, le basculement de l’un à l’autre se faisant à l’aide de boutons (« Editeur Python » et « retour à Blockly »)
Les fonctionnalités de ces deux versions sont similaires, y compris pour la plupart des nouveautés présentées dans cet article : création et transformation de variables (section B), configuration R (section C), activités disponibles (section D) et « création et diffusion d’activités » (section F). Toutefois, des différences significatives entre ces deux versions apparaissent quand on cherche à programmer en Python à l’aide de blocs (section E).
B) Création et transformation de variables
Grâce à un changement de version de Blockly, il y a désormais dans le menu Variables un bouton « Créer une variable » qui rend plus naturelle cette tâche.
Ce bouton fait aussi apparaître dans le menu « Variables » un bloc permettant de transformer des variables, avec diverses options [1] : augmenter, diminuer, multiplier, diviser, augmenter d’un pourcentage… Pour y parvenir, une adaptation du Blockly de base a été réalisée car la seule transformation proposée était « augmenter ».
C) Trois configurations : standard, calcul formel ... et R !
Deux configurations (calcul symbolique et R) ont été ajoutées à la version initiale de SofusPy. Elles sont accessibles grâce à une liste déroulante :
La configuration standard, proposée par défaut, était la seule disponible dans la version 2017 de SofusPy. Les deux environnements (visuel et textuel) y ont un moteur d’exécution spécifique :
un programme visuel est traduit en Javascript pour être exécuté par le navigateur (le code Javascript n’est pas fourni à l’utilisateur)
un programme Python est exécuté par l’interpréteur Skulpt, un interpréteur Python écrit en Javascript
Cette configuration permet de faire du calcul symbolique, que ce soit en mode visuel ou en mode Python (voir article) :
Pour pouvoir être exécuté, un programme par blocs est traduit en Python. Comme l’interpréteur de SofusPy ne gère pas le module de calcul formel de Python (SymPy), le code engendré est alors envoyé à un serveur externe (SymPy Live). Voici ce qu’on obtient ici :
On peut noter, pour cet exemple inspiré par le sujet 2017 de Pondichery au brevet des collèges, qu’il est très facile de passer de la version numérique à la version formelle : il suffit de remplacer le 7 de la section B par un bloc « x » (disponible dans le menu « calcul formel »). La programmation visuelle formelle ne nécessite donc pas d’apprentissage particulier de la part des élèves, ce qui est un atout.
Considérons ce programme par blocs où on répète le lancer de 3 dés et où on étudie graphiquement la répartition de leur somme :
Comme il comporte un bloc pour construire un graphique, il ne peut être exécuté par SofusPy ni directement (avec l’interpréteur Javascript) ni indirectement (en exécutant sa traduction Python) :
Certes, c’est déjà appréciable de pouvoir récupérer ce code Python (bouton Traduire ou Editeur) pour le transférer et l’exécuter dans un environnement externe, mais une exécution directe du programme par blocs apporterait un plus non négligeable : c’est ce que permet la configuration R. Un code R, non fourni à l’utilisateur, est alors engendré à partir des blocs, puis envoyé à un serveur R (OpenCPU) qui l’exécute. Pour cet exemple, à moins que le hasard ne soit facétieux, on pourra vérifier ainsi le paradoxe du duc de Toscane : il y aura un peu plus de 10 que de 9 sur le diagramme en barres.
Même s’il n’est pas fourni à l’utilisateur, ce code R intermédiaire peut néanmoins être récupéré dans l’éditeur textuel. Le voici à titre indicatif :
Dans les versions précédentes de SofusPy, il y avait quelques exemples de démonstration, mais pas d’activités disponibles. Cette lacune a été comblée, grâce au changement de version de Blockly (déjà mentionné en section B) qui permet ici d’intégrer des boutons dans le menu :
Plusieurs activités sont disponibles dans la configuration de base de SofusPy. Leurs thèmes (pourcentages, sommes...) reflètent des problématiques que je n’ai pas cherché à relier précisément aux programmes officiels. Elles sont à adapter aux objectifs pédagogiques d’une classe donnée et aux connaissances (mathématiques et algorithmiques) des élèves.
Des activités plus ciblées, adaptées à un niveau scolaire, sont en cours de réalisation. L’annexe 2 explique comment accéder à ces niveaux qui s(er)ont numérotés à partir de 1. Le niveau 1 propose un menu très élagué et, je l’espère, des activités accessibles au cycle 3 (que je connais très mal). On y trouve par exemple :
un exercice lié au calcul mental et à la multiplication
un exercice où il faut dessiner des lettres avec la tortue, le dessin à réaliser étant construit en direct lorsqu’on sélectionne une question.
Le niveau d’une question peut être très dépendant du support logiciel : par exemple, pour savoir comment évolue un prix après 4 augmentations de 5 %, c’est évidemment bien plus facile en programmation par blocs avec SofusPy (où on dispose non seulement d’un bloc « répéter n fois », comme avec Scratch, mais aussi d’un bloc « augmenter d’un pourcentage ») qu’avec un langage textuel. Dans l’activité « pourcentages », il y a aussi 2 questions traitant le problème inverse : déterminer le taux qui, appliqué 4 fois, donne une augmentation globale de 20 %. Dans l’activité, je fournis quasiment les réponses car des programmes visuels presque complets accompagnent les questions : l’objectif prioritaire est ici de faire comprendre des techniques algorithmiques usuelles (par exemple une dichotomie) en les appliquant à une problématique grand public. Mais ce sont aussi des exercices qui, sans toutes ces indications, ont leur place dans mon module d’algorithmique en IUT.
Pour illustrer l’activité « sommation », j’avais un vaste choix de situations mathématiques. J’ai opté pour une approche provenant d’une activité posée au collège avec Scratch [2] : déterminer expérimentalement pour quelles valeurs de n la somme de n entiers consécutifs est divisible par n. Dans l’activité Scratch originelle, cette question était précédée de 2 autres bien plus triviales : faire la somme de 3 entiers consécutifs (sans boucle donc), puis déterminer si elle est divisible par 3. Dans l’activité que je propose, je fournis au départ un programme Blockly calculant la somme des n premiers entiers, qu’il faut généraliser à n entiers consécutifs quelconques. Ensuite, le calcul numérique est remplacé par du calcul formel.
E) Comment enseigner efficacement Python à l’aide de blocs ?
Coder intégralement un programme par blocs avant d’en demander la traduction (bouton « Traduire ») est souvent trop chronophage. C’est pourquoi SofusPy permet d’alterner codage direct en Python et insertion de la traduction de blocs.
Par exemple, pour résoudre une équation du second degré en Python, c’est plus simple de commencer par coder directement des instructions telles que celles-ci :
Dans un second temps, on peut compléter ce code par l’insertion de la traduction Python de blocs (uniquement dans la version de SofusPy où on voit simultanément les deux éditeurs) :
Le bouton « Traduire » ne doit pas être utilisé ici car il effacerait le code Python initial [3].
Plusieurs mois après la publication de cet article, j’ai eu l’idée de proposer un bloc d’entrée et un bloc de sortie, afin d’obtenir rapidement des programmes Python conformes aux nouvelles préconisations pour le lycée (utilisation systématique de fonctions) :
Auparavant, il fallait définir une fonction Blockly, ce qui était assez chronophage (copie d’écran). Cette évolution n’a pas été encore intégrée dans la version de SofusPy hébergée par l’IREM de la Réunion, mais est opérationnelle sur mes pages professionnelles.
Comme je l’ai signalé dans la section D, les thèmes des activités disponibles (pourcentages, sommes, produits et dés) reflètent des problématiques que je n’ai pas cherché à relier précisément aux programmes officiels. Pour y remédier, j’ai mis au point un dispositif permettant aux enseignants de créer leurs propres activités et de les diffuser. Pour l’illustrer, je vous invite à télécharger ce fichier qui va être étudié dans la suite de cette section.
Le bouton « Ouvrir » de l’éditeur Blockly permet d’intégrer l’exemple dans SofusPy : il suffit de sélectionner le fichier zip dans la boîte de dialogue apparaissant alors. Cela crée dans le menu de Blockly un sous-menu intitulé « Exercice », composé de trois boutons :
question 1 : ce bouton fait apparaître un énoncé, ainsi qu’un programme Blockly à compléter.
question 2 : ce bouton fait apparaître un énoncé, mais pas de programme Blockly puisqu’on repart du programme Blockly obtenu à l’issue de la question 1.
question 3 : ce bouton fait apparaître un énoncé, ainsi qu’un programme Python à tester.
En dézippant le fichier de l’exemple pour en examiner le contenu, on voit qu’il consiste en un dossier nommé « xml » contenant deux fichiers :
un fichier nommé « activites.xml » décrivant la structure du menu Blockly, en particulier les boutons associés aux questions de l’activité
un fichier nommé « q1.xml » correspondant au programme Blockly téléchargé quand on clique sur le bouton « question 1 »
Le contenu du fichier « q1.xml » a peu d’importance : il suffit de savoir que je l’ai créé avec le bouton « Sauver » de l’éditeur Blockly de SofusPy. Par contre, si un lecteur veut développer ses propres activités, il est nécessaire que je lui explique en quoi consiste le fichier « activites.xml », qui peut être ouvert et modifié avec un simple éditeur de texte. Voici la partie de son code décrivant l’activité :
Comme il y a trois boutons, il y a trois balises <button> possédant deux attributs :
« text » précise la légende du bouton
« callbackKey » attribue un identifiant au bouton, qui est ensuite utilisé par SofusPy pour lui associer une action
Pour chaque bouton, il y a une (parfois deux) section CDATA :
la première correspond à l’énoncé de la question
la seconde, facultative, correspond à un éventuel code téléchargé dans l’éditeur textuel : ici, seule la question 3 en a une
L’identifiant d’un bouton détermine aussi, s’il y a un programme Blockly à télécharger, le nom du fichier correspondant :
comme l’identifiant du bouton « question 1 » est q1, il y a un fichier « q1.xml » dans le dossier « xml ».
comme il n’y a pas de fichier « q2.xml » et « q3.xml », aucun programme Blockly n’est téléchargé quand on clique sur les boutons « question 2 » ou « question 3 ».
Pour créer une nouvelle activité, mieux vaut limiter les risques d’erreur de syntaxe (en particulier pour les sections CDATA) en adaptant le code de l’exemple fourni. S’il y a plus de trois questions, il faudra faire des copier-coller du code d’un des boutons (<button ...> ... </button>), sans oublier d’en changer l’identifiant (attribut « callbackKey ») et la légende (attribut « text »).
Pour modifier le fichier « activites.xml », un simple éditeur de texte [4] suffit. Ensuite, il reste à rezipper le dossier le contenant (qui se nomme « xml »), et dans lequel on place tous les fichiers Blockly de l’activité. Il ne restera alors plus qu’à diffuser le fichier zippé et à demander aux utilisateurs de l’ouvrir (commande « Ouvrir » de l’éditeur Blockly de SofusPy) après l’avoir sauvegardé sur leur disque dur.
G) Conclusion
SofusPy est un logiciel adapté à l’enseignement du codage en mathématiques, que ce soit au collège (programmation visuelle) ou au lycée (programmation Python).
Pour le collège, SofusPy propose notamment :
de nombreux blocs adaptés à l’enseignement des mathématiques.
une tortue.
la possibilité de traiter les programmes de calcul du brevet non seulement numériquement, mais aussi en faisant du calcul symbolique (un bouton de commande permet d’exécuter les blocs en envoyant leur traduction Python vers le serveur https://live.sympy.org/).
Pour le lycée, une programmation par blocs spécifique peut faciliter l’enseignement de Python d’un point de vue méthodologique et opérationnel. Je l’illustre dans cet article en examinant divers programmes Python émanant de formateurs académiques.
SofusPy peut être utilisé soit séparément, soit comme composant du logiciel PluriAlgo, un logiciel initialement conçu pour faciliter la programmation dans une dizaine de langages textuels (voir article). En 2017, j’y ai intégré la programmation visuelle, ce qui a occasionné une sérieuse refonte du logiciel.
La nature du programme obtenu à partir du formulaire ci-dessous dépend de l’éditeur sélectionné auparavant : il sera textuel si on a choisi l’onglet « Editeur 1 » et visuel si on a choisi l’onglet « Blockly (Editeur 2) » [5].
De façon analogue, on peut créer des programmes Blockly à partir du formulaire de l’onglet « Boucles » :
L’exemple de droite illustre la technique de sommation (calcul de la somme des inverses des n premiers entiers). L’exemple de gauche illustre la technique de comptage, et est à compléter afin de calculer le nombre de 6 dans une simulation de 1000 jets d’un dé.
Si on reprend les exemples précédents en choisissant l’onglet « Editeur 1 » (au lieu de l’onglet « Blockly (Editeur 2) », on obtient des codes Python. Mais je vais choisir ici un autre exemple, afin d’illustrer une autre option de l’onglet « Principal » :
Elle permet ici de créer une procédure paramétrée pour résoudre une équation du second degré. Pour la compléter, on peut s’appuyer sur SofusPy dans l’onglet « Blockly (Editeur 2) », par exemple en y créant les deux blocs suivants :
Un clic sur le bouton « Editeur (Python/R) » fait basculer SofusPy en mode Python et fournit la traduction Python des blocs. Il ne reste plus qu’à transférer (par un copier-coller) le code ainsi obtenu dans l’éditeur « Editeur 1 » et à compléter la procédure « second_degre ».
J’ai eu des demandes d’enseignants qui aimeraient que le code Python soit automatiquement affiché à chaque modification du programme visuel. Or, cela rendrait caduque un exemple de la section E, où on commence par coder en Python (jusqu’au calcul de delta), puis où on crée des blocs pour l’instruction conditionnelle avant d’insérer leur traduction dans le code Python initial. C’est pourquoi je propose à ces enseignants de compléter l’URL de SofusPy dans la barre d’adresse du navigateur avec un paramétrage (.../index.html ?auto=1) leur offrant la fonctionnalité qu’ils souhaitent, sans que le comportement standard de SofusPy ne soit altéré par conséquent.
Et, comme cela relève de la même technique de programmation Javascript, j’ai ajouté une seconde option (.../index.html ?auto=2) qui exécute en plus le programme visuel à chaque modification d’un bloc. Dans le N°52 (voir article), Yves Martin a énuméré divers avantages de cette approche en temps réel pour les tortues de DGPad. Je la rends donc accessible pour la tortue de SofusPy, s’il y a des amateurs...
Pour éviter des situations de blocage, SofusPy vérifie qu’il n’y a pas d’instruction de saisie avant de lancer l’exécution automatique. Mais il reste à la charge de l’utilisateur d’éviter un trop grand nombre d’itérations dans un bloc « répéter n fois » ou un bloc « Pour ». Le bloc « Tantque » est encore plus risqué : en effet, quand on lui ajoute un test, celui-ci est traduit en 0=0 dans un premier temps, ce qui empêche de le compléter ensuite puisqu’une boucle infinie est lancée. Donc, autant se passer de ce bloc en général pas indispensable pour manipuler une tortue, même s’il existe des parades : l’une d’elles consiste à ajouter temporairement une instruction de saisie pour bloquer l’exécution automatique, ce qui permet de compléter le test du Tantque et d’ajouter dans le corps du Tantque (au moins) une instruction impactant l’évaluation du test.
Le paramètre « niveau » (.../index.html ?niveau=1,2...) permet d’adapter les menus de SofusPy au public concerné : par exemple, le niveau 1 supprime le menu « Autres » (listes notamment), supprime le menu « Sous-programmes », allège le menu « Boucles » (en ne gardant que la boucle « répéter n fois »), allège le menu « Nombres »... Les exemples de démonstration et les exercices sont également adaptés au niveau.
Comme tout ceci se met progressivement en place, je ne parlerai pas des autres niveaux : si en les testant vous voyez apparaître le menu standard, cela signifie qu’ils n’existent pas encore ! Et pour le(s) niveau(x) disponible(s), il est probable que leur liste d’activités soit provisoire car en chantier...