Les développeurs .NET * devraient-ils * vraiment * passer du temps à apprendre le C pour une exposition de bas niveau?

StackOverflow https://stackoverflow.com/questions/125791

  •  02-07-2019
  •  | 
  •  

Question

Lorsque Joel Spolsky et Jeff Atwood ont commencé le désaccord dans leur podcast sur le point de savoir si les programmeurs devaient apprendre le C, quels que soient leur secteur d’activité et leur plate-forme de diffusion, cela a déclenché un débat explosif au sein de la communauté des développeurs qui fait probablement encore rage parmi certains groupes. J'ai lu un certain nombre de passages d'un certain nombre de blogueurs programmeurs avec leur point de vue sur le sujet. Les arguments des deux côtés ont certainement de l'importance, mais ce que je n'ai pas trouvé, c'est une perspective uniquement du point de vue des développeurs focalisés uniquement sur le .NET Framework . Pratiquement tous commentaient le point de vue général des programmeurs.

Qu'est-ce que j'essaie de comprendre? Rappelez-vous que Jeff Atwood était d'avis que la plupart du temps, les développeurs à des niveaux aussi élevés consacreraient à l'apprentissage de l'entreprise / du domaine , en plus de ce qui est nécessaire pour apprendre les technologies permettant de répondre aux exigences de ce domaine. Dans mon expérience professionnelle, c’est une description très précise de la vie professionnelle de plusieurs personnes. Supposons maintenant que les développeurs .NET puissent gagner du temps pour les activités "extrascolaires". apprendre, doit-on que être C?

Pour mémoire, j’ai moi-même appris le C à l’école et je peux tout à fait comprendre et apprécier ce que les promoteurs raisonnent. Toutefois, lorsque je réfléchis, j’estime personnellement que les développeurs .NET ne devraient pas plonger directement dans C. En effet, ce que je souhaite à plus de développeurs prendrait un peu de temps à apprendre, c’est - MSIL et CLR .

Peut-être que je suis coincé avec un groupe inhabituel de collègues, je ne sais pas, mais il me semble que beaucoup de gens ne gardent pas une prise de conscience que leur code C # ou VB compile en IL avant que JIT entre et rend le code machine brut. La plupart ne connaissent pas IL et n'ont aucun intérêt à savoir comment exactement le CLR gère le code qu'ils écrivent. Lire le CLR via C # de Jeffrey Richter a été assez choquant pour moi dans tant de domaines; Je suis heureux de l'avoir lu, même si mes collègues l'ont qualifié de "niveau trop bas". Je ne suis pas un expert en IL, mais avec la connaissance des bases, je me suis retrouvé à suivre son texte plus facilement car je connaissais déjà le comportement de pile de IL. Je me trouve à désassembler des assemblages pour jeter un coup d’œil à l’évolution de l’IL lorsque j’écris certains codes.

J'apprends le CLR et le MSIL parce que je sais que c'est la couche directe en dessous de moi . La couche qui me permet de réaliser ma propre couche de travail. C, est en fait plus bas. Plus proche de notre " réalité " est le CLR et MSIL. C'est pourquoi je recommanderais aux autres d'essayer ceux-ci, car je ne vois pas assez de gens se plonger dans cette couche. Ou bien votre équipe connaît-elle déjà MSIL?

Était-ce utile?

La solution

Je connais déjà C et cela m’a aidé pendant les 1.1 jours où il y a beaucoup de choses qui ne se trouvent pas encore dans les bibliothèques de base .NET et je dois P / Invoke quelque chose du Platform SDK.

Mon avis est que nous devrions toujours prévoir un temps pour apprendre quelque chose que nous ne savons pas encore. Pour répondre à votre question, je ne pense pas qu’il soit essentiel pour vous d’apprendre le C, mais si vous avez un peu de temps, C est une bonne langue à apprendre et est tout aussi valable que toute autre langue.

Autres conseils

