philippewang.info

Quelques pensées concernant la programmation...

L'apprentissage de la programmation est quelque chose de difficile. D'une part, les apprentis font face à des restrictions de syntaxes auxquelles ils ne sont pas habitués, l'habitude étant de pouvoir écrire ou parler avec des fautes de grammaires tout en se faisant comprendre. Les ordinateurs ne sont pas capables de deviner nos pensées. C'est un fait absolu. Par exemple, un ordinateur tout neuf et isolé d'internet et dépourvu d'encyclopédie est incapable de répondre à une question du genre "Combien JFK avait-il de soeurs ?". Un être humain qui ne connaît pas la réponse ne peut pas la deviner avec une probabilité totale de donner la bonne réponse. Si on considère (au hasard) que les Américains avaient pour la plupart entre 0 et 7 soeurs avec une moyenne de 3 (ces chiffres sont faux, sauf si le hasard a fait qu'ils sont justes...), alors on peut répondre 3 en espérant que JFK était dans la moyenne. Mais dans le fond, quand on ne sait pas, on ne sait pas. C'est pareil pour les ordinateurs, avec toute l'intelligence artificielle possible même, l'inconnu n'est pas connu. (Je rappelle cette évidence car il existe de nombreuses personnes pensant - consciemment ou non - le contraire...)

Alors si on commence à s'intéresser aux comportements des étudiants qui débutent en programmation, on peut repérer/recenser les erreurs et les trier. On s'apperçoit rapidement qu'années après années, les erreurs - sans s'être passé le mot - sont pour la plupart toujours les mêmes. Oui, les erreurs sont récurrentes. Le travail des enseignants est en grande partie l'autorépétition. Et il vaut mieux l'accepter le plus tôt possible, sinon on risque de le vivre assez mal.

Ce que je me demande, c'est s'il faudrait mettre en place (dans un but pédagogique afin d'aider la diffusion du savoir) un meilleur système d'apprentissage de la programmation, et si oui, quel serait ce système ?

Je pense que les livres sont de très bons supports d'apprentissages, mais ils deviennent peut-être de moins en moins adéquats pour les débutants en programmation. Les langages sont nombreux, très nombreux. Mais il y a peu de révolutions. On a beaucoup de paradigmes de programmation et les nouveaux langages n'apportent pas vraiment de nouveautés, ils sont des combinaisons d'idées existantes. Bien sûr on peut chercher la bonne combinaison, on peut clamer l'avoir trouvée, on peut ajouter des touches personnelles vraiment nouvelles, etc. Mais dans le fond, on apporte peu de nouveautés conceptuelles. Et aujourd'hui, le paradigme de base pour pouvoir faire des calculs dans les langages de programmation répendus est le paradigme impératif.

Un langage impératif, c'est un langage où on demande à l'ordinateur d'exécuter une instruction, puis une seconde et ainsi de suite jusqu'à la fin. Il est maintenant souvent enveloppé d'une couche supplémentaire car la mode est à la programmation à objets où on introduit une structure de données dans le langage. Un objet est une valeur qui est une instance d'une classe. Une classe consiste en un ensemble de descriptions de propriétés qui peuvent être des données ou des actions (méthodes). Les classes sont reliées entre elles par les histoires de familles, puisqu'on parle d'héritage. Si une classe A est fille d'une classe B, alors toutes les propriétés de B sont transmises à A. Après c'est à A d'en faire ce qu'elle en a envie.

Mais ces classes et objets ne permettent pas (en tout cas pas de manière réaliste) de faire des calculs. Ils ne permettent que de représenter des valeurs. Si on prend un langage qui permet d'hériter de plusieurs parents, alors on peut dire qu'une vachevoiture est la fille d'une vache et d'une voiture et qu'elle possède toutes les propriétés de la vache et de la voiture. Si on appelle cela un calcul, alors ok on peut faire des calculs avec des objets et des classes. Mais dans la vraie vie, on ne calcule pas (par exemple dans un jeu vidéo) l'effet de la gravité par rapport au personnage en jouant avec des héritages. Non on fait des vrais calculs numériques. Et ces calculs numériques, on les fait en général dans un style impératif.

Et quand on dit dans un cours de programmation qu'à la fin de la formation (Bac+5) il faut être capable d'apprendre un langage de programmation en un week-end, c'est carrément vrai, mais pour un langage de programmation qui se limite à répéter les connaissances des paradigmes déjà connus. On peut bien apprendre PHP en quelques heures, c'est un langage très pauvre qui n'apporte rien de bien d'un point de vue de concepteur de langage. Ce n'est qu'un super langage de script dont la sémantique est nauséabonde dès qu'on le regarde d'un peu près. Néanmoins d'un point de vue de développeur, autant sa bibliothèque est très mal foutue car il n'y a aucune convention de nommage globale, autant elle est très grande, très complète et très bien documentée. En tout cas, nul besoin de quelques heures pour apprendre ce langage, le plus dur étant d'avoir vraiment envie de l'apprendre...

C'est beaucoup plus difficile d'apprendre un langage multiparadigme (i.e. qui possède de nombreux paradigmes de programmation). Déjà c'est un langage qui n'a pas eu le succès qu'il aurait mérité scientifiquement, forcément, puisque les langages multiparadigmes sont des cauchemars pour les entreprises. Et oui, il faut bien pouvoir apprendre un langage en un week-end, et ça se corse si le langage est riche. Il vaut mieux qu'il soit pauvre, comme PHP ou même Java. Quoi que depuis la version 5 de Java, l'introduction des classes génériques donne une zone bien sombre à ce langage ! Il faut alors faire très attention à ne pas jouer avec le feu (héritages et surcharges avec des classes génériques).

Tout ça pour en venir aux méthodes pédagogiques d'apprentissage de la programmation. Alors, d'abord, la question la plus difficile qui est la suivante. Doit-on apprendre la programmation à la manière dont on a appris à marcher ? C'est-à-dire en trébuchant souvent, en se cognant par terre, etc. Cette manière d'apprendre la programmation rappelle le "quitte ou double". En effet, ceux qui réussissent à s'en sortir en ressortent assez bons. Ceux qui ne passent pas l'étape sont mis sur la touche et c'est tant pis pour eux même s'ils avaient potentiellement les capacités. Et c'est là la question : que fait-on des apprentis moyens ? Les (vraiment) mauvais sont à réorienter. Les bons s'en sortent de toutes façons. Mais les moyens ? Comme en général il y a une majorité de moyens, il faut bien que l'attention porte sur eux.

Je pense qu'un très bon compromis pour l'apprentissage des langages de programmation (et non pas de la programmation car il s'agit d'une autre problématique) est un support encore inexistant (à ma connaissance) qui serait assez lourd à mettre en oeuvre mais qui pourrait très bien fonctionner, un peu à la manière de Wikipédia. L'idée serait de reprendre la structure classique des livres d'apprentissage de la programmation (je veux en effet utiliser l'existant concernant l'apprentissage de la programmation pour l'apprentissage d'un langage de programmation et au final on aura peut-être fait d'une pierre deux coups). On reproduit la structure du livre dans un système d'édition à la Wiki pour que tout le monde puisse participer (le coût pour la réalisation du support est acceptable s'il est suffisamment réparti).

Tout l'apprentissage de la programmation impérative de base (bannissons temporairement toute allusion à l'arithmétique des pointeurs notamment) est assez classique. La programmation impérative est au coeurs de nombreux langages (C, C++, VB, Java, C#, Pascal, Ada, ...).

Le support idéal pour l'apprentissage d'un langage de programmation est un support adaptatif. Les livres sont trop séquentiels, même s'il est possible de choisir de sauter des pages, il n'est jamais facile de savoir quels paragraphes lire lors de la première lecture et quels paragraphes lire lors des lectures approfondies. Je pars du principe qu'il n'est pas le meilleur moyen pédagogique que de suivre un livre de A à Z sans jamais se dévier du chemin imposé par la succession des pages. Si l'auteur (ou les auteurs) choisit les passages à comprendre en première lecture et peut cacher les autres pour des lectures ultérieures, alors le lecteur peut choisir selon son niveau le niveau de détails du livre. Il s'agit là de graines d'idées pour la réalisation d'un livre dynamique (informatisé puisqu'il n'est pas possible de concevoir un livre avec une telle dynamique avec seulement du papier).

Un livre dynamique qui présente une multitude de langages, c'est le bon livre pour avoir un panorama pratique des langages de programmation. En fait, le site 99 bottles of beer fait déjà ce travail mais le restreint à un seul et unique programme qui consiste à imprimer les paroles d'une chanson de bière. Et Wikipédia propose déjà dans ses articles concernant les langages de programmation des exemples simples de petits programmes qui pourraient remplir une bonne partie du contenu des deux premiers chapitres du livre dynamique que j'essaie de construire conceptuellement ici.

Les deux difficultés principales sont d'une part le support, c'est-à-dire de quoi pouvoir réaliser le livre dynamique, une idée est d'utiliser les pages web dynamiques car elles sont le moyen le plus moderne et portable pour ce genre de documents, et d'autre part les liens entre les différents langages puisque celui qui connaît l'un des langages contenu dans le livre pourra s'appuyer sur ses connaissances déjà acquises afin d'apprendre plus rapidement le langage qu'il doit apprendre.

C'est une idée qui me trotte dans la tête depuis déjà environ 3 ans. Je n'ai jamais eu l'occasion de concrétiser (ni même de commencer à concrétiser d'ailleurs) cette idée. J'espère que des gens vont le faire à ma place car je ne sais pas si j'aurai le temps un jour pour cela. En même temps, le web évolue. La recherche s'intéresse beaucoup à ce moyen de propagation de l'information (et de la désinformation, ne l'oublions pas non plus). Peut-être que les successeurs de Hop et Ocsigen seront à même de permettre la réalisation facile (et surtout rapide) du système de rêve pour ceux qui veulent apprendre rapidement un langage de programmation. Soulignons que le niveau de détails n'aurait pas de limite dans un tel système puisqu'il suffirait de paramétrer le contenu afin que le lecteur choisisse très facilement le niveau de détail qui lui convient.

2008-04-10

:: philippewang.info ::

:: design & photos by Philippe Wang :: XHTML 1.1 :: CSS 2 :: RSS 2 :: stats :: contact ::
:: Best viewed with Safari or Opera or Firefox or Links :: No SPAM Please ::
 
This page was generated on Thu Mar 20 19:41:09 GMT 2014 by BashGXD