Les dangers des écoles Java

From The Joel on Software Translation Project

Jump to: navigation, search
Article original: The Perils of JavaSchools
Date de publication: 29 Décembre 2005
Traducteur: Pierre-Henri Trivier
Vérifié par: Non-communiqué
Navigation: Retour à Main Page Retour à French FrenchFlag.png




Jeunes fainéants.

Qu'est devenu le goût du travail ?

Je deviens vieux. Un signe évident de ma décrépitude est le temps que je passe à me plaindre et à maugréer contre "les jeunes de maintenant", et à quels point ils ne veulent ou ne peuvent plus rien faire d'un tant soit peu difficile.

“Vous aviez de la chance. Nous avons vécu pendant trois

mois dans un sac en plastique marron au milieu d'une fosse septique. Il fallait qu'on se lève à six heures du matin, qu'on nettoie le sac, qu'on petit-déjeune avec des miettes de pain rassi, avant d'aller travailler au moulin, quatorze heures par jour, chaque jour que Dieu faisait, et quand nous rentrions papa nous bordait à coups de ceinture.” — Monty Python's Flying

Circus, Four Yorkshiremen

Moi, quand j'étais môme, j'ai appris à programmer sur des cartes perforées. Quand on se trompait, on n'avait pas tous ces moyens modernes, comme une touche "del" pour corriger une erreur. On jetait la carte et on recommençait.

Quand j'ai commencé à faire passer des entretiens d'embauche à des programmeurs, en 1991, je leur laissais en général le choix du langage pour résoudre les problèmes que je leur donnais. 99 fois sur cent, ils choisissaient le C.

Aujourd'hui, ils ont tendance à choisir le Java.

Ne vous méprenez pas : il n'y a rien de mal à utiliser le Java comme langage de programmation.

Un instant, ce n'est pas tout à fait ce que je veux dire. Je ne vais pas à démontrer dans cet article en particulier, qu'il y ait quoi que ce soit de mal à utiliser Java comme langage de programmation. Il a sûrement beaucoup de mal à en dire, mais ce sera pour un autre article.

Ce que je veux dire c'est que Java n'est pas, d'un manière générale, un langage assez difficile à utiliser pour séparer les très bons développeurs des médiocres. C'est probablement très agréable de travailler avec ce langage, mais ce n'est pas le sujet de cet article. J'irais même plus loin : le fait que Java ne soit pas trop dur à utiliser est une de ses caractéristiques, et non un défaut. Mais c'est un fait.

Sans vouloir être pédant, mon humble expérience à l'Université m'a montré que l'on y enseigne traditionnellement deux choses, dans les départements d'informatique, que beaucoup de personnes ne comprennent jamais vraiment : les pointeurs, et la récursivité.

De mon temps, on commençait son cursus par un cours sur les structures de données, avec listes chaînées, tables de hachage et autres, en usant et abusant des pointeurs. Ces cours servaient souvent de filtres : ils étaient tellement durs que ceux qui n'avaient pas les capacités pour suivre une formation d'informatique s'arrétaient là -- ce qui était une bonne chose, car si les pointeurs leur paraissaient compliqués, imaginez le moment où ils auraient attaqués la théorie du point fixe.

Tous les petits jeunes qui s'étaient éclatés au lycée à écrire des Pong en BASIC sur leur Apple II rentraient à l'Université, s'inscrivaient à un cours d'introduction à l'informatique, avec structures de données à volonté, et au moment des pointeurs, leurs cervelles se mettaient littéralement à fumer, et en un éclair on les retrouvait en fac de Droit, parce que les Sciences Humaines leur semblaient soudainement une meilleure idée. J'ai lu toutes sortes de statistiques sur les taux d'abandon dans les facultés d'Informatique, et ils oscillent entre 40 et 70%. Les universités trouvent que c'est du gâchis ; je pense qu'il s'agit simplement de se débarrasser de ceux qui n'étaient pas fait pour être programmeurs.

