web-dev-qa-db-fra.com

Le C ++ convient-il comme première langue?

Un collège local enseigne le C++ à des étudiants de première année (16 ans) sans expérience préalable en programmation.

En tant que premier langage de programmation, le C++ convient-il?

26
Ed James

Avec insistance Non .

Pour tout objectif que vous avez en tête pour les étudiants, une autre langue ou séquence de langues serait plus rapide et meilleure. Exemples.

"Les élèves doivent comprendre les concepts de bas niveau."

Le codage "de bas niveau" ne consiste pas à récupérer des objets à partir de new, à les renvoyer à delete, et à avoir occasionnellement un pointeur pointant quelque part où il ne devrait pas. Les fonctions, classes et modèles ne sont pas de bas niveau. RAII, 12 façons d'utiliser const, std::ostream::operator<<, protected et new ne sont pas des concepts de bas niveau. Ces choses ont des implications de bas niveau et vous les ignorez pendant des mois ou jusqu'à une classe future et enseignez des montagnes de sémantique C++ à la place.

Je suggère un assembleur avec un bon environnement et du matériel pédagogique comme MIPS ou MMIX. Si vous êtes pressé, apprenez à C avec des détours à regarder au moins la sortie de l'assembleur. Cela vous donnera toutes les connaissances de bas niveau que C++ fait, puis certaines plus rapidement.

"Les élèves doivent comprendre l'orientation objet."

L'orientation objet intégrée dans C++ est beaucoup trop compliquée pour enseigner OO concepts, ou presque tout autre concept de haut niveau. Voir La FAQ C++ pour une longue liste agréable) de raisons potentielles. Vous devez soit frapper tous ces trucs, ce qui prendra très, très longtemps avec les nouveaux programmeurs; soit vous devez en sauter beaucoup, laissant les nouveaux programmeurs dans le noir - effectivement, pas connaissant vraiment le C++!

Je suggère d'abord d'apprendre un langage simple et de haut niveau avec des objets (Python, Ruby, Squeak, Common LISP, Racket), si vous devez enseigner le C++. Au-delà de cela, apprenez le polymorphisme en tant que concept distinct de OO en visitant un langage fonctionnel.

"Les élèves doivent comprendre les modèles et la métaprogrammation des modèles."

Personne ne le demande vraiment, mais j'aimerais bien. C++ a de beaux modèles et STL est cool, mais ils ne devraient tout simplement pas être une priorité suffisamment élevée pour enseigner le C++ en premier. L'enseignement du système de type OCaml ou Haskell, puis la mise à niveau de ces concepts pourraient de toute façon être plus rapides.

"Les élèves doivent apprendre à résoudre des problèmes."

Oui, vous obtenez cela dans n'importe quel langage, et vous obtenez plus si c'est dans presque n'importe quel langage autre que C++ parce qu'il y a beaucoup moins de bagages. Encore une fois, voir La FAQ C++ pour une liste de toutes les choses que les étudiants apprendront au lieu des compétences en résolution de problèmes.

"Tout ce qui précède, et nous devons utiliser une seule langue." ou "Les employeurs le veulent." ou "Nous avons besoin d'un langage de style C." ou ...

Enseigner plus d'une langue.

L'idée que vous économisez du temps ou de l'énergie en enseignant ou en apprenant une seule langue est tout simplement ridicule. Il est basé sur l'idée que l'apprentissage d'une langue donnée prend exactement X mois homme ( HINT! HINT! ) où X est un nombre unique ou un nombre par langue. Ceci est presque identique à l'idée que vous pouvez gagner du temps et de l'argent en évitant toutes ces ordures et les tests.

En ce qui concerne les syntaxes multiples, vous paralysez dangereusement les élèves si vous leur apprenez à attendre la syntaxe C dans chaque langue en les rendant très biaisés par rapport aux autres langues.

Presque n'importe quel chemin est plus rapide et meilleur que de commencer avec C++. Apprendre un langage simple de haut niveau puis C++ serait plus rapide. L'apprentissage de l'assembleur puis du C++ serait plus rapide. Tout autre que C++ amènera les étudiants plus rapidement et ils en sauront bien plus pour démarrer. N'enseignez pas d'abord le C++.

