web-dev-qa-db-fra.com

Comment puis-je m'assurer que j'apprends réellement à programmer plutôt que d'apprendre simplement les détails d'une langue?

J'entends souvent qu'un vrai programmeur peut facilement apprendre n'importe quelle langue en une semaine. Les langues ne sont que des outils pour faire avancer les choses, me dit-on. La programmation est la compétence ultime qui doit être apprise et maîtrisée.

Comment puis-je m'assurer que j'apprends réellement comment programmer plutôt que de simplement apprendre les détails d'une langue? Et comment puis-je développer des compétences en programmation applicables à toutes les langues au lieu d'une seule?

83
Ryan

Ne vous inquiétez pas de rencontrer un concept ridicule de "compétence" si communément entendu dans des déclarations telles que:

  • Tous les langages de programmation sont fondamentalement les mêmes.
  • Une fois que vous avez bien choisi une langue, vous pouvez choisir n'importe quelle autre langue rapidement et facilement.
  • Les langues ne sont que des outils, il y a une magie cérébrale globale qui fait réellement le logiciel.

Ces déclarations sont toutes basées sur une prémisse erronée et trahissent un manque d'expérience à travers un spectre plus large de langages de programmation. Ce sont des déclarations très courantes et fortement crues par une grande partie des programmeurs, je ne contesterai pas cela, mais je contesterai leur exactitude.

