Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Faut-il enseigner le C et le C++ ensemble ou séparément ?

Le , par r0d

21PARTAGES

0  0 
Bonjour à tous,

je commence a avoir un peu d'expérience en c++, et récemment j'ai eu des développeurs juniors sous ma responsabilité, qui devaient implémenter ce que j'avais conçu. Rien d'impressionnant, c'étaient des petits projets, mais je me suis un peu énervé car leur code était très instable à cause des char* et autres int[] - sans parler des void* - qu'il y avait dans leur code. Je n'ai pas voulu faire l'intégriste dès le début et je les ai laissé faire. Du coup on a perdu beaucoup de temps en debug.

Du coup j'en ai discuté avec pas mal de collègues, et mon point de vue est: "lors de la formation, il faut absolument insister sur le fait que C et C++ sont des langages différents et insister sur ces différences". Mais ici, en Espagne, peu de gens sont d'accord avec moi. Pour eux, puisque ces deux langages sont quasiment pareil, il n'est pas nécessaire de l'enseigner séparément, ce serait une perte de temps etc.

Et du coup, je suis un peu à cours d'arguments. Sauriez-vous m'aider à répandre la bonne parole?

J'insiste sur le fait que la discussion porte sur la formation (universitaire ou professionnelle).

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de Bakura
Rédacteur https://www.developpez.com
Le 25/10/2009 à 14:18
Je me permet de réagir sur ce thème (même si je crois en avoir parlé l'année dernière sur un sujet similaire), puisque étant en deuxième année d'une école d'ingénieur, je peux en témoigner, sachant que ma vision est un peu différente, l'objectif n'est pas de convaincre des personnes qui programme depuis des lustres, mais en l'occurrence des étudiants qui programment depuis peu (lorsque je suis rentré en première année, on était peu à avoir déjà programmer).

Je passerai sur les élèves qui me disent que "de toute façon, autant uniquement apprendre le C et ne pas se faire chier sur d'autres langages puisque, de toute façon, en étant dans une école d'ingénieur ils sont là pour devenir des manageurs et non des pisseurs de code".

Histoire que vous ayez une vision de la "courbe" d'apprentissage de la programmation, voici comment cela se passe dans notre école (ingénieur, axé informatique), j'imagine que c'est un peu le même cas dans les autres :

Première année : Algorithmie, C
Deuxième année : Algorithmie, C++
Troisième année : Java, (C# je crois)

Je suis actuellement en L2, et les cours de C++ débutent au deuxième semestre, donc je ne peux pas témoigner sur la qualité des cours, mais un cours de programmation se divise principalement en trois "sections" :

- Les cours en amphithéâtre. Comme l'a souligné une personne plus haut, j'ai aussi cette sensation que les profs se considèrent plutôt comme "prof d'algorithmie", puisque, en fait, les cours ne portent pas le nom de "Cours de C" mais "Cours d'algorithmie". Concrètement, le professeur utilise un "langage algorithmique" plutôt que du C, sous prétexte que ce langage algorithmique a l'avantage de ne pas être dépendant d'une syntaxe. En pratique, ce langage algorithmique consiste à remplacer float, int, double... par réel, entier, if, else, while par SI, SINON, TANT QUE...

- Les "TD", ou "je code sur ma feuille". Pour moi, mais quelqu'un pourra peut-être me contredire, je considère ceci comme une ineptie. Quel est l'intérêt de "coder" sur une feuille ? De par ce que j'ai pu voir parmi les élèves, ceci à pour unique conséquence de dégouter une partie des élèves de la programmation.

- Les "TP", ou "je copie colle les sujets de TD, mais vous faites les exos sur l'ordinateur maintenant".

Voilà rapidement pour l'enseignement de la programmation en école d'ingénieur.

Concernant à présent le débat C et C++, j'ai bien peur que le même schéma se passe dans notre école. On nous présente, au tout début de la première année, les différents langages, en nous expliquant que le C++ est une évolution de C, une sorte "d'extension". Bref, dès le premier cours "d'algorithmie", il est rentré dans la tête des élèves que le C++ est une extension du C, comment voulez-vous que ceci change ? Résultat, lorsque je dis à mes amis que j'ai commencé par le C++, on me rétorque que je suis fou et on me demande l'intérêt.

Comme ceci a été souligné très justement par plusieurs personnes, il est inconcevable, à fortiori dans mon cas ou les gens ont, au maximum, 1 an de programmation dans le dos, de leur parler RAII ou de concepts compliqués dont il ne verrai pas l'intérêt.

J'ai pas mal observé mes camarades durant les cours de C, et je me suis aperçu que ce sont systématiquement les mêmes remarques qui reviennent : "putain, j'ai un problème avec ce pointeur", ou "comment je fais pour avoir un tableau dynamique sans avoir à faire des realloc bien chiants"... Et c'est clairement là qu'on peut convaincre les gens que les langages sont différents, justement en leur présentant les solutions à leur problème (à savoir std::vector pour les tableaux dynamiques, les pointeurs intelligents, la classe string...). La plupart du temps, les gens me répondent : "ah ouais, ça c'est pas mal, t'aurais pas un livre pour apprendre le C++ ?".

L'objectif principal est de leur faire prendre conscience qu'il existe des solutions en C++, qui soient propres, efficaces et simples à utiliser.

Comme je l'ai dit plus haut, je n'ai pas eu l'occasion d'avoir eu les cours de C++ encore, mais j'ai pu lire les slides du prof et, de mémoire, il traite effectivement d'abord la notion de POO, et passe très rapidement à la fin sur les templates, la STL... et c'est bien dommage. La POO, ils n'en verront peut-être pas "immédiatement" l'utilité, alors que std::vector, std::string, ça fera directement tilt dans leur esprit : il y a une solution à ce à quoi ils ont galéré durant des mois en C.

Même si je n'ai aps le droit vis-à-vis de l'école de mettre en ligne les slides du prof de C++, voici quand même le plan, histoire de vous donner une idée de la manière dont le C++ est enseigné dans une école d'ingénieur :

EDIT : je viens de m'apercevoir que des slides plus récents (et beaucoup plus beaux) sont en fait en lignes sur le réseau de l'école. J'ai regardé rapidement, et c'est quand même beaucoup mieux. Il cite même quelques exemples du moteur 3D Ogre pour montrer comment il est implémenté, avec de jolis diagrammes UML. C'est vraiment bien foutu, par contre les différents thèmes sont organisés de la même façon que ce que j'écris juste en dessous. En tout cas de très gros progrès ont été faits sur ce cours de C++.

Cours 1 : Introduction des entrées/sorties, référence, surcharge de fonctions, manière d'utiliser les fonctions C en C++, fonctions inline, allocations dynamiques avec new/delete à la place de malloc/free. Et, en prime, un magnifique slide indiquant que le C++ est un sur-ensemble de C.

Cours 2 : limitations des structures du C => présentation des classes : sécurisation des accès avec public, private, protected ; méthodes ; variables membres ; constructeur ; destructeur ; surcharge des opérateurs ; exemple de création d'une classe nombreComplexe.

Cours 3 : héritage & composition, liste d'initialisation (ça c'est un bon point déjà ), polymorphisme, classes abstraites.

Cours 4 : exceptions, exceptions dans le constructeur, namespace

Cours 5 : template, présentation de la STL, les fichiers en C++.

Je ne suis pas très clair dans ce que je veux dire, mais je pense effectivement que le problème vient directement de l'enseignement, ou le C est systématiquement enseigné en premier, ou le C++ présenté comme un subset du C, et lorsque le C++ est enseigné, c'est plus le côté "POO" qui est mis en avant, plutôt que la SL...

PS : Je tiens à préciser, au cas où des admins de l'école tourneraient par ici, que mon objectif n'est pas de dénigrer l'école où je suis et où je m'y sens bien, mais juste de pointer du doigt certaines faiblesses dans la manière d'enseigner la programmation et qui contribuent à faire de très mauvais programmeurs C++, même si beaucoup d'élèves argueront que de toute façon ils ne souhaitent pas devenir programmeur.
1  0 
Avatar de Médinoc
Expert éminent sénior https://www.developpez.com
Le 21/10/2009 à 15:59
Salut,
Déjà, je suis parfaitement d'accord avec toi. Un des arguments, c'est que le C est extrêmement limité par rapport au C++: Beaucoup de choses "propres" en C ne paraissent propres que parce qu'on n'a pas le choix, mais horriblement sales dans les autres langages.

Avec le C, on met les mains dans le cambouis. Avec le C++, on a droit à des gants, et ne pas les utiliser relève d'un manque de compétence.
0  0 
Avatar de white_tentacle
Membre émérite https://www.developpez.com
Le 21/10/2009 à 16:51
Pour eux, puisque ces deux langages sont quasiment pareil, il n'est pas nécessaire de l'enseigner séparément, ce serait une perte de temps etc.
Ca me semble la base du problème. Avant de les convaincre qu'il faut les enseigner séparément, il faut les convaincre que ce sont deux langages différents.

A ce titre, quelques exemples de programmes simples, avec un code C, un code C++, peuvent aider.
0  0 
Avatar de Nogane
Membre averti https://www.developpez.com
Le 21/10/2009 à 16:52
Bonjours,
Je suis convaincu qu'on ne devrai pas apprendre le C et le C++ ensemble. Justement pour éviter, en C++, l'usage de tout ses truc hérités du C et pas forcement pertinent en C++.(les pointeurs nus, les tableaux, les cast, les malloc/free bêtement remplacé par new/delete, les void*, etc...)

En même temps il n'est pas facile de faire comprendre a un programmeur "C with class" que ce qu'il fait n'est pas du C++.

En revanche, je constate que les programmeurs sont très réceptifs a tout se qui peut leur simplifier la vie. Et donc ce qui marche c'est de leur montrer qu'elle sont les méthodes C++ qui vont bien pour remplacer les méthodes C, en leur expliquant bien les avantages. Ils y sont d'autant plus réceptifs après avoir passé deux heurs a chercher un bug.

Exemple: Un développeur a passé l'après midi a chercher un bug, pour se rendre compte qu'on écrivait dans un tableau a un index hors limite...
La tu lui dit: "Tu vois, avec un vector, il y aurais eu une assertion fausse, et donc localisation immédiate du bug".
Ben la t'es sur qu'il a retenu la leçon

Et puis aussi je pense qu'il ne faut pas tout leurs dire d'un coup. Bien codder en C++ ne s'apprend pas en trois jours.
0  0 
Avatar de Médinoc
Expert éminent sénior https://www.developpez.com
Le 21/10/2009 à 16:55
À mon avis, le plus simple pour faire comprendre aux utilisateurs la différence: La saisie de lignes de texte de longueur arbitraire.
  • C: Une boucle impliquant des fgets ou getc, avec au moins un realloc quelque part (sous Visual, histoire de ne pas avoir la fonction helper non-standard de gcc).
  • C++: std::getline().
0  0 
Avatar de camboui
Membre éprouvé https://www.developpez.com
Le 21/10/2009 à 17:43
Je ne suis qu'à moitié d'accord avec vous.

Citation Envoyé par Médinoc Voir le message
Avec le C, on met les mains dans le cambouis. Avec le C++, on a droit à des gants, et ne pas les utiliser relève d'un manque de compétence.
Ou un manque de compétence du prof qui n'a pas su enseigner...

J'ai appris les deux à une semaine d'intervalle il y a très longtemps. D'abord le C, puis le C++ en temps qu'extension du premier. On n'a pas vu les exceptions, ni la STL. On a à peine parlé des templates et de la surcharge des operators. L'accent était mis sur la POO et le polymorphisme.

Par la suite, en entreprise j'ai constaté que les autres informaticiens étaient à peu près au même stade de connaissance en C++. A l'époque on se batait surtout à contourner les bugs des compilateurs Borland et de leur framework BWC (ou BCW, j'sais plus). A la mort de Borland, ce fut la migration vers Visual Studio qui fut pénible. Sans parler de la migration 16 vers 32 bits, les problèmes de compatibilté entre compilos C++ à cause d'un manque de normalisation formelle (ce n'est qu'en 1998 qu'intervient la première norme offcielle du C++, non ? Avant on suivait ou pas les recommantions de Barj S.).

Aujoud'hui, C++ est délaissé par C#, Java, flash, et tous les brols interprétés. Et je le comprends, c'est bien plus productif.
0  0 
Avatar de Médinoc
Expert éminent sénior https://www.developpez.com
Le 21/10/2009 à 17:48
@Camboui, c'est justement des profs qu'on discute ici.
0  0 
Avatar de JolyLoic
Rédacteur/Modérateur https://www.developpez.com
Le 21/10/2009 à 18:17
Je suis 200% d'accord sur le fait que C++ et C sont différents. Et même plutôt que de se poser la question de savoir s'il faut les enseigner séparément (ce qui est une évidence pour moi), il faut déjà se poser la question : "Doit-on enseigner les deux ?"

S'il y a des domaines où la connaissance du C est assez indispensable, il y en a à mon avis une majorité où l'on peut totalement la passer sous silence, et apprendre dès le début un C++ "procédural", mais qui utilise déjà les types qu'on utilise tous les jours, string et vector, en particulier.

Ensuite, si on est dans un cas où les deux sont nécessaires, la question se pose de savoir dans quel ordre les enseigner. Si j'avais mon mot à dire sur ce sujet, je dirais de commencer par le C++, du moins un sous ensemble (en gros, on peut s'arrêter au moment où on défini des types utilisateurs), et de finir par le C, ce dernier étant plus compliqué d'utilisation, on respecte ainsi mieux une progressivité d'apprentissage.

Maintenant, sur la manière de convaincre tes interlocuteurs, j'avoue que je n'ai pas trop d'idées. Peut-être peux-tu leur citer l'existence de personnes qui se débrouillent en C++, mais seraient incapables de faire un quelconque programme en C, car ne connaissant de ce langage que ce qui est nécessaire pour s'interfacer avec (j'en suis un exemple).

Peux-être peux-tu leur parler de livres qui enseignent le C++ directement, sans parler de C (accelerated C++, par exemple, le dernier livre de Stroustrup aussi, probablement, ou bien celui de Francis Glassborrow ("je me lance" en français le titre, je crois)).

Peut-être peux-tu leur dire que de toute façon, Espagnol et Catalan, c'est la même chose, et donc qu'on pourrait enseigner les deux ensemble à l'école, ça éviterai de perdre du temps (mmm, pas certain que ce soit une bonne idée, ça )
0  0 
Avatar de r0d
Expert éminent https://www.developpez.com
Le 21/10/2009 à 19:50
Merci à tous pour vos réponses. J'ai d'ailleurs commencé la rédaction d'un papier (en espagnol) à ce sujet. Comme ça, à chaque fois que je devrais m'expliquer, je renverrai vers ce papier... on appelle ça optimisation non?

Citation Envoyé par JolyLoic Voir le message
Maintenant, sur la manière de convaincre tes interlocuteurs, j'avoue que je n'ai pas trop d'idées. Peut-être peux-tu leur citer l'existence de personnes qui se débrouillent en C++, mais seraient incapables de faire un quelconque programme en C, car ne connaissant de ce langage que ce qui est nécessaire pour s'interfacer avec (j'en suis un exemple).
J'en suis aussi
Mais cet argument s'est retourné contre moi récemment: on avait un client qui voulait absolument qu'on utilise log4c (des fois faut pas chercher, le client est roi...), et lorsque j'ai commencé à poser des questions sur des morceaux de code en C que je ne comprenais pas bien, ils ont sauté sur l'occasion et m'ont dit, en substance: "ha ben tu vois, ça arrive souvent de devoir utiliser des libs C, c'est donc une bonne chose de connaître les deux". S'ensuivit une discussion interminable sur le fait qu'effectivement, il est bien de connaître les deux, mais que ça n'a rien à voir avec la discussion sur la formation, etc...