61
Jesse Millikan

Non, C++ est un langage difficile même pour les développeurs C++ expérimentés. Même pour les algorithmes les plus simples, vous devez expliquer la plupart des subtilités du langage. Prenons un exemple de Hello World:

#include <iostream>

int main()
{
  std::cout << "Hello World!" << std::endl;
}

Qu'est-ce que c'est #include commande? Qu'est-ce que std::cout. Pourquoi le ::? Quel est <<? Ohhh, c'est un opérateur surchargé! Qu'est-ce qu'un opérateur surchargé? Sooo, pour ints, il fait un décalage de bits, mais pour tout std::cout est, il envoie des trucs à la console. Ohhh, std::cout est un flux et les flux ont leur << et >> opérateur surchargé.

Voyons le même exemple en Python:

print("Hello World!")

Voilà, allons coder quelques algorithmes.

54
Marco Mustapic

Ce n'est probablement pas une bonne première langue: syntaxe complexe, beaucoup de règles, ancien langage, gestion de la mémoire sujette aux erreurs. Mieux vaut enseigner à vos élèves quelque chose de plus OO comme Smalltalk, ou quelque chose de plus agréable à programmer avec comme Python, ou quelque chose de fonctionnel comme Haskell.

Ils peuvent apprendre le C++ plus tard dans la vie (s'ils ne peuvent pas s'en empêcher), après avoir appris de meilleurs langages.

21
Andres F.

Réponse courte: Oui!

Je dirais que le langage any est un début approprié mais surtout C++ (ou équivalent). De nos jours, C # et Java sont les principaux langages utilisés et programmés avec ceux-ci, vous apprenez rapidement à vous appuyer sur l'API et les IDE, mais avec C++ vous avez la possibilité d'apprendre la programmation à partir de zéro, y compris les performances optimisation, etc.

Ce n'est jamais une mauvaise idée d'apprendre les bases de la programmation, de la boucle et du tri avant de vous fier aveuglément à un langage intégré à .Sort ();

18
Mantisen

En fait, je crois que c'est probablement un bon choix comme première langue pour une raison très pratique: après avoir appris le C++, tout autre langage que vous rencontrerez semblera un jeu d'enfant à apprendre.

14
ennuikiller

Je me suis enseigné le C++ quand j'avais 15-16 ans.

Il vaut mieux laisser la magie aux autres et apprendre soi-même le fonctionnement interne des choses.


Autrement dit, si vous ne pouvez pas comprendre la syntaxe et la sémantique C++ d'entrée de gamme, vous n'êtes pas si bon en informatique. Ce n'est pas si dur. Il n'y a aucune bonne raison d'éviter le "C avec les classes".

Si vous vous attendez à ce que les élèves commencent à travailler sur la métaprogrammation de modèles, à déduire les appels polymorphes et à démêler plusieurs hiérarchies d'héritage - c'est ridicule pour une classe d'entrée de gamme pour tout type de langue que vous utilisez.

Il y a une très mauvaise tendance à vouloir cacher les subtilités de la programmation pour les étudiants. Cela ne finit pas bien (cf Java Essai sur les écoles de Spolsky). Ces gens se retrouvent sur le DailyWTF s'ils ne se redressent pas. Fuites d'abstractions, et quand (pas si) l'abstraction des fuites, c'est pire que d'avoir à y faire face. J'ai travaillé comme TA pour les étudiants C++ d'entrée de gamme. Soit les choses doivent être cachées jusqu'au bout, soit elles doivent être mises en lumière La magie est l'ennemi de l'apprenant.

Si je devais recommander un langage de départ compilé en code machine, une variante Pascal serait probablement la meilleure approche. Elle a une approche plus régulière et structurée que la famille C d'après ce que je me souviens.

10
Paul Nathan

Non.

En tant que langage d'enseignement, le C++ n'est que légèrement meilleur que le C, qui est l'un des pires langages d'enseignement du monde. Cela introduit beaucoup de complexité au départ, certaines parties du langage sont profondément non intuitives, et la plupart du temps vous en apprenez plus sur C++ que sur la programmation en général.

