Le meilleur cours d’informatique
19 avril 2007
Depuis 1981 le cours d’Abelson et Sussman introduit l’informatique au MIT. Il a fait l’objet d’un livre, Structure and Interpretation of Computer Programs. C'est un chef d’œuvre de pédagogie, et pourtant il est difficile à assimiler : en le lisant, on comprend le texte ligne à ligne mais pour comprendre vraiment ou, comme on dit, pour réaliser ce que les auteurs ont voulu communiquer il reste du chemin à parcourir.
L’obstacle ne réside pas dans les langages utilisés – l’anglais d’Abelson et Sussman est limpide, leur style est élégant et la syntaxe du dialecte de LISP qu’ils utilisent pour programmer (Scheme) est l’une des plus simples qui soient[1]. Mais ils abordent frontalement les questions philosophiques nouvelles, et peut-on dire renversantes, que pose l’informatique.
L'informatique s’écarte en effet de la tradition grecque, qui est celle des mathématiques, car elle accorde la priorité à l’action (« how to ») sur la contemplation de l’être (« what is »). Elle s’appuie sur une pratique de l’abstraction, alors que notre culture nous incite à opposer l'abstraction et la pratique. En logique elle introduit la dimension de la performance[2] et la prise en compte du temps (états locaux, concurrence etc.) la complique terriblement, ce qui indique combien nos raisonnements habituels sont maladroits lorsqu'il faut penser un changement ou une évolution.
* *
En consultant la page consacrée à Scheme sur Wikipédia j’ai découvert des ressources qui permettent de mieux comprendre ce cours et dont l’ensemble forme, à ma connaissance, la meilleure introduction qui soit à la programmation informatique :
- on peut assister à l’intégrale en vidéo du cours d’Abelson et Sussman en 1986, y compris les questions des étudiants. Abelson est un pédagogue exceptionnel, Sussman s’intéresse surtout aux questions théoriques. Il est préférable de télécharger les séances l’une après l’autre (de l’ordre de 500 Mo par séance).
- les notes de cours (« lecture notes ») sont la transcription du cours dans sa version de 2004, parfois plus claire que le cours de 1986.
On peut télécharger d’un coup toute la documentation du cours, y compris le livre.
La bonne méthode me semble être de commencer par le livre, en faisant au moins une partie des exercices qu’il propose, puis d’écouter les cours en vidéo et de lire enfin les notes de cours. Mais vous pourrez préférer d'autres itinéraires.
* *
C’est intéressant, stimulant, et plus profond que le discours sur le « numérique » que ressassent des philosophes, des sociologues, des historiens qui n’ont jamais tenté de comprendre l’informatique : comme ils n'y voient qu'une modeste technique, elle ne leur semble pas mériter un effort approfondi et du haut de leur spécialité ils pensent pouvoir la juger et en parler de façon pertinente.
Qu’ils s’y mettent ! Il n’est pas plus difficile d'apprendre l'informatique que d’apprendre le grec et cela leur permettra de faire un bond intellectuel d’une ampleur comparable à celui qu'ils ont fait lorsqu’ils ont compris la démarche expérimentale, s'ils l'ont comprise.
Cela fera aussi le plus grand bien aux praticiens de l’informatique, parfois peu conscients de la portée des outils qu’ils manipulent quotidiennement (cf. ce que dit Stroustrup sur la qualité des programmes).
[1] Peu d'informaticiens sont assez sages pour éviter l'intégrisme lorsqu'il s'agit de langage de programmation : chacun ne veut connaître que celui auquel il s'est formé et couvre d'imprécations les autres chapelles. Loin de moi l'intention de dénigrer un langage quelconque, mais le fait est que mes idées se mettent en forme plus facilement, et de façon plus lisible, en Scheme qu'en C. La structure de liste, qui associe à chaque variable un pointeur vers la variable suivante, rend les langages de la famille LISP aussi souples que solides et il est facile de s'habituer aux fameuses parenthèses.
[2] (A et B) et (B et A) sont équivalentes en logique, mais non du point de vue de la performance informatique car A et B sont évalués dans l’ordre indiqué. Si par exemple A = (X est un nombre premier) et B = (X < 1000), évaluer (A et B) sur un nombre supérieur à 1000 suppose de vérifier si ce nombre est premier, ce qui demandera beaucoup de temps s'il est grand, alors que cette vérification n'aura pas lieu lorsque l'on évalue (B et A).
Pour lire un peu plus :
-
Structure and Interpretation of Computer Programs
- La qualité des programmes
informatiques
-
Vidéo
du cours d’Abelson et Sussman
-
Notes du cours
-
Télécharger
la documentation du cours
http://www.volle.com/travaux/abelsonsussman.htm
© Michel VOLLE, 2007
GNU
Free Documentation License