Apprendre à utiliser C (ou C ++) est-il une condition pour être un bon (excellent) programmeur? [fermé]


25

Lorsque j'ai commencé à apprendre à programmer, de vrais programmeurs pouvaient écrire des assemblages dans leur sommeil. Toute formation sérieuse en informatique comprendrait un peu de formation et de pratique en programmation à l'aide de l'assemblage. Cela a changé depuis, au point où je vois que les diplômes en informatique avec assemblage, s'ils sont inclus, sont relégués à une tâche et à un chapitre, pour un total de deux semaines de travail sur 4 ans de scolarité.

La programmation C / C ++ semble avoir suivi un chemin similaire. Je ne suis plus surpris d'interviewer des diplômés universitaires qui n'ont pas passé plus de deux semaines à programmer en C ++, et qui n'ont lu que C dans un livre quelque part. Bien que les diplômes CS les plus sérieux semblent encore inclure un apprentissage du temps important et l'utilisation d'une ou des deux langues, la tendance est clairement à un C / C ++ moins appliqué à l'école.

Il est clairement possible de faire une carrière produisant du bon travail sans jamais lire ou écrire une seule ligne de code C ou C ++.

Compte tenu de tout cela, est-ce que l'apprentissage des deux langues en vaut la peine? Doivent-ils absolument exceller? (au-delà des conseils évidents, non spécifiques à une langue, tels que "une bonne sélection de langues est probablement importante pour une éducation complète", et "c'est probablement une bonne idée de continuer à essayer et à apprendre de nouvelles langues tout au long de la carrière d'un programmeur, juste pour étirer les cellules grises ")


8
C est omniprésent dans l'infrastructure logicielle d'aujourd'hui. L'apprentissage vous donnera certainement une meilleure compréhension de ce qui se passe réellement dans le logiciel que vous écrivez. (Voir programmers.stackexchange.com/questions/14744/… ).
Charles Salvia

J'ai également trouvé les réponses pertinentes ici: programmers.stackexchange.com/questions/29109/…
blueberryfields

Tangentiel: un bon programmeur est à l'aise avec divers paradigmes de programmation, cela signifie avoir appris (et utilisé) plusieurs langages.
Matthieu M.

Apprendre plus de langues ne peut pas faire de mal.
Maxpm

4
Il n'y a pas de C / C ++. Il n'y a que C et C ++. Ce sont des langues très différentes, et la réponse sera probablement très différente en fonction de ce dont vous parlez.
Caleb

Réponses:


63

Joel Spolsky (oui, que Joel) a soutenu il y a quelque temps que les vrais programmeurs difficiles savent comment utiliser des langages plus durs (comme C, C ++ et Lisp) et leurs constructions (comme les pointeurs et les fonctionnalités), et que les langages de niveau supérieur n'étaient généralement pas «assez» pour démontrer votre compétence.

Je peux comprendre son point de vue que les gens qui connaissent le C et le C ++ et qui sont vraiment bons dans ce domaine en savent beaucoup plus sur ce qui se passe sous le capot que les gens qui, par exemple, programment en Ruby (et seulement en Ruby). Je dirais que ça se passe comme ceci: si vous connaissez un langage "dur", c'est probablement une bonne preuve que vous êtes capable de programmer tout en respectant des contraintes sévères ou que vous maîtrisez des modes de pensée complexes. Si vous êtes bon dans une langue de haut niveau, vous pourriez tout aussi bien pouvoir programmer tout en respectant des contraintes sévères, mais il n'y a aucune preuve de cela.

Je ne pense pas que l'apprentissage du C ou du C ++ endommagera votre cerveau (certaines personnes semblent le croire cependant). En fait, l'apprendre juste pour apprécier de meilleures langues de niveau supérieur pourrait être une bonne idée.


34

Oui, la connaissance de C (ou C ++) est nécessaire pour être un excellent programmeur (de nos jours).

Ce n'est pas la langue elle-même, c'est l'environnement.

Les programmes ne fonctionnent pas en vase clos. Un excellent programmeur connaît son environnement, comme un grand sculpteur connaît son matériel. Notre environnement de programmation actuel (systèmes d'exploitation, compilateurs, mise en réseau, etc.) est construit sur C / C ++.

Un excellent programmeur écrit des programmes efficaces et les met au point dans des situations réelles. Il doit connaître l'environnement - et il nécessite aujourd'hui de connaître le C / C ++.

Modifier: ne peut pas résister à l'ajout d'une référence de matrice. Morpheus pourrait se demander: voulez-vous prendre la pilule Java et continuer à vivre dans un monde confortable fourni par la machine virtuelle? Ou prenez-vous la pilule C et voyez à quelle profondeur va le trou du lapin?


9
+1 pour la référence Matrix, je le conserverai pour une éventuelle utilisation future :-)
Konamiman