Cela ne veut pas dire que C++ (ou C) sont de mauvais langages, ou ne valent pas la peine d'être appris; juste qu'il y a de meilleurs langages d'enseignement disponibles, tels que Python.

8
John Bode

Je dirais "non" - j'avais un désir et un désir d'apprendre la programmation, et je suis allé directement dans mon année d'introduction à l'université avec C++ dès le départ. Couplé avec un professeur qui enseignait le C++ comme s'il s'agissait d'un autre langage (concepts qui avaient du sens pour eux, pas nécessairement des concepts de langage ou d'application du monde réel), et des projets lancés tout de suite chaque semaine, je me suis écrasé et brûlé avec la moitié de la classe. Au moment où je pouvais même digérer, expérimenter et appliquer ce que l'on m'enseignait, j'ai eu du mal avec les devoirs du projet qui ont doublé en tests. Je dirais que c'était plus un cours de niveau 200 que 100.

J'ai vraiment fait de mon mieux. Je n'ai pas demandé de sympathie, je savais que ce serait un défi, mais le professeur ne m'aiderait même pas. Je viens de me dire d'aller lire le manuel, comme je l'avais fait.

Je dirais (et certains ne seraient pas d'accord) que Ruby ou Python est un bien meilleur langage pour introduire quelqu'un dans le monde de la programmation. Propre, concis, lisible) , une syntaxe plus claire.

8
Kevin

Il existe deux types essentiels d'enseignement postsecondaire: l'université et l'école de métiers. La différence réside dans ce que vous voulez être prêt à faire après l'obtention du diplôme. Dans le domaine automobile, il s'agit de savoir si vous serez mécanicien ou ingénieur en mécanique.

Cela étant dit, C++ est un excellent premier langage si vous voulez être ingénieur, et un moche si vous voulez être l'équivalent en programmation d'un mécanicien.

Une classe d'introduction sur C++ va passer beaucoup de temps à parler des types de données, des définitions, des déclarations, des pointeurs, de l'allocation de mémoire, etc. Ce sont une excellente base si vous avez l'intention de passer plusieurs semestres à être en mesure de faire quelque chose d'utile, mais que vous voulez savoir qu'une fois que vous y êtes, vous avez la base pour gérer n'importe quel degré de complexité.

D'un autre côté, si vous voulez pouvoir faire quelque chose d'utile plus rapidement, mais cela ne vous dérange pas si le domaine et la complexité sont limités, alors passer tout ce temps sur ces concepts de niveau inférieur sera un gaspillage. Il existe de nombreux programmeurs qui peuvent écrire un excellent validateur de formulaire html, mais ne savent pas comment concevoir un pilote de périphérique.

7
Karl Bielefeldt

Sûr. Mon premier langage était le C, mais c'était vraiment juste pour faciliter notre classe en C++. Cela a rendu Java beaucoup plus facile à gérer une fois arrivé à l'Université. C++ pourrait avoir une courbe d'apprentissage légèrement plus abrupte, mais s'il est enseigné correctement, ça devrait aller.

Non, C++ ne convient pas comme première langue. Comme indiqué ici, de nombreux programmeurs professionnels partagent cette opinion, mais c'est aussi une opinion que les enseignants professionnels ont.

Voici ce que rapport du doyen de l'Université Carnegie Mellon a à dire sur l'utilisation de C++ pour un cours d'introduction à la programmation pour les étudiants de première année:

Les langages standard tels que le C ou le C++ ne conviennent pas à ce cours car leur complexité et leurs lacunes entravent les techniques de raisonnement informelles et mécanisées.

La CMU propose deux cours d'introduction, un impératif et un fonctionnel. SML a été choisi pour la programmation fonctionnelle. Je ne sais pas ce qui a été choisi pour le cours impératif, mais le rapport mentionne l'utilisation d'un sous-ensemble de C.

4
Joh

Non, absolument pas.

Si je le pouvais, je refuserais son utilisation dans un cadre universitaire presque entièrement. Pas pour des raisons qui sont contraires à celles déjà faites, mais parce que trop de gens pensent que le C++ (ou ses variantes) est la réponse à presque tous les problèmes car vous pouvez l'utiliser dans presque toutes les situations. C'est le tournevis de la programmation.

