samedi 9 juin 2007

cursus informatique ...

(note "ce texte sera surement recomposé en 2 voir 3 parties, c'est imbuvable tel quel , sans parler de son incomplétude, n'est ce pas kurt ?!")

(status 'draft)

J'ai récemment découvert des cours online du MIT, respectivement "Structure and Interpretation of Computer Programs" (SICP) pour faire court, et "How to design program" (HTDP). Ce sont des cours d'introduction à l'informatique, enfin surtout la programmation.

En les parcourant la première fois j'ai remarqué 2 choses. La première c'est qu'ils utilisent la famille des langages lisp pour écrire leurs exemples, et la 2ème : les thèmes abordés.

Quand certains se limitent à des choses simples (récupérations d'arguments, jeux sur les tableaux, algorithme de tri pour le plus dur) eux vont dans d'autres galaxies. Ils cassent le cliché de récursion != itération, à Jussieu on a vu la récursion en C et forcément avec des exemples de bases du coup récursion = occupation temps et mémoire supérieurs.

(chg "En lisp ils utilisent l'optimisation de récursion terminale:" "Dans ce cours ils expliquent tout de suite ce qu'est l'optimisation de recursion terminale")

f x =
si x = 0 renvoyer 1
sinon f x-1

ici f n'empile aucun appel! on obtient le même nombre de cycle qu'une boucle while. (ces 2 formes sont équivalentes en fait, au détail près que l'un est exprimé comme une répétition d'évaluation, et l'autre comme une fonction qui se rappelle, et les fonctions c'est un formalisme étudiable et étudié :D ce qui est un avantage)

De plus ils montrent comment itérer récursivement en utilisant les paramètres formels comme variable "mutable"; leurs exemples sont souvent calculatoires (calcul de racines carrées, intégrations, calcul de pi [calculs approchés j'entends]). J'ai pas beaucoup de souvenirs des premiers exemples des programmes à Jussieu mais c'était beaucoup moins (chg "utile" "intéressant") . (au mieux les tours de hanoi quoi)

Ensuite ils passent en revue des concepts très contemporains mais vu de manière "plus" fondamentale. L'abstraction des données, chère à nos langages de programmation orientés objets (POO), sont exprimés de manière si simples grace à de bêtes fonctions sur des listes.
Au début ils implantent les constructeurs ( des fonctions bien nommées sur des listes d'informations ), puis les accesseurs pour "désemboiter" les informations encapsulées par le constructeur.

Et même l'encapsulation est montrée avec une facilité déconcertante. Le tout en partant de fonctions pures qui ne font que calculer des valeurs à partir de leurs arguments. Puis en ajoutant l'assignement juste quand il faut (ce qui leur permet d'introduire les mutateurs, ou setter pour coller avec les noms à la mode).

En 3 minutes passe d'une fonction immutable à une fonction dépendante des précédents appels, puis une fonction' englobant d'autres fonctions dont une nommée 'dispatch'.

Je fais une parenthèse.
Cette idée de dispatch est la base, enfin j'y vais fort avec ce mot "base", du 'polymorphisme' en poo, en gros c'est une fonction sur le type ( des paramètres , comme en C , mais aussi de l'instance qui va exécuter la méthode! ) pour choisir la bonne méthode parmi un ensemble.
Ce qui m'a frappé c'est que ca m'était complètement transparent dans ma tête. Je rangeais ca dans la case "magie des langages". Cette année avec le cours de Typage + ce livre je comprends beaucoup mieux Java par exemple.

Je découvre aussi que le choix d'une méthode en Java est d'abord faite en fonction du type de l'instance auquel s'applique l'appel!

exemple:

A a = new A().say("bonjour");

ca revient a appeler, au niveau interpretation par la JVM, une fonction de la forme:

invokeMethod( a, "say" , ( "bonjour" ) )


en fonction du type de a ( qui est une instance de A ) on obtient une liste de ses methodes, dans laquelle on cherche celle qui a la signature apropriée, en l'occurrence une méthode nommée "say" qui prend un argument de type String...

D'ailleurs c'est un algorithme non trivial, il faut tenir compte du sous typage!

say( String s ) peut etre appelée avec un objet SmallString, si SmallString hérite de String ( même idée pour l'implémentation des interfaces ). C'est le mécanisme qui nous permet d'avoir des methodes aux noms similaires sans se soucier du choix de la bonne méthode a l'exécution :)

ps: le mécanisme de recherche de méthodes de Java est "faillible" enfin l'algorithme peut se trouver face a un choix indécidable ^^.

Donc je reviens aux objets primitifs en Lisp, on peut les écrires comme ca :

(define c (make-account 100 ) ) -> défini un symbol qui représente un compte avec un solde de 100.

((c 'depot) 50) -> effectue un dépot de 50
((c 'retrait) 30) -> effectue un retrait de 30

avec un petit effort d'imagination syntaxique, on reconnait l'équivalent de c.depot(50) et c.retrait(30) ...

Lisp se souciant peu des détails syntaxiques en dehors de ses types de base et de la notation fonctionnelle, ce que je trouve très très intéressant dans ce language. Je le trouve dépouillé des fioritures qui bride l'esprit au début.

"La syntaxe n'est rien mais la syntaxe c'est tout en même temps"... pour ma part je penche un petit peu plus du côté "rien".

Dire que pendant 3 ans je m'émerveillais en programmant en Java en n'ayant aucune idée de la réalité des choses.

Bref les bouquins vont bien plus loin, introduisant :
- les intêrets du polymorphisme
- des abstractions métalinguistiques (1)
- l'unification donnée et programme (2)
- les flux reposant sur l'évaluation paresseuse (ou comment n'évaluer que ce dont on a besoin, fondamentalement passionnant comme sujet :) !)
- l'implantation d'évaluateurs de dataflow (5)
- l'implantation d'évaluateurs de contraintes (inspiré par le célèbre sketchpad)
- la compilation vers les machines à registres
... j'en passe et des meilleurs.

Donc je 'rebreffes', pour un cours d'introduction à la programmation, voila du cours trois étoiles au guide michelin de l'informatique.

Et sur un plan plus large même, je les trouve bien plus ( il manque un mot dans mon vocabulaire qui mèle pédagogie, réalisme, simplicité et d'autres qualités appréciables sur le long terme lol ) sur leur façon d'aborder l'informatique.

Bref leur vision/approche me plait car elle est incrémentale, et presque non informatique en fait. Ca décomplexifie l'informatique avec des notions simples mais puissantes et cohérentes.

Ici pas de mystères tout est clair et simple ( on repose sur le concept de fonction et de liste, rien de bien obscur en somme, on rejoint l'avis de C. Queinnec sur la rédaction d'ouvrages pédagogiques, acquérant la confiance du lecteur par la plus simple transparence )

Je trouve que ça forme non pas des utilisateurs avancés de l'informatique mais vraiment des penseurs sur informatique. Pas d'UML, pas de Java, que du good old lisp des familles sur des sujets fondamentaux. Et encore .. lisp pas pour ses beaux yeux, mais plutot son dénuement, et pour exprimer récursion, itération, fonction, donner des concepts universels. Le genre de choses qui survivent les modes.

ps: Tiens mon encadrant de stage veut jeter uml a la poubelle pour utiliser RDF , ca m'a fait rigoler, ils se rendent compte de l'inadéquation d'uml avec la conception de programmes. Uml était un grand pas pour l'industrie ( langage commun de communication, idée de structurer les informations issues des efforts de reflections pour la conception etc etc )

En fait mon objectif serait d'atteindre une sorte d'état de compréhension de l'informatique qui me permettrait de tout appréhender avec souplesse et facilité. Le truc c'est que je me connais, au final ça implique qu'il faudrait que je puisse tout comprendre sans le moindre effort... hem

Ah et tiens, par curiosité je voulais avoir des avis de gens sur ce cours, j'ai déniché un pdf rédigé par des profs ( du mit je crois ), et contrairement à moi, ils sont très critique envers ce cours.
Ils le trouvent un peu précipité et manquant de pédagogie même s'ils reconnaissent les qualités de ce même cours.

je cite :
***
The publication of Abelson and Sussman’s Structure and Interpretation of Com-
puter Programs (sicp) (Abelson et al., 1985) revolutionized the landscape of the
introductory computing curriculum in the 1980s. Most importantly, the book lib-
erated the introductory course from the tyranny of syntax. Instead of arranging a
course around the syntax of a currently fashionable programming language, sicp
focused the first course on the study of important ideas in computing: functional ab-
straction, data abstraction, streams, data-directed programming, implementation
of message-passing objects, interpreters, compilers, and register machines.
***
(source "www.cs.brown.edu/~sk/Publications/Papers/Published/fffk-htdp-vs-sicp-journal/paper.pdf ")

Par exemple, bien des exercices sont des exercices nécessitant de modifier/aggrémenter un programme montré précédemment (technique pédagogique vieille comme le monde)
Ils préconisent une approche feuille blanche, qui permet de développer une vraie compréhension interne du problème. (3)

Bref, pour eux SICP n'apprends pas à trouver par soi meme comment créer les fonctions nécessaires à la résolution d'un problème. C'est clairement un manque, mais alors entre nous, ce ne sont surement pas les seuls à l'avoir. en 7 ans de fac, combien de fois les profs m'ont sorti des "comment j'ai fait ? bah j'intuites." (je trouve toujours ça aussi énorme). Bref ce problème est à résoudre par tous les enseignants du monde, comment enseigner la résolution des problèmes en général. (4)

Pour finir ils ajoutent que les exemples donnés sont issus de domaines complexes (ils implantent un simulateur de circuit etc etc). 1 point pour eux,c'est clairement vrai.. là ça touche à mon subjectif, certaines personnes fuieront rien qu'a la lecture de la table des matières, moi j'avais pas fini de la lire que j'avais déjà la bave aux lèvres.
Pour faire un peu plus argumenté sur ce sujet, je trouve qu'on nous rend utilisateurs de l'informatique à un certain niveau. On sait utiliser certains langages, faire une application dans un paradigme etc etc mais .. j'ai vraiment l'impression de n'être qu'un programmeur java. C'est assez frustrant.. surtout quand on voit les choses faites dans les 50's avec si peu de "moyens".. je me dis qu'on a raté un truc. Bref ce livre montre en partie l'étendue du possible en informatique , tout en expliquant comment elle marche. Je trouve que c'est la bonne direction d'un enseignement supérieur, on doit penser et implanter via l'informatique .. hors j'ai pas l'impression que ça soit le cas de la majorité des étudiants qui sortent avec un Master. Moi meme,j'ai un objectif plus idéalisé, mais je suis loin de savoir expliquer les principes d'une machine virtuelle ou d'un compilateur.

(1 qui tombent dans l'industrie aujourdhui avec les Domain Specific Language chères à Microsoft et à l'OMG )
(2 programme = donnée => on peut les créer, les analyser, les modifier, les adapter grace à un autre programme )
(3 j'adhère tellement à ce principe, merci monsieur gastineau, j'aurais du suivre cette façon de faire tout le temps lol. en fait selon moi l'informatique devrait s'enseigner avec une feuille et un crayon. et des ordinateurs pour tester un peu quand le besoin d'environnements est trop grand)
(4 ca me rappelle la conférence de mr pitrat sur l'IA, il a passé la moitié du temps a nous montrer certaines faille de l'éducation, ou comment on nous faisait croire que certains problemes se solutionnait de telle maniere , solution qui était fausse en général. Bref il posait le problème de comment apprendre à apprendre formellement, c'est normal c'est le problème de l'IA. D'ailleurs il avait un tas d'anecdotes sur les apprentissages de certaines machine.. skynet sors de ce corps :D)
(5 j'ai récemment découvert [vers aout deux mille huit] que les architecture de dataflow ont été copieusement étudiées, jusqu'a la création d'architectures de dataflow différentes de l'archi de von neumann ! je savais bien que ca avait du bon ... sauf que ca à d'autres gros défauts. j'vous laisse wikipédier si vous voulez en savoir plus)