Apprendre la programmation en autodidacte
  1. La voie de l'autodidacte (1/2)
  2. La voie de l'autodidacte (2/2)

La voie de l'autodidacte (2/2)

(Nhat Minh Lê (rz0) @ 2010-09-03 09:24:01)

La suite du précédent…

Investissement personnel

(4.1)

rz0

Le public pas si général que ça associe souvent l’image du programmeur autodidacte à la culture geek. Et beaucoup de jeunes techno-enthousiastes se mettent en tête d’apprendre à programmer.

Vous reconnaissez-vous dans cette image ? Je ne vais pas nier que nous sommes tous plus ou moins geek (dans le sens où nous apprécions des usages de l’informatique un peu marginaux), mais l’étiez-vous avant de programmer ? Si oui, cela a-t-il été un facteur dans votre décision de commencer à apprendre en autodidacte ?

alp

Non je n’étais pas vraiment à fond dans l’informatique « grand public » avant d’attaquer la programmation au tout début de chez tout début. Je me reconnais dans geek selon la définition qu’on donne à ce mot. Je suis passionné par des domaines de l’informatique tout comme je le suis par beaucoup de domaines en mathématiques, ou en science en général. Et si geek est considéré ici comme désignant une personne qui est tellement passionnée qu’elle peut passer des heures et des heures, coupée du reste, à apprendre des choses, pratiquer, etc, alors oui. Dans tous les cas, non ç’a n’a pas été un facteur dans ma décision de commencer à apprendre la programmation en autodidacte. C’est vraiment la curiosité intellectuelle qui m’y a poussé.

bluestorm

Je pense que j’étais effectivement déjà curieux du fonctionnement des ordinateurs avant de commencer à programmer. Mais je ne connaissais pas du tout la culture geek à l’époque, qui n’a jamais été une motivation et dans laquelle je ne me reconnais toujours pas. Quand j’ai commencé la programmation, je considérais cette activité comme un jeu de l’esprit basé sur l’abstraction, un peu comme des mathématiques très appliquées, et pas du tout un outil pour créer des jeux vidéos, faire des blagues à ses amis ou pirater l’ordinateur de son voisin…

rz0

Pour ma part, ce n’était pas vraiment le cas. Je jouais un peu, je bidouillais trois fois rien pour avoir un beau fond d’écran et un thème Windows sympa, mais voilà tout. Geeker en venu après, au fur et à mesure que j’apprenais à mieux comprendre l’informatique.

Je trouve cela même quelque peu dangereux que l’amalgame soit si facile. Généralement, je n’aime pas que l’on me confonde avec le mec qui est au courant des derniers gadgets à la mode, suis l’actualité vulgarisée de tous les domaines possibles et imaginables de l’informatique, et possède sa carte de membre au parti^Wfanclub Apple/Google/Microsoft/etc. du coin. Cependant, pour le novice, apprendre à programmer pour se sentir plus geek est une motivation initiale comme une autre, que je ne critique pas ; mais je ne pense pas non plus qu’elle puisse demeurer la raison maîtresse qui continuera à guider l’apprentissage. Si elle ne laisse pas place à des objectifs plus sérieux, l’investissement ne sera pas au rendez-vous, et avec lui le niveau…

(4.2)

rz0

Revenons sur l’investissement. C’est une question difficile. Combien d’heures, de jours, de mois, faut-il consacrer à son apprentissage, et avec quel rythme, pour espérer devenir « bon » ? Je doute que quiconque ici ait la prétention de pouvoir apporter une réponse définitive à cette question.

En revanche, je peux répondre à la suivante : quel investissement m’a-t-il fallu pour arriver là où je suis aujourd’hui ? Si l’on s’en réfère à la fameuse règle des 10000 heures, je dois avoir fait mon quota. Est-ce que cela fait de moi un expert ? Faut voir. Avec la définition toute relative que certains ont de « maîtriser quelque chose » (en particulier sur les CV), je suis certainement un expert en pas mal de choses. :D Blague à part, je dirais simplement que la clef est certainement de pratiquer, et continuer à s’auto-former, régulièrement, année après année…

Qu’en est-il de votre expérience ?

alp