20

Je dois me référer à un autre article de Joel. Dans The Law of Leaky Abstractions , l'apprentissage de langages comme le C, le Lisp, le C ++ et les langages qui impliquent la gestion de la mémoire impliquent également l'apprentissage d'une façon de penser qui nous définit pour le reste de notre carrière.

Mon professeur dans ma classe Structures de données et algorithmes, William Spears, a expliqué à une salle d'étudiants sceptiques en informatique pourquoi nous n'étions pas en train d'apprendre les derniers outils. Les étudiants se sont plaints d'avoir l'impression de ne pas être préparés au «monde réel» parce que nous n'étions pas en train d'apprendre Java. Nous n'étions pas en train d'apprendre JavaScript. Il n'y avait pas de cours sur HTML. Nous n'étions pas en train d'apprendre [[INSÉRER LA TECHNOLOGIE ICI]].

Pourquoi n'avons-nous pas appris les derniers outils? Selon notre professeur, la technologie évolue si vite qu'en 4 ans, les outils que nous apprenons pourraient très bien être obsolètes. Eh bien, après quelques années dans l'industrie, je dois dire que je suis d'accord avec son évaluation.

Le but d'une formation en informatique est d'apprendre à apprendre. Trouver des solutions à de nombreux problèmes de développement nécessite souvent une capacité à sortir des sentiers battus qui ne peut venir que de l'apprentissage de base, fondamental, sous le capot, de l'informatique brute issue du travail avec C, C ++ et Lisp.

Lorsque ces abstractions dans le monde réel fuient, et elles le feront, une compréhension des bases est ce qui sépare la moyenne du meilleur.


3
J'ai dû louper quelque chose. Qu'est-ce que Lisp a à voir avec les fondamentaux de l'apprentissage? C'est la plus grande inversion d'abstraction jamais inventée. L'un de ses objectifs de conception fondamentaux à l'origine était "supposons que nous ne sommes pas vraiment sur une machine Turing et voyons à quel point nous pouvons simplifier les choses en faisant cela."
Mason Wheeler

6
@Mason: Apprendre Lisp ne vous apprendra pratiquement rien sur les ordinateurs du monde réel. Il vous apprendra beaucoup sur la théorie du calcul. L'informatique brute, c'est bien plus que des ordinateurs bruts.
David Thornley

2
@Mason Wheeler Learning lisp introduit plusieurs concepts avancés, notamment: les données / code sont interchangeables, le code de réflexion / d'auto-modification et l'importance de considérer votre compilateur / vm comme une partie de votre produit final
blueberryfields

@blueberryfields: ... qui sont tous considérés comme des vulnérabilités nuisibles et / ou de sécurité à un degré ou un autre par des codeurs plus expérimentés. De très mauvaises choses à enseigner aux débutants.
Mason Wheeler

2
@Mason Je ne comprends pas le contexte de votre commentaire - nous parlons ici d'excellents programmeurs, pas de débutants. Je ne considérerais pas un programmeur, qui n'a pas une compréhension approfondie de ces concepts et les applique de manière appropriée (et régulière) dans son travail, comme un expert.
blueberryfields

18

Laisses-moi le mettre comme ça. Supposons que vous deviez embaucher quelqu'un pour faire du travail en C ++, et quelqu'un qui a fait un projet C ++ à l'université, mais n'a programmé en Java que depuis l'obtention du diplôme. À l'inverse, supposons que vous deviez embaucher quelqu'un pour certains travaux Java, et quelqu'un qui a fait un projet Java au collège mais n'a programmé en C ++ que depuis l'obtention du diplôme.

Qui allez-vous être plus à l'aise d'embaucher? Je dirais que le gars C ++, car passer à l'utilisation d'un langage de collecte des ordures est beaucoup plus facile que de s'en éloigner. De même pour d'autres concepts et d'autres langages, comme passer de compilé à interprété, ou de statique à dynamique. Dans presque toutes les fonctionnalités par comparaison de fonctionnalités que vous pouvez faire entre les langages, C ++ sort sur la fin difficile, ce qui rend la programmation difficile, mais aussi une excellente base de référence pour juger un programmeur.