Bien sûr, vous devriez. Le meilleur moyen de devenir excessivement spécialisé et déterminé (et, par conséquent, d'avoir des compétences négociables limitées) est de ne travailler qu'avec un seul type de langue et d'éviter que toutes les autres ne soient "liées à votre tâche actuelle".

Chaque programmeur devrait avoir une expérience avec un langage JIT'd OO moderne (C # / Java), un langage plus simple de niveau inférieur (C, FORTRAN, etc.), un langage interprété de très haut niveau (Python, Ruby, etc.) , et un langage fonctionnel (Scheme, Lisp, Haskell, etc.). Même si vous ne les utilisez pas tous au quotidien, l’élargissement de votre processus de réflexion que de telles connaissances accordent est très utile.

Vrai, C est bien en dessous de la chaîne. Connaître MSIL peut aider les développeurs à comprendre comment optimiser leurs applications. Pour ce qui est d’apprendre le C ou le MSIL, pourquoi pas les deux? :)

Les développeurs .NET devraient en savoir plus sur le CLR. Mais ils devraient aussi apprendre le C. Je ne vois pas comment quiconque peut vraiment comprendre le fonctionnement du CLR sans une compréhension élémentaire de ce qui se passe dans le métal nu.

Passer du temps à apprendre des concepts de niveau supérieur est certes avantageux, mais si vous vous concentrez trop sur le niveau élevé au détriment du niveau bas, vous risquez de devenir l’un de ces "architectes". personnes capables de dessiner des boîtes et des lignes sur des tableaux blancs, mais qui sont incapables d’écrire du code.

Ce que vous apprendrez en apprenant C sera utile pour le reste de votre carrière. Ce que vous apprendrez sur le CLR deviendra obsolète à mesure que Microsoft changera de plate-forme.

Mon opinion est qu'apprendre un langage compilé et un assemblage est un must . Sans cela, vous n'obtiendrez pas la polyvalence requise pour basculer entre les langues et les piles.

Pour être plus précis, je pense que tout bon / grand programmeur doit savoir ces choses par expérience directe:

  • Quelle est la différence entre un registre et une variable?
  • Qu'est-ce que le DMA?
  • Comment un pixel est-il affiché à l'écran (au niveau bas)?
  • Que sont les interruptions?
  • ...

La connaissance de ces choses est la différence entre travailler avec un système que vous comprenez et un système qui, pour tout ce que vous savez, fonctionne par magie. :)

Pour adresser certains commentaires

Vous avez deux types de développeurs différents:

  • personnes pouvant faire une chose de 10 façons dans une ou deux langues
  • personnes pouvant faire une chose d'une ou deux manières dans 10 langues différentes

Je pense fermement que le deuxième groupe est globalement le meilleur développeur.

