L'apprentissage et l'enseignement moderne du C++
Le
Mathieu STEFANI

Bonjour à tous,
Comme le dit le sujet, j'écris ce post pour parler et débattre autour d=
e l'apprentissage et l'enseignement _moderne_ du C++.
En effet, comme vous le savez sans doute, dans la majorité des cursus inf=
ormatiques (tout du moins, en France), l'on retrouve toute une partie sur l=
'apprentissage de la programmation, et sur le C++.
De mon point de vue, il s'agit de l'un des langages les plus complexes à =
appréhender, ce qui rend son enseignement très délicat. Les cours dis=
pensés dans les différentes écoles se doivent d'être rigoureux, en =
réduisant le plus possible les approximations que l'on pourrait y trouver=
.
Cependant, de ma propre constatation, au sein du corps enseignant, rares so=
nt les enseignants à se tenir au gout du jour (l'informatique étant un =
secteur évoluant très vite), et à imposer une réelle rigueur dans l=
es cours dispensés aux élèves. Au final, on se retrouve donc avec un =
cours plutôt approximatif, aux exemples mal choisis et idioms et pratique=
s courantes pas toujours respectées.
C'est pour cela que je souhaite instaurer le débat, avec des personnes d'=
expérience, venant de l'industrie même, et ayant dans la plupart des ca=
s vu évoluer le langage, voire son enseignement (dans les différents bo=
uquins, cours, ). En outre, avec l'arrivée récente du nouveau standa=
rd C++11, cela risque de remettre pas mal de choses et de cours en question=
.
Pensez-vous qu'il est pour l'instant trop prématuré d'introduire certai=
nes notions et fonctionnalités de C++11 dans les cours actuels ? Pensez-v=
ous que cela rentre dans le cadre de la « renaissance » du C++, et doit=
donc faire parti de l'enseignement moderne du C++ ? A l'heure actuelle, ra=
res sont les bouquins ayant été mis à jour pour C++11 (à part les b=
ouquins faisant état de TR1). Cela ne risque donc t-il pas de poser un pr=
oblème au niveau des ressources disponibles pour les étudiants ?
D'autre part, certains cours de C++ se basent et supposent, de la part des =
étudiants, qu'ils possèdent déjà des bases en C. Ainsi, ces cours r=
eposent sur des notions acquises en C. Pensez-vous qu'aujourd'hui, en 2011,=
cela a t-il encore réellement un sens ? Scott Meyers nous disait que l'u=
tilisation de C++ rassemblait 4 entités :
- le C
- L'orienté objet
- La programmation générique avec les templates
- la STL
Est-il donc encore, en 2011, réellement productif et justifié de passer=
par la case « C » avant d'introduire le C++ ?
Enfin, si aujourd'hui, on vous demandait d'enseigner le C++, quelles seraie=
nt les lignes directrices de votre cours ? Quel serait le « plan » de v=
otre cours ? Passeriez-vous du temps pour « vérifier » les acquis du =
C, ou bien vous concentreriez-vous exclusivement sur le C++, ses pratiques =
et ses idioms en évoquant les parties héritées du C lorsqu'il le faut=
?
Si je pose ces questions, c'est car j'aimerais récolter l'avis de personn=
es ayant passé de nombreuses années dans l'industrie, et non pas seulem=
ent dans le domaine accadémique. Les deux ne sont, selon moi, pas incompa=
tible, et peuvent travailler ensemble.
Cordialement.
Comme le dit le sujet, j'écris ce post pour parler et débattre autour d=
e l'apprentissage et l'enseignement _moderne_ du C++.
En effet, comme vous le savez sans doute, dans la majorité des cursus inf=
ormatiques (tout du moins, en France), l'on retrouve toute une partie sur l=
'apprentissage de la programmation, et sur le C++.
De mon point de vue, il s'agit de l'un des langages les plus complexes à =
appréhender, ce qui rend son enseignement très délicat. Les cours dis=
pensés dans les différentes écoles se doivent d'être rigoureux, en =
réduisant le plus possible les approximations que l'on pourrait y trouver=
.
Cependant, de ma propre constatation, au sein du corps enseignant, rares so=
nt les enseignants à se tenir au gout du jour (l'informatique étant un =
secteur évoluant très vite), et à imposer une réelle rigueur dans l=
es cours dispensés aux élèves. Au final, on se retrouve donc avec un =
cours plutôt approximatif, aux exemples mal choisis et idioms et pratique=
s courantes pas toujours respectées.
C'est pour cela que je souhaite instaurer le débat, avec des personnes d'=
expérience, venant de l'industrie même, et ayant dans la plupart des ca=
s vu évoluer le langage, voire son enseignement (dans les différents bo=
uquins, cours, ). En outre, avec l'arrivée récente du nouveau standa=
rd C++11, cela risque de remettre pas mal de choses et de cours en question=
.
Pensez-vous qu'il est pour l'instant trop prématuré d'introduire certai=
nes notions et fonctionnalités de C++11 dans les cours actuels ? Pensez-v=
ous que cela rentre dans le cadre de la « renaissance » du C++, et doit=
donc faire parti de l'enseignement moderne du C++ ? A l'heure actuelle, ra=
res sont les bouquins ayant été mis à jour pour C++11 (à part les b=
ouquins faisant état de TR1). Cela ne risque donc t-il pas de poser un pr=
oblème au niveau des ressources disponibles pour les étudiants ?
D'autre part, certains cours de C++ se basent et supposent, de la part des =
étudiants, qu'ils possèdent déjà des bases en C. Ainsi, ces cours r=
eposent sur des notions acquises en C. Pensez-vous qu'aujourd'hui, en 2011,=
cela a t-il encore réellement un sens ? Scott Meyers nous disait que l'u=
tilisation de C++ rassemblait 4 entités :
- le C
- L'orienté objet
- La programmation générique avec les templates
- la STL
Est-il donc encore, en 2011, réellement productif et justifié de passer=
par la case « C » avant d'introduire le C++ ?
Enfin, si aujourd'hui, on vous demandait d'enseigner le C++, quelles seraie=
nt les lignes directrices de votre cours ? Quel serait le « plan » de v=
otre cours ? Passeriez-vous du temps pour « vérifier » les acquis du =
C, ou bien vous concentreriez-vous exclusivement sur le C++, ses pratiques =
et ses idioms en évoquant les parties héritées du C lorsqu'il le faut=
?
Si je pose ces questions, c'est car j'aimerais récolter l'avis de personn=
es ayant passé de nombreuses années dans l'industrie, et non pas seulem=
ent dans le domaine accadémique. Les deux ne sont, selon moi, pas incompa=
tible, et peuvent travailler ensemble.
Cordialement.
Quand on fait des cours de 5 jours en entreprise, la STL ne peut être
traitée en détail. On se contente d'énumérer les classes les plus
importantes avec leur s fonctionnalités. Dans un cours universitaire
c'est autre chose mais c'est au détriment d'autres domaines.
Notre discussion oublie un point, pourtant essentiel, c'est la
conception objet. Je ne conçois pas qu'on puisse faire apprendre un
langage objet sans parler de conception objet.
A ce titre, le livre de Stroustrup me paraît indispensable car il lie la
COO et la POO (quelques fois maladroitement d'ailleurs).
Je suis d'accord.
Mon chouchou sur le sujet est Stanley B. Lippman qui avait écrit, en son
temps déjà, le C++ primer qui, à l'époque, était le meilleur livre sur C++.
Je ne connais pas mais je vais regarder...
[snip le reste]
Ce que je voulais dire, c'est que pour ces profs-là, une chaîne de
caractères s'écrit :
char* p= new char [taille];
i.e. une copie exacte de code C, mais en remplaçant "malloc()" par
"new".
Alors qu'on devrait enseigner d'abord std::string, et laisser les
histoires de char* pour les derniers chapitres.
S'il y a des gens qui ont tendance à faire du C en C++, il y a aussi
des gens qui ont tendance à faire du Java en C++. En gros, ils
viennent de Java, et gardent leurs habitudes.
Il me semble que ce que tu proposes en fait partie. La programmation
objet est le coeur de Java. En C++, ce n'est qu'un paradigme parmi
d'autres. On l'utilise quand on en a besoin, et on utilise autre chose
quand on n'en n'a pas besoin.
Tu remarqueras qu'en C++, par défaut, les fonctions membres ne sont
pas virtuelles. Ce n'est pas une erreur.
L'absence de bouquins de référence est moins grave : généralement, on
trouve tout ce qu'on veut sur le web, ou dans la doc du compilateur.
Ce qui est plus gênant, en revanche, c'est l'absence de bouquins pour
débutants. C'est là le moment le plus critique : enseigner au débutant
les fonctionnalités de base du langage. Si 99 % des bouquins disent
qu'une chaîne de caractères s'écrit "char*", ben on est dans la merde.
Bon courage pour trouver des candidats compétents quand tu as un poste
de programmeur C++ à pourvoir.
D'un autre côté, j'ai effectivement vu le même problème en
Javascript : J'ai trouvé un seul bouquin qui explique effectivement le
langage, "Javascript: The Good Parts" de Crockford. Et encore, il est
un peu aride pour un débutant.
Effectivement. Je l'avais oublié celui-là. De plus, VMS est un des
meilleurs OS que j'ai connu.
Tu gagnes ma considération et c'est beaucoup ;-)
Fabien LE LEZ
Et ceux-là, il faudrait leur botter le cul une bonne fois pour
toute.
Ai-je prétendu le contraire ? Mon discours est beaucoup plus simple.
en C++, on peut faire du procédural (strict) ou de l'objet. Et
lorsque je parle de faire un cours de programmation orientée objet,
je ne parle surtout pas de Java (ni de C++). Il faut avant tout que
le développeur de base sache ce qu'il doit utiliser et quand pour ne
pas essayer de faire rentrer une idée ronde dans un concept carré.
Ouaips... Mais un bouquin de référence Fortran2003 ou 2008 va un
peu plus loin que la doc du compilateur. Il y a des subtilités dans
les C_BINDING ou les SEQUENCE que je n'ai jamais vu dans aucune doc
de compilo.
begin{ma vie}
Pour avoir cherché des bons développeurs, c'est dur dans _tous_ les
langages actuellement. Et c'est sans compter les donneurs d'ordre qui
essayent aussi par moment de faire rentrer des idées carrées dans
des concepts ronds et qui hurlent au loup en entendant le nom de
certains langages... Au final, tu te retrouves avec des développeurs
moyens sur des langages à la mode et un code bon à jeter rapidement.
J'ai un exemple assez pathétique sur un bout de code en électronique
embarqué écrit en Java...
end{ma vie}
JKB
--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
J'ai lu quelque part que les bons développeurs ne sont jamais sur le
marché du travail ; il faut aller les débaucher là où ils bossent.
Ou du fonctionnel. Ou du "pseudo-objet", i.e. des classes sans
polymorphisme dynamique.
Je ne vois pas bien en quoi ça peut aider de faire un cours théorique
sur un seul des paradigmes en question.
Hélas ce n'est pas nouveau. Durant toute ma vie professionnelle j'ai été
confronté à cela.
J'en suis arrivé à la conclusion qu'il n'y a que 10% de "bons
programmeurs" et encore, c'est peut-être optimiste.
Par "bon programmeur", j'entends :
- Un programmeur qui connaît parfaitement le(s) langage(s) dans
le(s)quel(s) il programme (syntaxe ET sémantique)
- Un programmeur qui ne met pas son ego dans la programmation (du style,
regarde ce que j'ai écrit, tout ce que ça fait en 2 lignes...)
- Un programmeur qui respecte le cahier des charges, l'analyse et la
conception qui ont été faites en amont
- Un programmeur qui optimise "raisonnablement" son programme et qui ne
cherche pas à en optimiser la totalité (à l'exécution, un programme
passe 80% de son temps dans 20% du code. Ce sont ces 20% qu'il faut
optimiser)
- Un programmeur qui "ne joue pas" avec les aspects les plus obscurs du
langage
Tout ceci paraît trivial mais de tels programmeurs sont très difficiles
à trouver.
Ça a même un nom : http://en.wikipedia.org/wiki/Sturgeon%27s_Law
Fabien LE LEZ
Parce que je ne vois pas comment attaquer brutalement le C++ sans
avoir quelques connaissances sur des langages plus simple. Attaquer
par el C++, c'est faisable, mais c'est tout de même ardu.
JKB
--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Merci. J'ai appris quelque chose aujourd'hui :-)