Pouvez-vous prospérer dans une carrière sans jamais toucher au code C ou C ++? Bien sûr, mais je ne voudrais toujours pas embaucher quelqu'un qui n'a pas pu ou peur de le faire.


3
Argument peu impressionnant. Si j'avais besoin d'un travail Java, j'embaucherais quelqu'un avec une expérience Java. Si j'avais besoin de travail C ++, j'embaucherais quelqu'un avec une expérience C ++. Si je devais embaucher un gars Java pour un poste C ++, je pourrais passer un peu plus de temps à l'interroger pour le questionner sur les pointeurs et la gestion de la mémoire et RAII; de même, si je devais embaucher un gars C ++ pour un poste Java, je passerais plus de temps dans l'interview à poser des questions sur la nervosité, les modèles de conception, la réflexion, etc. La majeure partie de la courbe d'apprentissage se trouve de toute façon dans les bibliothèques.
Aaronaught

13

Non, il n'est pas nécessaire d'apprendre le C ou le C ++ pour être un bon programmeur mais le comprendre aiderait à effacer certains concepts de base comme la gestion de la mémoire.


7

est-ce que l'apprentissage des deux langues en vaut la peine?

Il est clairement possible de faire une carrière produisant du bon travail sans jamais lire ou écrire une seule ligne de code C ou C ++.


6

En bref, non, ils ne le sont pas. Ce sont des langages utiles à apprendre, mais vous pouvez facilement être un excellent programmeur sans toucher à une ligne de C ou C ++. La plupart des excellents programmeurs les auront probablement touchés, mais c'est d'ailleurs le point important - dans de nombreuses applications de nos jours, ils ne sont pas autant utilisés que .NET et Java, et en tant que tels, leur nécessité a quelque peu diminué.

Notez que je ne dis pas qu'ils ne valent pas la peine d'être appris, je pense que ce sont deux langues importantes à apprendre, surtout si vous prévoyez de faire carrière dans la programmation. Mais pouvez-vous être un programmeur décent sans jamais avoir touché non plus? Sûr.


5

Cela dépend de vos intérêts.
Si vous voulez être en programmation système, oui, vous devrez apprendre le C / C ++ car ce sont des langages par défaut de CS. Afin de vous familiariser avec les concepts OS, les compilateurs, les structures de données, la gestion de la mémoire, etc., vous devez connaître le C / C ++. De plus, des tonnes de bons textes, livres et articles sont disponibles sur C / C ++, ce qui optimisera vos compétences en programmation. Il y a quelques jours dans / * Programmers * / j'ai lu une excellente réponse pour Why C - Parce que c'est proche du métal .
À l'inverse, si vous voulez vous limiter à la programmation d'applications, il n'est pas nécessaire d'opter pour C / C ++, commencez directement avec C # (.Net) / Java et vous obtiendrez un bon travail de développeur. Mais si vous aimez vraiment la programmation hardcore, je suis sûr qu'un jour vous commencerez à apprendre le C / C ++.


Près du métal! J'adore ce commentaire.
Wajih

3

Cela dépend totalement du domaine d'application dans lequel vous souhaitez travailler. Si vous voulez jouer dans le paysage intégré, vous devez à peu près connaître le C ou le C ++. C ++ est également probablement le langage le plus utilisé dans le développement de jeux. Si vous souhaitez travailler sur des applications Web, alors C ou C ++ peut ne pas être aussi important. Il n'y a pas de langage qui ait le prestige d'être tenu de connaître comme priorité pour définir un bon ingénieur logiciel.


3

C a été nommé "portablement assemblé", ce qui est très vrai. Il a été conçu pour rendre Unix portable sur tous les processeurs et décrire un code très proche du jeu d'instructions du processeur sous-jacent.

Si vous souhaitez travailler à proximité du matériel réel, en étant dans des pilotes de logiciels ou de périphériques intégrés, etc., il n'y a aucun moyen de contourner C. Si vous voulez travailler dans les langues les plus courantes et de haut niveau, c'est une meilleure idée car de nombreuses fonctionnalités qui rendent C puissant rendent également C dangereux, donc elles ont été réduites ou simplement supprimées.