Ceci est prouvé simplement: passez une semaine (ou vraiment n'importe quel temps supérieur à quelques jours) à essayer d'apprendre les principes fondamentaux de Haskell , Prolog , ou Agda . Vous entendrez peu après la vieille chanson de Sesame Street dans votre tête "Une de ces choses n'est pas comme les autres ...".

En fait, il existe toute une série de langages de programmation, de techniques et d'approches qui sont si étrangers à ce que 95% d'entre nous font ou ont déjà fait. Beaucoup ignorent complètement que l'un de ces autres concepts existe même, ce qui est bien et ces concepts ne sont pas nécessaires pour être un programmeur employé et même efficace.

Mais le fait demeure: ces techniques et approches existent, elles sont bonnes pour de nombreuses choses différentes et peuvent être très utiles, mais elles ne sont pas simplement comme ce à quoi vous êtes habitué et les gens ne peuvent pas simplement les ramasser avec un après-midi de tripotage.

De plus, je dirais que la majorité des cas où les gens affirment qu'ils ont ou peuvent apprendre des choses aussi complexes que les langages de programmation si rapidement qu'une semaine, ils souffrent d'un peu de Dunning Kruger Effect , Wikipedia (souligné mien):

L'effet Dunning-Kruger est un biais cognitif dans lequel les individus non qualifiés souffrent d'une supériorité illusoire, évaluant par erreur leur capacité beaucoup plus que la moyenne. Ce biais est attribué à une incapacité métacognitive des personnes non qualifiées à reconnaître leurs erreurs.

Je renvoie les gens à cette présentation plus expérimentée du concept d'apprentissage de la programmation de Peter Norvig: Apprendre à programmer en dix ans.

Des chercheurs (Bloom (1985), Bryan et Harter (1899), Hayes (1989), Simmon et Chase (1973)) ont montré qu'il faut environ dix ans pour développer une expertise dans une grande variété de domaines, notamment le jeu d'échecs, la musique composition, opération télégraphique, peinture, piano, natation, tennis et recherche en neuropsychologie et topologie. La clé est la pratique délibérative: non seulement le faire encore et encore, mais vous mettre au défi avec une tâche qui dépasse votre capacité actuelle, l'essayer, analyser vos performances pendant et après le faire, et corriger les erreurs. Répétez ensuite. Et recommencez.


Certes, il existe un ensemble de principes fondamentaux qui rendront toutes les langues faciles à apprendre!

Peut-être, mais je dirais que cet ensemble de principes est si vaste qu'il y aura presque toujours des langues en dehors de votre portée d'une semaine. Au fur et à mesure que vous ajoutez de nouveaux concepts à la liste avec laquelle vous êtes familier et à l'aise, cette liste de langues hors de votre portée immédiate peut se réduire, mais j'ai du mal à croire qu'elle disparaîtra jamais. La liste des approches de l'informatique conceptuelle est si large qu'elle est déroutante, de langages concaténatifs à langages vectoriels aux langages spécialisés en AI ou métaprogrammation ( ou des langues qui existent entièrement pour supporter les expressions régulières ).

Après dix ans, vous pourrez généralement programmer. Cela signifie que vous pouvez écrire du code quelque peu décent dans une langue ou un style de langue. Donc, après 10 ans, vous êtes prêt à commencer à aborder ces innombrables concepts transversaux pour le reste de votre vie, et à court d'être Edsger W. Dijkstra , Donald Knuth ou John D. Carmack , vous n'allez pas les atteindre tous.

96
Jimmy Hoffa

... comment puis-je développer des compétences en programmation applicables à toutes les langues au lieu d'une seule?

La clé de cette question est de transcender la langue et de penser dans et non la langue dans laquelle vous codez.

WAT?

Les programmeurs polyglottes expérimentés pensent dans le arbre de syntaxe abstraite (AST) de leur propre modèle mental du langage. On ne pense pas "J'ai besoin d'une boucle for ici", mais plutôt "J'ai besoin de faire une boucle sur quelque chose" et cela se traduit par approprié pour, ou pendant, ou itérateur ou récursivité pour cette langue.

Ceci est similaire à ce que l'on voit dans l'apprentissage d'une langue parlée. Les personnes qui parlent plusieurs langues pensent couramment le sens , et il apparaît dans une langue donnée.

On peut voir un indice de cela AST dans la paire de vidéos d'eyeracking Compréhension de code avec Eye Tracking et Expérience de code de suivi oculaire (novice) où les mouvements de l'œil d'un débutant et d'un programmeur expérimenté sont On peut voir le programmeur expérimenté "compiler" le code dans son modèle mental et "l'exécuter" dans sa tête, tandis que le débutant doit parcourir le code mot-clé par mot-clé.

Ainsi, la clé de la question du développement des compétences en programmation à appliquer à toutes les langues est d'apprendre plusieurs langues afin de se distancier du modèle mental de une langue et développer la capacité de générer le AST pour un problème par lui-même dans une langue principale qui est puis traduit dans une langue donnée.

Une fois que l'on a cette capacité à utiliser le AST dans la tête, apprendre une autre langue dans une école de pensée similaire (aller à Befunge est un peu un saut de Java , mais pas autant de Forth ) devient beaucoup plus facile - il suffit de traduire le AST dans une nouvelle langue qui est beaucoup plus facile les 3ème, 4ème et 5ème ( etc ...) une fois terminé.


Il y a un article classique, Les vrais programmeurs n'utilisent pas Pascal. Une partie de ceci se lit comme suit:

... le vrai programmeur déterminé peut écrire des programmes Fortran dans n'importe quelle langue

Il y a aussi des bits pour lesquels vous ne pouvez pas simplement utiliser le mental AST - vous devez aussi penser dans la langue. Cela prend un peu de temps à accomplir (je suis toujours accusé d'écrire Perl code dans Python et mon premier LISP code a été revu en disant "Ceci est un très bon programme C. ").

Pour cela, je dois signaler un article publié par l'ACM, Comment ne pas écrire Fortran dans n'importe quelle langue. Le troisième paragraphe de l'article (qui n'est pas des citations principales) répond directement à la question posée:

Il existe des caractéristiques d'un bon codage qui transcendent tous les langages de programmation à usage général. Vous pouvez implémenter une bonne conception et un style transparent dans presque n'importe quel code, si vous vous y appliquez. Ce n'est pas parce qu'un langage de programmation vous permet d'écrire du mauvais code que vous devez le faire. Et un langage de programmation qui a été conçu pour promouvoir un bon style et une bonne conception peut toujours être utilisé pour écrire du code terrible si le codeur est suffisamment créatif. Vous pouvez vous noyer dans une baignoire avec un pouce d'eau, et vous pouvez facilement écrire un programme complètement illisible et incontrôlable dans une langue sans gotos ni numéros de ligne, avec une gestion des exceptions et des types génériques et la collecte des ordures. Que vous écriviez Fortran ou Java, C++ ou Smalltalk, vous pouvez (et devriez) choisir d'écrire du bon code au lieu d'un mauvais code.

Il ne suffit pas d'avoir le AST - il faut avoir le AST que l'on peut traduire dans d'autres langues. Avoir un Fortran AST dans votre tête et écrire du code Fortran dans Java n'est pas une bonne chose. Il faut aussi être assez familier avec le langage et ses idiomes pour pouvoir pensez dans la langue (malgré ce que j'ai dit tout en haut).

J'ai vu Java code écrit par quelqu'un qui n'avait pas arrêté d'écrire du code C. Il y avait un objet avec une méthode principale. Dans cet objet il y avait un tas de méthodes statiques appelées par main, et des classes internes privées qui avaient des champs publics (et ressemblaient donc beaucoup à des struts). C'était du code C écrit en Java. Tout ce qui était fait était de traduire la syntaxe d'une langue à une autre.

Pour dépasser ce point, il faut continuer à écrire du code dans plusieurs langues, pas penser dans ces langues lors de la conception du code, mais penser en elles quand traduire la conception dans le code pour fonctionner correctement avec les idiomes du langage.

La seule façon d'y arriver - être en mesure de développer des compétences de programmation qui peuvent être appliquées à toutes les langues - est de continuer à apprendre des langues et de garder ce langage de programmation mentale flexible plutôt que lié à une seule langue.

(Mes excuses à ChaosPandion pour avoir emprunté massivement à l'idée qu'il a présentée .)

51
user40980

Choisissez une langue et commencez à coder. Python est un bon choix pour un débutant, et il y a tutoriels disponibles en ligne , afin que vous puissiez apprendre à le faire correctement.

Tout en découle. Vos intérêts vous mèneront à des cadres et des concepts de conception qui ajouteront de la sophistication à vos programmes. Vous découvrirez qu'il existe des cours en ligne que vous pouvez suivre qui vous ancreront dans les principes fondamentaux et la théorie, et qu'il existe différents paradigmes de programmation que vous pouvez explorer, etc.

Et oui, vous découvrirez des langues comme Haskell qui vous apprendront quelque chose de nouveau, une fois que vous aurez une base solide dans les fondamentaux.

Certains programmeurs pensent probablement que toutes les langues sont les mêmes car elles n'ont été exposées à aucune qui les fait penser différemment. Tous les langages les plus couramment utilisés sont dérivés d'ALGOL (ce sont essentiellement des langages procéduraux), et parmi ceux-ci, la plupart sont des langages à accolades similaires à C. Tous font essentiellement les mêmes choses, bien que certains avec plus de sophistication que d'autres.

12
Robert Harvey

La programmation concerne la résolution de problèmes de telle manière que la solution peut être exprimée dans une grammaire si restreinte qu'elle peut être implémentée avec un langage de programmation. L'art de la programmation est donc l'art de résoudre des problèmes.

Certains langages invitent d'autres paradigmes de programmation tels que l'orientation objet, piloté par les événements, multithread et basé sur MVC. Ce ne sont que des modèles et des modèles et n'ont rien à voir avec la mise en œuvre.

Si vous pouvez vous asseoir et résoudre un problème sur papier de manière à ce qu'il puisse être facilement traduit en code et associé à un modèle approprié pour votre plate-forme, alors vous êtes programmeur. Si tout ce que vous pouvez faire est de prendre ces solutions et de les implémenter dans la langue de votre choix, alors c'est une autre affaire.

Je programme depuis 30 ans (OMFG!) Et j'utilise toujours php.net pour rechercher des commandes dans PHP car ce n'est pas ma première langue.

Je dirais que l'expertise en langues est inversement proportionnelle à la fréquence à laquelle vous regardez le flux manuel ou stackoverflow. L'expertise en programmation est la facilité avec laquelle vous résolvez les problèmes d'une manière compatible avec les langages de programmation informatique.

Dans les nouvelles connexes, j'ai appris Ruby la semaine dernière. Bien que je ne sois pas un "expert", je peux vous résoudre un problème que je pourrais écrire en Perl, disons, puis passer un certain temps à le traduire à Ruby pendant que je l'apprends un peu plus.

5
stevemarvell

Je pense que, comme pour tout, la pratique rend parfait. Ne vous limitez pas à toujours faire la même chose ou à toujours utiliser la même langue et continuez à apprendre des choses sur chaque projet.

Je pense que vous pouvez facilement établir un parallèle avec quelque chose comme apprendre à jouer de la guitare. Tout bon musicien peut apprendre à jouer une nouvelle chanson en très peu de temps, car il connaît déjà tous les accords et toute la théorie qui explique pourquoi les accords sont joués tels qu'ils sont. Comment deviennent-ils si bons? Ils ont juste joué tellement de chansons que tous les motifs se sont mélangés, tout en complétant leurs connaissances avec une théorie documentée selon laquelle ces motifs sont également abonnés.

Alors peut-être que vous pouvez très bien jouer quelques chansons, mais vous ne pouvez pas dévier ou choisir de nouvelles chansons rapidement. C'est probablement l'équivalent d'un . NET programmeur qui continue de faire la même application CRUD encore et encore, à un moment donné essayez quelque chose de nouveau, ajoutez des appels de service Web ou une interface utilisateur avancée, ou écrivez-le dans une toute nouvelle langue. Lorsque vous tentez de comprendre pourquoi les choses se passent comme elles le font, posez des questions sur Stack Exchange, etc. semblent presque aussi intimidants.

3
KDiTraglia

Je ne vais pas aborder le temps qu'il faut pour apprendre une langue ou ce que cela signifie pour apprendre une langue, je vais plutôt aborder votre problème réel: comment déterminer si vous avez appris à programmer ou avez appris un langage de programmation .

Vous avez appris à programmer si vous avez appris à décomposer un problème en processus discrets, puis à utiliser ces processus pour résoudre votre problème. Vous avez appris un langage de programmation si vous avez appris la syntaxe d'un langage et savez comment ajuster le fonctionnement d'un processus, lorsqu'il est implémenté dans ce langage.

Cela ne veut pas dire que vous devez programmer dans Fortan lors de l'utilisation de LISP ou additionner les valeurs d'une colonne dans une table dans une base de données à l'aide d'un curseur. Juste que le langage est un détail d'implémentation. Celui qui peut changer les processus nécessaires, mais pas le besoin d'identifier et de créer des processus - en fin de compte, il y a une mise en œuvre réelle, avec des entrées/sorties et les résultats souhaités.

1
jmoreno

Ma stratégie a toujours été de me concentrer sur les compétences pures plutôt que sur les compétences spécifiques.

Au lieu d'apprendre la syntaxe spéciale de Python (ou n'importe quel langage) pour tout ce que vous voulez faire, passez vos cycles cérébraux à résoudre des problèmes abstraits, comme la meilleure façon de résoudre tous les problèmes de cette catégorie.

De cette façon, vous saurez quoi faire, peu importe la langue, et posséderez surtout des compétences intemporelles qui peuvent être utilisées pour la programmation dans n'importe quelle langue.

Évitez spécifiquement les outils qui sont pleins de pièges, comme MySQL, ou les langages d'opinion, comme Java, car tout ce que vous apprenez en utilisant ces outils aura une grande proportion de connaissances spécifiques aux outils qui deviendront inutilisables assez rapidement.

Contrairement à ce qui a été dit dans de nombreuses réponses, n'écoutez PAS les autres programmeurs, vous êtes un noob et il n'y a aucun moyen de distinguer le faux de la vraie affaire, il est donc préférable de tout prendre avec une cuillère de sel.

Vous voulez être interrogé tout le temps et n'accepter que lorsque la solution est rapide, élégante et fiable.

1
Morg.

Je pense que si vous pouvez penser analytiquement, vous avez un bon départ.

Apprenez la langue que vous voulez et travaillez vous-même à travers une série d'exemples, par exemple comme présenté dans presque tous les livres qui enseignent la programmation.

Essayez ensuite de résoudre vos propres problèmes. Essayez de trouver différentes solutions et de les comparer. La vitesse et l'utilisation de la mémoire sont des facteurs couramment utilisés qui importent. Discutez de vos solutions avec d'autres programmeurs.

Lisez le code des autres programmeurs et essayez de comprendre pourquoi ils ont résolu le problème de cette façon.

Vous devriez également lire quelques livres sur les algorithmes pour avoir un aperçu des approches standard. Les nouveaux problèmes sont souvent des modifications d'anciens problèmes.

Beaucoup de pratique et de travail avec le code également en équipe vous aideront à augmenter vos compétences étape par étape.

J'espère que mon avis vous répond à une question au moins partielle.

0
MrSmith42

Il y a l'approche théorique. Découvrir comment les ordinateurs fonctionnent réellement sous le capot. Comment les instructions de base du processeur sont enchaînées pour rendre les opérations et les structures plus complexes que nous tenons pour acquises dans un environnement de programmation de haut niveau.

Ensuite, il y a l'approche de programmation plus pratique. Le principal point d'achoppement qui affecte généralement les personnes qualifiées de "mauvais programmeurs" est qu'elles ne connaissent vraiment qu'une seule langue. Et même s'ils en connaissent d'autres, ils les programment de la même manière qu'ils le font avec leur langue maternelle . C'est un cycle qu'il faut rompre s'ils veulent vraiment apprendre à programmer. La réponse par défaut à cela est d'apprendre au moins une langue de chaque paradigme de programmation. Apprenez donc un OOP langage, un langage fonctionnel, un langage de script ... etc. Et par apprentissage, je ne veux pas dire apprendre la syntaxe . Vous apprenez une langue en l'utilisant réellement pour créer quelque chose.

Personnellement, quand je veux apprendre une nouvelle langue, j'utilise Project Euler puzzlers. Je vais à un puzzle que j'ai déjà résolu dans une langue OOP (à titre d'exemple) et j'essaie de le résoudre en utilisant une langue fonctionnelle tout en essayant de suivre les meilleures pratiques de la nouvelle langue. vous résolvez le même problème en utilisant deux approches fondamentalement différentes non seulement vous voyez quelles sont les vraies différences, mais elles vous montrent également où se trouvent les espaces communs. Ces espaces communs qui sont partagés par toutes les langues sont les vrais programmation , les différences ne sont que différentes façons de le réaliser.

0
System Down

Dans mon cas, j'apprends à réellement programmer à travers les éléments suivants:

  1. Apprenez des maîtres. Écoutez des podcasts de programmation, lisez des blogs professionnels dans le sujet de programmation de votre choix, lisez/regardez de merveilleux tutoriels réalisés par des gourous qui sont dispersés sur le Web et enfin, lisez des livres épiques comme The Pragmatic Programmer . Ce livre a beaucoup de joyaux de programmation qui ont été accumulés tout au long de la carrière des auteurs. Un moyen sûr d'apprendre comment coder est de savoir comment les autres programmeurs réussis le font.
  2. Expérience en faisant. Le lire et le savoir est une chose, le mettre en pratique et le faire fonctionner en est une autre. Il n'y a pas de meilleur professeur que l'expérience, alors mettez votre capuchon de codage et commencez.
  3. Demandez à quelqu'un qui sait. Tout comme vous le faites maintenant, n'ayez pas peur de poser des questions sur les meilleures pratiques ou les meilleures façons de faire les choses des aînés de votre équipe, ou si vous avez la malchance de ne pas avoir accès auxdits aînés ou mentors ou gourous, puis il reste le reste de stackexchange et Internet à demander.

De plus, comme vos commentateurs l'ont mentionné, n'oubliez pas de maîtriser également vos outils. Apprendre toutes les meilleures pratiques et les plus grandes théories est inutile ou sera mal implémenté si vous ne connaissez pas assez votre outil, dans ce cas, un langage de programmation.

0
Maru

Eh bien, la plupart des choses que je voulais dire ont déjà été dites. Ce que je voudrais ajouter, c'est une analogie très simple.

Si les langages de programmation sont considérés comme de simples outils, même alors, il n'y a absolument aucune logique à être bon dans l'un et être bon dans l'autre.

Il suffit de considérer un groupe de maîtres-escrimeurs réputés, de mettre soudainement leurs épées et de partir combattre les lances après 7 jours d'entraînement. Ce qui se passerait? Ils seraient massacrés.

Les langues ne sont souvent pas difficiles à apprendre, mais il faut de la patience et de l'exercice pour être bon dans ce domaine. De plus, il n'y a pas à droite moyen d'apprendre la programmation.

Apprendre une programmation, c'est comme jouer à un jeu RPG. Parfois, vous utilisez des épées, parfois des lances, parfois un bouclier. Chaque ennemi que vous tuez, vous obtenez des points d'expérience. Une fois que vous avez suffisamment de points d'expérience, vous montez de niveau. Maintenant, maîtriser une épée ne vous rendra pas excellent avec des arcs et des flèches. Mais une partie de l'expérience que vous avez acquise précédemment augmentera votre endurance et votre vitesse.

Voici quelques choses que vous voudrez peut-être faire lors de l'apprentissage d'une langue.

  • Lisez la langue. si cela vous semble intéressant, essayez par vous-même les applications Hello World.
  • Lisez quelques tutoriels, astuces, blogs.
  • Créez des applications simples juste pour le plaisir.
  • Testez différentes fonctionnalités.
  • Si vous l'aimez vraiment, achetez des livres et/ou des tutoriels vidéo.
  • Recherchez de bonnes bibliothèques.
  • Recherchez des réponses, demandez uniquement si vous ne trouvez pas les réponses.
  • Aidez les autres à demander des réponses (où mieux qu'ici?)
  • Faites quelque chose d'utile. Faire une application de calculatrice peut être un bon exercice, mais si vous créez une application de liste de choses à faire et que vous utilisez réellement sur votre PC/téléphone, le sentiment est 100 fois satisfaisant.

Découvrez de nouvelles langues, explorez de nouvelles bibliothèques, découvrez de nouvelles astuces sur votre temps libre. Avant de vous en rendre compte, vous vous surprendrez avec vos propres compétences.

0
Sayem Shafayet