Apprendre à coder : des blocs au texte

J'apprends à coderScratch est un formidable logiciel. Grâce à son système de programmation à base de blocs que l'on combine comme des briques Lego, il permet de transformer n'importe qui en programmeur en quelques minutes. Le revers de la médaille, c'est quand on atteint les limites des possibilités offertes par ces blocs de programmation. Le passage à une forme textuelle de codage peut être difficile car il impose un retour en arrière. Il y a beaucoup trop de choses à apprendre pour coder des trucs qui n'atteignent même pas le niveau de ce que l'on sait déjà faire avec Scratch.

Scratch offre un environnement intégré où l'on va créer des objets graphiques et les animer. Il est très facile d'utilisation pour tout ce qui est programmation événementielle. On a les événements classiques liés à l'environnement (la souris, le clavier...) mais on a aussi l'envoi de messages définis par le développeur.
Toutefois, quand on veut aller un peu plus loin sur les aspects algorithmiques impliquant des structures de données, ça se complique. Au delà des listes de valeurs simples, Scratch ne sait plus faire. Idem pour le partage de code entre objets. On en est réduit à mettre le code dans un objet séparé, appeler ce code via un événement et obtenir un retour via des variables globales. Ne parlons même pas de polymorphisme. Scratch offre une fonction de clonage d'objet mais si on veut un code différent pour chacun des clones, ce sera à coup de variables et de if/then/else.

Je vis régulièrement cette situation avec mes filles. "Papa, là je voudrais faire un truc qui fait ceci et cela". Je ne vois, bien évidemment, que ce qui me manque dans le langage des blocs pour faire quelque chose assez facilement et j'en suis donc réduit à trouver la meilleure astuce possible pour faire quelque chose d'approchant sans transformer leur projet en un monstre difficilement maintenable[1].

La solution se trouve donc dans la découverte d'un nouveau langage, avec un nouvel environnement, pour aller au delà de Scratch. J'ai aiguillé Sibylle (11 ans) vers Codecademy où elle a fait avec enthousiasme quelques tutoriels sur HTML et JavaScript. Avec un tel environnement, le champ des possibles s'agrandit de manière spectaculaire... à condition que l'on veuille bien y passer quelques jours, voire semaines d'apprentissage là où 2 heures suffisaient avec Scratch. Sur Codecademy, au bout de 2 heures on arrive, si tout va bien, à coder un pierre/papier/ciseau en mode texte...
Il existe probablement des bibliothèques qui faciliteraient la transition. J'ai un peu regardé Phaser et CreateJS. Il existe tellement de "moteurs de jeu" HTML/JavaScript que je ne sais où regarder. Si quelqu'un a une idée plus précise...

Mais ce qui aiderait vraiment à passer de Scratch à un langage textuel, ça serait la possibilité de garder les repères acquis dans Scratch pour découvrir un nouveau langage. J'ai décidé de tenter une expérience. A partir du jeu "Birds" écrit par Sibylle, j'ai fait une version C#[2] en m'appliquant à avoir un code source lisible, au mot-près, par quelqu'un qui connaîtrait seulement Scratch.

Voici le jeu original :

Et voici le jeu en C# (utilisant le moteur MonoGame).
Pour conserver les repères, j'ai juste écrit une petite API qui copie celle de Scratch. Avec MonoDevelop, on se retrouve dans un environnement qui est certes beaucoup moins interactif que celui de Scratch, mais avec un "lutin" (sprite) par classe, on s'y retrouve assez facilement.

MonoDevelop

Avec Sibylle, nous avons parcouru tous les lutins du jeu en ayant côte à côte les scripts Scratch qu'elle avait écrit et le code C#. Il n'y a eu aucun problème pour comprendre l'ensemble du code C# (sa connaissance de base du JavaScript a probablement aidé). Elle a eu, entre autres, cette remarque intéressante sur la correspondance entre les accolades du C# et les "creux" dans les blocs de Scratch. Comparaison CSharp Scratch

Cette expérience m'a conforté dans l'idée qu'un démarrage avec Scratch et ses blocs suivi d'une transition en douceur vers une approche de la programmation sous forme de texte est possible. Il ne manquerait que quelques outils pour, par exemple, convertir un projet Scratch vers une autre langage tout en gardant du code proche de l'API Scratch.

Notes

[1] Il existe des gens qui développent des projets très compliqués avec Scratch. Il faut voir par exemple ce clone de Minecraft. En fait, il faut surtout aller à l'intérieur pour apprécier tous les scripts illisibles pour toute personne autre que l'auteur.

[2] parce que c'est l'environnement que je maîtrise le mieux, donc celui où mon expérience serait réalisée le plus rapidement possible