Certaines personnes l'utilisent pour serrer les vis, un outil parfaitement raisonnable pour le travail. D'autres l'utilisent comme un levier, bien que souvent efficace, pas vraiment idéal car un tournevis, peu importe ce que votre père pourrait vous dire, n'est pas un levier, et peut échouer de manière catastrophique en raison d'une mauvaise utilisation car la composition de la tige n'est pas intentionnellement construite pour le genre de forces qu'un prybar rencontrerait. D'autres encore pourraient essayer de l'utiliser comme un poinçon ou un burin, et ils rencontreront presque toujours des problèmes parce que la poignée du tournevis n'a pas été conçue pour le type d'abus frappant que le poinçon ou le burin est conçu pour résister.

À mon avis, le travail d'un programmeur consiste généralement à traduire les vrais problèmes en automatisation qui offre un certain degré d'amélioration de l'efficacité (diminution de l'engagement des ressources pour une tâche), de la vitesse (diminution du temps d'exécution d'une tâche), de la prévisibilité (augmentation de la répétabilité). d'une tâche), ou d'une organisation (accroître la prise de conscience de la relation entre les tâches).

Bien qu'il soit compréhensible que tous ceux qui programment devraient avoir des connaissances communes sur les opérations de bas niveau des ordinateurs, et en particulier sur le périphérique IO et l'allocation de mémoire, il est certainement rare d'avoir vraiment à utiliser ces connaissances pour tout dans une large mesure, et encore moins en tirer parti pour la grande majorité des tâches. Tenter de le faire sans comprendre le contexte plus large du problème introduit un risque inutile pour un effort.

Il est absurde qu'un premier langage de programmation soit C/C++ ou des variantes proches, car la classe de problèmes que C et ses dérivés résolvent ne sont certainement pas appropriés pour un pourcentage arbitrairement élevé des problèmes actuels et futurs (sauf là où il faut sauver un programme précédemment tournevis), et est en fait plus d'un ensemble minuscule de problèmes à venir. La plupart des programmeurs ne parviendront jamais à développer des fonctionnalités de base du système d'exploitation ou des interfaces directes d'appareils, malgré la prévalence croissante des petits appareils mobiles interconnectés. La plupart travailleront et vivront comme nous l'avons fait. Correction et suppression de code datant de plus de deux générations, mise en œuvre sur une technologie qui montre déjà son âge ou travail en marge de la technologie sur l'application killer (x + 1).

Pour une première langue, je regarderais Lego NXT, une variante légère mais riche en fonctionnalités de LabView. Bien que Lego NXT ne soit pas largement utilisé dans les entreprises commerciales, il présentera la nature fondamentale de ce que c'est de programmer de manière "riche en capteurs". Je pourrais l'associer à un langage de script quelque peu neutre sur la plate-forme comme Javascript ou TCL/TK. Les deux auraient un impact relativement faible en termes de ce que vous devez découvrir pour effectuer des tâches très basiques mais efficaces, avec un rendement élevé en termes de boucle de rétroaction et de flexibilité pour introduire et résoudre divers degrés de complexité du problème. De plus, il offre une bonne opportunité aux étudiants à mesure qu'ils avancent pour explorer le potentiel de dépassement de ce qui est fourni dans l'environnement en conserve: une chance d'essayer de travailler dans les endroits obscurs, humides et de bas niveau de l'appareil IO et des pilotes personnalisés avec une petite quantité de surcharge.

Après avoir appris à conduire la boîte automatique à quatre cylindres, montez-les dans le grand hotrod manuel v8, s'ils sont vraiment intéressés et motivés. Si Joel ne trouve pas les programmeurs de rock-star sous une pierre sous ses pieds, il devra peut-être continuer à chercher ailleurs, ou repenser pourquoi il peut avoir besoin de plus d'un tas de tournevis dans sa boîte à outils.

2
JustinC

Sûr. Il existe d'autres langues qui pourraient être plus faciles à comprendre pour les étudiants de première année. Cependant, il existe des moyens pour un enseignant d'introduire lentement des concepts en C++.