L'autre cours difficile pour beaucoup de jeunes étudiants en informatique est celui où on enseignait la programmation fonctionnelle, et donc la récursivité. Le MIT a placé la barre très haut pour ce genre de sujets, en imposant un cours (6.001) et un ouvrage ( Structure et Interprétation des Programmes Informatiques, d'Abelson & Sussman), qui ont servis de d'introduction à l'Informatique dans des dizaines (voire des centaines) des meilleures Universités et Ecoles. (Vous pouvez, et d'ailleurs vous devriez, jeter un oeil à une version video de ce cours disponible en ligne.)

Ce cours est incroyablement difficile. En une heure vous avez appris l'essentiel de Scheme, et on vous a déjà asséné une fonction de calcul de point fixe qui prends une autre fonction en paramètre. Alors que je me débattais dans un cours du même genre, CSE121 à Penn, je voyais bien que beaucoup d'étudiants, pour ne pas dire tous, étaient tout simplement largués. Le contenu du cours était trop difficile. Je me suis longuement plaint par mel au professeur, en disant que c'était "vraiment trop injuste". Quelqu'un a du m'écouter (moi ou un autre geignard), car maintenant le cours se fait en Java.

Malheureusement, ils m'ont écoutés.

Tout le problème est là. Des années de pleurnicheries de quelques étudiants paresseux, ajoutées aux plaintes de l'industrie sur le faible nombre de diplômés en informatique, l'ont finalement emporté, et ces dix dernières années, une grand nombre d'institutions, par ailleurs irréprochables, sont intégralement passées à Java. C'est cool, les recruteurs qui utilisent grep pour évaluer un CV adorent, et, surtout, il n'y a rien de suffisamment difficile dans Java qui disqualifie les gens privés de la partie du cerveau qui s'occupe des pointeurs et de la récursion ; du coup le nombre d'abandons est plus faible, les départements d'Informatique ont plus d'étudiants et de plus gros budgets, et tout va pour le mieux.

Les petits chanceux de la Javaternelle ne vont donc jamais se prendre d'étranges segfaults en essayant d'implémenter une table de hachage à base de pointeurs. Ils ne vont jamais devenir mabouls en tentant de ranger des données par paquets de bits. Ils ne vont jamais s'arracher les cheveux pour comprendre comment, dans un programme purement fonctionnel, la valeur d'une variable n'arrête pas de changer alors qu'elle ne change jamais ! Paradoxal !

Il n'ont plus besoin de cette partie du cerveau pour avoir d'excellentes notes.

Est-ce que je suis juste un de ces vieux schnoks dépassés, comme les Four Yorkshiremen, pour rabâcher à quel point c'était difficile de survivre à ça ?

Mince, en 1900, le Latin et le Grec étaient des sujets obligatoires à l'Université, non pas parce que cela servait à quoi que ce soit, mais parce qu'il semblait complètement évident que les gens instruits devaient en faire. En quelque sorte, mon argument est le même que celui des défenseurs du Latin (je veux dire, les quatre qui restent). Scott Baker le dit ainsi : "Le Latin forme l'esprit. Il exerce la mémoire. Décortiquer une phrase latine est un excellent exercice de pensée, un vrai puzzle intellectuel, et une bonne introduction au raisonnement logique." Pourtant, je n'arrive pas à trouver une seule Université qui exige encore de ses élèves qu'ils étudient le Latin. Est-ce que les pointeurs et la récursion sont le Latin et le Grec de l'Informatique ?

Maintenant, j'admets que l'utilisation des pointeurs n'est pas indispensable dans 90% du code écrit de nos jours ; et c'est même carrément dangereux dans du code en production. Ok. C'est entendu. Et la programmation fonctionnelle est à peine utilisée en pratique. Nous sommes d'accord.

C'est pourtant indispensable, sur les projets les plus intéressants. Sans les pointeurs, par exemple, vous ne pourrez jamais travailler sur le noyau Linux. On ne peut pas comprendre une seule ligne du code de Linux, ou de n'importe quel système d'exploitation, à vrai dire, sans maîtriser les pointeurs.

Et sans connaître la programmation fonctionnelle, vous ne pouvez pas inventer MapReduce, l'algorithme qui rends Google si massivement scalable. Les termes 'map' et 'reduce' viennent directement de Lisp et de la programmation fonctionnelle. A posteriori, MapReduce est parfaitement évident pour quiconque a retenu de ses premières heures de cours qu'un programme purement fonctionnel n'a pas d'effets de bord, et donc qu'il se parallélise les doigts dans le nez. Le fait que c'est Google qui ai inventé MapReduce, et pas Microsoft, explique un peu le fait que la firme de Redmond en soit toujours à essayer de faire marcher son moteur de recherche, alors que Google pense déjà à son prochain problème : construire Skynet^H^H^H^H^H^H, le plus gigantesque supercalculateur massivement parallèle au monde. Je ne suis pas sûr que Microsoft se rende bien compte à quel point ils sont en retard dans cette course.

Et au-delà de leur intérêt immédiat, le réel avantage des pointeurs et de la récursion, c'est que la tournure d'esprit, et les capacités intellectuelles nécessaires pour survivre aux cours où on vous les enseignent, sont celles indispensables pour concevoir de larges systèmes. Pour comprendre les pointeurs et la récursion, il faut une certaine capacité de raisonnement, d'abstraction, et surtout, la capacité à voir un problème à plusieurs niveaux de détails simultanément. D'où le lien entre la capacité à les comprendre et la capacité à être un bon programmeur.


Rien, dans un cursus 100% Java, ne va vraiment éliminer les étudiants qui n'ont pas les capacités mentales pour saisir ces concepts. J'ai vu que certaines Javaternelles commençaient à remarquer qu'un petit nombre de diplômés n'étaient pas assez futés pour travailler sur quoi que ce soit d'un tant soit peu plus sophistiqué qu'un énième logiciel de comptabilité en Java, alors qu'ils avaient parfaitement suivi leur formation, version allégée. Ces étudiants là n'auraient sûrement pas survécu à 6.001 au MIT, ou a CS323 à Yale ; et franchement, c'est une des raisons pour lesquelles, en tant qu'employeur, un diplôme d'informatique de Yale ou du MIT pèse plus qu'un diplôme de Duke, qui vient de passer à Java à 100%, ou de l'Université de Pennsylvanie, qui a remplacé Scheme et ML par Java, dans ce fameux cours qui nous avait pratiquement tués moi et mes amis, CSE121. Ca ne veut pas dire que je refuse d'engager des gens de Duke ou de Penn -- je le fais -- c'est juste que c'est plus compliqué pour moi de déterminer qui ils sont. Avant, je pouvais reconnaître les petits malins parce qu'ils défrichaient un algorithme récursif en quelques secondes, ou qu'ils pouvaient implémenter les fonctions de manipulations de liste chaînées avec des pointeurs en moins de temps qu'il n'en faut pour les écrire au tableau. Avec les diplômés de la Javaternelle, je ne peux pas dire si ils bloquent sur ce genre de problème simplement parce qu'on ne leur a jamais rien appris, ou parce qu'ils leur manque la partie du cerveau qui fera d'eux des grands programmeurs. Paul Graham les appellent des Blub Programmers.

C'est déjà assez pénible de voir que les Javaternelles n'éliminent plus les élèves qui ne seront jamais de grands programmeurs, mais les universités peuvent toujours dire que ce n'est pas leur problème. Le marché de l'emploi, ou en tout cas les recruteurs-qui-utilisent-grep, poussent pour que le Java soit enseigné en Fac.

Mais les Javaternelles n'arrivent pas non plus à former des jeunes cerveaux suffisamment agiles, flexibles et ouverts d'esprit pour être de bon designers (et je ne parle pas de "design" 00, où on passe des heures à réécrire son code pour secouer sa hiérarchie d'objet, ou à se poser de fausses questions genre 'est-un' ou 'a-un'). Il faut de l'entraînement pour arriver à penser à plusieurs niveaux d'abstraction à la fois, et c'est ce genre de pensée qui est nécessaire pour concevoir de bonnes architectures de logiciel.

Vous vous demanderez peut-être si l'apprentissage de la programmation orientée objet (POO) peut remplacer les pointeurs et la récursion comme filtre. En un mot : non. Sans vouloir discuter des mérites de la POO, elle ne suffit pas pour éliminer les programmeurs médiocres. La POO, au niveau universitaire, consiste essentiellement à retenir un paquet de vocables tels que "encapsulation" et "héritage", et remplir des questionnaires à choix multiples sur la différence entre le polymorphisme et la surcharge. Pas beaucoup plus difficile que de se rappeler des dates des batailles et des noms des rois dans un cours d'histoire. La POO ne pose pas assez de problèmes intellectuels pour effrayer les étudiants de première année. Quand vous vous battez contre un problème de POO, votre programme marche quand même, il est juste un peu compliqué à maintenir. Enfin en principe. Quand vous vous battez contre des pointeurs, votre programme assène la ligne Segmentation Fault, et vous n'avez pas la moindre idée de ce qui se passe, alors vous vous arrêtez, vous respirez un grand coup, et vous forcez votre cervelle à examiner la situation à plusieurs niveaux d'abstraction à la fois.

Au fait, les recruteurs-qui-utilisent-grep, pour le coup, sont ridicules. Je n'ai jamais rencontré quelqu'un qui, connaissant Scheme, Hasckell et les pointeurs C, ne puisse pas apprendre le Java en quelques jours, et produire du code bien supérieur à certains programmeurs Java expérimentés. Mais allez donc faire comprendre ça au robot des RH moyen.

Et la mission des départements d'Informatique ? Ce ne sont pas des IUT !! Leur boulot n'est pas de préparer les gens pour le monde du travail. Ils sont là pour donner aux étudiants les outils fondamentaux pour vivre leur vie, pas les préparer à leur trois premières semaine de travail. Pas vrai ? L'informatique, c'est des preuves (récursion), des algorithmes (récursion), des langages (lambda calcul), des systèmes d'exploitation (pointeurs), des compilateurs (lambda calcul) -- et la morale est que les Javaternelles qui n'enseignent ni le C n'enseignent pas non plus l'informatique. Aussi inutile que puisse paraître le concept de currification de fonctions dans la vie de tous les jours, c'est indispensable pour une école d'informatique.Je n'arrive pas à comprendre pourquoi les enseignants qui décident des programmes des écoles d'informatiques ont laissé ceux-ci êtres simplifiés au point de ne plus être pouvoir produire ni programmeurs corrects, et ni futurs thésards. Un instant. Je n'ai rien dis. En fait je comprends.

En fait, si on remonte dans le temps et qu'on étudie les débats qui ont eu lieu dans le monde académique au moment du Grand Bond vers Java, on remarquera que le plus gros problème était de savoir si Java serait assez simple comme langage scolaire.

Mon Dieu, me suis-je dis, ils essaient encore de simplifier le programme ! Et pourquoi ne pas tout prémâcher aux étudiants ? On n'a qu'à laisser les thésards passer les examens à leur place ! Comment voulez vous apprendre quelque chose si le programme est soigneusement étudié pour rendre les choses toujours plus facile ? Visiblement, il y a un groupe de travail qui planche sur un sous-ensemble simplifié de Java, afin de générer une documentation allégée pour protéger nos chères têtes blondes des méandres des EJB ou de J2EE, et leurs épargner des heures de cours à étudier des choses inutiles.

En étant charitable, on pourrait penser que les département d'informatique sont très contents de simplifier leur programmes parce qu'ils auront plus de temps pour les vrais concepts d'Informatique, si ils ne doivent pas passer deux heures à expliquer la différence entre un  int et un Integer en Java. Mais bon, si c'est le cas, 6.001 a une excellente réponse : Scheme, un langage si simple qu'il faut environ dix minutes aux élèves les plus brillants pour l'apprendre. Comme ça on peux passer le reste du trimestre sur la théorie des points fixes.

Bref.

Je m'en retourne aux 'uns' et aux 'zéros'.

(Vous aviez des 'uns' ? Petits veinards ! De mon temps on n'avait que des 'zéros'.)

Personal tools