Personnellement, je considérerais qu'il est très important de comprendre ce qui finira par nécessiter l'exécution de vos programmes, car de nombreuses décisions de conception en dépendent, vous devez donc au moins savoir comment mapper du code sur le jeu d'instructions d'assemblage et comment il fonctionne dans la réalité. Matériel. Que les choses que vous tenez pour acquises prennent du temps et pourquoi.

Par conséquent, je suggérerais au moins de jeter un œil à C et à un code arithmétique avancé de pointeur, afin que vous sachiez ce que vous n'avez pas à gérer quotidiennement.


1

C est utile à apprendre car il est proche du silicium. Le langage C ou assembleur vous donnera une bonne idée de ce que les ordinateurs peuvent faire et comment ils le font, et cela sera probablement utile pour comprendre ce qui est possible et ce qui est pratique. De plus, il y a beaucoup de code C qui pourrait vous intéresser, et un grand nombre de langages plus modernes utilisent une grande partie de sa syntaxe et de sa sémantique.

C ++ est un langage de niveau supérieur qui contient des fonctionnalités très intéressantes. Il a de nombreuses bonnes utilisations et est un langage puissant. D'un autre côté, il existe de nombreux autres langages puissants et utiles.

Donc, je recommande fortement d'apprendre ce qui se passe aux niveaux inférieurs, et C est un excellent moyen de les apprendre, donc je recommande fortement d'apprendre C. C ++ est facultatif; l'apprendre vous apprendra des choses, mais il existe d'autres façons d'apprendre la plupart d'entre elles, et si vous travaillez déjà dans une langue traditionnelle, il y a de meilleures langues à apprendre pour apprendre de nouveaux concepts.


0

Cela dépend du type de logiciel que vous pensez créer. Les jeux sont souvent écrits en C / C ++ car c'est classiquement un langage plus optimisé en ce qui concerne le code exécutable. Ce que vous codez est à peu près ce que vous obtenez, en quelque sorte.

Cela étant dit, C # a également été utilisé pour programmer des jeux. C # est probablement l' un des les meilleures langues pour le développement d'applications de bureau, au moins sur la plate - forme Windows.

Avec Visual Studio, C # est devenu presque le seul langage de développement logiciel que j'utilise (excusant des langages comme SQL et PHP, etc.) car il est à toutes fins utiles, sanglant fantastique à mon avis.

Si vous développez sur Windows, je vous recommande fortement d'apprendre C # .NET en parallèle à toute autre chose.

Je ne pense pas que le C ++ soit une exigence en soi, mais c'est bien d'avoir une connaissance de niveau inférieur des pointeurs, de la gestion de la mémoire et d'autres concepts.


1
@ Nick: Le monde informatique est au-delà des fenêtres et du C #.
Ranger

2
C'est pourquoi j'ai dit: "Si vous développez sous Windows" .
Nick Bedford

0

@Nick Bedford a raison sur le domaine dans lequel vous travaillez. Mes homologues logiciels écrivent des pilotes de périphériques et des logiciels intégrés. C est le chemin pour y aller. Et ne pensez pas au C ++ comme un deuxième langage, ils se chevauchent énormément.


3
Si vous ne considérez pas le C ++ comme un langage différent du C, vous ne connaissez vraiment pas bien le C ++. Travailler uniquement dans le chevauchement est possible mais non recommandé.
David Thornley

J'exagère peut-être la similitude. Mais ils sont plus les mêmes que, par exemple, C et Perl.
Brian Carlton

0

