Comment puis-je vraiment maîtriser un langage de programmation?


103

Je sais que pour apprendre une langue, vous pouvez simplement acheter un livre, suivre les exemples et, dans la mesure du possible, essayer les exercices. Mais ce que je cherche vraiment, c'est comment maîtriser la langue une fois que vous l’avez apprise.

Maintenant, je sais que l'expérience est un facteur majeur, mais qu'en est-il de l'apprentissage des éléments internes de la langue, quelle est la structure sous-jacente, etc.

Il y a des articles disant de lire ce livre, de lire ce livre, de créer ce jeu et ce jeu-là. Mais pour moi, cela ne signifie pas maîtriser une langue. Je veux être capable de lire le code des autres et de le comprendre, peu importe la difficulté. Comprendre quand utiliser une fonction et quand une autre, etc. etc.

La liste pourrait s'allonger encore et encore, mais je crois avoir bien expliqué le problème. :)

Et pour finir, prenons le cas échéant, quelle que soit la langue, bien que le mieux serait que C soit pris comme exemple.


11
L'expérience est tout ce qu'il faut vraiment résumer. Toute la théorie dans laquelle vous êtes expert est inutile à moins que vous ne puissiez l'appliquer de manière pratique.
Simon Whitehead le

2
Implémentez un compilateur pour ce langage. En fait, c'est ma façon préférée d'essayer une nouvelle langue. Si cela vous semble trop facile et ennuyeux, essayez plutôt de définir une sémantique de langage formel, en utilisant K framework ou quelque chose de similaire.
SK-logic le

6
"l'homme, la pomme de terre est dinosaure, univers automobile". peu importe combien vous maîtrisez une langue, si le code est mauvais et n'a pas de sens, il est toujours difficile à comprendre.
Renato Dinhani

2
Je me sens comme manquaient un peu le point. Les langues étant en évolution, il n'y a pas de maîtrise d'une langue, plus on grandit avec elle, plus on l'utilise, plus il faut apprendre.
Nycynik

2
Code et lire le code. Prenez un morceau aléatoire du noyau Linux (programmation C) et déterminez le rôle d’une fonction.
Alex Hart

Réponses:


166

Je dois répondre: "Tout ce qui précède." Les gens se disputent pour savoir si le codage est un art, un métier, une discipline du génie ou une branche des mathématiques, et je pense qu'il est plus juste de dire qu'il en est une partie. En tant que tel, plus vous maîtriserez la langue avec des techniques, mieux ce sera. Voici une liste partielle:

  • Utilisez la langue toute la journée, tous les jours. Habituellement, cela signifie être employé à plein temps dans la langue.

  • Lisez tout ce que vous pouvez sur la langue. Surtout, les "meilleures pratiques" et les idiomes.

  • Rejoignez un groupe d’utilisateurs pour parler avec d’autres de la langue et de ce qu’ils en font.

  • Travaillez avec le code des autres! Il n'y a pas de moyen plus rapide d'apprendre quoi ne pas faire dans une langue que de devoir nettoyer après quelqu'un qui a fait quelque chose de terrible.

  • Soutenez le code que vous écrivez - chaque bogue devient un tour de vos pires décisions!

  • Etudier l'informatique et les langues en général

  • Apprenez une langue très différente. Un grand compliment à C serait un langage fonctionnel comme Lisp. Cela transformera votre façon de penser en langage procédural.

  • Apprenez à utiliser les frameworks et les API disponibles pour cette langue.

  • Prenez le temps de faire vos propres expériences avec la langue. Le SICP ne s’applique pas au C, mais l’attitude d’apprendre une langue en testant ses limites est très productive.

  • Lisez l’histoire de la langue pour comprendre pourquoi elle a été conçue telle quelle.

  • Assistez à des conférences pour entendre la langue parlée par les auteurs ou pour apprendre ce que les leaders de l'industrie font avec la langue.

  • Prenez un cours dans la langue.

  • Enseignez la langue aux autres (grâce à Bryan Oakley )

En résumé, faites tout ce que vous pouvez penser. Il n'y a aucun moyen de tout savoir sur la plupart des langues. Chaque technique d'apprentissage que vous utilisez apporte une perspective supplémentaire à votre compréhension.


