Apprenez à programmer en dix ans

18:29 Uncategorized

Version originale par Peter Norvig (Copyright 2001) (Directeur de la recherche chez Google).
Traduit avec la permission de l’auteur.

Note du traducteur : Par cette traduction, nous voulons exprimer notre engagement total envers l’excellence et l’amélioration continue, lesquelles nous appliquons à l’innovation en vision artificielle.

Pourquoi les gens sont-ils si pressés?

Entrez dans une librairie, et vous verrez comment Apprendre Java en 7 jours de même que de nombreuses variations offrant d’apprendre Visual Basic, Windows, l’Internet, et ainsi de suite en quelques jours ou heures. J’ai fait la recherche suivante sur Amazon.com :

pubdate: after 1992 and title: days and
(title: learn or title: teach yourself)

[ datepublication: après 1992 et titre: jours et
(titre: apprenez ou titre: enseignez-vous) ]

et j’ai obtenu 248 résultats. Les 78 premiers étaient des livres d’informatique (le numéro 79 était Learn Bengali in 30 days [Apprenez le Bengali en 30 jours]). J’ai remplacé “days” ["jours"] par “hours” ["heures"] et les résultats ont été similaires : 253 livres de plus, dont 77 livres d’informatique suivi de Teach Yourself Grammar and Style in 24 Hours [Apprenez la grammaire et le style en 24 heures] au numéro 78. Parmi les 200 premiers, 96% étaient des livres d’informatique.

La conclusion est que soit les gens sont pressés d’apprendre à propos des ordinateurs, soit les ordinateurs sont infiniment plus faciles à apprendre que n’importe quoi d’autre. Il n’y a pas de livres pour apprendre Beethoven, la physique quantique, ou même le toilettage des chiens en quelques jours.

Analysons ce qu’un titre comme Apprenez Pascal en trois jours pourrait bien signifier :

  • Apprenez : En 3 jours, vous n’aurez pas le temps d’écrire plusieurs programmes significatifs, et d’apprendre de vos succès et échecs. Vous n’aurez pas le temps de travailler avec un programmeur expérimenté et de comprendre ce que c’est de vivre dans cet environnement. En résumé, vous n’aurez pas le temps d’apprendre tellement. Ils ne peuvent que parler d’une familiarité superficielle, et non pas d’une connaissance approfondie. Comme Alexander Pope l’a dit : “a little learning is a dangerous thing” ["un peu de connaissances est une chose bien dangereuse"].
  • Pascal : En 3 jours, vous pourriez être capable d’apprendre la syntaxe de Pascal (si vous connaissiez un langage similaire), mais vous ne pourrez pas en apprendre tellement à propos de comment utiliser la syntaxe. En résumé, si vous étiez, par exemple, un programmeur de Basic, vous pourrez apprendre à écrire des programmes selon le style du Basic en utilisant la syntaxe du Pascal, mais vous ne pourrez pas apprendre ce pour quoi est bon (ou mauvais) le Pascal. Alors pourquoi se donner la peine? Alan Perlis a dit un jour : “A language that doesn’t affect the way you think about programming, is not worth knowing” ["Un langage qui n'affecte pas la manière dont vous pensez à la programmation, ne vaut pas la peine d'être appris"]. Une motivation possible est que vous devez apprendre un petit peu de Pascal (ou plus vraisemblablement, quelque chose comme Visual Basic ou JavaScript) parce que vous avez besoin d’interfacer avec un outil existant pour une tâche spécifique. Mais dans ce cas là, vous n’apprenez pas à programmer; vous apprenez à accomplir cette tâche.
  • en trois jours : Malheureusement, cela n’est pas suffisant, comme le démontre la section suivante.

Apprenez à programmer en dix ans