Citation Envoyé par JolyLoic Voir le message
Peut-être peux-tu leur dire que de toute façon, Espagnol et Catalan, c'est la même chose, et donc qu'on pourrait enseigner les deux ensemble à l'école, ça éviterai de perdre du temps (mmm, pas certain que ce soit une bonne idée, ça )
Héhéhé, bonne idée, je vais le tenter
Mais bon, le potentiel trollesque des espagnols est (encore) plus élevé que celui des francophones. Et là, j'ai bien peur que la seule allusion au catalan/castillan n'ouvre trop la vanne "trollifère". Mais je vais le tenter
0  0 
Avatar de Goten
Membre chevronné https://www.developpez.com
Le 21/10/2009 à 20:55
C'est un sujet courant au final. Et plus ça va plus je me rends compte que finalement les développeurs C++ moderne (par opposition a historique j'entends) sont pas monnaie courante. (en tout cas pas en majorité amha).
L'histoire que tu racontais est a mon avis a elle seule l'argument le plus convaincant, c'est à dire que quand ils ont le nez dans la mer** leur dire, tu vois ça sent pas bon au final, maintenant laisse moi te montré les bons outils.
Mais le problème c'est que c'est une trop grosse perte de temps, donc le problème revient à l'enseignement. Et là... ben c'est pas gagné, vu que les profs (dans la majorité?) non même pas entendu parler de la SL ou pense que c'est une bizarrerie inventé par des universitaires boutonneux. (pas sympa pour notre ami stepanov :p).
Le problème c'est que du coup sa renforce la """chute""" (vraiment entre guillemets) du C++ aux yeux des patrons, si les jeunes savent pas ou savent mal, à quoi bon.


Maintenant, sur la manière de convaincre tes interlocuteurs, j'avoue que je n'ai pas trop d'idées. Peut-être peux-tu leur citer l'existence de personnes qui se débrouillent en C++, mais seraient incapables de faire un quelconque programme en C, car ne connaissant de ce langage que ce qui est nécessaire pour s'interfacer avec (j'en suis un exemple).
Un autre :p. (c'est moins vrai maintenant).

Quand à l'apprentissage, je suis partisan du commencé par le C++, et revenir sur du C plus tard si besoin il y'a. (les profs devraient prendre comme bouquin de référence un de ceux cité par Loic.)

Enfin un dernier truc, mais qui est au final a la base de l'amalgame qui est fait, cette appellation de C/C++. Combien de fois j'ai repris des gens sur : Non C ET C++ pas un mix des deux. Et combien de fois derrière j'ai du expliqué pendant dix minutes pourquoi c'était pas les mêmes langages et pourquoi c'était mal de les assimiler (parfois en vain d'ailleurs).
0  0