76
+5 for Support le code que vous écrivez - chaque bogue devient un tour de vos pires décisions!
Jennifer S

8
+1 uniquement pour la dernière phrase:Every technique you use to learn brings and additional perspective to your understanding.
Izkata le

1
@ Izkata: OMG, est-ce que j'ai écrit ça? Je suis en fait un anglophone! Je l'ai corrigé. Merci!
GlenPeterson

2
@GlenPeterson ... En fait, je viens de copier-coller sans accorder beaucoup d'attention à la phrase "off". Le +1 était en effet pour l'intention derrière. = P
Izkata le

13
+1 pour "Apprenez un langage très différent. Un compliment intéressant pour C serait un langage fonctionnel comme Lisp. Cela changera la façon dont vous envisagez votre langage procédural." - c'est probablement le plus important. Cela vous aide à apprendre à apprendre sur la programmation (c.-à-d. Ce qu'il faut rechercher dans quelle situation).
rien101

53

10 000 heures de pratique suffisent.

Lire "Apprenez à programmer en dix ans"

Points clés ci-dessus:

  • Intéressez- vous à la programmation et faites-en parce que c'est amusant. Assurez-vous que cela continue à être assez amusant pour que vous soyez prêt à mettre dans vos dix ans / 10 000 heures.
  • Programme. Le meilleur type d'apprentissage est l'apprentissage par la pratique.
  • Parlez avec d' autres programmeurs; lire d'autres programmes.

1
C'est ce que j'allais poster! Évidemment, je n'ai pas encore passé assez d'heures sur P.SE.
Martijn Pieters le

@MartijnPieters: :-D
vartec le

8
Grand titre pour un livre! Je suis impatient de la suite, "Apprenez-vous à bien programmer dans 20 ans!"
GlenPeterson

16
Cependant, vous devez vous assurer que vous ne répétez pas les mêmes 10 heures 1000 fois ...
Izkata

Aucune expertise technique ne permettra à quelqu'un de savoir quoi automatiser ou créer un programme. C'est comme si vous alliez au gymnase et que vous faisiez tous les exercices fondamentaux du basketball pendant dix ans, une heure par jour. Pouf! Vous êtes une superstar du basketball (maître) ... non, il ne s'agit pas que de compétences techniques. Par conséquent, je ne considère pas cela comme une réponse à la question, à savoir, comment devenir un maître? Cela pourrait faire partie de la solution, mais ce n'est pas la potion magique pour la maîtrise. Je sais - je ne suis pas un maître!
oemb1905

36

Ne vous considérez JAMAIS comme le maître de toute la langue tant que vous n'avez pas mis en place une meilleure langue. Ce qui signifie que pour apprendre comment une langue particulière fonctionne de dessous, procurez-vous un livre qui vous apprendra les concepts de compilateur / interprète de la langue. Par exemple:

  • C: Le compilateur LCC

  • C ++: La conception et l'évolution de C ++ (Et ensuite, construisez votre propre compilateur C ++ ou au moins comprenez l'implémentation de celui-ci en utilisant le code du compilateur GNU C ++)

  • Java: Obtenez "Inside JVM" et obtenez le code source de javac. Le code .C de "java" est également utile

  • Python: implémentation CPython.

  • ObjectiveC: Presque tout le matériel fourni par Apple sur les composants internes des codes d’environnement d’environnement d’exécution ObjC et du compilateur va vous aider.

  • Lisp: SICP Book (enseigne Scheme et un interpréteur-compilateur de base pour lisp like language): Lisp in Small Pieces (un autre bon livre).


1
Voilà ce que j'appelle une réponse. J'en ai déjà accepté un, mais cela mériterait une "meilleure réponse" si c'était un peu plus tôt
cprogcr

2
Vous ne savez pas à quel point votre réponse vous a aidé. Je lis sur les livres que vous avez mentionnés et ils sont le genre de chose dont j'ai besoin.
cprogcr

hehe j'ai appris d'eux. Heureux de vous aider :-)
Aniket Inge le