Des chercheurs (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) ont démontré que cela prend environ 10 ans pour développer une expertise dans une variété de domaines, incluant les échecs, la composition musicale, l’opération d’un télégraphe, la peinture, la natation, le tennis, la recherche en neuropsychologie et en topologie. La clé est la pratique délibérée : non pas refaire encore et encore, mais plutôt se donner comme défi une tâche qui est tout juste au delà de votre habilité actuelle, l’essayer, et corriger les erreurs. Puis répéter. Et encore répéter. Il ne semble pas y avoir de véritable raccourcis : même Mozart, qui était un prodige musical à 4 ans, a pris 13 années de plus avant de produire de la musique de calibre mondial. Dans un autre style musical, les Beatles ont semblé apparaitre sur la scène avec une série de succès numéros 1 et une visite à l’émission d’Ed Sullivan en 1964. Cependant, ils ont joué dans des petits clubs de Liverpool et de Hambourg à partir de 1957, et même s’ils avaient un grand potentiel dès leurs débuts, leur premier grand succès, Sgt. Peppers, a été lancé en 1967. Une étude portant sur les étudiants de la Berlin Academy a comparé les tiers supérieur, moyen et inférieur de la classe et leur ont demandé combien de temps ils avaient pratiqué.

Tous les étudiants, pour les trois groupes, ont commencé à jouer environ au même âge, soit 5 ans. Durant ces quelques premières années, ils ont tous pratiqué environ autant – deux ou trois heures par semaine. Cependant, à huit ans, des différences significatives ont commencé à apparaitre. Les étudiants qui ont éventuellement été les meilleurs de leur classe ont commencé à pratiquer plus que tous les autres : six heures par semaine à 9 ans, huit heures par semaine à 12 ans, 16 heures par semaine à 14 ans, et ainsi de suite en augmentant, jusqu’à l’age de 20 ans où ils pratiquaient plus que 30 heures par semaine. À 20 ans, les musiciens d’élite avaient accumulé 10 000 heures de pratique au cours de leur vie. Les étudiants simplement bons avaient accumulé par contraste 8 000 heures, et les futurs enseignants de musique à peine plus de 4 000 heures.

Il se pourrait bien que le nombre magique soit 10 000 heures, et non pas 10 ans. Samuel Johnson (1709-1784) pensait qu’il faut plus longtemps : “Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price.” ["L'excellence dans un domaine ne peut être atteinte qu'au prix du travail d'une vie; elle ne s'obtient pas à moindre prix."]. Et Chaucer (1340-1400) se plaignait que “the lyf so short, the craft so long to lerne” ["la vie est si courte, et le métier, si long à apprendre"]. Hippocrate (environ 400 av. J-C.) est reconnu pour avoir dit “ars longa, vita brevis”, lequel fait partie de la citation “Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”, qui en français donnerait “La vie est courte, le métier long, l’opportunité passagère, l’expérience traitre, le jugement difficile.” Malgré qu’en latin, ars peut signifier art ou métier, à l’origine, en grec, le mot “techne” signifiait uniquement “habileté” et non pas “art”.