Je dois avoir mon quota aussi… Si l’on veut sérieusement connaître et « maîtriser » un langage, une technologie, une théorie, peu importe, il faut y consacrer beaucoup de temps. Qu’il s’agisse d’apprendre les bases, des les consolider, ou d’attaquer des choses plus avancées, et ce en théorie comme en pratique, cela demande toujours beaucoup de temps. Si l’on est pas prêt à passer beaucoup de temps sur quelque chose, autant laisser tomber l’idée de pouvoir vraiment bien connaître et savoir utiliser le « quelque chose » en question. Pour illustrer, imaginez combien de caps j’ai franchi entre le moment où j’ai appris à déclarer un int en C++ et le moment où j’ai commencé à savoir faire de la métaprogrammation vraiment sérieuse, toujours en C++… Donc oui, il faut persévérer, refuser de ne pas comprendre, être prêt à s’investir autant que nécessaire. Note : cela n’empêche toutefois pas d’avoir une vie sociale, il s’agit de savoir gérer son temps et d’être capable de se motiver lorsque l’on a du temps à consacrer à l’apprentissage.

bluestorm

J’ai tendance à estimer grossièrement trois niveau de connaissance : ce que je n’arrive pas à faire, ce que je sais faire, et ce que je sais expliquer aux autres. Je ne sais pas si transmettre aux autres suffit pour être « bon » dans un domaine, mais personnellement ça me suffit ; ce qui est sûr c’est que ça demande pas mal de pratique, et assez (mais surtout pas trop !) de confiance en ses compétences.

Pour couvrir un domaine aussi large que la programmation, il faut sans doute effectivement une ou plusieurs heures par jour, pendant des années. Après, c’est un apprentissage progressif, il y a des choses qu’on arrive à faire rapidement, et d’autres qui peuvent résister très longtemps. J’ai encore beaucoup à apprendre et je trouve ça excitant.

(4.3)

rz0

Un autre acteur que l’on retrouve souvent dans les discussions autour de l’apprentissage de la programmation en autodidacte est le logiciel libre. Faut-il s’investir dans le logiciel libre pour réussir sa formation d’autodidacte ? Quels gains ? Quelles contraintes ?

alp

Au début : aucun intérêt. Je dirais que le meilleur moment c’est quand on est à la phase 3 (cf. dans les premières questions) car on est capable d’apporter du bon code tout en en apprenant nous-même. Contribuer aux logiciels libres vous en apprend bien plus humainement que techniquement, pour peu que votre niveau soit assez élevé. De toute manière, avant d’en arriver à pouvoir contribuer à un logiciel libre, il faut avoir réalisé des projets personnels plus sérieux qu’un petit morpion, par exemple. Mais c’est une expérience intéressante et enrichissante que de participer à un projet libre, car vous vous familiariserez avec les outils entourant les logiciels libres (subversion/git/darcs/mercurial/autres pour le versionning, mailing lists, bug tracker, etc.) et apprendrez la collaboration à échelle plus ou moins grande. Donc non il ne faut pas nécessairement s’y investir, mais ce n’est pas une mauvaise chose et si vous en avez l’occasion cela s’avèrera probablement enrichissant.

bluestorm

Pour moi, aimer la programmation conduit naturellement à un soutien du logiciel libre. Une fois qu’on réalise que le code source est essentiellement une façon de transmettre des idées, on est conduit à souhaiter que ces idées soient distribuables, réutilisables et améliorables.

Le logiciel libre est aussi une chance pour celui qui veut apprendre à programmer : cela fait plein de code déjà écrit qui n’attend que d’être lu et compris. On apprend beaucoup en regardant comment font les autres, beaucoup plus qu’en se contentant de répéter les mêmes pratiques personnelles.

Ce qui est aussi essentiel à mon avis, c’est rencontrer une critique de ce que l’on fait. Demander des commentaires aux autres, les inciter à juger notre travail. Les communautés de logiciel libre sont de bons endroits pour le faire, mais cela peut aussi se faire ailleurs.

rz0

Ma contribution au libre est très récente et quasi inexistante, aussi, je n’ai pas grand chose à dire sur le sujet. Tout ce que je peux remarquer, c’est qu’elle ne m’a pas été nécessaire pour en arriver où je suis ; avec de la volonté et des idées, je considère qu’il est tout aussi productif de se fixer de petits projets à soi.

Technique

(5.1)

rz0

