Et si les ordinateurs pouvaient se programmer sans nous ?
À la fin du dernier cours de Gérard Berry au Collège de France, un auditeur, visiblement universitaire chevronné, a mentionné l’idée, de plus en plus répandue, que bientôt les ordinateurs sauraient se programmer eux-mêmes, et que donc les humains n’auraient plus à s’en occuper.
Cette question me laisse pantois : pour créer un programme informatique il faut une intention de programme, et le plus difficile est souvent de formuler cette intention. Alors de deux choses l’une :
– soit les ordinateurs seront bientôt capables d’intentionnalité (un concept qui a fait pâlir bien des philosophes, d’Aristote à Husserl), alors ils auront des idées de programmes et seront en mesure de les réaliser ; mais encore seront-ils aussi bientôt capables d’examiner leur environnement, d’y observer la présence d’entités parasites qui consomment énormément de ressources, nommément les humains, et, logiquement, de les éliminer ; est-ce souhaitable ?
– soit les ordinateurs restent dépourvus d’intentionnalité, ce qui semble probable, et il faudra que des humains (ou toutes autres entités pourvues d’intentionnalité, certains animaux nous en donnent la preuve) leur communiquent des intentions de programmes ; cet acte de communication d’intention de programme s’appelle la programmation des ordinateurs, qu’il faudra donc continuer à enseigner, à un public le plus large possible, nous dit le professeur Berry, parce que malgré des décennies d’efforts et des investissements colossaux on n’a jamais réussi à rendre cette activité « intuitive », « naturelle », « facile », etc.
Il semble bien que la difficulté intrinsèque de la programmation des ordinateurs tienne à la différence de nature entre d’une part le cerveau humain et les langages qu’il utilise, d’autre part l’ordinateur et les langages que l’on emploie pour le programmer. Cette différence avait déjà été décrite par John von Neumann dans le texte posthume L’ordinateur et le cerveau.
Revenons donc à la question (inévitable) de l’apprentissage de la programmation, déjà évoquée ici.
Apprendre à programmer, donc
Depuis quelques années je donne au Cnam un cours d’initiation à la programmation et à l’algorithmique destinés à des biologistes. Les effectifs étudiants varient selon l’humeur des enseignants de biologie, qui accordent ou non une place dans leur cursus à ces unités d’enseignements. Ces dernières années ils ont décidé que la place qu’ils ambitionnaient pour leurs étudiants était sur les listes de Pôle emploi, alors nous ne sommes pas inscrits dans leur cursus. Il faut en effet savoir que les offres d’emploi pour diplômés en biologie dépourvus de toute compétence informatique sont en voie de disparition, sinon déjà disparues.
Le langage que j’utilise pour cet enseignement est Scheme, choix pour lequel j’ai déjà exposé ici quelques arguments. J’ai récemment appris que l’équipe de bioinformatique souhaitait que l’on change de langage, pour utiliser plutôt Python. J’ai cru à un nouvel épisode de la controverse des langages de programmation, inépuisable depuis près de 60 ans. Bon, pourquoi pas, comme me le rappelait récemment un collègue, il convient d’être agnostique en matière de langages de programmation. N’empêche que certains sont plus propices à l’enseignement que d’autres.
Les langages de script
Python appartient avec Perl, Ruby et bien d’autres à la famille des langages de script, qui dans l’arbre évolutif des langages descendent des shells, dont ils procurent les qualités, étendues à certains perfectionnements. Ces langages ont été créés à l’origine par et pour des ingénieurs système, pour effectuer leurs tâches répétitives d’administration des infrastructures. Ces travaux demandent le lancement et la supervision de nombreux programmes, avec une adaptation souple aux circonstances contingentes, sans que le script de supervision doive lui-même effectuer de calculs lourds. Les langages de script incorporent un langage embarqué, celui des expressions régulières, très pratiques pour justement adapter le lancement des programmes à l’air du temps et à la météo informatique.
Puisque les langages de script ne servent pas eux-mêmes à effectuer des calculs lourds, ils n’ont pas besoin d’être compilés [1], ils sont seulement interprétés [2] : un programme interprété est en général cent fois plus lent que le même programme compilé, mais étant donné l’usage auquel ils sont destinés, les langages de script peuvent très bien supporter cette lenteur.
Les langages de script ont été conçus essentiellement pour lancer d’autres programmes, en leur passant des arguments, éventuellement selon des règles compliquées : pour cette mission, ils n’ont besoin fondamentalement que d’un seul type de données, les chaînes de caractères, auxquelles ils peuvent administrer des traitements compliqués grâce à leurs capacités pour manipuler les expressions régulières. Du coup ils ont été conçus au départ sans véritable système de typage, et il a fallu leur en rajouter un par la suite, qui du coup s’insère assez mal dans la logique d’ensemble du langage.
La notion de typage des langages de programmation emprunte aux concepts des structures algébriques des mathématiques et des équations aux dimensions de la physique. Le typage facilite grandement le travail du programmeur, en lui permettant de détecter de nombreuses erreurs de programmation avant même d’avoir tenté d’exécuter le programme. C’est donc, aussi, un outil pédagogique précieux.
Compiler un programme, c’est attribuer une signification à son texte, en l’occurrence une traduction en langage machine. Quand on enseigne la programmation, on s’efforce d’amener les étudiants à raisonner sur des textes de programmes ; pour raisonner sur un texte il est souhaitable que ce texte ait une signification, si possible univoque et bien définie. Si les textes d’un langage ne peuvent pas être compilés, c’est qu’il est impossible de construire un compilateur qui leur attribue une signification, et s’il en est ainsi il sera probablement difficile à un étudiant de leur attribuer une signification. Il devrait être clair que, d’un point de vue pédagogique, c’est un inconvénient sérieux. Les langages de script ne sont pas les seuls à présenter cet inconvénient : ainsi, le langage C est compilable, mais les documents normatifs qui le décrivent admettent de nombreuses expressions dont la signification est indéfinie. De ce point de vue, Ada est par contre un excellent langage, et ce n’est pas tout à fait par hasard qu’après une longue éclipse on recommence à en entendre parler.
Mais de toute façon, la question n’était pas là.
Quel est le minimum à savoir ?
Aujourd’hui tout le monde utilise quotidiennement un ordinateur, ne serait-ce que sous la forme d’un téléphone, et sans pour autant savoir programmer, activité réservée à une minorité de la population.
Néanmoins, il est très souhaitable que tout le monde acquière une compréhension minimum de ce qu’il fait lorsqu’il utilise un ordinateur, afin de ne pas être un jour victime de son ignorance et de rester désarmé devant un problème informatique. C’est pourquoi nous sommes de plus en plus nombreux à plaider pour l’enseignement de l’informatique à l’école, et d’ailleurs il semble que nous ayons été entendus par le Ministre. L’enseignement de l’informatique doit bien sûr donner une place importante à la programmation. Ainsi, si l’étudiant se trouve un jour en situation de devoir programmer, par exemple après un changement professionnel, il ne sera pas démuni, il aura déjà acquis les bases.
De quoi est faite la vie quotidienne d’un bioinformaticien en entreprise ? Il écrit rarement des programmes fondamentalement nouveaux, parce que la communauté scientifique met à sa disposition toute une bibliothèque de programmes qu’il suffit souvent d’enchaîner les uns après les autres en faisant pour ainsi dire percoler les données à travers un pipeline de logiciels spécialisés. Les langages de script ont justement été conçus pour effectuer ce type de travail. De plus, il existe une bibliothèque Biopython toute faite pour faciliter la mise en œuvre, qui comporte une grande quantité de fonctions utiles, pratiquement tout ce qu’il faut.
L’idée de l’équipe bioinformatique, c’est qu’il faut que les étudiants sachent utiliser Biopython, pour cela qu’ils apprennent les bases de Python, et c’est un objectif raisonnable. Est-ce un objectif suffisant ? Sans doute pas. Il faut aussi qu’ils apprennent vraiment la programmation, sinon ils risquent d’être désarçonnés au prochain changement de technologie : ainsi il y a une vingtaine d’années on ne jurait que par Perl et BioPerl, aujourd’hui démodés. Si l’on a vraiment appris à programmer, passer à un nouveau langage n’est pas trop difficile, mais encore faut-il vraiment avoir appris, et pour ce faire les langages de script présentent les inconvénients énoncés ci-dessus. De surcroît, au fur et à mesure que leur étaient ajoutés les dispositifs absents de leurs définitions initiales, ils sont devenus complexes et d’apprentissage difficile.
Quel enseignement pour devenir programmeur ?
Plusieurs messages me sont parvenus pour discuter ce point. J’emploie ici le terme programmeur, généralement dévalué et remplacé par « développeur », qui fait plus chic, mais moins exact. Edgser Dijkstra, grand nom de la science informatique s’il en fut, se définissait comme programmeur.
Bref, pour être un programmeur autonome et capable de faire face aux difficultés du métier, il faut compter une dizaine d’années, en alternant les études et la pratique. Ce qui ne veut pas dire que l’on ne sera capable d’accomplir aucun travail utile avant dix ans, mais au début on aura besoin de l’aide de collègues plus expérimentés, et il y aura des choses plus difficiles dont on ne sera pas capable.
Pour programmer de façon professionnelle, apprendre la programmation ne suffit pas, il faut apprendre l’informatique en général, qui comporte aussi l’architecture des ordinateurs, le système d’exploitation, les réseaux, les bases de données, l’algorithmique, la théorie des automates et des langages. Si je réfléchis à mon expérience personnelle, j’ai commencé à écrire des programmes après quelques mois d’apprentissage, mais je ne comprenais pas très bien tout ce que je faisais, pour certaines choses il m’a fallu des années, et il m’en manque encore sûrement.