Puisque vous avez cité C comme exemple, laissez-moi vous donner le nom de deux autres livres, en cadeau, que je maitrisais C au revers de la main): 1. OOC.PDF (disponible gratuitement en ligne) et 2. Minix livre (bien que le livre d'un OS implémenteurs, c'est ce que Linus Torvalds lire avant d' implémenter Linux)
Aniket Inge

1
Ouais par Andrew Tenenbaum, c'est le livre. Toute édition est bonne à lire. Cela ne vous dit pas comment "C" fonctionne, mais quand vous voyez comment la bibliothèque C est implémentée pour fonctionner avec un système d'exploitation que VOUS avez construit, vous commencez à comprendre le C encore mieux! Peut-être assez pour vous permettre de le modifier. (Et c'est là que l'OOC entre en jeu)
Aniket Inge le

12

Essayez d’utiliser le langage pour quelque chose pour lequel il n’était pas destiné. Écrivez un pilote de périphérique en Python ou une bibliothèque de manipulation de matrice en COBOL. Je pense que l’un des meilleurs moyens de maîtriser une langue est de la pousser vraiment, d’essayer de faire en sorte que ses forces dépassent ses faiblesses.


1
Quand j'étais à la fac, je décidais que j'avais "maîtrisé" une langue une fois que j'y ai écrit Pong. Cela a très bien fonctionné jusqu'à ce que j'apprenne MIPS. J'ai encore des cauchemars.
Roddy des Frozen Peas le

Site Web en C peut être fait?
BigSack

10

Je vais vous faciliter la tâche. Vous ne maîtriserez jamais une langue. Période. Si vous pensez que vous avez, alors vous avez très évidemment pas. Soudain, vous ne parvenez pas à atteindre le sommet d'une montagne en disant: «Eh bien, maintenant, je maîtrise parfaitement cette langue. Et maintenant? Même les programmeurs chevronnés qui travaillent avec le même langage depuis des décennies vous diront qu’ils rencontrent encore parfois de nouvelles idées, processus, pratiques, etc. Le véritable objectif est de maîtriser votre compréhension conceptuelle d’un langage ou de plusieurs langues. La capacité d'apprendre de nouveaux concepts et la rapidité avec laquelle vous pouvez adopter des fonctionnalités nouvelles ou modifiées dans le langage est bien plus importante qu'une connaissance pratique de chaque mot clé et de chaque syntaxe. Arrêtez de vous soucier de "maîtriser" une langue, mais simplement d’améliorer et d’affiner en permanence la qualité et l’efficacité de votre code.


2
The true goal is to master your conceptual understanding of a language or languages.Exactement. C'est ce que je voulais vraiment dire.
cprogcr

Tout langage de programmation est fini. Il est construit à partir d'un nombre fini de concepts, nécessite un nombre fini d'astuces idiomatiques. Par conséquent, il est facile de maîtriser n'importe quelle langue. Bien sûr, on ne peut pas maîtriser la programmation en général, il y a toujours un potentiel d'amélioration supplémentaire, mais la question concerne spécifiquement un langage donné .
SK-logic le

SK-logic: les langages de programmation changent, de même que leurs bibliothèques et leurs environnements. En conséquence, votre façon de travailler avec la langue change également. Par exemple, jQuery a changé notre façon de travailler avec Javascript.
orlp

Il est probablement vrai que personne ne peut vraiment maîtriser un langage comme le C ++, mais pour des langages quelque peu minimalistes comme Scheme, cela devrait être tout à fait possible - comme le dit @SK-logic, c’est vraiment la programmation , quel que soit le langage, qui ne peut pas être maîtrisée, car Le champ d'applications est infini.
leftaroundabout

1
@nightcracker, les langues ne "évoluent" pas. C99 sera toujours C99 et ne changera jamais. C ++ 11 restera toujours C ++ 11, même après son remplacement par un langage de nouvelle génération. Les environnements "évoluent", certes, mais jQuery n'a pas introduit de nouvelles techniques inconnues auparavant dans les autres communautés linguistiques. Ils n'étaient nouveaux que dans la communauté Javascript étroite.
SK-logic le

5

Vous connaissez déjà la réponse à cette

  • Vous devez utiliser la langue. Beaucoup. Résoudre le plus de problèmes possible
  • Vous devez lire (et, idéalement, travailler avec) le code des autres peuples, de préférence ceux qui ont un degré de maîtrise (c'est-à-dire une compréhension profonde d'au moins certains aspects de la langue). Par extension, si vous pouvez parler aux gens de la résolution de problèmes avec la langue, tant mieux.

Cela se résume à un travail acharné, à la détermination et à tout ce que vous pourriez ne jamais atteindre.

Pensez à l’origine du terme. Pour devenir un maître artisan, vous deviez être un apprenti puis un compagnon. Seuls eux pourraient avoir la chance de devenir maîtres. Tout au long du chemin, on vous enseignerait et vous pratiqueriez et vous observeriez et interrogeriez les autres selon leur métier et (espérons-le) apprendre d'eux.

Il n'y a pas de solution miracle ...


2

Commencez par lire et comprendre ce qu'est SDLC (cycle de vie du développement logiciel). C’est un processus itératif qui implique l’amélioration de soi, l’apprentissage,**practicing, practicing...**

entrez la description de l'image ici

Cela ouvrirait vos horizons sur quels domaines devez-vous apprendre ou améliorer. Il est également très utile de lire plusieurs livres de génie logiciel de base une fois que vous avez créé quelques applications par vous-même.

En outre, une fois que vous êtes à l'aise avec un langage POO , vous pouvez commencer à apprendre les modèles de conception , et Head First Design patterns est vraiment un bon livre à considérer. J'aime ce livre.


1
Merci. J'avais déjà choisi de répondre au moment où j'ai lu ceci, mais je vais certainement suivre votre conseil.
cprogcr

vous ne savez pas pourquoi, votez s'il vous plaît, faites-moi savoir ce qui doit être amélioré.
EL Yusubov

2

Il n'y a pas de substitut à l'expérience. Afin de maîtriser quelque chose, vous devez le faire / l'utiliser, beaucoup, pour différentes choses.

Alors, n'hésitez plus et utilisez ce langage pour des exercices (comme Project Euler ) et des projets personnels, des éléments dont vous avez réellement besoin ou des éléments que vous jugez intéressants. Écrivez un jeu, écrivez une application Web, écrivez un analyseur, comme vous voulez. Et à chaque étape, efforcez-vous de comprendre ce que vous faites plutôt que de simplement coller du code ou suivre des instructions.

Je veux être capable de lire le code des autres et de le comprendre, peu importe la difficulté.

C’est quelque chose que vous pouvez faire dès que vous avez compris la syntaxe de base. Il suffit de prendre un code et de prendre le temps de le détailler. Recherchez des éléments que vous ne comprenez pas ou posez des questions spécifiques à des endroits tels que Stack Overflow .


2

En haut du problème, découvrez l’architecture: comment organiser vos projets, quelle est sa structure. Ne les laissez pas grandir au hasard.

Au niveau intermédiaire, apprenez différentes techniques et paradigmes. Plus vous avez d'outils divers dans votre répertoire, plus vous avez de pouvoir. Si vous n’avez étudié que le java, le python et le ruby, vous n’avez été exposé qu’à une infime partie de l’espace de programmation. Apprenez la programmation impérative et fonctionnelle, apprenez le prologue et J. L'idée n'est pas de "maîtriser" cent langues, mais d'apprendre différentes façons de résoudre les mêmes problèmes.

Parmi les problèmes de bas niveau, une chose qui pourrait vous aider à devenir un meilleur programmeur (en fait, quoi que vous fassiez) est d’avoir un bon modèle mental de la plate-forme. Par exemple, vous pouvez apprendre comment les structures de contrôle C fonctionnent et connaître les bibliothèques les plus courantes, mais si vous ne possédez pas de modèle mental de fonctionnement des pointeurs et de la mémoire, vous aurez des problèmes avec les expressions moyennement complexes.


1

Puis-je faire quelques suggestions?

Tout d’abord, si vous pouvez trouver un mentor avec lequel discuter de votre utilisation de la langue, obtenir les meilleurs conseils et astuces, et savoir quand une technique est meilleure que l’autre.

Deuxièmement, pratiquez autant que possible et essayez la langue au maximum! J'avais l'habitude de travailler en équipe, ce qui (par amusement) choisissait chaque jour un verbe ou un autre élément du langage de programmation du manuel. C'était une marque d'honneur si vous pouviez l'intégrer à votre codage ce jour-là. Cela signifiait que toute l'équipe de programmation devait examiner et comprendre le terme (parfois) obscur afin de le comprendre et de l'utiliser efficacement. Certains jours, nous avons échoué, mais cette équipe était amusante à travailler et techniquement allumée !!


0

Les langages de programmation reflètent les idées qui sous-tendent les paradigmes de programmation développés pour le développement de logiciels à usage général ou pour le développement de logiciels à usage spécifique. Par exemple, un langage de programme tel que Java représente le paradigme de programme orienté objet, mais AspectJ (une extension de Java) est utilisé pour programmer en fonction de la programmation orientée aspect.

Compte tenu de cette brève introduction, il ne serait pas très utile d’acquérir et de lire un livre en soi pour maîtriser une langue. Vous devez comprendre l'environnement dans lequel vous pouvez programmer en utilisant le langage souhaité, en apprendre davantage sur le paradigme et, plus important encore, créer une application significative en utilisant ce langage. Construire une petite application qui peut vous donner un avant-goût des différents outils fournis par la langue est une approche d'apprentissage vraiment utile.

J'ai vu des gens venant de la pure communauté C sans rien apprendre sur l'orientation objet ni sur la difficulté d'apprendre Java ou Objective-c. J'ai également vu des gens peiner avec la programmation d'interfaces utilisateur sans vraiment comprendre les éléments d'interface utilisateur, la programmation événementielle, etc.

J'espère que ça aide!


0

J'ajouterais deux éléments à la liste de Glen

  • Essayez de résoudre un problème difficile que d’autres ont, par exemple, à donner des réponses sur le SO.
  • Lire les blogs de concepteurs / livre C'est la meilleure ressource de connaissance profonde. Vous sauriez quelle est la décision de conception derrière la raison X.

0

Construire sur ce que @TMN a dit. J'ai eu beaucoup de succès dans l'apprentissage des langues en écrivant le même programme dans une langue différente.

Par exemple, l'écriture d'un programme qui lit dans un fichier CSV, analyse le texte puis le réécrit dans un deuxième fichier CSV avec les colonnes dans l'ordre inverse.

Comme ça,

Colonne1, Colonne2, Colonne3

à

Colonne3, Colonne2, Colonne1

Cela vous donnera une compréhension de base ou la langue. Ensuite, voyez ce que vous pouvez faire d'autre. Peut-être autoriser la substitution de valeur, la réorganisation ou la lecture de la ligne de commande. Rendez-le aussi complexe que vous le souhaitez.

Je pense aussi ce que @GlenPeterson a dit à propos de,

Apprenez une langue très différente. Un grand compliment à C serait un langage fonctionnel comme Lisp. Cela transformera votre façon de penser en langage procédural.

C'est une bonne idée. Je suggérerais un langage comme Haskell car, dans les dernières versions, vous pouvez programmer en utilisant les quatre paradigmes de programmation de OO, procédural, logique ou fonctionnel. Même s’il s’agit d’un langage fonctionnel, vous pouvez avec un effort quelconque mettre en œuvre les autres paradigmes, ce qui constituerait une bonne expérience d’apprentissage.

Super langue pour jouer avec.


0

Vous ne pouvez pas apprendre une langue du livre. Tout ce dont vous avez besoin est pratique et pratique. Ne pensez pas que vous pouvez apprendre une langue à partir de ce livre particulier ou de cette source particulière. Il suffit de penser que le langage de programmation est identique au langage humain. Vous ne pouvez simplement apprendre l'anglais ou le français en lisant un livre en particulier.Tout ce dont vous avez besoin, c'est de l'utiliser la vie quotidienne. Code à partir de zéro, étendre ses fonctionnalités, essayez de construire quelque chose qui vous satisfera un peu. Et si vous envisagez de maîtriser un langage en sachant le langage entier et en utilisant chaque élément du langage de programmation dans un codage pratique ... VOUS NE POUVEZ PAS. Ou même si vous le pouvez, cela pourrait prendre 10-15 ans.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.