jeudi 13 novembre 2008

De l'intention pédagogique...

Je reproduis ci-dessous l'introduction d'un Tutoriel sur le langage de programmation Python.


Si j'étais capable d'exprimer avec autant de clarté mes intentions pédagogiques à chaque activité que je conçois, j'en serais heureux...

"A l'origine, les présentes notes ont été rédigées à l'intention des élèves qui suivent le cours Programmation et langages de l'option Sciences & informatique au 3e degré de transition de l'enseignement secondaire belge. Il s'agit d'un texte expérimental qui s'inspire largement de plusieurs autres documents publiés sous licence libre sur l'internet.

Nous proposons dans ces notes une démarche d'apprentissage non linéaire qui est très certainement critiquable. Nous sommes conscients qu'elle apparaîtra un peu chaotique aux yeux de certains puristes, mais nous l'avons voulue ainsi parce que nous sommes convaincus qu'il existe de nombreuses manières d'apprendre (pas seulement la programmation, d'ailleurs), et qu'il faut accepter d'emblée ce fait établi que des individus différents n'assimilent pas les mêmes concepts dans le même ordre. Nous avons donc cherché avant tout à susciter l'intérêt et à ouvrir un maximum de portes, en nous efforçant tout de même de respecter les principes directeurs suivants :

  • L'apprentissage que nous visons doit être adapté au niveau de compréhension et aux connaissances générales d'un élève moyen. Nous nous refusons d'élaborer un cours qui soit réservé à une « élite » de petits génies. Dans la même optique, notre ambition reste généraliste : nous voulons mettre en évidence les invariants de la programmation et de l'informatique, sans poursuivre une spécialisation quelconque.
  • Les outils utilisés au cours de l'apprentissage doivent être modernes et performants, mais il faut aussi que l'élève puisse se les procurer en toute légalité pour son usage personnel. Toute notre démarche d'apprentissage repose en effet sur l'idée que l'élève devra très tôt mettre en chantier des réalisations personnelles qu'il pourra développer et exploiter à sa guise.
  • L'élève qui apprend doit pouvoir rapidement réaliser de petites applications graphiques.
    Les étudiants auxquels nous nous adressons sont en effet fort jeunes (en théorie, ils sont à peine arrivés à l'âge ou l'on commence à pouvoir faire des abstractions). Dans ce cours, nous avons pris le parti d'aborder très tôt la programmation d'une interface graphique, avant même d'avoir présenté l'ensemble des structures de données disponibles, parce que nous observons que les jeunes qui arrivent aujourd'hui dans nos classes « baignent » déjà dans une culture informatique à base de fenêtres et autres objets graphiques interactifs. S'ils choisissent d'apprendre la programmation, ils sont forcément impatients de créer par eux-mêmes des applications (peut-être très simples) où l'aspect graphique est déjà bien présent. Nous avons donc choisi cette approche un peu inhabituelle afin de permettre à nos élèves de se lancer très tôt dans de petits projets personnels attrayants, par lesquels ils puissent se sentir valorisés. Nous leur imposerons cependant de réaliser leurs projets sans faire appel à l'un ou l'autre de ces environnements de programmation sophistiqués qui écrivent automatiquement de nombreuses lignes de code, parce que nous ne voulons pas non plus masquer la complexité sous-jacente.
Certains nous reprocheront que notre démarche n'est pas suffisamment centrée sur l'algorithmique pure et dure. Nous pensons qu'une telle approche n'est guère adaptée aux jeunes, pour les raisons déjà évoquées ci-dessus. Nous pensons également qu'elle est moins primordiale que par le passé. Il semble en effet que l'apprentissage de la programmation moderne par objets nécessite plutôt une mise en contact aussi précoce que possible de l'étudiant avec des objets et des bibliothèques de classes préexistants. Ainsi il apprend très tôt à raisonner en termes d'interactions entre objets, plutôt qu'en termes de procédures, et cela l'autorise assez vite à tirer profit de concepts avancés, tels que l'héritage et le polymorphisme.