Voici ma recette pour réussir en programmation :

  • Devenez intéressé à la programmation, et faites-en parce que c’est agréable. Assurez-vous que cela reste suffisamment agréable pour vouloir y consacrer 10 ans.
  • Parlez à d’autres programmeurs; lisez des programmes. C’est plus important que n’importe quel livre ou cours.
  • Programmez. La meilleure sorte d’apprentissage est d’apprendre en le faisant. En termes plus techniques, “le niveau maximal de performance pour des individus dans un domaine donné n’est pas atteint automatiquement grâce à une longue expérience, en fait, le niveau de performance peut être amélioré même par des individus hautement expérimentés grâce à des efforts délibérés de s’améliorer.” (p. 366) et “l’apprentissage le plus efficace requiert une tâche bien définie avec un niveau de difficulté approprié pour l’individu, une rétroaction informative, et des opportunités de répétition et correction des erreurs.” (p. 20-21) Le livre Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life [La Cognition en pratique : esprit, mathématiques et culture dans la vie de tous les jours] est une référence intéressante sur ce point de vue.
  • Si vous le voulez, passez 4 ans à l’université (ou plus pour des études plus avancées). Ceci va vous donner accès à des emplois qui nécessitent des qualifications, et cela va vous donner une compréhension plus approfondie du domaine, mais si vous n’appréciez pas l’école, vous pourrez (avec un certain dévouement) acquérir une expérience similaire au travail. Dans tous les cas, l’apprentissage par les livres ne sera pas suffisant. “Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter” ["L'étude de l'informatique ne peut pas plus rendre un programmeur expert que l'étude des pinceaux et des pigments peut rendre une peintre expert"], selon Eric Raymond, auteur de The New Hacker’s Dictionary [Le nouveau dictionnaire du hacker]. Un des meilleurs programmeurs que j’aie embauché avait seulement un diplôme d’étude secondaire; il a produit plusieurs logiciels d’excellente qualité (XEmacs, Mozilla), possède son propre groupe de nouvelles, et a fait suffisamment en options pour acheter son propre club.
  • Travaillez sur des projets avec d’autres programmeurs. Soyez le meilleur programmeur sur certains projets; et le pire sur d’autres. Lorsque vous êtes le meilleur, cela vous permet de tester vos habiletés à mener un projet, et à inspirer les autres par votre vision. Lorsque vous êtes le pire, vous apprenez ce que les maîtres font, et vous apprenez ce qu’ils n’aiment pas faire (parce qu’ils vous le donnent à faire).
  • Travaillez sur des projets à la suite d’autres programmeurs. Prenez le temps de comprendre un programme écrit par quelqu’un d’autre. Vous comprendrez l’effort nécessaire pour le comprendre et le réparer lorsque les programmeurs initiaux ne sont plus là. Réfléchissez à comment concevoir vos programmes de manière à faciliter la vie de ceux qui vont les maintenir par la suite.
  • Apprenez au moins une demi-douzaine de langages de programmation. Incluez un langage qui supporte l’abstraction de classe (comme Java ou C++), un qui supporte l’abstraction fonctionnelle (comme Lisp ou ML), un qui supporte l’abstraction syntaxique (comme Lisp), un qui supporte les spécifications déclaratives (comme Prolog ou les templates du C++), un qui supporte les coroutines (comme Icon ou Scheme), et un qui supporte le parallélisme (comme Sisal).
  • Rappelez-vous que l’ordinateur fait partie intégrante de l’informatique. Sachez combien de temps cela prend à votre ordinateur pour exécuter une instruction, lire un mot dans la mémoire (qu’il soit déjà dans la mémoire cache ou pas), pour lire des mots consécutifs ou non du disque. (Les réponses sont ici.)
  • Impliquez vous dans un projet de standardisation d’un langage. Cela pourrait être le comité ANSI C++, ou de décider si votre standard de codage aura des indentations de 2 ou 4 espaces. De toute manière, vous apprendrez ce que les autres aiment dans un langage, à quel point ils y tiennent, et peut-être un peu sur pourquoi ils y tiennent.
  • Ayez le bon sens de quitter le projet de standardisation du langage aussitôt que possible.

Avec tout cela à l’esprit, il est discutable combien loin on peut se rendre en apprenant par les livres. Avant la naissance de mon premier enfant, j’ai lu tous les livres sur comment faire, mais je me suis tout de même senti comme un débutant sans aucune idée quoi faire. 30 mois plus tard, alors que mon deuxième enfant est né, est-ce que je suis retourné vers les livres pour me rafraichir la mémoire? Non. À la place, je me suis fié à mon expérience personnelle, laquelle a somme tout été beaucoup plus utile et rassurante que les milliers de pages écrites par des experts.

Fred Brooks, dans son essai No Silver Bullets [Pas de solutions magiques] a identifié un plan en trois parties pour trouver d’excellents concepteurs de logiciel :

1. Identifiez systématiquement les meilleurs concepteurs aussi tôt que possible.
2. Confiez-les à un mentor qui sera responsable de leur développement et de la tenue leur dossier de carrière.
3. Fournissez aux concepteurs en croissance des opportunités d’interaction et de stimulation mutuelle.

Ceci suppose que certaines personnes ont déjà les qualités nécessaires pour être un excellent concepteur; la tâche est de les diriger adéquatement. Alan Perlis l’a dit plus concisément : “Everyone can be taught to sculpt: Michelangelo would have had to be taught how not to. So it is with the great programmers.” ["On peut amener n'importe qui à sculpter : Michel-Ange ne pouvait s'en empêcher. Ainsi en est-il des programmeurs qui excellent."].