Pour démarrer avec les questions techniques, parlons de langages de programmation. Quels sont vos langages de prédilection ? Depuis combien de temps les pratiquez-vous ? Qu’est-ce qui a arrêté votre choix ? Envisagez-vous d’en changer bientôt ?

alp

Les deux langages que j’utilise vraiment souvent et couramment sont C++ et Haskell. Je pratique le C++ depuis mes 15 ans, ce qui fait donc six ans environ. Concernant Haskell, je le pratique depuis un peu plus d’un an à peine, mais très intensivement. Je suis resté sur C++ car bien que considéré comme complexe, il s’avère offrir une énorme puissance lorsque l’on combine les paradigmes, ce qui permet d’écrire du code assez bas-niveau avec une certaine abstraction, par exemple. Bref, en C++ on peut vraiment aller dans la direction que l’on veut, il suffit de savoir comment le faire, et c’est ce que j’ai appris avec les années et de très bonnes ressources. Concernant le Haskell, c’est principalement l’élégance et la communauté qui m’ont séduit. Beaucoup de bibliothèques/outils, le tout avec une façon de penser totalement fonctionnelle, et bien d’autres features qui m’ont plu. Plus j’en fais, plus j’en apprends, et plus je suis content de mon choix. Après toutes ces années à m’intéresser à pleins de langages, je pense que je tiens mon duo de choc et je n’envisage vraiment pas d’en changer.

bluestorm

J’utilise encore principalement OCaml. Entre le moment où j’ai appris OCaml pour faire de l’algorithmique, et la période où je me suis fixé en OCaml pour l’ensemble de mes besoins en programmation, j’ai fait des essais avec d’autres langages plus populaires (C, PHP), pour voir du pays. Plus tard, j’ai aussi appris progressivement le Haskell, qui est un langage très intéressant et qui serait un choix raisonnable, mais je trouve OCaml plus pratique comme langage généraliste : c’est un bon compromis entre l’élégance des langages fonctionnels statiquement typés et la simplicité à l’exécution.

J’aime bien lire du code même dans les langages que je ne connais pas ou très mal, et modifier des programmes pour les adapter à mes besoins. Il m’arrive donc occasionellement de toucher à du code Python, ELisp, PHP, des scripts shell, etc. Ce ne sont pas des langages de prédilection, mais parfois il faut faire des efforts pour se coordonner avec les autres. Il y a aussi les langages intéressants à apprendre, mais que je ne pratique pas du tout : Erlang, Prolog, Oz..

Je n’envisage pas de changer bientôt de langage principal, mais il y a des langages que je voudrais avoir le temps de découvrir (Scala, Forth, ATS) et j’aimerais faire plus de Coq. Tous les langages ont des défauts, et je pense qu’on peut faire mieux que ce qui existe : je changerai certainement de langage à long terme.

rz0

Pour ma part, le C m’a bien servi durant ces huit–neuf dernières années, et je n’ai pas tellement l’intention de le remplacer maintenant. Cependant, je cherche toujours un langage de script pour complémenter mon usage. Le script shell devient vite maladroit ; pour l’heure, je n’ai rien trouvé à mon goût…

(5.2)

rz0

Parlons un peu du parcours qui vous a mené à vos choix actuels : Par quels langages êtes-vous passés avant d’aboutir à votre outillage actuel ? À quel point avez-vous commencé à incorporer l’algorithmique dans votre apprentissage ? Et l’usage des outils (débogueur, gestionnaire de versions, etc.) ? Quelle place pour le génie logiciel ? Enfin, conseilleriez-vous aux débutants de suivre la même voie ?

alp

Dans l’ordre plus ou moins chronologique : Visual Basic, C, C++, HTML, PHP, CSS, Javascript, Java, Prolog, Python, OCaml, Haskell ; ce sont les langages auxquels j’ai vraiment touché un minimum. J’ai quelques connaissances en assembleur, (Emacs) Lisp, Pascal, etc. mais rien qui ne mérite vraiment d’être mentionné.

