J'entends souvent dire 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 à programmer plutôt que de simplement apprendre les détails d'une langue? Et comment puis-je développer des compétences de programmation qui peuvent être appliquées à toutes les langues au lieu d’une seule?
"What do you mean you're not an expert in LanguageX?!? I can learn a language in a Week!"
. 1 semaine plus tard:"See, I've learnt the language, and here's a Hello World example I copied from Wikipedia to prove it!"
Réponses:
Ne craignez pas de rencontrer un concept ridicule d '"habileté" si communément entendu dans des déclarations telles que:
Ces déclarations sont toutes basées sur une prémisse erronée et trahissent un manque d'expérience dans un large spectre de langages de programmation. Ce sont des déclarations très courantes auxquelles un grand nombre de programmeurs croient fermement, je ne le contesterai pas, mais je contesterai leur exactitude.
Cela est prouvé simplement: passez une semaine (ou plus de deux jours à essayer de vous familiariser avec les principes fondamentaux de Haskell , Prolog ou Agda . Vous entendrez bientôt dans votre tête la vieille chanson de Sesame Street "Une de ces choses ne ressemble pas aux autres ...".
En fait, il existe toute une gamme de langages de programmation, de techniques et d’approches qui sont si différentes de ce que 95% d’entre nous faisons ou ont fait. Beaucoup ignorent totalement que ces concepts existent, ce qui est bien et que 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 beaucoup de choses différentes et peuvent être très utiles, mais elles ne ressemblent pas à ce à quoi vous êtes habitué et les gens ne peuvent pas simplement les reprendre avec un après-midi de violon.
De plus, je dirais que dans la majorité des cas, les gens affirment qu'ils ont ou peuvent apprendre des choses aussi complexes que les langages de programmation si rapidement en une semaine, ils souffrent un peu de l'effet Dunning Kruger , Wikipedia:
Je renvoie les gens à cet aperçu plus expérimenté du concept d’apprentissage par programme de Peter Norvig: Apprendre à programmer dans dix ans .
Certes, il existe un ensemble de principes généraux qui faciliteront l’apprentissage de toutes les langues!
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 semaine. Au fur et à mesure que vous ajoutez de nouveaux concepts à la liste que vous connaissez bien et avec laquelle vous êtes à l'aise, cette liste de langues hors de votre portée immédiate risque de diminuer, mais j'ai du mal à croire qu'elle disparaîtra un jour. La liste des approches informatiques conceptuelles est si vaste qu'elle est déroutante, des langages concaténatifs aux langages basés sur les vecteurs en passant par les langages spécialisés dans l' IA ou la métaprogrammation ( ou des langages qui existent entièrement pour supporter les expressions régulières ).
Après dix ans, vous pourrez programmer en général. Cela signifie que vous pouvez écrire du code quelque peu décent dans certaines langues ou styles de langues. Donc, après 10 ans, vous êtes prêt à aborder ces innombrables concepts transversaux pour le reste de votre vie, et à moins d’être Edsger W. Dijkstra , Donald Knuth ou John D. Carmack , vous n’allez pas aller à tous d'eux.
la source
La clé de cette question est de transcender le langage et de ne pas penser au langage que vous codez.
WAT?
Les programmeurs polyglottes expérimentés pensent dans l' 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 traduit cela en fonction de, pour, ou, ou itérateur ou récursion 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 en pensent couramment le sens , et cela s’exprime dans une langue donnée.
On peut voir quelques indices de cet AST dans la paire de vidéos qui traitent des yeux. Compréhension de code avec suivi des yeux et expérience du code de suivi des yeux (novice) où sont surveillés les mouvements des yeux du débutant et du programmeur expérimenté. On peut voir le programmeur expérimenté «compiler» le code dans son modèle mental et le «faire tourner» 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 consiste à apprendre plusieurs langues de manière à pouvoir se distancer du modèle mental d’ une langue et à développer la capacité de générer l’AST pour un problème par eux-mêmes. une langue de tête qui est ensuite traduite dans une langue donnée.
Une fois que l’on a cette capacité à utiliser l’AST dans la tête, apprendre une autre langue dans une école de pensée similaire (aller à Befunge, c’est un saut de Java, mais pas autant de Forth ) devient beaucoup plus facile - c’est 'juste' traduire l'AST dans une nouvelle langue, ce qui est beaucoup plus facile les 3ème, 4ème et 5ème (etc ...) fois que c'est fait.
Il existe un article classique, Real Programmers Don't Use Pascal . Une partie de ceci se lit comme suit:
Il existe également des éléments pour lesquels vous ne pouvez pas simplement utiliser l'AST mental - vous devez également penser dans la langue. Cela prend un peu de temps (je suis toujours accusé d’écrire du code Perl en Python et mon premier code Lisp a été commenté: "C’est un très bon programme C.").
À cela, je dois signaler un article publié par l’ACM, Comment ne pas écrire le Fortran dans n’importe quelle langue . Le troisième paragraphe de l'article (sans les guillemets) aborde directement la question à l'examen:
Il ne suffit pas d'avoir l'AST, il faut aussi l'AST pour pouvoir traduire dans d'autres langues. Avoir un AST Fortran dans votre tête et écrire du code Fortran en Java n'est pas une bonne chose. Il faut aussi être suffisamment familiarisé avec la langue et ses idiomes pour pouvoir penser dans la langue (malgré ce que j'ai dit tout en haut).
J'ai vu du code Java é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 qui 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, ne pas penser à ces langues lors de la conception du code, mais y penser lors de la traduction du dessin dans le code pour utiliser correctement les idiomes de langue.
Le seul moyen d'y parvenir - être capable de développer des compétences en programmation pouvant être appliquées à toutes les langues - est de continuer à apprendre les langues et de garder cette langue de programmation mentale souple plutôt que liée à une seule langue.
(Mes excuses à ChaosPandion pour avoir emprunté énormément à l'idée qu'il a présentée .)
la source
Choisissez une langue et commencez à coder. Python est un bon choix pour un débutant et des tutoriels sont disponibles en ligne pour vous permettre d’apprendre à le faire correctement.
Tout découle de ça. Vos intérêts vous mèneront vers des cadres et des concepts de conception qui ajouteront une sophistication à vos programmes. Vous découvrirez qu'il existe des cours en ligne que vous pouvez suivre pour vous familiariser avec 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 maîtriserez les bases.
Certains programmeurs pensent probablement que toutes les langues sont identiques car elles n'ont pas été exposées à une langue qui leur fasse penser différemment. Tous les langages les plus couramment utilisés sont dérivés d'Algol (ils sont essentiellement des langages procéduraux) et parmi ceux-ci, la plupart sont des langages à accolades similaires au C. Tous font essentiellement les mêmes choses, bien que certains soient plus sophistiqués que d'autres.
la source
La programmation concerne la résolution de problèmes de telle manière que la solution puisse être exprimée dans une grammaire restreinte telle qu’elle puisse être mise en œuvre 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 d'objet, les événements, les multi-threads et le framework MVC. Ce ne sont que des modèles et des modèles et n’ont vraiment 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, vous êtes alors un programmeur. Si tout ce que vous pouvez faire est de prendre ces solutions et de les mettre en œuvre dans la langue de votre choix, c'est un autre problème.
Je programme depuis 30 ans (OMFG!) Et utilise toujours la
php.net
recherche de commandes en PHP car ce n'est pas mon premier langage.Je dirais que l'expertise en langues est inversement proportionnelle à la fréquence à laquelle vous consultez le manuel ou le stackoverflow. L’expertise en programmation est votre capacité à résoudre les problèmes d’une manière compatible avec les langages de programmation.
Dans les nouvelles, 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, puis passer un siècle à le traduire en Ruby pendant que je l'apprendrais davantage.
la source
Je pense que, comme pour tout, la pratique rend parfait. Ne vous contentez pas de toujours faire la même chose ou d'utiliser toujours le même langage et continuez à apprendre des choses sur chaque projet.
Je pense que vous pouvez facilement faire 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 sous-tend la raison pour laquelle les accords sont joués comme ils sont. Comment obtiennent-ils ce bien? Ils ont juste joué tellement de chansons que tous les motifs ont été fusionnés, tout en complétant leurs connaissances avec la théorie documentée selon laquelle ces motifs souscrivent aussi.
Alors peut-être que vous pouvez très bien jouer quelques chansons, mais vous ne pouvez pas dévier ou prendre de nouvelles chansons rapidement. C'est probablement l'équivalent d'un programmeur .NET qui continue de créer la même application CRUD encore et encore, essayez quelque chose de nouveau, ajoutez des appels de service Web ou une interface utilisateur avancée, ou écrivez-le dans un tout nouveau langage. Lorsque vous rencontrez un problème, cherchez pourquoi les choses se passent comme cela, posez des questions sur Stack Exchange, etc. Éventuellement, vous verrez tous les schémas qui se présentent continuellement et connaissez une partie de la théorie sous-jacente et l'apprentissage d'une nouvelle langue ne semble presque aussi intimidant.
la source
Je ne vais pas aborder le temps nécessaire pour apprendre une langue ou ce que cela signifie d'apprendre une langue, mais plutôt votre problème actuel: comment déterminer si vous avez appris à programmer ou si vous 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 devriez programmer dans Fortan lorsque vous utilisez Lisp ou additionner les valeurs d'une colonne dans une table dans une base de données à l'aide d'un curseur. Juste que la langue est un détail de mise en œuvre. Une solution qui peut changer les processus nécessaires, mais pas le besoin d’identifier et de créer des processus - à la fin, il existe une implémentation réelle, avec des entrées / sorties et des résultats souhaités.
la source
Ma stratégie a toujours été de me concentrer sur des compétences pures plutôt que sur des compétences spécifiques.
Au lieu d’apprendre la syntaxe spéciale de Python (ou n’importe quel langage), peu importe ce que vous voulez faire, consacrez votre cerveau à la résolution de problèmes abstraits, comme comment résoudre au mieux 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 pouvant être utilisées pour programmer dans n'importe quelle langue.
Évitez plus particulièrement les outils encombrants, tels que MySQL, ou les langages basés sur les opinions, tels que Java, car tout ce que vous apprendrez en utilisant ces outils aura une grande proportion de connaissances spécifiques à cet outil, qui deviendra vite inutile.
Contrairement à ce qui a été dit dans de nombreuses réponses, n'écoutez PAS les autres programmeurs. Vous êtes un noob et il est impossible de distinguer le faux de la réalité, il est donc préférable de tout prendre avec une cuillère à soupe.
Vous voulez interroger tout le temps et accepter uniquement lorsque la solution est rapide, élégante et fiable.
la source
Il y a l'approche théorique. Découvrez comment les ordinateurs fonctionnent réellement sous la couverture. Comment les instructions de base des processeurs sont-elles combinées pour rendre les opérations et les structures plus complexes que nous prenons pour acquis dans les environnements de programmation de haut niveau.
Il y a ensuite l'approche de programmation la plus pratique. Le principal problème qui pèse souvent sur les personnes qualifiées de "mauvais programmeurs" est qu’elles ne connaissent qu’une seule langue. Et même s’ils connaissent les 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 à cette question consiste à apprendre au moins une langue de chaque paradigme de programmation. Donc, apprendre un langage POO, un langage fonctionnel, un langage de script, etc., 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, lorsque je veux apprendre une nouvelle langue, j'utilise les casse-tête de Project Euler . Je vais à un casse-tête que j'ai déjà résolu dans un langage POO (à titre d'exemple) et j'essaie de le résoudre en utilisant un langage fonctionnel tout en essayant de suivre les meilleures pratiques du nouveau langage. Lorsque vous résolvez le même problème en utilisant deux approches fondamentalement différentes, vous ne voyez pas seulement quelles sont les véritables différences, mais elles vous indiquent également les zones communes. Ces domaines communs qui sont partagés par toutes les langues constituent la vraie programmation , les différences ne sont que des manières différentes de la réaliser.
la source
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 dans ce cas, il n'y a absolument aucune logique à être bon dans l'un, mais à être bon dans l'autre.
Les langues ne sont souvent pas difficiles à apprendre, mais il faut de la patience et de l'exercice pour être doué. De plus, il n’ya pas de bonne façon d’apprendre à programmer.
Voici quelques choses à faire lors de l’apprentissage d’une langue.
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 serez surpris par votre propre talent.
la source
Dans mon cas, j'apprends à programmer grâce aux éléments suivants:
En outre, comme vos commentateurs l'ont mentionné, n'oubliez pas de maîtriser également vos outils. L'apprentissage de toutes les meilleures pratiques et des meilleures théories est inutile et sera mal mis en œuvre si vous ne connaissez pas suffisamment votre outil, dans ce cas, un langage de programmation.
la source
Je pense que si vous pouvez penser de manière analytique, vous avez un bon début.
Apprenez la langue de votre choix et construisez-vous à l'aide d'une série d'exemples, par exemple tels que présentés dans presque tous les livres de programmation.
Ensuite, essayez de résoudre vos propres problèmes. Essayez de trouver différentes solutions et comparez-les. La vitesse et l’utilisation de la mémoire sont des facteurs importants qui sont couramment utilisés. 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, même en équipe, vous aideront à augmenter vos compétences étape par étape.
J'espère que mon opinion répond à votre question au moins partielle.
la source