Alors, allez-y, achetez ce livre sur Java; il vous sera probablement utile. Mais vous ne changerez pas votre vie, ou votre expertise de programmeur en général en 24 heures, jour ou même mois.

Références

Bloom, Benjamin (éd.), Developing Talent in Young People, Ballantine, 1985.

Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.

Bryan, W.L. & Harter, N. Studies on the telegraphic language: The acquisition of a hierarchy of habits. Psychology Review, 1899, 8, 345-375.

Hayes, John R., Complete Problem Solver, Lawrence Erlbaum, 1989.

Chase, William G. & Simon, Herbert A. Perception in Chess, Cognitive Psychology, 1973, 4, 55-81.

Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.

Réponses

Durées approximatives pour diverses opérations sur un PC 1 GHz typique (été 2001) :

exécution d’une instruction 1 ns = (1 / 1 000 000 000) s
lecture d’un mot en cache L1 2 ns
lecture d’un mot en mémoire 10 ns
lecture d’un mot d’un emplacement consécutif sur le disque 200 ns
lecture d’un mot d’un nouvel emplacement sur le disque (seek) 8 000 000 ns = 8 ms

Annexe : Choix du langage

Plusieurs m’ont demandé quel langage de programmation ils devraient apprendre en premier. Il n’y a pas une seule bonne réponse, cependant veuillez considérer ce qui suit :

  • Utilisez vos amis. Lorsqu’on me demande “Quel système d’exploitation utiliser, Windows, Unix ou Mac?”, ma réponse est habituellement : “Utilisez ce que vos amis utilisent.” Les avantages que vous tirerez d’apprendre de vos amis vont surpasser toute différence entre systèmes d’exploitation ou entre langage de programmation. De plus, pensez à vos futurs amis : la communauté des programmeurs dont vous ferez partie si vous continuez. Est-ce que le langage choisi a une communauté dynamique ou une qui survit difficilement. Y a-t-il des livres, des sites web, des forums en ligne où obtenir des réponses? Aimez-vous les gens sur ces forums?
  • Simplifiez-vous la vie. Les langages de programmation tels que C++ et Java sont conçus pour le développement par des équipes de plusieurs programmeurs professionnels, qui se soucient de l’efficacité à l’exécution de leur code. En conséquence, ces langages sont compliqués. Vous voulez apprendre à programmer. Vous n’avez pas besoin de la complexité. Vous voulez un langage qui soit facile à apprendre et à se rappeler pour un programmeur débutant seul.
  • Amusez-vous. De quelle manière préfèreriez-vous apprendre le piano : de la manière interactive habituelle, où on entend chaque note aussitôt qu’on l’enfonce, ou de la manière “batch”, où on entend les notes uniquement après avoir joué toute la pièce? Évidemment, le mode interactif rend l’apprentissage plus facile pour le piano, mais aussi pour la programmation. Insistez pour avoir un langage avec un mode interactif et utilisez-le.

Étant donné ces critères, mes recommandations pour un premier langage de programmation sont Python ou Scheme. Vos circonstances peuvent varier, et il y a d’autres bon choix. Si vous avez moins de 10 ans, vous pourriez préférer Alice ou Squeak (malgré que des gens plus âgés pourraient aussi les apprécier). L’important est de choisir et de s’y mettre.

Annexe : Livres et autres ressources

Plusieurs ont demandé quels livres et sites web ils devraient utiliser pour apprendre. Je répète que “l’apprentissage par les livres ne sera pas suffisant” mais je peux toutefois recommander les suivants :

Notes

T. Capey a fait remarqué que la page Complete Problem Solver sur Amazon a maintenant les livres Teach Yourself Bengali in 21 days et Teach Yourself Grammar and Style dans la section “Les clients qui ont acheté cet article ont aussi acheté”. Je suppose qu’une grande partie des gens qui regardent ce livre viennent de cette page-ci. Merci à Ross Cohen pour son aide à propos d’Hippocrate.

Comments are closed.