J’ai incorporé l’algorithmique assez tôt. Cela vient principalement du fait que j’ai toujours bien aimé les maths et j’ai donc assez tôt voulu résoudre des problèmes de maths avec des programmes, et il se trouvait que par enchantement mes algos était un cas particulier d’un algo plus connu, etc. Par contre, mon apprentissage structuré et solide de l’algorithmique est arrivé bien après. Et je suis d’ailleurs loin d’être un as dans le domaine, je vais régulièrement voir mon Cormen pour lire ou relire des passages. Le débogueur est arrivé quand j’ai commencé à faire des trucs non triviaux en C++ et que j’avais des bugs « mystiques » comme il nous arrive tous d’en avoir et que l’on n’arrive pas à résoudre à coups de std::cout << "Je suis dans MaClasse::MaFonctionMembre()", std::cout << "Je rentre dans cette fonction et tel et tel trucs valent ceci et cela" et j’en passe. Donc bien au bout d’un an et demi ou deux ans. Les gestionnaires de versions, wouah, là c’est carrément bien plus tard. J’ai dû commencer au bout de quatre ans environ, quand j’ai pour la première fois travaillé sur un projet avec d’autres personnes dans un cadre plus ou moins sérieux. Bref, cela ne fait pas si longtemps que « j’utilise des outils de grands ».

En ce qui concerne le génie logiciel, disons que c’est à mes yeux pas mal attaché à l’aspect « business » du développement, qui m’a beaucoup rebuté. Rares sont les situations où cela s’avère particulièrement pertinent selon moi de s’attacher à 400% au génie logiciel tel qu’il est pratiqué. En ayant pas mal investi le monde de la programmation fonctionnelle, je me rends compte que ce n’est pas « le design OO », les « schémas UML » ou autres qui comptent, mais la réflexion sur l’interface que l’on offre, dans un sens général. Bien sûr, on a un vocabulaire spécifique pour chaque paradigme, mais finalement ce n’est pas tant différent et il y a une majeure partie de la réflexion en amont qui demeure la même, et je trouve justement que dans le monde du « business » de l’informatique, on met tout ça de côté. Donc oui, je connais un minimum tout ça, mais non je n’ai pas tellement introduit ça dans mes projets, dans le sens « commun » de l’expression « génie logiciel ».

Enfin, j’ai un parcours similaire à bien des gens, dans le sens où j’ai pas mal vadrouillé entre les langages et paradigmes de programmation, j’ai lu des bouquins, articles, cours, tutoriels, howtos, etc. et chaque étape j’ai été amené à découvrir un nouveau langage, des techniques, des points de vue, des raisonnements, et je recommande tout simplement de se laisser « guider » comme cela, car au bout d’un certain temps de toute façon cela se stabilisera. Suivre le même parcours que moi précisément n’aurait pas vraiment de sens, car c’est ce qu’il m’est arrivé par rapport à mon expérience, aux choix que j’ai faits, etc.

bluestorm

J’ai longtemps erré sur le chemin de la programmation web (XHTML, PHP, SQL…), avant de me rendre compte que ça ne me plaisait pas. Je pense que ce qui la rend si tentante, c’est la facilité à montrer ce qu’on fait aux autres. Je me suis cependant rendu compte au bout d’un moment que ce n’était pas un environnement agréable pour programmer, entre autres à cause de la domination de mauvais outils (PHP) et de l’importance de normes à absorber avant de pouvoir faire les choses bien. Ça a l’air simple de loin, mais coder un parseur XML complet est une tâche quasiment insurmontable.

J’ai toujours incorporé l’algorithmique dans mes considérations. Je pense que j’ai mis un peu de temps avant que ça devienne vraiment naturel (sans doute un an ou deux). Il s’agit seulement des bases : quand on approfondit le sujet, l’algorithmique est un domaine extrêment technique qui ne m’intéresse en fait pas énormément.

Pour l’usage des outils, je suis extrêment paresseux et en pratique assez minimaliste et réactionnaire. Je n’ai jamais appris à utiliser un débugguer par exemple, tout simplement par flemme, et je débuggue mes programmes en ajoutant des instructions d’affichage aux bons endroits. Jusqu’à récemment, je faisais aussi très peu de tests. Pour programmer j’utilise un éditeur de texte et les outils de base de mon langage, pas d’environnements trop lourds et complexes.

Je suis par contre fortement convaincu par les gestionnaires de versions : j’ai fait l’expérience plusieurs fois du code qui « était juste il y a une heure, mais il ne marche plus du tout et je n’arrive plus à le refaire marcher », et on comprend vite l’intérêt de faire des sauvegardes régulières, et surtout expliquées, de son travail ; c’est encore plus utile quand il y a plusieurs auteurs.

