<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>philippewang.info</title>
    <link>http://philippewang.info/</link>
    <description>
Quelques pensées concernant la programmation...
</description>
    <language>fr</language>
    <generator>BASHGXD Another Super HTML Generator XD</generator>
    <item>
    <guid>http://philippewang.info/2008-04-10-16.00.xml</guid>
      <title>
Quelques pensées concernant la programmation...
</title>
      <link>http://philippewang.info/2008-04-10-16.00.htm</link>
      <pubDate>Fri, 11 Apr 2008 01:52:32 +0200</pubDate>
      <description><![CDATA[
<!-- extra top links-->
<div>

</div>
<div>
<div>
<h1>Quelques pensées concernant la programmation...
</h1>
<!-- body-content -->
<div>
<p>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...)
</p>

<p>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.
</p>

<p>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 ?
</p>

<p>
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.
</p>

<p>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.
</p>

<p>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.
</p>

<p>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...
</p>

<p>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).
</p>

<p>
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.
</p>

<p>
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).
</p>

<p>
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,
...).
</p>

<p>
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).
</p>

<p>
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 
<a  href="http://www.99-bottles-of-beer.net/">99  bottles of  beer</a>
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.
</p>

<p>
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.
</p>

<p>
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.
</p>

</div>
<div> 2008-04-10 </div>
</div>
</div>
      ]]></description>
    </item>
  </channel>
</rss>