2
jzd

Certainement C++ peut être le tout premier langage. Mais c'est à quel point il est bien enseigné.

Tout le monde dit que la première langue devrait être très facile à comprendre. Mais mon point est que la plupart des gens commencent à programmer au niveau du premier cycle. Ainsi, vous pouvez enseigner quelque chose qu'ils sont capables de saisir. Et avec C++, vous pouvez passer d'un niveau inférieur à un niveau supérieur de programmation.

2
Gulshan

Quand j'étais au collège C++ était la langue de base qui a été enseignée tout au long de la première année de collège. La théorie était qu'il contenait des concepts de programmation complexes, donc si vous pouviez le maîtriser, vous pouviez choisir d'autres langages. Cela m'a bien servi de bonne base.

Cela dit, au cours de ma dernière année, j'ai siégé à un comité pour déterminer s'il fallait ou non passer le langage de base à Java. Après avoir parlé à plusieurs employeurs éminents et à certains anciens du département, il a été déterminé qu'un passage à Java était le meilleur intérêt des étudiants. Les employeurs à qui nous avons parlé voulaient que les gens aient de l'expérience dans un langue qu'ils utilisaient pour les embaucher. Je crois que maintenant, 10 ans plus tard, ils utilisent toujours Java comme langue principale.

Sur une note similaire, nous avons cherché à embaucher quelques diplômés récents avec de très bonnes compétences en C++. Nous n'avons pas pu en trouver.

1
SchwartzE

Je dirais oui. Mais n'importe quelle langue peut vraiment être une première langue. Je pense que le C++ est bon car bien qu'il soit complexe et parfois difficile, il vous montre ce que vous pouvez vraiment faire (moins de limitations). En outre, il a une conception orientée objet qui peut vous aider à vous préparer à affronter d'autres langues.

C++ était ma première langue et je suis content que ce soit le cas. Cela m'a fait réfléchir dans l'état d'esprit OOP au début et j'en suis reconnaissant. Mais au final, cela se résume vraiment à ce que vous voulez faire. Le langage n'a pas d'importance car beaucoup parce que si vous pouvez vous améliorer avec une langue, il est probable que vous n'aurez aucun problème à en choisir une autre. Que voulez-vous faire? Créer des jeux? Programme pour téléphones mobiles? Chacun aura des outils et des langues mieux adaptés pour ça.

1
user16281

C++ est un langage expert, pas un langage débutant ... dirait C en premier, pas Java ou C # ou Python ... pourquoi? Parce que C vous apprend à prendre soin de votre mémoire et d'autres des concepts délicats tels que des pointeurs qui sont "cachés" par toutes les langues et pourtant présents partout. J'ai vu tellement de jeunes développeurs qui ne comprennent même pas pourquoi la mémoire devrait être libérée parfois et croient que le garbage collector n'est pas un petit nain qui nettoie tous les craps de codage: ils instancient, ils instancient et explosent, même s'ils ont une RAM XXXXGb ... Mais ils ne comprennent pas pourquoi le garbage collector ne nettoie pas tout simplement comme par magie! Et j'ai vu ce genre de développeurs coder en C++ (et encore plus fou, à Corba) et ce fut un massacre !!!!!!!!!! Je conseillerais donc d'apprendre le codage en C puis d'aller en Python/Java/C # pour les concepts d'objet et tout le sucre autour Ensuite, quand vous comprenez tout cela, vous allez en C++ et vous ressentez la puissance du C++ mais vous découvrez également tous ses dangers et pourquoi il ne devrait être utilisé par personne;)

1
mandubian

Certains des points où les débutants font facilement des erreurs en C++ sont:

faire des devoirs où vous vouliez tester = vs ==

Manquant ;

Lisibilité des accolades contre par exemple Pascal début-fin

Et puis il y a tous les fichiers include, les macros, la gestion de la mémoire, etc. à confondre.

Je dirais donc que le C++ n'est pas le meilleur langage pour commencer - mais il ne fait aucun doute qu'il peut être très utile lorsque vous l'avez appris.

