Apprendre + Équipe = Programmes


Comment j'ai appris mon métier, comment j'ai progressé ?


Hier cette question était posée sur FramaTeam :

Comment avez-vous appris votre savoir, comment avez-vous progressé ?

Ouf ! Super question ! Je ne peux pas y répondre complètement, mais j'essaie quelque chose.

Découverte

Tout à commencé pour moi par la découverte du Basic et du Logo sur MO5 en centre aéré au primaire. On dessinait des cercles et des motifs sur un écran monochrome, c'était rigolo.

Pendant cette période, j'étais déjà interessé. Au début c'était surtout physique, les couleurs bleues intense de l'écran du MO5, le côté magique du crayon optique posé sur l'écran cathodique plein d'électricité statique, et toutes ces touches je trouvais ça chouette.

Au lycée, j'ai bidouillé sur calculatrice graphique en lisant le manuel, et cours de Pascal en terminale, c'était un monde calme et à part. Et j'avais aussi un ami qui explorait, donc on pouvait s'inspirer de ce que l'autre faisait.

En prépa, j'ai bidouillé sur HP 48 en RPL, un mini Forth. J'ai fini par faire une quine sans savoir ce que c'était, mon idée était de faire un programme qui se rajouterait lui-même à la fin d'un autre programme (le RPL est un langage concaténatif, ça aide). J'ai bien lancé la quine pour vérifier, mais je n'ai jamais activé la réplication à la fin des autres programmes, par peur que ça fonctionne. Il y avait un côté puzzle ludique.

Avec ces calculatrices graphiques, je pouvais passer du temps à chercher les instructions qui pourraient améliorer mes programmes dans leurs épais manuels. C'était un peu comme une chasse au trésor, qui continue encore aujourd'hui. C'est le premier élément de réponse à la question.

En école d'ingénieur, j'ai eu des cours de C, C++ et Java, et des cours d'algorithmique. J'ai reçu des bases classiques avec de bons profs, mais je n'étais pas prêt à les apprécier, j'ai peu de souvenirs. Autre point, j'étais dans une école généraliste donc la programmation ne constituait pas la majorité de l'enseignement. Je pense que cette étape a été importante cependant, j'y ai été exposé à beaucoup de concepts fondamentaux que j'ai pu explorer plus tard facilement grâce à ces cours. Je pense qu'une certaine familiarité et une structuration de mes idées sur la programmation ont été installées et j'en suis reconaissant. Ça m'a donné une situation, au sens de m'apprendre à me situer.

Premier job

Premier boulot, premiers apprentissages avec les collègues. On ne faisait pas de pair programming, mais on discutait, et je faisais relire mon code.

C'est aussi les premières explorations du code de quelqu'un d'autre. Ces explorations m'ont permis de progresser : essayer de comprendre, avec un papier et un crayon = une nouvelle sorte de chasse au trésor. On peut même faire des cartes.

Et aussi, premiers livres. Le dev senior de l'équipe (coucou Olivier !) me passe les bouquins Effective C++, de Scott Meyers. C'est un peu une révélation pour moi : les livres, en expliquant des points techniques du langage, dévoilent énormément de pratiques de dev. très mémorables. Par exemple, dans l'Item 18: "Make interfaces easy to use correctly and hard to use incorrectly", le conseil suivant pour implémenter les opérateurs classiques de ses propres types :

When in doubt, do as the ints do.

Avec à chaque fois, une explication des conséquences de le faire ou de ne pas le faire. J'ai lu ces livres du début à la fin, passionné par la découverte d'un nouveau niveau de finesse que je n'imaginais pas. Wow! Je commence à comprendre que je n'aurai jamais fini d'apprendre mon métier.

Il y avait aussi le classique Design Patterns, je l'ai trouvé intéressant mais il ne m'a pas marqué autant.

Ensuite le même collègue me passe le bouquin Extreme Programming Explained, ça me donne envie de travailler comme ça. J'essaie un peu, mais seul ce n'est pas simple. Patience, il me faudra encore environ cinq ans avant de trouver des gens qui pratiquent XP.

Deuxième job

Dans mon deuxième job, je rencontre une bande de fous qui font des jeux vidéos, et là c'est l'effervescence. Je suis à nouveau le plus mauvais de l'équipe (en tout cas c'est mon opinion), ce qui est une super position pour apprendre. C'est même un conseil qu'on voit partout sur Internet maintenant.

Dans un open space, je suis au milieu d'experts en 3D qui ont écrit des moteurs 3D ou des drivers de carte graphique, d'experts réseaux, de personnes qui ont codé des jeux en assembleur dans les années 90 (coucou Fabrice). Les échanges sont permanents, et cette équipe fonctionnait comme un genre d'organisme qui essaie de s'améliorer en permanence. Les infos circulaient à grande vitesse entre personnes très curieuses, on passait régulièrement notre temps à former des groupes de deux et à discuter en pointant du doigt sur notre écran. Quelle chance. Et on échangeait aussi avec les graphistes et les game designers : ce n'était pas que de la programmation. Wow!

Et là encore, des livres. Il y avait une bibliothèque bien fournie, et un budget open bar pour faire commander des livres. Le livre qui m'a le plus marqué est The Pragmatic Programmer. Il couvre presque tous les pans du métier, et est agréable à lire. Une mine d'or, je le recommande encore aujourd'hui.

Un autre livre qui m'a marqué est Programming in Lua. Ce livre décrit un langage très petit, et montre comment on peut étendre le langage pour l'adapter à ses besoins à partir de principes très simples. Par exemple voilà comment fournir un set alors qu'il n'y a pas de structure de données "set" dans le langage :

function Set (list)
  local set = {}
  for _, l in ipairs(list) do set[l] = true end
  return set
end

reserved = Set{"while", "end", "function", "local"}

Ce livre m'a montré :

C'est aussi là que j'ai appris le Web, en faisant... du Smalltalk. On parlait souvent de ce langage avec un collègue (coucou Ludo), et à l'époque un framework Web "révolutionnaire" était sorti. Il existe encore aujourd'hui :

Voilà une autre façon de progresser : essayer des choses radicalement différentes. Ce que j'ai appris en Smalltalk a changé ma façon de voir un programme. Ce n'est plus une liste de fichiers, mais des classes et des méthodes qu'on peut browser, et modifier en live.

Dans la même idée, le collègue qui m'avait montré Smalltalk m'a montré Emacs. Et donc je me suis trouvé projeté dans Emacs Lisp, et dans cette éditeur de texte qui peut s'explorer et se modifier lui même. Wow!

À Suivre ?

Voilà le début. Et vous, comment avez-vous appris votre savoir, comment avez-vous progressé ?