[Sondage] Quelle est la meilleure méthode pour apprendre la programmation ?
par
, 01/04/2022 à 09h45 (1166 Affichages)
Forum -► Général Développement -► Débats sur le développement – Le Best Of
[Sondage] Quelle est la meilleure méthode pour apprendre la programmation ?
■ ■ ■ SOMMAIRE DE LA SYNTHÈSE ■ ■ ■AVANT-PROPOS
- Résultats du sondage
- Résultats des avis
- Synthèse et analyse des avis
- Langage (12 avis)
- Motivation (8 avis)
- Algorithmique (3 avis)
- Méthodologie (2 avis)
- Logique (2 avis)
- Expérience (2 avis)
- Conclusion
■ AVANT-PROPOS
La discussion ayant dérapé en querelle d’égos à propos de langages alors que précisément, le sujet ne concernait pas l’apprentissage d’un langage mais la méthode et la logique, ma synthèse occulte ces échanges hors sujet.
Pour donner une idée de ces débats, quelques chiffres suffisent : le langage C a été cité une centaine de fois, le langage C++ 51 fois et le langage Python 19 fois. Mais le typage bat tous les records avec 235 fois. La méthode et la logique qui étaient le vrai sujet de la discussion, n’ont été citées que 8 fois chacune et l’algorithmique 13 fois.
NB : Quelques messages ont été rendus plus lisibles (reformulés, fautes corrigées, mieux présentés).
■ § 1. Résultats du sondage
■ § 2. Résultats des avis
La discussion a recueilli différents avis classés en 6 catégories triées en ordre décroissant :
Conseils 29 AvisLangage 12Motivation 8Algorithmique 3Méthodologie 2Logique 2Expérience 2
■ § 3. Synthèse et analyse des avis
Les types de conseils sont abordés dans l'ordre du nombre d’avis émis. Mes analyses n’engagent que moi en tant qu'informaticien de gestion "périmé". Je regrette par exemple que l’ordre des catégories ne soit pas inversé, c’est-à-dire que la logique ait recueilli le maximum d’avis, puis la méthodologie, l’algorithmique, la motivation et enfin le langage. Je regrette également que les prédispositions ou la vocation n’ait pas été évoquées.
Bien que la discussion ne concerne pas l’apprentissage d’un langage, les avis révèlent que les préoccupations techniques des développeurs sont plus importantes que leurs préoccupations conceptuelles.
■ § 3.1. Langage
■ SYNTHÈSE
■ ANALYSE
Le classement du langage en tête des avis révèle bien que la préoccupation principale des développeurs est avant tout la programmation et non l’analyse, la réalisation et non la conception, les hard skills et non les soft skills.
En réalité, coder n’est pas le gros du boulot. Coder n’est que traduire en langage compréhensible et compilable un ou plusieurs algorithmes. L'intérêt du développement et le gros du boulot c’est de concevoir ces algorithmes.
Coder pour coder n'a aucun intérêt sinon satisfaire son ego. Si c’est le cas, ce n'est pas de la passion, c'est de l'addiction, une dépendance assimilable à celle du jeu. Le codage est presque un pensum. D'autant que cela revient souvent à du simple copier-coller.
La formation à un langage est de l’ordre de la semaine. Le codage se résume pratiquement à la maitrise de quelques instructions. Il n'y a pas de quoi déchainer des passions :
- Lecture
- Écriture
- Condition
- Affectation
- Tant que condition Faire
Air-dex dit très justement qu’il suffit de se concentrer sur les spécificités liées à un langage et sur son paradigme, sans rappeler cependant que l’algorithmique, le solfège du développeur, prime sur le langage.
Un paradigme est une manière de programmer un ordinateur basé sur un ensemble de principes ou une théorie. Il existe différents paradigmes de programmation basés sur des principes ou des théories variés, comme la programmation impérative, la programmation orientée objet, la programmation fonctionnelle, ou la programmation orientée processus. Le choix d'un paradigme de programmation est un des critères principaux pour le choix d'un langage.
Paradigme de programmation (Wikipédia)
Paradigme de programmation (Techno-Sciences.net)
Paradigme de programmation (Philippe Boulanger)
La création au niveau du seul langage, c'est l'élaboration de son environnement de développement, le souci de la lisibilité de son code source par l'adoption de règles d'écriture.
La technicité s’acquiert quand on en a besoin et cela suppose de savoir s’adapter. Miser sur une technicité, c’est devenir une espèce endémique menacée de disparaitre au moindre changement environnemental. Et n’est-ce pas se confiner dans un rôle de simple Ouvrier Spécialisé ? Mais c’est rassurant, la technique a toujours une réponse rationnelle et cela évite de se confronter à ses semblables.
■ § 3.2. Motivation
■ SYNTHÈSE
■ ANALYSE
Devenir développeur est un choix qui suppose à priori la motivation de l’étudiant. Proposer des sujets intéressants proches de la réalité relève d’un savoir-faire pédagogique et ne devrait pas être un sujet. Professionnellement par contre, il ne doit pas être évident d’être confronté à des sujets sans intérêt.
Les problématiques de gestion sont toutes très spécifiques. Il n’est pas évident d’abstraire de leurs développements des tutoriels d’algorithmique originaux, attractifs, représentatifs de la réalité du développement. Parmi plus de 2.000 programmes développés, à peine trois programmes m’ont permis de créer des tutoriels d’algorithmique répondant à ces critères. Le hasard des discussions m’en a inspiré deux autres, soit cinq en tout à ce jour (avril 2023).
■ § 3.3. Algorithmique
■ SYNTHÈSE
ANALYSE
Apprendre l’algorithmique, c’est apprendre à structurer logiquement un programme en devenir. Mais ce n’est pas la même chose d’avoir à coder un programme qui traduit un sujet en moins d’une centaine de lignes et un programme qui traduit une problématique en deux, trois mille lignes, voire davantage.
La démarche intellectuelle est différente et distinguer ces deux approches revient à distinguer deux types de logiques, la logique combinatoire et la logique conceptuelle.
- Dans le premier cas, c’est le pseudo langage ou le langage qui constitue l’objet de la réflexion du programmeur.
L’algorithmique fait appel à la logique combinatoire. L’algorigramme est le terme approprié pour définir sa représentation visuelle.
- Dans le second cas, c’est la problématique qui constitue l’objet de la réflexion du développeur.
L’algorithmique fait appel à la logique conceptuelle. Le logigramme est un terme plus approprié pour définir sa représentation visuelle.
- Algorithmique et logique combinatoire
Le cours d'initiation à l'algorithmique Introduction aux algorigrammes est censé apprendre le concept d'algorigramme, outil visuel pour décrire un algorithme. Ce cours se réfère à la norme ISO 5807 qui officialise ni plus, ni moins, la méthode sauvage des années 60 où l’algorigramme ne décrit pas la problématique mais décrit la solution.
On retrouve cette symbolique algorithmique dans ce normographe des années 60-70 avec d’autres symboles de l’époque comme la carte perforée et la bande magnétique.
- les EXERCICES ALGO (Exercices corrigés pour apprendre l'algorithmique)
- et les SOURCES ALGO (Les meilleures sources algorithmes)
… focalisent la réflexion algorithmique sur le pseudo codage ou le codage de sujets théoriques à base de chiffres, de nombres ou de caractères. La nature de ces sujets ne nécessite aucune réflexion personnelle vis-à-vis des sujets eux-mêmes. Ce sont des sujets mais en aucun cas des problématiques. Dans le monde réel du développement, un algorithme est censé rester au niveau logique des traitements et non décomposer la réflexion au niveau de l’instruction. En traduisant leurs sujets en pseudo langage, ces exercices apprennent à coder et assimilent insidieusement l’algorithme à un programme.
- Algorithmique et logique conceptuelle
La logique conceptuelle se focalise sur la problématique dans sa globalité.
Généralement, les programmes sont constitués de deux parties, une partie Données et une partie Procédurale. La partie Données (DATA DIVISION COBOL, CLAUSE DEFINE SGBD...) qui rassemble les données que doit traiter la partie Procédurale fait appel à une logique dite séquentielle.
La logique conceptuelle concerne la partie Procédurale ; elle analyse la problématique dans sa globalité et reste au niveau logique des traitements. Le codage n’est pas le sujet, la décomposition de la réflexion au niveau de l’instruction reste mentale.
Quand on pratique LCP (Logique de Construction des Programmes), il n'y a pas vraiment de création car c’est la réflexion et l'analyse par traitements qui construisent l’algorithme.
De même qu’un plan diffère d’une dissertation classique à une dissertation juridique, les règles et techniques algorithmiques diffèrent selon la méthodologie de programmation adoptée.
■ § 3.4. Méthodologie
■ SYNTHÈSE
■ ANALYSE
Si l’on excepte la norme ISO 5807 qui n'est pas une méthode, les trois principales méthodologies de programmation sont apparues au début des années 1970 :
- Norme ISO 5807 (méthode sauvage des années 60)
- CORIG - COnception et Réalisation de l’Informatique de Gestion
- LCP - Logique de Construction de Programme
- PS - Programmation Structurée (Arbre programmatique)
La révolution software a pourtant bien eu lieu fin des années 60, début des années 70, avec les méthodologies LCP et CORIG, mais nous ne sommes plus que deux ou trois à en pérenniser le souvenir.
■ § 3.5. Logique
■ SYNTHÈSE
■ ANALYSE
La logique structure le raisonnement censé satisfaire un besoin, encore faut-il comprendre et savoir traduire ce besoin…
- Décoder le besoin de l'utilisateur qui ne sait pas qu'il sait et lui réaliser devant lui son outil informatique qu'il crée lui-même sans le savoir, ça oui, c'est palpitant, et on ne s'en lasse pas…
- Intégrer des paramètres comme l’ergonomie et la convivialité, tenir compte du fait que la plupart des gens zappent et ne lisent pas. Il n’y a pas de recettes pour créer un écran, un état, cela ne s'enseigne pas. C'est également un cheminement personnel ou la spécialité aujourd’hui d’un webdesigner.
- S'intéresser aux gestionnaires plutôt qu'à leur hiérarchie, qui connait certes les règles de gestion mais ignore la façon dont elles sont appliquées. Quel responsable est capable de remplacer l'un(e) de ses gestionnaires derrière son écran ?
Finalement, la logique qui devrait être la qualité essentielle de l’informaticien, est à peine évoquée. Sans doute parce qu’elle ne s’enseigne pas. Chacun possède son raisonnement propre et possède donc sa propre logique. La logique n’a pas de norme, mais elle peut être évaluée par des tests psychotechniques. Plus qu’une qualité, ce serait un don consubstantiel de l’informatique.
On ne peut pas percevoir la programmation uniquement comme l’expertise d’un langage et la mise en œuvre d’un astucieux savoir. La programmation n’est pas un but en soi mais la phase finale et concrète d’une démarche conceptuelle.
"Analyste" et "Programmeur" ne sont plus des qualifications cloisonnées comme autrefois. La conception utilise les mêmes mécanismes intellectuels que la programmation, à un niveau d’abstraction plus élevé. Aujourd’hui, le "développeur" intègre la conception détaillée de l’analyste et la réalisation du programmeur.
La programmation, exige toujours logique, méthodologie, algorithmique, et technicité, mais pas seulement. Elle est impactée par la démarche conceptuelle qui elle, s’alimente d’autonomie, de liberté, de réflexion, de raisonnement, de créativité, de curiosité, d’audace, d’aventure, d’expérimentation, de défi, d’initiative, de prise de risque, d’adrénaline, de responsabilité, de professionnalisme, de nouveauté, d’incertitude, de surprise, de coïncidence, d’opportunité, de passion, de plaisir, de communication, de philosophie, de psychologie, d’empathie...
Ces aptitudes humaines, ces qualités relationnelles, ces savoirs comportementaux… donnent l’agilité nécessaire pour s’adapter et rester performant dans un environnement changeant.
Ce sont des compétences qui créent de la valeur, dans un monde où la valeur ajoutée se situe dans la gestion des interfaces, dans la résolution de situations complexes, dans la conduite du changement, etc.
Ces compétences ou aptitudes, non liées à un contexte technique particulier se nomment des soft skills, par opposition aux compétences purement techniques que l’on nomme des hard skills.
■ § 3.6. Expérience
■ SYNTHÈSE
■ ANALYSE
45 votants, 21 intervenants et seulement deux expériences d’apprentissage de la programmation par des autodidactes. En fait, leur témoignage relève davantage de leur apprentissage des langages que de celui de la programmation proprement dite. Globalement, on peut dire que « Programmation » = « Codage ».
L’apprentissage de la programmation en école (38 %) ou en formation (31 %) ne laisse guère de souvenirs impérissables. Curieusement, l’apprentissage par un formateur (38 % + 31 %) totalise autant de votes qu’avec des tutoriels écrits (69%).
Ces deux témoignages d’apprentissage n’évoquent ni méthodologie, ni acquisition d’un savoir-faire, ni logique, ni réflexion personnelle, conceptuelle, analytique.
Leur discours est essentiellement orienté langage : C, C++, PHP, GUI, MFC, langage de script, Basic, API Windows, multithread, Python, POO.
Il semble que l’apprentissage de la programmation soit un processus difficile à exprimer du point de vue de la logique ou des soft skills, la partie immergée de l’iceberg « développement ».
Personnellement, ma période d’apprentissage s’est étalée de mi-1966, j’avais 18 ans, à mi-1971. Au cours de ces cinq années, j’aurais été successivement « Préparateur de commandes », « Coursier », « Militaire », « Chômeur », à nouveau « Coursier », « Opérateur-Pupitreur » et enfin « programmeur ».
Ce que je retiens de mon apprentissage de la programmation tient en trois mots : prédispositions, détermination, autoformation...
■ § 5. Conclusion
■ Développeur = Analyste + Programmeur
Les développeurs pensent avant tout en programmeur. C’est le langage qu’ils pratiquent qui impacte leur réflexion. Ils adaptent la problématique à leur technicité alors que ce devrait être l’inverse. Il suffit de suivre les discussions sur les forums pour le constater.
Sur le Forum Algorithmes et structures de données, les deux discussions qui m’ont inspiré chacune un tutoriel, sont très révélatrices. Les développeurs ne lisent pas l’énoncé, ils l’interprètent et dégainent du code sans analyser la problématique. C’est tellement vrai que les deux discussions que j’évoque ont été résolues uniquement de façon algorithmique, sans avoir besoin de coder.
■ Logique vs Codage
- La logique traduit une problématique en algorithme.
Autrement dit : l’algorithme décode la problématique.
- Le codage traduit l’algorithme dans un pseudo codage ou un langage de programmation,
Autrement dit : le programme code l’algorithme.
■ Tutoriels de développement
Ces tutoriels sont des tutoriels complets d’analyse-programmation pour lesquels l’objet de la réflexion concerne la problématique et non le codage ou le pseudo codage comme c’est souvent le cas concernant les exercices d’algorithmique.
On enseigne les méthodes d’analyse, l’algorithmique, les langages mais on n’enseigne pas la réflexion. Il appartient à chacun d’instruire et d’enrichir sa propre réflexion. Développer, ne se limite pas à appliquer des recettes rassurantes. Développer, c’est réfléchir par soi-même en utilisant ce que l’on a appris.
Chacun de ces tutoriels commence soit par une anecdote exposant la problématique étudiée, soit par le message du prime posteur sur un forum d’entre-aide. Mis en situation, il convient de s’approprier la problématique et de concevoir sa propre solution avant de s’intéresser au corrigé proposé.
D’autres membres DVP proposent ce genre de tutoriels de développement :
User : [Actualité] Algorithme pour planifier les horaires de travail en équipes
User : Algorithme itératif pour générer les combinaisons de p éléments parmi n
■ Shell, EDI
Étonnamment, aucun intervenant n’a évoqué le shell pas plus que l’outil indispensable du développeur, l’éditeur, et pas davantage l’EDI d’un SGBD. Programmer, c’est écrire un programme, donc utiliser un éditeur ; c’est exécuter un programme, donc utiliser le shell du serveur. Un shell comme Unix est bien plus complexe qu’un langage. Un shell d’exécution peut compter plusieurs centaines de lignes et fait appel à la même logique que pour un programme. Développer dans le cadre d’un SGBD, suppose d’autres connaissances que celle d’un langage comme l’Environnement de Développement Intégré (EDI).