Je voudrais - comme d'autres l'ont également suggéré - utiliser C #, Java ou peut-être même VB - et un bon IDE avec syntaxe) mettre en surbrillance, débogueur, etc. pour faciliter la récupération des erreurs.

1
Rune Andersen

NON. Il y a tellement de choses que C++ a, ce qui rend difficile pour un débutant de comprendre. N'entrez pas dans le fallacie "tous les langages de programmation sont égaux".

Commencez avec Basic ou Pascal, (ignorez les trucs "ils sont obsolètes"), et plus tard, avec C/C++/Java/C #/Perl. Ou si vous en avez l'occasion, d'abord avec Logo & Karel, puis Basic ou Pascal.

P.D. Certaines universités et collègues ont une classe d'utilisation et de comparaison des langages de programmation, et il m'arrive d'avoir enseigné cette classe ;-)

1
umlcat

J'ai commencé avec C++ au collège. J'ai ramassé une copie de ce livre: C++ How to Program by Deitel and Deitel . Ce livre est assez bon.

Franchement, il n'y a pas de bonne ou de mauvaise réponse ici, j'ai personnellement trouvé que C++ était saisissable. Je l'ai appris jusqu'à OOP (j'ai trébuché sur "ceci" que je ne comprends pas comment je n'ai pas pu l'obtenir mais peu importe). Essayez-le, ne le faites pas découragez-vous. Si vous êtes coincé, consultez d'autres langues et continuez à en apprendre de nouvelles. L'idée est que si vous voyez le même concept sous 2-3 formes différentes, vous les comprendrez mieux. Comme je l'ai dit, le concept de "ce "le pointeur m'a confondu mais quand j'ai vu la même chose en Python (nommé self à la place), cela m'a semblé tout de suite logique parce que je l'avais compris en C++. Apprenez Java si vous pouvez enseigner autant de collèges. Apprenez python ou Ruby car c'est la langue du jour et si vous pouvez explorer plus de niche)/de nouveaux trucs comme Clojure (et tous les autres lisps), Haskell, Scala ...

0
nkassis

Si "convenable" signifie "possible", oui. Si pour "bien", non.

Il est possible d'aimer, même d'aimer le C++, mais pour cela, vous feriez mieux d'apprendre plusieurs langages et de travailler une dizaine d'années avec des bases de code pourries de la vie sarcelle, d'acquérir de l'expérience sur la "création de logiciels non triviaux qui fonctionnent réellement" - alors le C++ aura du charme.

Pas au début lorsque vous êtes vierge, jouez avec de petits problèmes simples (mais supposément intéressants et amusants).

Je commencerais par python, suivi de SICP (schéma), ou quelque chose de similaire. Peut-être inversé ou entrelacé. Avec ceux-là, vous pouvez simplement régler le problème. Au lieu de combattre le système, marcher dans la boue profonde et apprendre toutes sortes de bizarreries illogiques et leurs raisons historiques.

Plus tard, lorsque vous pourrez déjà programmer votre sortie d'un sac en papier, passez au métal nu: découvrez les méthodes d'assemblage et plusieurs architectures, plus peut-être le mélange de Knuth. Je ne parle pas de mémoriser des opcodes ou de faire beaucoup de choses réelles, juste pour comprendre la mémoire, les registres, l'ALU, les caches, les interruptions et obtenir le niveau de lecture.

Ensuite, avec cette fondation, vous pouvez être exposé à d'autres langages, y compris C++. Peut-être une bonne idée d'ajouter un peu "d'histoire et d'évolution des langues" entre les deux.

0
Balog Pal

Vous pouvez choisir n'importe quelle langue pour apprendre les fondements de la programmation. J'ai appris des trucs en C/C++. mais 7 ans plus tard, les outils/langages sont modifiés dans mon école et ils préfèrent Java/C #. les langues ne sont que de simples outils. Ce dont vous avez besoin pour vous améliorer, ce sont les fondamentaux. par exemple. en MIT les gens apprennent les principes de base de l'algorithme en utilisant python. Par exemple Java peut être bon pour la programmation Web. mais C/C++ est bon pour les services et les applications hautes performances). Cela dépend donc de vos situations.

0
sarat