Nous avons par ailleurs accordé une place assez importante à la manipulation de différents types de structures de données, car nous estimons que c'est la réflexion sur les données qui doit rester la colonne vertébrale de tout développement logiciel.

Nous souhaitons avec ces notes ouvrir un maximum de portes. A notre niveau d'études, il nous paraît important de montrer que la programmation d'un ordinateur est un vaste univers de concepts et de méthodes, dans lequel chacun peut trouver son domaine de prédilection. Nous ne pensons pas que tous nos étudiants doivent apprendre exactement les mêmes choses. Nous voudrions plutôt qu'ils arrivent à développer chacun des compétences quelque peu différentes, qui leur permettent de se valoriser à leurs propres yeux ainsi qu'à ceux de leurs condisciples, et également d'apporter leur contribution spécifique lorsqu'on leur proposera de collaborer à des travaux d'envergure.

De toute manière, notre préoccupation primordiale doit être d'arriver à susciter l'intérêt, ce qui est loin d'être acquis d'avance pour un sujet aussi ardu que la programmation d'un ordinateur. Nous ne voulons pas feindre de croire que nos jeunes élèves vont se passionner d'emblée pour la construction de beaux algorithmes. Nous sommes plutôt convaincus qu'un certain intérêt ne pourra durablement s'installer qu'à partir du moment où ils commenceront à réaliser qu'ils sont devenus capables de développer un projet personnel original, dans une certaine autonomie.

Ce sont ces considérations qui nous ont amenés à développer une structure de cours que certains trouveront peut-être un peu chaotique. Le principal fil conducteur en est l'excellent « How to think like a computer scientist », mais nous l'avons un peu éclaté pour y insérer toute une série d'éléments concernant la gestion des entrées/sorties, et en particulier l'interface graphique Tkinter. Nous souhaiterions en effet que les élèves puissent déjà réaliser l'une ou l'autre petite application graphique dès la fin de leur première année d'études.

Très concrètement, cela signifie que nous pensons pouvoir explorer les huit premiers chapitres de ces notes durant la première année de cours. Cela suppose que l'on aborde d'abord toute une série de concepts importants (types de données, variables, instructions de contrôle du flux, fonctions et boucles) d'une manière assez rapide, sans trop se préoccuper de ce que chaque concept soit parfaitement compris avant de passer au suivant, en essayant plutôt d'inculquer le goût de la recherche personnelle et de l'expérimentation. Il sera souvent plus efficace de réexpliquer les notions et les mécanismes essentiels en situation, dans des contextes variés.

Dans notre esprit, c'est surtout en seconde année que l'on cherchera à structurer les connaissances acquises, en les approfondissant. Les algorithmes seront davantage décortiqués et commentés. Les projets, cahiers des charges et méthodes d'analyse seront discutés en concertation. On exigera la tenue régulière d'un cahier de notes et la rédaction de rapports techniques pour certains travaux.

L'objectif ultime sera pour chaque élève de réaliser un projet de programmation original d'une certaine importance. On s'efforcera donc de boucler l'étude théorique des concepts essentiels suffisamment tôt dans l'année scolaire, afin que chacun puisse disposer du temps nécessaire.

Il faut bien comprendre que les nombreuses informations fournies dans ces notes concernant une série de domaines particuliers (gestion des interfaces graphiques, des communications, des bases de données, etc.) sont matières facultatives. Ce sont seulement une série de suggestions et de repères que nous avons inclus pour aider les étudiants à choisir et à commencer leur projet personnel de fin d'études. Nous ne cherchons en aucune manière à former des spécialistes d'un certain langage ou d'un certain domaine technique : nous voulons simplement donner un petit aperçu des immenses possibilités qui s'offrent à celui qui se donne la peine d'acquérir une compétence de programmeur."