Je vais tenter de donner mon avis sur la question initiale, bien que je n'ai que survolé les autres posts sur le sujet.
J'ai l'impression qu'il y a eu un glissement sur la question. Au début, c'était :
Lors de l'apprentissage, faut-il commencer par la théorie ou par la pratique ?
Mais beaucoup de post que j'ai pu lire étaient plus orientés :
Lorsqu'on est confronté à un nouveau problème, faut-il commencer par une phase de réflexion ou par sa réalisation ?
Je pense que ces questions appellent des réponses différentes. Et pour la première, je dirais : Commencer par la pratique, sans hésiter.
Pourquoi ? Principalement pour deux raison :
Déjà, la théorie, c'est un peu le mythe de Sisyphe, on croit aborder la théorie, on pousse sa pierre, pour finalement se rendre compte en arrivant en haut qu'on ne faisait que mettre en pratique une autre théorie sous-jacente, et on recommence. Appliquer en C++, la théorie sur les langages informatiques nous entraîne vers l'informatique formelle d'un côté, vers l'électronique numérique de l'autre. Faire de la théorie sur l'électronique numérique nous entraînera vers la physique du solide, la physique statistique... Commencer par la théorie me semble impossible à mettre en œuvre pour cette raison théorique.
Et surtout, parce que la théorie est bien plus abstraite et complexe, et que si on n'a pas déjà une certaine compréhension intuitive des concepts manipulés auxquels se raccrocher, le risque d'être submergé est très grand. Je vais prendre quelques exemples :
On a tous commencé les math par apprendre à compter, puis par apprendre à faire des opérations. L'algèbre de Peano vient bien après (et pour beaucoup, elle ne vient même jamais). Et je ne pense pas qu'il soit possible de voir où l'on va avec l'algèbre de Peano si on n'a pas en tête que quelque part, ça sert à définir ce qu'est 3 et ce que signifie 2 + 3.
Quand on étudie une langue vivante, on commence toujours (sauf si on fait de la linguistique, mais c'est une contexte différent) par apprendre plus ou moins par cœur quelques textes basique où l'on apprend à dire bonjour (une sorte de Hello world!
), on étend autour de ces exemples simples, puis seulement après, quand on a un minimum de vocabulaire, on commence à nous parler de la structure grammaticale de la langue en question, et de ses règles de conjugaison, déclinaisons...
Un exemple plus proche de l'informatique : Dans mon école d'ingénieur, à mon époque, on avait un cours de génie logiciel en première année. J'avais déjà fait de la programmation avant, je m'étais déjà cassé les dents sur un programme de plus de 100 lignes, j'ai trouvé ce cours intéressant, il posait les bons concepts. J'en ai discuté avec pas mal d'amis qui n'avaient pas cette expérience préalable, l'avis était unanime : Le cours était simplement pour eux imbattable, incompréhensible et inutile. A tel point qu'ils ont réussi à le faire supprimer de l'enseignement. Il était pour moi simplement mal placé.
Il y a une image que j'aime beaucoup dans le dernier Stroustrup, qui prend à contre pied une idée pré-construite, qui est de dire qu'il faut apprendre à marcher avant d'apprendre à courir. Il fait remarquer que quand on regarde un bébé, il commence par savoir courir (en tombant régulièrement, bien entendu, mais ce n'est pas grave), avant d'apprendre la maîtrise fine et subtile des ses mouvements nécessaire pour marcher.
Je pense qu'en C++, c'est un peu pareil, il faut commencer par des programmes simples, des aspects bassement techniques qui passent par la syntaxe ou la manière de compiler son code. Une fois ces bases apprises, il faut laisser le temps de jouer un peu avec ces programmes simple, en faire des un peu plus complexes, laisser l'étudiant écrire du code spaghetti, lui demander de faire une modification dans son code, le laisser en baver un peu.
Comme ça, quand on lui présentera enfin des outils qui lui permettent d'organiser le code, le principe open-closed, il saura quels sont les enjeux derrière, et il aura la motivation et les prérequis nécessaires pour passer aux aspects plus théoriques.
Pour prendre un ultime exemple, les règles du C++ pour séparer son code en plusieurs fichiers sont, il faut bien l'avouer, tordues, mal faites, antédiluviennes. Pourtant, j'ai vécu leur découverte comme une vraie libération, car j'avais du bosser avec du relativement gros code mono-fichier auparavant. Et à cette époque, je savais déjà (approximativement) la différence entre déclaration et définition, et les notions de classe, fonctions, variables. Du coup, avec la motivation et le bagage nécessaire, je n'ai pas eu de problèmes pour les apprendre, et comprendre ce qui les motivait.
Attention, quand je plaide pour la pratique en premier, je ne plaide pas du tout pour la pratique uniquement ! La théorie est nécessaire à un moment ou à un autre, et la pratique seule ne peut pas permettre de prétendre à une maîtrise suffisante du sujet. Simplement, pour moi, elle vient en second, chronologiquement parlant.
Partager