J'y pense comme ça:

  1. Les programmeurs devraient probablement travailler dans le langage de plus haut niveau approprié. Ce qui est approprié dépend de votre scénario. Un pilote de périphérique ou un système intégré appartient à une classe différente de celle d’une application de bureau ou d’une page Web CRUD.
  2. Vous voulez que vos programmeurs s'exercent autant que possible dans la langue dans laquelle ils travaillent.
  3. Etant donné que la plupart des programmeurs finissent par travailler sur des applications de bureau et Web génériques, vous souhaitez que les étudiants en programmation passent aux langues les plus avancées dès que possible pendant les heures de cours.
  4. Cependant, les langages de plus haut niveau dissimulent quelques problèmes de programmation élémentaires, tels que les pointeurs. Si nous appliquons également notre principe d'utilisation de ce qui convient aux étudiants, ces langues de niveau supérieur pourraient ne pas convenir aux étudiants de première année. Cela supprime Java, .Net, Python et bien d’autres.
  5. Les étudiants doivent donc utiliser C (ou mieux encore: C ++ puisqu'il s'agit d'un "niveau supérieur" qui couvre la plupart des mêmes concepts) pendant les deux premières années d'école afin de couvrir les concepts de base, mais de passer rapidement à un niveau supérieur. langue de niveau supérieur pour activer plus tôt les programmes difficiles.

Pour être suffisamment avancé en écriture en C #, vous devez comprendre les concepts en C, même si vous n’apprenez pas la langue proprement dite.

Plus généralement, si vous tenez vraiment à l'une des compétences, vous devez savoir ce qu'il se passe au moins à un niveau d'abstraction inférieur à votre niveau de travail principal.

  • Le codage dans jQuery doit être associé à une compréhension de JavaScript
  • La conception de circuits nécessite de connaître la physique
  • Tout bon joueur de basketball apprendra les muscles, les os et la nutrition
  • Un violoniste étudiera l’interaction entre la colophane, les frottements, les poils d’arc, les cordes et la sécheresse du bois

J'aime apprendre une nouvelle langue chaque année. Pas nécessairement pour le maîtriser, mais pour forcer mon cerveau à penser de différentes manières.

Je pense que l’apprentissage du langage C est un bon langage pour apprendre les concepts de bas niveau sans avoir à utiliser le codage en assemblage.

Cependant, j'estime qu'apprendre des leçons de langues comme Haskell, python, et même sans doute regex (pas exactement une langue, mais vous attrapez ma dérive?) est aussi important que les leçons à tirer de C.

Je vous dis donc de vous renseigner sur le CLR et le MSIL au travail si c'est votre domaine et pendant votre temps libre, essayez de choisir une langue différente de temps en temps. Si cela se produit en C cette année, tant mieux et amusez-vous à jouer avec les pointeurs;)

Je ne vois pas pourquoi ils devraient le faire. Des langages tels que Java et C # ont été conçus pour que vous n'ayez pas à vous soucier des détails de bas niveau. C’est la même chose de demander si un développeur WinForms devrait passer du temps à apprendre l’API Win32 parce que c’est ce qui se passe dessous.

Même si cela ne fait pas de mal de l’apprendre, vous gagnerez probablement plus à passer plus de temps à apprendre les langues et les plates-formes que vous connaissez bien, à moins que vous ne deviez apprendre les détails techniques de bas niveau.

Ce n’est pas une mauvaise idée d’apprendre MSIL, c’est un peu un autre langage .NET, mais avec une syntaxe désagréable. C’est une autre couche, cependant, et je pense que les gens devraient au moins avoir une idée vague de toutes les couches.

C, étant un peu comme le langage assembleur avec une syntaxe plus jolie, est un bon moyen de se faire une idée de ce qui se passe à un niveau assez bas (même si certaines choses vous sont encore cachées).

Et de l’autre côté, je pense que tout le monde devrait connaître un peu quelque chose comme Haskell ou Lisp pour avoir une idée des choses de plus haut niveau (et voir certaines des idées introduites dans C # 3 sous une forme plus propre)

Si vous vous considérez comme un programmeur, je dirais que oui, apprenez C.

Beaucoup de personnes qui écrivent du code ne se considèrent pas comme des programmeurs. J'écris des applications .NET environ 3 heures par jour au travail, mais je ne m'identifie pas comme un "programmeur". Je fais beaucoup de choses qui n'ont rien à voir avec la programmation.

Si vous passez toute la journée à programmer ou à penser à programmer, et que vous allez faire tourner toute votre carrière autour de la programmation, vous feriez mieux de connaître votre contenu. Apprendre C aiderait probablement à créer une base de connaissances qui serait utile si vous voulez approfondir vos compétences en programmation.

Avec tout, il y a des compromis. Plus vous apprenez de langues et consacrez plus de temps à la technologie, moins vous avez de temps pour acquérir d'autres compétences. Par exemple, serait-il préférable d'apprendre le C ou de lire des livres sur la gestion de projet? Cela dépend de vos objectifs. Vous voulez être le meilleur programmeur EVAR? Apprendre C. Passez des heures et des heures à écrire du code et à vous consacrer au métier. Vous voulez jamais gérer quelqu'un d'autre au lieu de coder toute la journée? Utilisez le temps que vous consacriez à la programmation et trouvez des moyens d’améliorer vos compétences générales.

Les développeurs .net devraient-ils apprendre le C? Je dirais "pas nécessairement", mais nous devrions toujours utiliser une langue en dehors de notre bazar professionnel, car chaque langue apporte une nouvelle façon de penser aux problèmes. Au cours de ma carrière professionnelle en tant que développeur .net (et avant cela, VB 2-6), j’ai écrit de petits projets en Pascal, LISP, C, C ++, PHP, JavaScript, Ruby et Python. Perl.

Hormis le C ++, je ne les énumère pas dans mon CV car je ne cherche pas à devenir professionnel dans aucun d’eux. Au lieu de cela, je ramène des idées intéressantes de chacun d’eux à utiliser dans mon travail basé sur .net.

C est intéressant en ce sens que cela vous rapproche vraiment du système d'exploitation, mais ce n'est pas le seul niveau à connaître pour être un bon programmeur.

Le CLR est une machine virtuelle . Si c'est tout ce que vous apprenez, vous ne pouvez donc savoir que ce qui se passe au niveau virtuel.

L’apprentissage de C vous en apprendra plus sur la machine physique en ce qui concerne l’utilisation de la mémoire, ce qui, comme vous le dites, correspond à ce que le CLR utilise en dessous. Apprendre le fonctionnement du CLR ne vous donnera pas autant d'informations sur, par exemple, la récupération de place, mais plutôt l'apprentissage de C. Avec C, vous appréciez vraiment ce qui est impliqué dans la gestion de la mémoire.

L’apprentissage de CIL , en revanche, vous en dit un peu plus sur l’exécution dans .NET que sur l’apprentissage de C . Néanmoins, la façon dont la IL correspondance avec le langage machine restera toujours un mystère, alors connaître certains des opcodes de haut niveau, tels que ceux des types de casting, n'est-il pas utile en termes de compréhension que se passe-t-il réellement, car ils sont pour la plupart opaques. L’apprentissage de C et des indicateurs vous éclairera sur certains de ces aspects.

La question est-elle d’apprentissage C ou MSIL, ou est-ce plus fondamental? Je dirais qu'en général, davantage de développeurs pourraient en savoir plus sur le fonctionnement des ordinateurs , physiques ou virtuels. Une personne peut devenir un programmeur assez compétent en ne comprenant qu'un langage et une API dans une boîte. Pour que la profession passe au niveau supérieur, j’estime que les développeurs ont vraiment besoin de comprendre toute la pile. Pas nécessairement dans les détails, mais dans une généralité suffisante pour aider à résoudre les problèmes.

Beaucoup de ces compétences dont on parle ici peuvent être acquises en en apprenant plus sur les compilateurs et la conception de langage. Vous devez probablement apprendre le C pour faire cela (whoops, sournois), mais l'écriture de compilateur est un excellent contexte pour apprendre le C. Steve Yegge en parle sur son blog, et je suis largement d'accord avec lui sur ce point. Mon cours d’écriture de compilateur à l’université a été l’un des cours les plus révélateurs que j’ai jamais suivis, et j’aimerais vraiment qu’il s’agisse d’un cours de niveau 200 plutôt que de niveau 400.

J'ai posté ceci sur un autre sujet mais cela s'applique ici à:

Je crois que vous avez besoin de bonnes bases, mais consacrez la majeure partie de votre temps à apprendre ce que vous allez utiliser.

  • Apprenez suffisamment d'assembleur pour ajouter deux nombres et afficher le résultat sur une console. Vous aurez une bien meilleure compréhension de ce qui se passe réellement avec l'ordinateur et vous comprendrez pourquoi nous utilisons binaire / Hex. (Cela peut être fait en un jour et avec déboguer à partir de cmd.exe ).
  • Apprenez suffisamment de C pour allouer de la mémoire et utiliser des pointeurs. Une simple liste chaînée suffit. (Cela peut être fait en un jour ou deux).
  • Passez plus de temps à apprendre une langue que vous allez utiliser. Je laisserais vos centres d'intérêt vous guider dans quelle langue (C #, Java, Ruby, Python, etc.).
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top