Formation Python = formation rapide et efficace
Plus on avance dans le domaine de la formation, moins on enseigne à des débutants. C’est sans doute un tort car c’est avec eux que l’on doit user du plus de pédagogie et donc que l’on s’améliore le plus en tant que formateur. Justement, je me fais une petite piqure de rappel en replongeant dans le milieu universitaire, et je me retrouve devant les constats que j’avais fais il y a déjà plusieurs années :
-
On enseigne jamais en premier les langages de plus haut niveau. Les premiers cours sont le plus souvent du Java, parfois du C# mais plus volontiers du C. Aucun signe de PHP, Ruby, ou Python.
-
Les étudiant ne comprennent rien à ce qu’ils font avant plusieurs mois. C’est un fait, pas une analyse ou une critique, non, un simple constat. Ils sont tellement embrumés dans la mémorisation de la syntaxe, le debuggage de problèmes qu’ils ne peuvent pas appréhender sans le professeur et la perspective désespérée de faire « marcher le TD », que ce qu’ils devraient vraiment apprendre leur échappe complètement.
Et ça n’est pas de leur faute. En fait le professeur a souvent l’illusion que son cour est parfaitement assimilé. Après tout leur code compile… Parfois même, l’enseignant sait très bien que l’étudient fait son travail en mode automatique je-copie-je-colle-je-prie mais il estime que ça fait partie de l’apprentissage, que le brouillard initial et normal. C’est bien comme ça qu’il a appris, lui.
Seulement si il y a 10 ans on pouvait encore trouver du sens à cette approche1, aujourd’hui nous avons des outils d’une qualité remarquable qui nous permettent de concilier évolution pédagogique et crédibilité technique. En l’occurence, nous avons à notre portée une batterie de langages de très haut niveau, largement utilisés, largement prouvés utilises et robustes, avec toutes les bibliothèques nécessaires, complètement polyvalents, libres, et gratuits.
Il n’y a pas de raison d’écrire une classe (salut Java) ou une fonction (bonjour C) avant de savoir écrire un « Hello World ». On ne devrait pas avoir les variables et les pointeurs dans un même cours. On ne devrait pas avoir à apprendre plus de syntaxe spécialisée à un langage que de concepts généraux informatique.
Et parmi tous les langages qui permettent cette excellence pédagogique, Python sort particulièrement du lot.
Petit exemple partial…
… et injustement subjectif car volontairement en faveur de Python. Vous commencez à enseigner la base de la base, avec des snippets simples du genre :
# si i est dans le mot, afficher toutes les lettres une a une word = "www.e-vidence.net" char = "e" if char in word : for letter in word : print letter # si le nombre fait partie de la sequence, afficher toute la sequence une a une seq = (1, 2, 3, 4) i = 3 if i in seq : for number in seq : print number # afficher la derniere lettre d'un mot : print word[-1] # afficher le dernier element d'une sequence : print seq[-1] # afficher un fichier ligne a ligne : for line in open("my_file") : print line
Maintenant, supposons que vous vouliez faire la même chose en PHP. Vous n’avez pas d’interpréteur interactif de base, et vous commencez comme la plupart des formateurs (mais pourquoi, mon dieu ????) à faire installer un environnement LAMP. Bien, après une semaine, ça tourne, et vous commencez avec des choses simples, car ce langage est connu pour sa simplicité :
<?php // C'est quoi ça monsieur ? // si i est dans le mot, afficher toutes les lettres une à une $word = "www.e-vidence.net"; // A quoi sert le "$" ? $char = "e"; if (strstr($char, $word) !== 0) // Là vous bégayez une tirade sur le typage faible et la différence des opérateurs de comparaison { // On explite les bracelets, et on fait un topo sur l'indentation volontaire $len = strlen($word); // Passage obligé par les compteurs, la condition d'arrêt, la joli syntaxe de tout ça for ($i=0; $i<=$len; $i++) echo $word[$i]."\n"; // on rajoute le saut de ligne à la main + sur une page Web, un <br />... } // Si le nombre fait partie de la sequence, afficher toute la sequence une à une $seq = array(1, 2, 3, 4); $i = 3; // Tiens, c'est pas la même function... if (in_array($i, $seq)) // Hop, on change de syntaxe (plus personne n'utilise for sur un array...) foreach ($seq as $number) print $number."\n"; // Afficher la dernière lettre d'un mot : echo $word[$len - 1]."\n"; // Aller, on va expliquer le petit coup du -1, et tant qu'on y est que tout tableau commence à zéro // Afficher le dernier élément d'une séquence : echo $seq[count($seq) - 1]."\n"; // pas la même function pour la longueur non plus
72 syntax errors pour oubli de « ; » en fin de ligne plus tard, le TD marche, et un petit malin vous demande pourquoi on utilise « echo » et pas « print », et si il y a une différence. Vous allez boire un café.
En rapportant ça autour d’un verre à mes collègues, j’obtiens généralement un taulé, on hurle que c’est important de connaitre “for” en programmation, que si un étudiant ne sait pas faire ça il n’a pas sa place en info. On crie que connaitre les compteurs, la taille, et le coup du - 1, c’est primordiale, et que c’est déjà du haut niveau, on leur demande quand même pas de connaitre l’allocation de pointeur, ou encore les registres en assembleur. Et puis les sauts de lignes, si on veut pas les mettre, on fait comment ?
Soit. Seulement nous parlons ici pédagogie, pas somme de connaissances. Je suis d’accord sur le fait qu’un programmeur doit comprendre tout ça, de l’UTF-8 au functionnement de la stack en passant par l’opérateur ternaire et les acronymes récursifs (:-)). Mais on ne peut pas tout faire rentrer d’un coup. Et un langage qui permet d’amener toute les notions, une à une, pour que l’apprenant puisse bien les maitriser, ça vaut de l’or.
Avec Python, en bonus, l’élève pense maintenant à un haut niveau d’abstraction sans faire d’effort. Pensez donc, il utilise le design pattern “Iterator” ! D’ailleurs si il veut afficher toutes les lignes d’un fichier :
for line in open("my_file") : print line
L’apprenti codeur PHP, lui, se retrouve face à :
- fopen (qui ouvre aussi des url) ;
- file (qui semble avoir le même résultat car on peut faire foreach, mais qui en fait charge tout en mémoire) ;
- file_get_contents (qui est un raccourci pour fread(fopen($filename, “r”), filesize($filename)));
- et finalement la SPL (qui seuls les programmeurs avancés connaissent) qui permet effectivement d’utiliser un itérateur qui générent les données à la volées sans tout mettre en mémoire :
foreach (new SplFileObject("/etc/fstab") as $line) echo $line;
Et pourtant, PHP est un langage de très haut niveau, facile à apprendre. Imaginez que vous enseignez Java, là ça devient carrément amusant :
// Bonne chance pour expliquer la première ligne. // Au mieux vous pourrez effrayer tout le monde en disant // "z'en faites pas, on verra ça plus tard" import java.util.ArrayList; // // Deuxième élipse public class Test { // Aller hop, un autre trou dans l'explication... public static void main(String[] args) { // Prêt pour parler du typage statique ? // non ? dommage, il va falloir le faire String word = "www.e-vidence.net"; String c = "e"; // Aller, je suis choux, j'utilise pas un "char" int len = 0; // Il y a plusieurs manière de faire ça // on va utiliser la plus facile et taire les autres... if (word.contains(c)) { // Ici point délicat. Vous expliquez le principe des méthodes // vous en avez pour 2 plombes, mais si vous ne le faites pas // la moitié des éléves vont s'embrouiller avec les méthodes, // les membres, les permissions et le principe des getters et setters // parceque lenght() ressemble à un membre publique. len = word.length() -1; // Contrairement à PHP, le out of boundarie n'est pas toléré, donc -1 ici aussi // une bonne chose pour le développement, mais pour un détail de plus // La syntaxe de for inclus la déclaration de type, attention ! for (int i=0; i<=len; i++) // System.out.println, c'est évident voyons... // 2 choix, vous passez 1 heure de plus à configurer Eclipse // avec l'autocompletion pour tous, ou 3 h souffler la syntaxe // aucun des deux n'aident à apprendre System.out.println(word.charAt(i)); } // Si le nombre fait partie de la sequence, afficher toute la sequence une à une // Pour la sequence vous utilisez un tableau ou un ArrayList ? // le tableau, c'est simple (int[] seq = { 1, 2, 3 };) // ArrayList, c'est moche, mais possède la méthode contains() // Oh, et qui tente le coup de parler de la bibliothèque standard ? ArrayList seq = new ArrayList() {{ add(1); add(2); add(3); add(4); }}; // Et là, il a fallut choisir de paramétrer ou non // seulement si on le fait pas, après il faut caster... // Bien sûr, dans la foulée, au moins un étudient vous demande pourquoi // Eclipse a rajouté "tout seul" : // private static final long serialVersionUID = 7846639601304304217L; int i = 3; if (seq.contains(i)) for (Integer number : seq) System.out.println(number); // Afficher la dernière lettre d'un mot : System.out.println(word.charAt(len)); // Le -1 est déjà retiré, ah oui mais dans une condition, il vaudrait mieux... // Oh et puis merde // Afficher le dernier élément d'une séquence : // Python : print seq[-1] // PHP : echo $seq[count($seq) - 1]."\n"; // Java : System.out.println(seq.get(seq.size() - 1)); // Amen } }
Vous êtes chef d’entreprise ?
Si vos employés veulent se former, Python sera vite appris, maitrisé et utilisé. Ça veut dire des sous en moins à dépenser et un collaborateur indisponible moins longtemps. Il existe peu de domaines où Python ne peut être aussi bon qu’un autre langage, alors à moins de se trouver dans ce cas, choisissez le plus rentable.
Vous êtes enseignant ?
Python permet de couvrir l’apprentissage de la programmation du « Hello Word » aux confins de la programmation orientée objet avec efficacité et délicatesse. Vous serez moins stressé et désappointé, parfois même fier des travaux rendus en Python. En contrepartie, vous élèves comprendrons enfin ce que le grand singe qui s’agite sur le pupitre essaye de mimer depuis 2 semestres. C’est tout bénef, alors rangez la bible du C/C++ dans un tiroir en attendant la seconde année.
Et pour ceux qui savent déjà programmer ?
Si vous lisez ce blog, vous pensez certainement que ça ne vous concerne plus. Après tout, vous programmez déjà depuis longtemps, alors pourquoi se soucier de la faciliter d’apprentissage ? Tout simplement parcequ’une bonne partie des formés sont déjà aguerris dans un autre langage, et prennent sur le temps (ou leur DIF) pour en apprendre un nouveau. Les raisons ? Une mission particulière qui demande de connaître au moins un framework Web agile, l’envie de scripter un logiciel graphique ou une intelligence artificielle, la curiosité, une reconversion en admin sys…
Au moment de faire le choix, que croyez-vous qui pèse dans la balance ? Tous ces langages permettent de faire la même chose et les performances n’ont souvent aucune importance dans ce cadre. Python est un langage incroyablement facile à prendre en main quand on vient d’un autre langage, car il reprend les même concepts, en plus simple, en plus court, et toujours de la même façon partout dans son implémentation.
Avec cet article, le suis loin de vouloir enfoncer un pieu dans le coeur de PHP, Java ou [insérer votre langage fétiche ici]. Je programme dans 8 langages différents à l’heure actuelle (sans compter les langages de structuration de contenu), et tous ont leurs bénéfices. Mais quand il s’agit de se former, Python est sans conteste le choix le plus rentable, et surtout le plus agréable.
1- Et encore, je suis du genre à croire qu’il y a toujours un moyen pour simplifier l’apprentissage de l’élève, mais généralement j’ai peu d’échos auprès de mes collègues parce que ça veut dire plus de travail pour nous. Non payé en plus, quelle hérésie !