J’attache beaucoup d’importance au fait de découper l’évolution du code en modifications atomique, que j’essaie de bien expliquer. On ne peut pas toujours avoir ce qu’on veut (parfois on est pressé et on n’a pas le temps de soigner cet aspect autant qu’il le faudrait), mais je crois que ça a globalement une influence positive sur la façon dont on organise les modifications de son programme.

Je m’intéresse au génie logiciel, mais j’ai parfois du mal à faire la différence entre le bon sens, les conseils de grand-mère, les choses carrément trompeuses et les idées nouvelles et intéressantes. Je pense qu’il y a beaucoup de choses à apprendre dans cette direction, mais je préfère les domaines plus formalisés, où il est plus facile de séparer l’important de l’accessoire.

Aux débutants, je conseillerais de commencer avec des outils simples, qu’ils comprennent bien, et de passer progressivement à des choses plus complètes dans les domaines qui les intéressent.

rz0

Je suis passé par le Turbo Pascal, puis je suis tombé directement sur le C, qui me suivra, à partir de là. Bien sûr, j’ai flirté avec bon nombre d’autres langages et de technologies, à partir de là. J’ai failli faire de C++ mon outil principal, et j’ai fait pas mal d’assembleur x86 également.

L’algorithmique un minimum non triviale n’est pas venue avant un bon nombre d’années, deux ou trois peut-être. Je crois que c’est autour de la Seconde que j’ai mis la main sur un Knuth (que je n’ai jamais réussi à digérer :) et un Cormen (bien plus comestible, mais j’en ai laissé des bouts…), et voilà… Et si je me suis spécialisé dans mon domaine, ce qui vaut aussi pour l’algorithmique associée, j’en apprends encore beaucoup, notamment en cours, à l’école ! Héhé, et oui, pas en autodidacte cette fois-ci…

Il en est un peu de même pour outils : cela ne m’est pas venu non plus avant bien deux ans dans l’obscurité, à déboguer à coup de printf… ça forge le caractère, dira-t-on. :p

Quant à savoir si je conseillerais le même parcours, c’est difficile à dire. Je pense que la voie de l’autodidacte est constituée d’une part non négligeable de hasard, et je pense que cet aléa fait partie de l’apprentissage : apprendre à se débrouiller, à faire la part des choses, entre ce que l’on doit savoir, et ce que l’on veut maîtriser.

Conclusion

(6.1)

rz0

L’interview touche maintenant à sa fin. Pour conclure, un mini-quizz !

  1. Les trois plus importantes qualités d’un autodidacte ?
  2. Le plus grand piège à éviter quand on débute ?
  3. Le bon âge pour commencer ?
  4. Livre ou cours sur Internet ?
  5. Algorithmique avant langage, langage avant algorithmique, ou les deux en même temps ?
alp
  1. Curiosité intellectuelle, persévérance et être débrouillard(e).
  2. Ne pas faire face aux problèmes rencontrés (faire faire par quelqu’un d’autre, etc).
  3. Fin du collège, lycée.
  4. Livre si possible !
  5. Un peu de langage, de quoi pouvoir implémenter les algos de base, avant d’apprendre l’algo, et ensuite apprendre les deux en parallèle.
bluestorm
  1. Curiosité, persévérance, rigueur.
  2. Se laisser entraîner vers des choses pénibles ou fastidieuses par
    envie de plaire aux autres.
  3. N’importe quand, tant qu’on est vraiment intéressé.
  4. Les deux : comparer les différentes sources.
  5. En même temps. Pratique et théorie.

rz0
  1. Curiosité intellectuelle, ténacité, résistance (à l’échec, aux conflits, au ridicule, etc. :-°).
  2. Sombrer dans la justification de l’improductivité.
  3. Collège ou lycée, quand on n’a rien à faire de ses journées.
  4. Ça dépend si on est pauvre…
  5. Langage avant algorithmique, pour moi… pas trop avant non plus, mais histoire d’avoir un truc avec lequel appliquer, quand on attaque l’algorithmique.

(6.2)

rz0

Un dernier mot pour vos fans ? ;)

alp

Comme le dit dangerous, et tous ceux qui le connaissent le reconnaîtront bien là, « Y’a pas de secret, faut bosser ! ».

bluestorm

J’espère ne pas avoir de fans ; pour programmer, les idées sont plus importantes que les gens.