Beaucoup ont dit que C est bon à apprendre pour la gestion de la mémoire et je suis d'accord. Pour mon avis sur l'apprentissage C, c'est qu'il est très bon d'apprendre pour apprendre à déboguer un programme. Beaucoup de choses peuvent mal se passer par écrit pour C qui vous oblige à réfléchir à la façon dont vous devriez déboguer vos programmes. J'utilise rarement un outil de débogage dans aucune de mes programmations (en C ou dans d'autres langages) simplement parce que C m'a appris à ajouter des utilitaires de débogage intégrés dans les programmes.

L'apprentissage du C / C ++ est-il nécessaire pour une carrière? Non, mais j'ai également vu beaucoup de développeurs Java qui ne connaissent pas beaucoup les bases de la programmation car ils n'ont appris que Java. Même chose avec les programmeurs Perl. L'apprentissage de plusieurs langues devrait être une exigence pour une carrière, que le C / C ++ soit l'un de ces langages ou non.


+1 - Voir des concepts similaires présentés différemment dans différentes langues m'a aidé à mieux comprendre ces concepts et à les voir sous un tout nouveau jour.
jmort253

0

Au début, je pensais que mon université était dans la génération de Dennis M. Ritchie pour avoir inclus C pendant 2 semestres quand il y a beaucoup de langages relativement nouveaux comme Java, Visual Basic et cetera. Mais le fait est, ou du moins maintenant je crois, que C est l'un des meilleurs langages qui vous aident à comprendre les concepts fondamentaux de la programmation.

Et sur la carrière sans apprendre le C (ou C ++) - Oui, c'est possible, mais l'apprentissage du C mettra en valeur vos connaissances en programmation.


0

La réponse pour moi était oui. C et C ++ étaient tous les deux des cours obligatoires dans mon programme de diplôme CS, et je crois que la possession d'un diplôme CS ou connexe est une exigence minimale pour être un "bon programmeur". De plus, être un «bon programmeur» signifie pouvoir rationaliser les problèmes qui se produisent et comprendre pourquoi quelque chose ne fonctionne pas comme on pourrait s'y attendre. Trop de fois dans ma carrière, j'ai vu des individus perplexes à cause de problèmes et pensant que des forces surnaturelles travaillaient contre eux ... c'est ridicule.

L'OMI, connaissant C, démontre sa capacité à comprendre n'importe quel langage impératif et à résoudre des problèmes en utilisant l'un des outils les plus puissants jamais inventés par l'humanité.


0

Un programmeur bien équilibré a plusieurs sacs de trucs dans sa manche, et ceux-ci comprennent:

1) Programmation de bas niveau ... C au minimum. Certains assemblages ne feraient pas de mal.

2) Programmation fonctionnelle ... Un langage fonctionnel pur, pas un hybride - Scheme fonctionne ici.

3) OOP ... Normalement, je dirais smalltalk, mais je suppose que nous pourrions aller avec Java maintenant.


0

C est la mère de tous les langages de programmation .... les connaissances expertes en C vous permettent de connaître un autre langage comme Java en peu de temps.

C ++ est un jeu de balle complètement différent et est le plus complexe de tous.


0

Il n'est pas nécessaire d'apprendre le C ou le C ++ pour être un bon (excellent) programmeur mais il est nécessaire d'apprendre l'assemblage pour être un bon (excellent) programmeur. Une excellente programmation signifie optimiser la mémoire, le Mhz, la bande passante, les contraintes de puissance, puis choisir la meilleure conception et / ou implémentation pour accomplir la tâche à accomplir. Chez les informaticiens, la principale faiblesse reste, après des décennies d'évolution des technologies, avec une gestion optimale des données. Il s'agit d'un ensemble de compétences enseignées en écrivant Assembly (tout assemblage; il peut s'agir d'ARM, ou MIPS, ou x86, ou d'un microcontrôleur, ou d'un DSP, ou même inférieur à cela, via verilog / VHDL).


0

Ayant utilisé avec compétence c, c ++, assembly et Lisp, je dirais que cela n'a aucun sens d'avoir à apprendre un langage particulier pour être un bon programmeur. Mes expériences avec ce qui fait un bon programmeur est de pouvoir penser d'une manière qui résout les problèmes. Les langues vous permettent simplement d'exprimer vos compétences en résolution de problèmes. Par exemple, la simplicité de C vous permet d'exprimer facilement des algorithmes, tandis que Lisp vous permet de résoudre les problèmes de manière récursive. Un langage ne fait donc pas de vous un programmeur. Vous devez être un résolveur de problèmes avant de devenir un bon programmeur. Les langues ne sont que des outils que vous utilisez pour résoudre des problèmes.


-1

Il vaut la peine d'apprendre le C simplement pour acquérir une solide compréhension de la gestion de la mémoire. Idem pour C ++ sauf dans le but d'apprendre des structures de données.


Peu importe la langue utilisée pour apprendre les structures de données.
kirk.burleson

Je crois que c'est le cas parce que dans beaucoup d'autres langues, les structures de données sont utilisées sans savoir comment elles sont gérées en mémoire. C ++ (sans utilisation de STL) oblige le programmeur à apprendre comment les structures de données sont gérées au bas niveau.
aqua

-1

Non. Il existe de nombreux programmeurs pourris qui écrivent du code C / C ++. Ce qui fera de vous un bon programmeur, c'est de comprendre quand et pourquoi vous devrez écrire quelque chose en C / C ++

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.