De nos jours, la programmation devient une compétence de plus en plus essentielle : en tant que designer, connaître quelques bases en programmation peut vous aider à mieux comprendre votre travail ; en tant qu’entrepreneur, le statut de fondateur technique rendra beaucoup de vos tâches plus faciles. Et pour un débutant, face à la multitude d’informations, il se peut qu’il ne sache pas par où commencer ; après avoir passé un apprentissage facile des matériaux de base, il découvre que l’apprentissage devient de plus en plus difficile, la courbe d’apprentissage abrupte le décourage ; vous savez comment afficher du texte sur une page, mais vous ne savez pas quand lancer un vrai projet utile ; vous ne comprenez pas ce que vous ignorez encore, et vous ne savez même pas ce que vous devriez apprendre ensuite.
Le contenu de cet article vous donnera non seulement quelques conseils orientés, mais aussi une introduction à la programmation centrée sur les fondamentaux. Bien sûr, une approche étape par étape n’est pas réaliste, et chacun a ses caractéristiques, donc cette introduction à la programmation vise surtout à susciter la réflexion du lecteur, pour finalement vous aider à élaborer une trajectoire d’apprentissage adaptée à vous-même.
Mais attention : cet article s’adresse à ceux qui veulent vraiment apprendre la programmation — ceux qui ont une forte motivation, qui doivent absolument créer quelque chose de concret, et qui ne lâcheront pas tant qu’ils n’auront pas réussi ; ce n’est pas pour ceux qui pensent simplement que « la programmation a l’air amusante ». À mon avis, ces personnes ne pourront jamais vraiment entrer dans la programmation, encore moins produire quelque chose de valable.
Bien que tout le ton de cet article soit basé sur la philosophie « Opinions fortes, convictions faibles » (Strong Opinions, Weakly Held), le lecteur doit toujours rester sceptique, comme il le ferait avec tout ce qui l’entoure, et remettre en question la précision de ce que nous écrivons. Si vous avez des questions, n’hésitez pas à en discuter publiquement.
Réglage d’état d’esprit
Fixer ses objectifs
Avant de commencer à apprendre la programmation, réfléchissez à vos objectifs. Lorsqu’ils sont clairs, le chemin devient plus évident. Alors, que souhaitez-vous écrire ? Un site web ? Un jeu ? Une application iOS ou Android ? Ou souhaitez-vous automatiser des tâches ennuyeuses pour avoir plus de temps pour profiter du paysage ? Peut-être souhaitez-vous simplement améliorer votre employabilité pour décrocher un bon emploi. Tous ces objectifs sont valables, ils constituent une partie de la motivation pour apprendre la programmation. Sans motivation, il est impossible d’aller loin dans cette longue et parfois monotone aventure d’apprentissage.
Cette vidéo pourrait vous inspirer : « La plupart des écoles n’enseignent pas ce genre de choses »
Ne soyez pas impatient
Une mauvaise programmation est facile. Même les débutants peuvent l’apprendre en 21 jours. Une bonne programmation demande de la réflexion, mais tout le monde peut y parvenir et ressentir la satisfaction extrême qu’elle procure. La programmation médiocre est facile. Même les idiots peuvent l’apprendre en 21 jours. La bonne programmation nécessite de la réflexion, mais tout le monde peut la faire et tout le monde peut expérimenter la satisfaction extrême qu’elle apporte.
Que ce soit en librairie ou en ligne, on voit souvent des livres de type « Apprenez X en 21 jours », qui promettent de vous faire maîtriser une technologie en peu de temps. Matthias Felleisen, dans son ouvrage How to Design Programs, critique cette tendance de manière ironique.
Il n’existe pas de « raccourci » ou de « solution miracle » ; comme le dit un proverbe, maîtriser quelque chose demande 10 ans ou 10 000 heures, c’est-à-dire « aiguiser son épée pendant dix ans ». Il ne faut pas se précipiter, le travail acharné porte ses fruits.
Cultiver l’intérêt
La plupart des bons programmeurs font de la programmation non pas parce qu’ils espèrent être payés ou recevoir des éloges, mais parce que c’est amusant de programmer.
La majorité des grands programmeurs ne font pas de la programmation pour l’argent ou la reconnaissance, mais parce que c’est passionnant.
– Linus Torvalds
Se plonger dans la programmation, c’est avant tout par passion. L’intérêt est une source inépuisable de motivation. Maintenez cette sensation d’intérêt pour pouvoir l’investir dans votre parcours de 10 000 heures / 10 000 heures de pratique. La programmation est une exploration joyeuse. C’est la joie de créer. Voir ses propres œuvres s’afficher à l’écran est fascinant. L’admiration pour votre code, la reconnaissance de votre produit par les autres, l’utilisation de votre produit par vos voisins, ou encore sa discussion dans les médias, tout cela est passionnant. La programmation doit être très amusante ; si ce n’est pas le cas, identifiez le problème qui la rend ennuyeuse, puis résolvez-le.
Commencer à apprendre
Une histoire qui fait réfléchir
Quand j’étais au collège, j’ai commencé à apprendre la programmation. Malheureusement, j’ai lu plusieurs livres populaires à l’époque, comme 21 jours pour maîtriser C++, qui étaient de mauvaises qualités. À l’époque, cela ne m’a pas trop gêné, je pouvais même écrire quelques petits programmes. Mais quand un logiciel plantait, je ne comprenais pas pourquoi, et face à des problèmes plus complexes, je ne savais pas comment faire. Je ne pouvais que lever les épaules face à des bibliothèques qui ne faisaient pas ce que je voulais. Bien que je codais tous les jours, je constatais que ma progression était très lente. Je n’avais qu’une compréhension limitée des concepts d’« itération » et de « récursion », je ne faisais qu’utiliser l’ordinateur comme une calculatrice.
Après être entré à l’université, j’ai étudié la physique. Au début, je mémorisais et récitais des formules physiques sans vraiment comprendre comment elles étaient dérivées, leurs relations ou leur signification. J’apprenais comment résoudre certains problèmes physiques courants, mais je ne comprenais pas le « pourquoi » derrière le « comment ».
Lorsque j’ai essayé de créer des jeux vidéo basés sur la physique, j’ai rencontré à nouveau ces difficultés : face à de nouveaux problèmes, je ne savais pas comment faire, la peur de l’inconnu s’accumulait, et je commençais à fuir, à ne pas vraiment comprendre, en espérant pouvoir copier-coller des solutions via Google. Heureusement, un cours de deux heures a complètement changé ma façon d’apprendre. C’était la première fois que je ressentais une sorte de « révélation », et j’ai pris conscience que je ne comprenais que très peu de choses dans certains domaines, y compris la physique que j’étudiais et l’informatique que je complétais.
Ce cours : à l’époque, nous venions de finir d’étudier l’électromagnétisme et la relativité restreinte. Le professeur a écrit sur le tableau ces deux sujets, puis a tracé une ligne pour les relier. « Supposons qu’un électron se déplace le long d’un fil à une vitesse relativiste… » Au début, il écrivait simplement les formules classiques d’électromagnétisme et de relativité, mais après plusieurs dérivations algébriques, la formule du champ magnétique est mystérieusement apparue. Bien que je connaisse cette formule depuis des années, je ne comprenais pas à l’époque la relation profonde entre ces phénomènes. La différence entre magnétisme et électricité n’était qu’une question de « point de vue ». J’ai soudain compris : à partir de ce moment, je ne me suis plus contenté de demander « comment faire (How) », mais j’ai commencé à demander « pourquoi (why) », à revenir aux bases, à apprendre ces éléments fondamentaux que j’aurais dû étudier sérieusement. Ce retour en arrière a été douloureux, j’espère que cela vous alertera : ne faites jamais cette erreur.
Réflexion après éveil
Ce diagramme est tiré de l’ouvrage Gödel, Escher, Bach de Douglas Hofstadter. Chaque lettre est composée d’autres lettres plus petites. Au niveau supérieur, on voit « MU », la lettre M étant constituée de trois concepts d’holisme, et U étant constitué d’un réductionnisme. Chaque lettre contient l’autre, et vice versa. Au niveau le plus bas, la plus petite lettre est elle-même composée de « MU » répété.
Chaque niveau d’abstraction contient de l’information. Si vous ne regardez qu’en utilisant une vision holistique au sommet ou une vision réductionniste au niveau le plus bas, vous n’obtiendrez que « MU » (dans certains dialectes, « mu » signifie « rien »). La question est : comment obtenir le plus d’informations possibles à chaque niveau ? Ou, autrement dit, comment apprendre dans un domaine complexe comme la programmation, qui contient de nombreux savoirs ?
Un problème clé dans l’éducation et l’apprentissage : les débutants ont souvent des objectifs trop orientés vers la vision holistique, en négligeant les bases. Par exemple, ils veulent construire un robot, mais ne comprennent pas la physique sous-jacente, ni l’électronique, ni la servo-mécanique, ni les capteurs. Ce processus ne suscite pas d’intérêt.
Il y a deux pièges majeurs pour les débutants :
Si un débutant ne manipule que des « moteurs et composants » préfabriqués (sans comprendre leur principe de construction), cela limitera fortement sa capacité à en construire plus tard, et il sera incapable de diagnostiquer ou de résoudre des problèmes.
Le second piège est moins évident : la méthode « holistique » naïve peut parfois sembler efficace, mais elle est trompeuse. Après un ou deux ans, lorsque vous aurez avancé dans votre apprentissage, revenir en arrière pour « renforcer les bases » sera très difficile psychologiquement. Il faudra abandonner des idées préconçues, et avancer lentement et patiemment, ce qui sera beaucoup plus difficile que d’apprendre les bases dès le début.
Mais il ne faut pas non plus tomber dans l’excès inverse, en se perdant dans le réductionnisme. Tenter de tout faire en théorie dès le début, c’est risqué : cela peut devenir ennuyeux, et vous risquez de perdre votre motivation. Ce genre de situation arrive souvent chez les étudiants en informatique.
Pour mieux comprendre, on peut comparer l’apprentissage de la programmation à celui de la cuisine : vous achetez des livres de recettes pour cuisiner de bons plats. Si vous souhaitez simplement faire à manger pour votre famille, c’est une bonne idée. En suivant les recettes, vous pouvez faire de bons plats. Mais si vous voulez impressionner vos amis, préparer des plats exceptionnels, voire devenir un grand chef, vous devez comprendre la logique derrière ces recettes, leur théorie, et pas seulement suivre aveuglément. Si chaque jour, votre seul travail consiste à lire des livres de théorie épais, sans pratique, vous ne deviendrez qu’un mauvais cuisinier, voire vous abandonnerez la cuisine à cause de l’ennui. En résumé, la programmation est le lien entre théorie et pratique, un domaine où la science informatique et la technologie appliquée se croisent. La bonne méthode d’apprentissage consiste à explorer de haut en bas par la pratique de projets, pour développer une intuition et une motivation, et à construire une base solide en partant du bas, pour comprendre les principes fondamentaux de la programmation.
En tant que débutant, privilégiez la démarche descendante, avec un soutien en approche ascendante.
Bases de la conception de programmes
« Quelle langue de programmation apprendre en premier ? » C’est souvent la première question des débutants, mais c’est une erreur. La première question devrait plutôt être : « Quelles sont les bases qui constituent l’apprentissage de la programmation ? »
Il y a trois éléments clés à la base de la pyramide des connaissances en programmation :
La pensée algorithmique : par exemple, comment trouver le plus grand nombre dans une liste ? D’abord, il faut avoir une variable maxSoFar, puis pour chaque nombre…
La syntaxe : comment exprimer ces algorithmes dans un langage de programmation pour que l’ordinateur comprenne.
Les fondamentaux du système : pourquoi la boucle while(1) ne se termine jamais ? Pourquoi la fonction int *foo() { int x = 0; return &x; } est-elle impossible à utiliser ?
Pour les débutants en phase d’initiation, choisir le langage C comme premier langage est difficile et ennuyeux, car ils doivent apprendre ces trois aspects en même temps, ce qui demande beaucoup de temps avant de pouvoir faire quelque chose.
Ainsi, pour minimiser l’apprentissage de la syntaxe et des fondamentaux du système, il est conseillé d’utiliser Python comme premier langage. Bien que Python soit très convivial pour les débutants, cela ne signifie pas que c’est un simple « jouet ». Dans de grands projets, on voit aussi sa puissance et sa flexibilité. Après avoir maîtrisé Python, apprendre le C est une bonne étape : cela vous aidera à penser en termes proches du matériel, et à comprendre certains principes du système d’exploitation.
Voici une introduction recommandée pour la phase d’initiation : en la complétant, vous construirez une vision globale pour guider votre exploration descendante. Les matériaux ci-dessous n’ont pas d’ordre strict, choisissez celui qui vous convient, et si vous bloquez, n’hésitez pas à changer de ressource.
MIT 6.00.1x (Introduction à l’informatique et à la programmation en Python) : bien que ce cours utilise Python comme langage d’enseignement, c’est une excellente introduction qui insiste sur les concepts et paradigmes fondamentaux de l’informatique, pas seulement sur un langage spécifique. Si vous n’êtes pas en filière informatique, cela vous ouvrira l’esprit en autodidacte ; contenu : concepts de calcul, programmation Python, structures de données simples, algorithmes, tests et débogage.
Harvard CS50x (Informatique, Harvard) : également une introduction, complémentaire à celle du MIT. Langages enseignés : C, PHP, JavaScript + SQL, HTML + CSS. La portée et la profondeur sont très raisonnables, et vous pourrez découvrir des avancées technologiques récentes, ce qui stimule l’intérêt pour l’informatique. Tâche supplémentaire : lire Coding.
Après cette étape d’initiation, vous aurez acquis une certaine expérience en codage et une compréhension de base de la programmation. Vous pourriez alors vouloir apprendre une technologie spécifique, comme le développement web, Android ou iOS. Essayez de faire des projets simples, pour vous donner des retours positifs et renforcer votre motivation. Mais ne vous lancez pas dans des détails trop complexes, car ces technologies ont beaucoup de subtilités, et vous aurez le temps de les apprendre plus tard. Ne vous perdez pas non plus dans des frameworks ou langages très spécialisés pour l’instant. C’est le moment d’apprendre les bases de l’informatique, pas de chercher des raccourcis pour apprendre directement ce que vous souhaitez.
Que faire concrètement à ce stade ? Réfléchissez à vos anciens programmes, demandez-vous pourquoi vous avez conçu votre code de cette façon, comment faire mieux, et cherchez à comprendre l’essence de la programmation : utiliser l’ordinateur pour résoudre des problèmes.
Hypothèses :
X = temps consacré à la réflexion pour trouver une solution, c’est-à-dire « résoudre un problème »
Y = temps consacré à écrire le code, c’est-à-dire « utiliser l’ordinateur »
Capacité de programmation = F(X, Y) (X > Y)
Pour améliorer cette capacité, il faut optimiser X, Y, et la fonction F(X, Y). Peu de livres abordent ces trois aspects simultanément, mais Structure and Interpretation of Computer Programs (SICP) y parvient. Il indique ces trois directions. Avant de lire SICP, vous pouvez déjà résoudre des problèmes simples avec quelques fonctions. Après lecture, vous apprendrez à abstraire et décomposer les problèmes, ce qui constitue un saut qualitatif énorme dans la capacité de programmation. Cela changera fondamentalement votre façon de penser et de résoudre des problèmes avec du code. De plus, SICP utilise Scheme, un langage fonctionnel simple, pour vous initier à la programmation fonctionnelle. Sa syntaxe est très simple, vous pourrez l’apprendre rapidement, et consacrer plus de temps à comprendre la philosophie de la programmation et la résolution de problèmes complexes.
Peter Norvig a écrit une critique très intéressante de SICP, dont voici un extrait :
Pour faire une analogie, si SICP parlait d’automobiles, ce serait pour ceux qui veulent comprendre comment fonctionnent les voitures, comment elles sont construites, et comment concevoir des véhicules économes en carburant, sûrs et fiables pour le 21ème siècle. Ceux qui détestent SICP sont ceux qui veulent juste apprendre à conduire sur l’autoroute, comme tout le monde.
Si vous faites partie des premiers, lire SICP sera une étape clé pour relier votre initiation et votre apprentissage avancé.
Bien que SICP soit un « livre d’introduction », il présente un certain défi pour les débutants. Voici quelques ressources très utiles :
Udacity CS212 Design of Computer Program : enseigné par Peter Norvig, chef de recherche chez Google, en Python, avec un contenu assez difficile.
How to Design Programs, Second Edition : moins avancé que SICP, avec un contenu pédagogique, idéal pour les débutants. Si SICP semble trop difficile, commencez par celui-ci.
Vidéos de cours SICP de UC Berkeley et enregistrements des deux auteurs formant des employés chez Hewlett-Packard (en chinois).
Composing Programs : une introduction à la programmation inspirée de SICP, utilisant Python, avec quelques petits projets.
Collection d’exercices SICP : pour les exercices à la fin du livre, les débutants doivent s’efforcer de les faire.
Après cette étape, vous construirez progressivement un modèle de conception de programmes. Votre esprit ne sera plus un chaos, vous réaliserez que mémoriser bibliothèques et syntaxe ne suffit pas pour résoudre des problèmes. Vous saurez ce qu’il faut apprendre ensuite, et votre vision sera plus claire. C’est le vrai début de la pratique de projets, un moment idéal pour renforcer votre motivation. Concernant la pratique de projets : pour un débutant, participer à des projets open source est encore prématuré. Commencez par des projets simples, comme créer un site web et le maintenir, ou développer un petit jeu, puis l’étendre. Si vous avez des idées floues, suivez L’Atelier de la Forge ou choisissez un projet dans la Mega Project List qui vous plaît.
Si vous pensez que SICP est trop difficile, ne vous forcez pas. Passez à autre chose, et continuez votre parcours classique : commencez par The Elements of Computing Systems. Ce livre vous apprendra à construire un ordinateur à partir de la porte NAND, jusqu’à son bon fonctionnement. Je ne vais pas entrer dans les détails, mais ce livre sera votre compagnon tout au long de votre initiation à la programmation. Votre objectif à ce stade est de terminer tous les projets de ce livre (y compris un compilateur minimal et un système d’exploitation).
Pour maîtriser complètement ce livre, renforcer vos bases, et préparer l’avenir, voici quelques autres ressources (sans ordre strict) :
Fondamentaux des systèmes informatiques
Après avoir acquis les bases de la conception de programmes, si vous souhaitez approfondir la compréhension de l’informatique, jetez un œil à Computer Systems: A Programmer’s Perspective, 3/E (Deep Understanding of Computer Systems). La traduction française est souvent critiquée, mais en réalité, ce n’est pas vraiment une « compréhension approfondie » ; c’est simplement le manuel de CMU’s Introduction to Computer Systems. La spécialité de CMU est plutôt orientée logiciel, et ce livre décrit en détail comment un programme s’exécute dans un système informatique, en adoptant la perspective du programmeur, en expliquant le fonctionnement interne des systèmes.
Si la lecture vous paraît sèche, vous pouvez suivre le MOOC The Hardware/Software Interface sur Coursera, qui est une sous-partie de CSAPP, avec les expériences clés adaptées. Vous pouvez aussi relire The C Programming Language pour revoir les bases du C.
Après avoir terminé ce livre, vous aurez une base solide en systèmes, et vous serez prêt à étudier les systèmes d’exploitation, les compilateurs, les réseaux, etc. En étudiant des sujets plus avancés, parcourir certains chapitres de ce livre et implémenter les exemples en code vous donnera une compréhension plus intuitive, et vous permettra de maîtriser aussi bien la conception que la mise en œuvre, en visualisant le flux de données dans le réseau, la mémoire, le cache, le CPU.
Bases des structures de données et des algorithmes
Aujourd’hui, beaucoup pensent que la programmation (notamment pour le développement web) consiste surtout à utiliser le code des autres, et à exprimer leurs idées de façon claire et simple, plutôt que de maîtriser des mathématiques et des algorithmes complexes. Les fonctions de tri, de recherche binaire, etc., sont déjà intégrées dans les langages. On se demande : « À quoi ça sert d’apprendre ces choses ? » ou « Je ne les utiliserai jamais dans mon travail ». Cette mentalité utilitariste est à éviter. Sans une base théorique solide, on finira tôt ou tard par rencontrer des limites.
Les structures de données et les algorithmes vont de pair. En phase d’initiation, vous devriez surtout savoir : quel algorithme ou quelle structure de données utiliser pour résoudre un problème rapidement. Cela implique de connaître bien ces structures et algorithmes, et de pouvoir les écrire à la main, sur papier, pour aller plus vite. Pour ce que vous ne comprenez pas, cherchez à savoir à quoi ça sert, dans quel contexte on l’utilise.
Ressources recommandées :
Introduction to Algorithms : certains disent de ne pas le prendre comme livre d’initiation, mais en réalité, ce n’est pas un livre pour débutants. Son titre est Introduction to Algorithms, mais c’est surtout parce que l’auteur ne voulait pas le confondre avec d’autres livres. On peut le lire en sautant les exercices et démonstrations la première fois. Si vous avez encore des doutes, lisez d’abord Data Structures and Algorithm Analysis.
Algorithms: Design and Analysis [Part 1] & [Part 2] : cours Stanford, sans limite de langage, ces deux parties suffisent pour avoir une bonne base en algorithmes. Si votre anglais est faible, vous pouvez aussi regarder Introduction to Algorithms du MIT.
En phase d’initiation, il est aussi utile de pratiquer avec des algorithmes classiques pour résoudre de petits problèmes, en combinant avec la partie SICP précédente. Par exemple : Programming Pearls, The Practice of Programming.
Autres bases
Quelques points souvent négligés en phase d’initiation à la programmation :
Apprenez à poser des questions : vous rencontrerez forcément des problèmes, il faut savoir utiliser efficacement les moteurs de recherche. Quand la recherche ne suffit pas, posez des questions sur Stack Overflow ou Zhihu. Avant, lisez cet article : Comment poser une question efficace.
Ne soyez pas un loup solitaire : échangez avec d’autres, créez un site personnel, tenez un blog pour noter vos idées. Abonnez-vous à des blogs de programmation que vous aimez, par exemple : Joel on Software, Peter Norvig, Coding Horror.
Apprenez bien l’anglais : c’est votre principal outil pour accéder à des ressources de qualité. Mais au début, la traduction des livres n’est pas si mauvaise, faites selon votre situation.
Conclusion
Ne soyez pas effrayé par tout cela. L’entrée en programmation ne se résume pas à quelques semaines de petits projets. Vous rencontrerez de nombreux obstacles, mais utilisez la technique de Feynman : décomposez les difficultés en petites parties, traitez-les une par une, puis expliquez-les clairement à quelqu’un pour vérifier votre compréhension. Il y aura toujours des problèmes que vous ne pourrez pas résoudre immédiatement, mais ne vous forcez pas. Souvent, en y revenant plus tard, tout deviendra clair.
N’oubliez pas non plus d’autres livres précieux, à lire et relire à chaque étape, comme ceux figurant dans la liste des incontournables sur Stack Overflow, notamment :
Code Complete : pour les programmeurs expérimentés ou débutants, ce livre comble les lacunes en connaissances. Pour les débutants, consultez les chapitres sur la gestion des variables, les tests, la personnalité.
The Pragmatic Programmer : considéré comme le « bible » du code, il couvre tout, de DRY à KISS, de la philosophie à la pratique.
Son auteur, Dave, écrit en ouverture :
Vous êtes un programmeur pragmatique. Vous n’êtes attaché à aucune technologie particulière, mais vous avez une connaissance large de la science, et votre expérience pratique vous permet de choisir de bonnes solutions selon la situation. La théorie et la pratique se combinent pour vous rendre fort. Vous adaptez votre approche en permanence, en fonction des circonstances. Et vous faites cela tout au long du projet. Les programmeurs pragmatiques accomplissent leur travail, et le font bien.
Ce paragraphe, ainsi que la philosophie de The Pragmatic Bookshelf, m’ont toujours influencé. C’est pourquoi j’ai voulu suivre cette idée dans ce guide, pour vous guider et vous encourager à devenir un vrai programmeur pragmatique.
Postface
Si vous parvenez à réaliser toutes ces étapes, félicitations : vous avez véritablement franchi le cap de l’initiation à la programmation. Cela signifie qu’à l’avenir, vous n’aurez plus peur d’apprendre de nouveaux langages, ni des API complexes, ni des technologies spécifiques. Vous trouverez cela plus facile qu’avant. Bien sûr, pour maîtriser tout cela, il faudra beaucoup pratiquer : votre dos pourra encore faire mal, marcher sera encore difficile, et vous ne pourrez pas monter au 5ème étage d’un seul coup. Mais je vous garantis un changement mental profond, une grande confiance en vous. Vos enseignants, vos collègues, et même CSDN auront un regard plus subtil sur vous. Même si vous n’êtes qu’un débutant, vous serez déjà un « haut-fonctionnaire » dans le monde de l’esprit du programmeur. Non, je me suis trompé : même un « haut-fonctionnaire » n’a pas une force mentale extraordinaire, il doute aussi de lui-même, et pense que sans argent, il n’est rien. Mais en suivant ce guide et en lisant attentivement, vous ressentirez la sensation d’être au sommet.
()(
Voir l'original
Cette page peut inclure du contenu de tiers fourni à des fins d'information uniquement. Gate ne garantit ni l'exactitude ni la validité de ces contenus, n’endosse pas les opinions exprimées, et ne fournit aucun conseil financier ou professionnel à travers ces informations. Voir la section Avertissement pour plus de détails.
Guide d'introduction à la programmation - Plateforme d'échange de cryptomonnaies
Guide d’initiation à la programmation
Préface
De nos jours, la programmation devient une compétence de plus en plus essentielle : en tant que designer, connaître quelques bases en programmation peut vous aider à mieux comprendre votre travail ; en tant qu’entrepreneur, le statut de fondateur technique rendra beaucoup de vos tâches plus faciles. Et pour un débutant, face à la multitude d’informations, il se peut qu’il ne sache pas par où commencer ; après avoir passé un apprentissage facile des matériaux de base, il découvre que l’apprentissage devient de plus en plus difficile, la courbe d’apprentissage abrupte le décourage ; vous savez comment afficher du texte sur une page, mais vous ne savez pas quand lancer un vrai projet utile ; vous ne comprenez pas ce que vous ignorez encore, et vous ne savez même pas ce que vous devriez apprendre ensuite.
Le contenu de cet article vous donnera non seulement quelques conseils orientés, mais aussi une introduction à la programmation centrée sur les fondamentaux. Bien sûr, une approche étape par étape n’est pas réaliste, et chacun a ses caractéristiques, donc cette introduction à la programmation vise surtout à susciter la réflexion du lecteur, pour finalement vous aider à élaborer une trajectoire d’apprentissage adaptée à vous-même.
Mais attention : cet article s’adresse à ceux qui veulent vraiment apprendre la programmation — ceux qui ont une forte motivation, qui doivent absolument créer quelque chose de concret, et qui ne lâcheront pas tant qu’ils n’auront pas réussi ; ce n’est pas pour ceux qui pensent simplement que « la programmation a l’air amusante ». À mon avis, ces personnes ne pourront jamais vraiment entrer dans la programmation, encore moins produire quelque chose de valable.
Bien que tout le ton de cet article soit basé sur la philosophie « Opinions fortes, convictions faibles » (Strong Opinions, Weakly Held), le lecteur doit toujours rester sceptique, comme il le ferait avec tout ce qui l’entoure, et remettre en question la précision de ce que nous écrivons. Si vous avez des questions, n’hésitez pas à en discuter publiquement.
Réglage d’état d’esprit
Fixer ses objectifs
Avant de commencer à apprendre la programmation, réfléchissez à vos objectifs. Lorsqu’ils sont clairs, le chemin devient plus évident. Alors, que souhaitez-vous écrire ? Un site web ? Un jeu ? Une application iOS ou Android ? Ou souhaitez-vous automatiser des tâches ennuyeuses pour avoir plus de temps pour profiter du paysage ? Peut-être souhaitez-vous simplement améliorer votre employabilité pour décrocher un bon emploi. Tous ces objectifs sont valables, ils constituent une partie de la motivation pour apprendre la programmation. Sans motivation, il est impossible d’aller loin dans cette longue et parfois monotone aventure d’apprentissage.
Cette vidéo pourrait vous inspirer : « La plupart des écoles n’enseignent pas ce genre de choses »
Ne soyez pas impatient
Une mauvaise programmation est facile. Même les débutants peuvent l’apprendre en 21 jours. Une bonne programmation demande de la réflexion, mais tout le monde peut y parvenir et ressentir la satisfaction extrême qu’elle procure. La programmation médiocre est facile. Même les idiots peuvent l’apprendre en 21 jours. La bonne programmation nécessite de la réflexion, mais tout le monde peut la faire et tout le monde peut expérimenter la satisfaction extrême qu’elle apporte.
Que ce soit en librairie ou en ligne, on voit souvent des livres de type « Apprenez X en 21 jours », qui promettent de vous faire maîtriser une technologie en peu de temps. Matthias Felleisen, dans son ouvrage How to Design Programs, critique cette tendance de manière ironique.
Il n’existe pas de « raccourci » ou de « solution miracle » ; comme le dit un proverbe, maîtriser quelque chose demande 10 ans ou 10 000 heures, c’est-à-dire « aiguiser son épée pendant dix ans ». Il ne faut pas se précipiter, le travail acharné porte ses fruits.
Cultiver l’intérêt
La plupart des bons programmeurs font de la programmation non pas parce qu’ils espèrent être payés ou recevoir des éloges, mais parce que c’est amusant de programmer.
La majorité des grands programmeurs ne font pas de la programmation pour l’argent ou la reconnaissance, mais parce que c’est passionnant.
– Linus Torvalds
Se plonger dans la programmation, c’est avant tout par passion. L’intérêt est une source inépuisable de motivation. Maintenez cette sensation d’intérêt pour pouvoir l’investir dans votre parcours de 10 000 heures / 10 000 heures de pratique. La programmation est une exploration joyeuse. C’est la joie de créer. Voir ses propres œuvres s’afficher à l’écran est fascinant. L’admiration pour votre code, la reconnaissance de votre produit par les autres, l’utilisation de votre produit par vos voisins, ou encore sa discussion dans les médias, tout cela est passionnant. La programmation doit être très amusante ; si ce n’est pas le cas, identifiez le problème qui la rend ennuyeuse, puis résolvez-le.
Commencer à apprendre
Une histoire qui fait réfléchir
Quand j’étais au collège, j’ai commencé à apprendre la programmation. Malheureusement, j’ai lu plusieurs livres populaires à l’époque, comme 21 jours pour maîtriser C++, qui étaient de mauvaises qualités. À l’époque, cela ne m’a pas trop gêné, je pouvais même écrire quelques petits programmes. Mais quand un logiciel plantait, je ne comprenais pas pourquoi, et face à des problèmes plus complexes, je ne savais pas comment faire. Je ne pouvais que lever les épaules face à des bibliothèques qui ne faisaient pas ce que je voulais. Bien que je codais tous les jours, je constatais que ma progression était très lente. Je n’avais qu’une compréhension limitée des concepts d’« itération » et de « récursion », je ne faisais qu’utiliser l’ordinateur comme une calculatrice.
Après être entré à l’université, j’ai étudié la physique. Au début, je mémorisais et récitais des formules physiques sans vraiment comprendre comment elles étaient dérivées, leurs relations ou leur signification. J’apprenais comment résoudre certains problèmes physiques courants, mais je ne comprenais pas le « pourquoi » derrière le « comment ».
Lorsque j’ai essayé de créer des jeux vidéo basés sur la physique, j’ai rencontré à nouveau ces difficultés : face à de nouveaux problèmes, je ne savais pas comment faire, la peur de l’inconnu s’accumulait, et je commençais à fuir, à ne pas vraiment comprendre, en espérant pouvoir copier-coller des solutions via Google. Heureusement, un cours de deux heures a complètement changé ma façon d’apprendre. C’était la première fois que je ressentais une sorte de « révélation », et j’ai pris conscience que je ne comprenais que très peu de choses dans certains domaines, y compris la physique que j’étudiais et l’informatique que je complétais.
Ce cours : à l’époque, nous venions de finir d’étudier l’électromagnétisme et la relativité restreinte. Le professeur a écrit sur le tableau ces deux sujets, puis a tracé une ligne pour les relier. « Supposons qu’un électron se déplace le long d’un fil à une vitesse relativiste… » Au début, il écrivait simplement les formules classiques d’électromagnétisme et de relativité, mais après plusieurs dérivations algébriques, la formule du champ magnétique est mystérieusement apparue. Bien que je connaisse cette formule depuis des années, je ne comprenais pas à l’époque la relation profonde entre ces phénomènes. La différence entre magnétisme et électricité n’était qu’une question de « point de vue ». J’ai soudain compris : à partir de ce moment, je ne me suis plus contenté de demander « comment faire (How) », mais j’ai commencé à demander « pourquoi (why) », à revenir aux bases, à apprendre ces éléments fondamentaux que j’aurais dû étudier sérieusement. Ce retour en arrière a été douloureux, j’espère que cela vous alertera : ne faites jamais cette erreur.
Réflexion après éveil
Ce diagramme est tiré de l’ouvrage Gödel, Escher, Bach de Douglas Hofstadter. Chaque lettre est composée d’autres lettres plus petites. Au niveau supérieur, on voit « MU », la lettre M étant constituée de trois concepts d’holisme, et U étant constitué d’un réductionnisme. Chaque lettre contient l’autre, et vice versa. Au niveau le plus bas, la plus petite lettre est elle-même composée de « MU » répété.
Chaque niveau d’abstraction contient de l’information. Si vous ne regardez qu’en utilisant une vision holistique au sommet ou une vision réductionniste au niveau le plus bas, vous n’obtiendrez que « MU » (dans certains dialectes, « mu » signifie « rien »). La question est : comment obtenir le plus d’informations possibles à chaque niveau ? Ou, autrement dit, comment apprendre dans un domaine complexe comme la programmation, qui contient de nombreux savoirs ?
Un problème clé dans l’éducation et l’apprentissage : les débutants ont souvent des objectifs trop orientés vers la vision holistique, en négligeant les bases. Par exemple, ils veulent construire un robot, mais ne comprennent pas la physique sous-jacente, ni l’électronique, ni la servo-mécanique, ni les capteurs. Ce processus ne suscite pas d’intérêt.
Il y a deux pièges majeurs pour les débutants :
Mais il ne faut pas non plus tomber dans l’excès inverse, en se perdant dans le réductionnisme. Tenter de tout faire en théorie dès le début, c’est risqué : cela peut devenir ennuyeux, et vous risquez de perdre votre motivation. Ce genre de situation arrive souvent chez les étudiants en informatique.
Pour mieux comprendre, on peut comparer l’apprentissage de la programmation à celui de la cuisine : vous achetez des livres de recettes pour cuisiner de bons plats. Si vous souhaitez simplement faire à manger pour votre famille, c’est une bonne idée. En suivant les recettes, vous pouvez faire de bons plats. Mais si vous voulez impressionner vos amis, préparer des plats exceptionnels, voire devenir un grand chef, vous devez comprendre la logique derrière ces recettes, leur théorie, et pas seulement suivre aveuglément. Si chaque jour, votre seul travail consiste à lire des livres de théorie épais, sans pratique, vous ne deviendrez qu’un mauvais cuisinier, voire vous abandonnerez la cuisine à cause de l’ennui. En résumé, la programmation est le lien entre théorie et pratique, un domaine où la science informatique et la technologie appliquée se croisent. La bonne méthode d’apprentissage consiste à explorer de haut en bas par la pratique de projets, pour développer une intuition et une motivation, et à construire une base solide en partant du bas, pour comprendre les principes fondamentaux de la programmation.
En tant que débutant, privilégiez la démarche descendante, avec un soutien en approche ascendante.
Bases de la conception de programmes
« Quelle langue de programmation apprendre en premier ? » C’est souvent la première question des débutants, mais c’est une erreur. La première question devrait plutôt être : « Quelles sont les bases qui constituent l’apprentissage de la programmation ? »
Il y a trois éléments clés à la base de la pyramide des connaissances en programmation :
int *foo() { int x = 0; return &x; }est-elle impossible à utiliser ?Pour les débutants en phase d’initiation, choisir le langage C comme premier langage est difficile et ennuyeux, car ils doivent apprendre ces trois aspects en même temps, ce qui demande beaucoup de temps avant de pouvoir faire quelque chose.
Ainsi, pour minimiser l’apprentissage de la syntaxe et des fondamentaux du système, il est conseillé d’utiliser Python comme premier langage. Bien que Python soit très convivial pour les débutants, cela ne signifie pas que c’est un simple « jouet ». Dans de grands projets, on voit aussi sa puissance et sa flexibilité. Après avoir maîtrisé Python, apprendre le C est une bonne étape : cela vous aidera à penser en termes proches du matériel, et à comprendre certains principes du système d’exploitation.
Voici une introduction recommandée pour la phase d’initiation : en la complétant, vous construirez une vision globale pour guider votre exploration descendante. Les matériaux ci-dessous n’ont pas d’ordre strict, choisissez celui qui vous convient, et si vous bloquez, n’hésitez pas à changer de ressource.
MIT 6.00.1x (Introduction à l’informatique et à la programmation en Python) : bien que ce cours utilise Python comme langage d’enseignement, c’est une excellente introduction qui insiste sur les concepts et paradigmes fondamentaux de l’informatique, pas seulement sur un langage spécifique. Si vous n’êtes pas en filière informatique, cela vous ouvrira l’esprit en autodidacte ; contenu : concepts de calcul, programmation Python, structures de données simples, algorithmes, tests et débogage.
Harvard CS50x (Informatique, Harvard) : également une introduction, complémentaire à celle du MIT. Langages enseignés : C, PHP, JavaScript + SQL, HTML + CSS. La portée et la profondeur sont très raisonnables, et vous pourrez découvrir des avancées technologiques récentes, ce qui stimule l’intérêt pour l’informatique. Tâche supplémentaire : lire Coding.
Après cette étape d’initiation, vous aurez acquis une certaine expérience en codage et une compréhension de base de la programmation. Vous pourriez alors vouloir apprendre une technologie spécifique, comme le développement web, Android ou iOS. Essayez de faire des projets simples, pour vous donner des retours positifs et renforcer votre motivation. Mais ne vous lancez pas dans des détails trop complexes, car ces technologies ont beaucoup de subtilités, et vous aurez le temps de les apprendre plus tard. Ne vous perdez pas non plus dans des frameworks ou langages très spécialisés pour l’instant. C’est le moment d’apprendre les bases de l’informatique, pas de chercher des raccourcis pour apprendre directement ce que vous souhaitez.
Que faire concrètement à ce stade ? Réfléchissez à vos anciens programmes, demandez-vous pourquoi vous avez conçu votre code de cette façon, comment faire mieux, et cherchez à comprendre l’essence de la programmation : utiliser l’ordinateur pour résoudre des problèmes.
Hypothèses :
X = temps consacré à la réflexion pour trouver une solution, c’est-à-dire « résoudre un problème »
Y = temps consacré à écrire le code, c’est-à-dire « utiliser l’ordinateur »
Capacité de programmation = F(X, Y) (X > Y)
Pour améliorer cette capacité, il faut optimiser X, Y, et la fonction F(X, Y). Peu de livres abordent ces trois aspects simultanément, mais Structure and Interpretation of Computer Programs (SICP) y parvient. Il indique ces trois directions. Avant de lire SICP, vous pouvez déjà résoudre des problèmes simples avec quelques fonctions. Après lecture, vous apprendrez à abstraire et décomposer les problèmes, ce qui constitue un saut qualitatif énorme dans la capacité de programmation. Cela changera fondamentalement votre façon de penser et de résoudre des problèmes avec du code. De plus, SICP utilise Scheme, un langage fonctionnel simple, pour vous initier à la programmation fonctionnelle. Sa syntaxe est très simple, vous pourrez l’apprendre rapidement, et consacrer plus de temps à comprendre la philosophie de la programmation et la résolution de problèmes complexes.
Peter Norvig a écrit une critique très intéressante de SICP, dont voici un extrait :
Pour faire une analogie, si SICP parlait d’automobiles, ce serait pour ceux qui veulent comprendre comment fonctionnent les voitures, comment elles sont construites, et comment concevoir des véhicules économes en carburant, sûrs et fiables pour le 21ème siècle. Ceux qui détestent SICP sont ceux qui veulent juste apprendre à conduire sur l’autoroute, comme tout le monde.
Si vous faites partie des premiers, lire SICP sera une étape clé pour relier votre initiation et votre apprentissage avancé.
Bien que SICP soit un « livre d’introduction », il présente un certain défi pour les débutants. Voici quelques ressources très utiles :
Après cette étape, vous construirez progressivement un modèle de conception de programmes. Votre esprit ne sera plus un chaos, vous réaliserez que mémoriser bibliothèques et syntaxe ne suffit pas pour résoudre des problèmes. Vous saurez ce qu’il faut apprendre ensuite, et votre vision sera plus claire. C’est le vrai début de la pratique de projets, un moment idéal pour renforcer votre motivation. Concernant la pratique de projets : pour un débutant, participer à des projets open source est encore prématuré. Commencez par des projets simples, comme créer un site web et le maintenir, ou développer un petit jeu, puis l’étendre. Si vous avez des idées floues, suivez L’Atelier de la Forge ou choisissez un projet dans la Mega Project List qui vous plaît.
Si vous pensez que SICP est trop difficile, ne vous forcez pas. Passez à autre chose, et continuez votre parcours classique : commencez par The Elements of Computing Systems. Ce livre vous apprendra à construire un ordinateur à partir de la porte NAND, jusqu’à son bon fonctionnement. Je ne vais pas entrer dans les détails, mais ce livre sera votre compagnon tout au long de votre initiation à la programmation. Votre objectif à ce stade est de terminer tous les projets de ce livre (y compris un compilateur minimal et un système d’exploitation).
Pour maîtriser complètement ce livre, renforcer vos bases, et préparer l’avenir, voici quelques autres ressources (sans ordre strict) :
Fondamentaux des systèmes informatiques
Après avoir acquis les bases de la conception de programmes, si vous souhaitez approfondir la compréhension de l’informatique, jetez un œil à Computer Systems: A Programmer’s Perspective, 3/E (Deep Understanding of Computer Systems). La traduction française est souvent critiquée, mais en réalité, ce n’est pas vraiment une « compréhension approfondie » ; c’est simplement le manuel de CMU’s Introduction to Computer Systems. La spécialité de CMU est plutôt orientée logiciel, et ce livre décrit en détail comment un programme s’exécute dans un système informatique, en adoptant la perspective du programmeur, en expliquant le fonctionnement interne des systèmes.
Si la lecture vous paraît sèche, vous pouvez suivre le MOOC The Hardware/Software Interface sur Coursera, qui est une sous-partie de CSAPP, avec les expériences clés adaptées. Vous pouvez aussi relire The C Programming Language pour revoir les bases du C.
Après avoir terminé ce livre, vous aurez une base solide en systèmes, et vous serez prêt à étudier les systèmes d’exploitation, les compilateurs, les réseaux, etc. En étudiant des sujets plus avancés, parcourir certains chapitres de ce livre et implémenter les exemples en code vous donnera une compréhension plus intuitive, et vous permettra de maîtriser aussi bien la conception que la mise en œuvre, en visualisant le flux de données dans le réseau, la mémoire, le cache, le CPU.
Bases des structures de données et des algorithmes
Aujourd’hui, beaucoup pensent que la programmation (notamment pour le développement web) consiste surtout à utiliser le code des autres, et à exprimer leurs idées de façon claire et simple, plutôt que de maîtriser des mathématiques et des algorithmes complexes. Les fonctions de tri, de recherche binaire, etc., sont déjà intégrées dans les langages. On se demande : « À quoi ça sert d’apprendre ces choses ? » ou « Je ne les utiliserai jamais dans mon travail ». Cette mentalité utilitariste est à éviter. Sans une base théorique solide, on finira tôt ou tard par rencontrer des limites.
Les structures de données et les algorithmes vont de pair. En phase d’initiation, vous devriez surtout savoir : quel algorithme ou quelle structure de données utiliser pour résoudre un problème rapidement. Cela implique de connaître bien ces structures et algorithmes, et de pouvoir les écrire à la main, sur papier, pour aller plus vite. Pour ce que vous ne comprenez pas, cherchez à savoir à quoi ça sert, dans quel contexte on l’utilise.
Ressources recommandées :
Autres bases
Quelques points souvent négligés en phase d’initiation à la programmation :
Conclusion
Ne soyez pas effrayé par tout cela. L’entrée en programmation ne se résume pas à quelques semaines de petits projets. Vous rencontrerez de nombreux obstacles, mais utilisez la technique de Feynman : décomposez les difficultés en petites parties, traitez-les une par une, puis expliquez-les clairement à quelqu’un pour vérifier votre compréhension. Il y aura toujours des problèmes que vous ne pourrez pas résoudre immédiatement, mais ne vous forcez pas. Souvent, en y revenant plus tard, tout deviendra clair.
N’oubliez pas non plus d’autres livres précieux, à lire et relire à chaque étape, comme ceux figurant dans la liste des incontournables sur Stack Overflow, notamment :
Code Complete : pour les programmeurs expérimentés ou débutants, ce livre comble les lacunes en connaissances. Pour les débutants, consultez les chapitres sur la gestion des variables, les tests, la personnalité.
The Pragmatic Programmer : considéré comme le « bible » du code, il couvre tout, de DRY à KISS, de la philosophie à la pratique.
Son auteur, Dave, écrit en ouverture :
Vous êtes un programmeur pragmatique. Vous n’êtes attaché à aucune technologie particulière, mais vous avez une connaissance large de la science, et votre expérience pratique vous permet de choisir de bonnes solutions selon la situation. La théorie et la pratique se combinent pour vous rendre fort. Vous adaptez votre approche en permanence, en fonction des circonstances. Et vous faites cela tout au long du projet. Les programmeurs pragmatiques accomplissent leur travail, et le font bien.
Ce paragraphe, ainsi que la philosophie de The Pragmatic Bookshelf, m’ont toujours influencé. C’est pourquoi j’ai voulu suivre cette idée dans ce guide, pour vous guider et vous encourager à devenir un vrai programmeur pragmatique.
Postface
Si vous parvenez à réaliser toutes ces étapes, félicitations : vous avez véritablement franchi le cap de l’initiation à la programmation. Cela signifie qu’à l’avenir, vous n’aurez plus peur d’apprendre de nouveaux langages, ni des API complexes, ni des technologies spécifiques. Vous trouverez cela plus facile qu’avant. Bien sûr, pour maîtriser tout cela, il faudra beaucoup pratiquer : votre dos pourra encore faire mal, marcher sera encore difficile, et vous ne pourrez pas monter au 5ème étage d’un seul coup. Mais je vous garantis un changement mental profond, une grande confiance en vous. Vos enseignants, vos collègues, et même CSDN auront un regard plus subtil sur vous. Même si vous n’êtes qu’un débutant, vous serez déjà un « haut-fonctionnaire » dans le monde de l’esprit du programmeur. Non, je me suis trompé : même un « haut-fonctionnaire » n’a pas une force mentale extraordinaire, il doute aussi de lui-même, et pense que sans argent, il n’est rien. Mais en suivant ce guide et en lisant attentivement, vous ressentirez la sensation d’être au sommet.
()(