Partage
  • Partager sur Facebook
  • Partager sur Twitter

Diffamation du cours d'openclassrooms(c++)

    31 août 2019 à 19:51:36

    Bonjour,je débute en c++ et je suis très troublé par un bon nombre de postes/commentaires/sites qui décrivent le cours de c++ comme étant mauvais et obsolète, notamment ce lien:

    https://informaticienzero.github.io/c++-avec-openclassrooms-ou-comment-perdre-son-temps/

    Ce qui me fait douter de ce poste est que une grande parts des liens qu'ils renvoient montrent toujours des commmentaires d'un internaute: Ksass`Peuk crach continuellement sur le cours et pub un autre cours de son voisins du dessous: http://guillaume.belz.free.fr/doku.php?id=programmez_avec_le_langage_c

    J'aimerais donc avoir un maximum d'avis de gens compétant pour savoir si le cours est réellement mauvais ou si ces articles sont justes écrit par des concurents afin de ne pas perdre du temps sur u cours inutile ou a reprendre un cours de 0.

    Merci

    PS:J'ai aussi trouver un autre cours qui pourrait ettre une alternative a celui d'openclassroom: https://zestedesavoir.com/tutoriels/822/la-programmation-en-c-moderne/ pouvez-vous me dire si il est bien?

    • Partager sur Facebook
    • Partager sur Twitter
      31 août 2019 à 20:43:45

      Si tu veux serieusement apprendre le C++, tu te procures C++ Primer 5th Edition (c'est en anglais technique, donc facile à comprendre, tu lis pas le Guardian quoi). Tu le lis de A à Z en faisant tous les exercices (un moins de 1000 exos). Cela te prendra environ 2 mois, mais tu auras d'excellentes bases, bien meilleures que ce que n'importe quel tuto sur internet te fournira. Le cours d'Openclassromm est à des années lumières derrière la profondeur de C++ Primer. Tu n'y trouveras pas de petites phrases "jeuns", les auteurs ne te prennent pas pour leur pote, mais ils sont très pédagogiques et rigoureux. De plus tu apprendras comment correctement coder en C++ 11, et non pas à faire du "C with classes".

      • Partager sur Facebook
      • Partager sur Twitter
        31 août 2019 à 21:08:17

        Le second lien est également un cours obsolète maintenant, il est préférable de suivre le cours de Zeste de Savoir.
        • Partager sur Facebook
        • Partager sur Twitter
        Pour poser des questions ou simplement discuter informatique, vous pouvez rejoindre le discord NaN.
          1 septembre 2019 à 1:22:14

          Salut,

          Le plus difficile quand on débute dans "quelque chose", quel que soit le domaine, est de prendre toute la mesure de ce que l'on ignore !

          C'est particulièrement vrai pour l'apprentissage du C++, qui compte certainement parmi les langages les plus complexes (j'ai bien dit complexe, et non compliqué) qui existent.

          Or, pour comprendre pourquoi le cours de C++ du site est mauvais, il faut avoir un "niveau d'expérience" que personne n'a au moment d'entamer le cours.

          Mais si tu avais lu les interventions qui précèdent (ou qui suivent) celles de Ksass ` Peuk dans les liens fournis par l'article, tu te serais rendu compte que de nombreux intervenants (dont je fais partie) sont exactement du même avis que lui.

          Tu demande l'avis de gens compétents? tu en as tant et plus dans les différentes discussions pointées par cet article.  Ne fait pas l'erreur de croire que, sous prétexte que le site s'appelait "Site du Zero" il y a quelques années, les gens qui interviennent sur le forum sous tous... des zéros en C++. 

          Bien au contraire : je ne vais pas tenter de dresser de liste, au risque d'en oublier, mais de nombreux intervenants sur ce forums (dont Ksass ` Peuk et moi-même ) sont des professionnels, qui utilisent C++ de manière journalière.

          Tu peux donc nous croire sur parole lorsque l'on te dit que ce cours -- écrit en 2005 -- ne fait que répéter ce qui, à l'époque de sa rédaction, passait déjà pour de mauvaises pratiques depuis plusieurs années.

          Tu peux nous croire sur parole lorsque l'on te dit -- pour être passé par là -- que la manière dont le C++ est abordé dans ce cours correspond à la manière dont nous avons nous-même appris le langage cinq ou dix ans avant que ce "cours" ne soit rédigé.

          Et tu peux nous croire sur parole lorsque l'on te dit que nous avons sué sangs et eaux pour adapter ce que l'on avait appris à des pratiques qui ne sont désormais plus remises en cause.

          AzerazerAzerazer1 a écrit:

          J'aimerais donc avoir un maximum d'avis de gens compétant pour savoir si le cours est réellement mauvais

          Je te confirme que ce cours est réellement mauvais.  Prend peut être la peine de lire l'ensemble des discussions pointées par l'article, tu verras que les arguments qui justifient ce jugement implacable sont légions (et souvent différents d'une discussion sur l'autre, même si certains points reviennent de manière quasi systématique ;) )

          AzerazerAzerazer1 a écrit:

          si ces articles sont justes écrit par des concurents.

          Aucun des intervenant n'est un "concurrent". A la base, gbdivers avait commencé la rédaction de son cours pour pallier un manque réel de ressources "fiable" en francais.  Et comme tous les professionnels qui interviennent régulièrement sur ce forum reconnaissent la qualité de l'écrit, il est normal qu'ils l'aient tous, à un moment ou à un autre, plus ou moins plébiscité.  C'est exactement la même raison qui nous fait mettre Primer C++ de Lipmann en évidence.

          AzerazerAzerazer1 a écrit:

          de ne pas perdre du temps sur u cours inutile ou a reprendre un cours de 0.

          As tu la moindre idée de la difficulté que représente le fait de devoir abandonner des habitudes qui "semblent pourtant si bien fonctionner" au profit de "bonnes pratiques".  Nous (comprends: ceux qui émettent tous ces avis négatifs sur le cours)  oui, parce qu'on a du en passer par là; et que l'on a du suivre ce cheminement "à la dure".

          Tu as la chance de profiter de l'expérience de gens qui codaient pour certains déjà en C++ bien avant que le cours ne soit rédigé, et d'être orienté vers des ressources moins obsolètes et surtout plus correctes à de nombreux points de vue.  Ressources qui te permettront de prendre tout de suite de bonnes habitudes, au lieu de t'en faire prendre de mauvaises que tu devras faire l'effort d'abandonner.

          • Partager sur Facebook
          • Partager sur Twitter
          Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
            1 septembre 2019 à 14:04:49

            Ok merci pour votre aide je vais donc  arrêter le cours d'openclassroom et continuer celui de zeste de savoir.
            • Partager sur Facebook
            • Partager sur Twitter
              1 septembre 2019 à 15:24:51

              Salut,

              Pour ma part, je dirais surtout que le C++ a été créé comme une extension du C (qu'on aurait pu l'appeler C with classes). Il a peu a peu évolué pour devenir plus propre, et la norme actuelle est très différente maintenant de ce qu'il était avant. 

              Le cours de ce site est un cours qui apprend le vieux C++ (le C with class), et il parait qu'il y a quelques coquilles avec.

              Le cours de Gbdivers apprend le C++ récent, avec de bons réflexes, plus propre.

              Mais le monde n'étant pas parfait non plus, tu verras dans le monde professionnel beaucoup de gens qui programment en C++ à l'ancienne, les habitudes sont tenaces ; et pire, il existe encore des profs qui enseignent le C++ à l'ancienne. ça c'est pas super.

              • Partager sur Facebook
              • Partager sur Twitter

              Recueil de codes en C et C++ http://fvirtman.free.fr/recueil/index.html

                1 septembre 2019 à 18:13:23

                C'est pas tant (*) le langage qui change que la manière de l'utiliser, avec  l'adoption de l'idiome raii et des exceptions comme moyen de gérer les erreurs.

                Techniquement on  peut toujours faire du C+classes avec le dernier standard. 

                Si certains émettent et répètent de vives réserves sur le cours c++ d'OC, c'est 1) que le cours est mauvais (le cours de C aussi, ne faisons pas de jaloux) 2) la question est soulevée fréquemment.  Si les gens cherchaient un peu par eux mêmes, ils poseraient pas la question, mais il faut faire avec.

                Et pour être constructif  il faut bien proposer autre chose à la place.

                (*) a part bien sûr la sémantique de mouvement, la déduction de type,  les lambdas etc

                -
                Edité par michelbillaud 1 septembre 2019 à 18:22:03

                • Partager sur Facebook
                • Partager sur Twitter
                  3 septembre 2019 à 6:03:32

                  C'est parce que je suis méchant et que GB me donne de l'argent pour chaque visite sur son cours.

                  (Tout a été dit au dessus à part ça, donc ça me semblait nécessaire de le préciser)

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

                    3 septembre 2019 à 7:21:05

                    La méchanceté gratuite, le syndicat est contre.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 septembre 2019 à 14:47:04

                      En voyant le titre j'ai cru à YES, man. J'ai transpiré.

                      Sinon histoire que mon intervention serve à quelque chose et pour avoir un avis de plus d'un inconnu jugé neutre car à priori pas sur les liens que tu postes, oui le cours de ce site est nase.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 octobre 2019 à 14:44:23

                        Bonjour,

                        Pouvez-vous m'expliquer svp, la différence entre ce que vous appelez "C+Classes" et le "c++ moderne".

                        J'ai débuté il y a un an le C++ avec ce cours avant de poursuivre avec des livres recommandés comme étant "plus sérieux". Certes, j'ai appris pleins de choses ailleurs, mais ce site m'a donné les bases du language (Constructeur, surcharge, la stl avec les algo, les itérateurs ...). J'ai acheté le livre et l'ai complété, il y a des notes partout glanées à droite et à gauche.

                        J'aime bien voir ce cours comme le cours élémentaire du C++, et si c'était le but des auteurs je trouve que c'est pas mal réussi.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          9 octobre 2019 à 22:34:03

                          ok, j'utilise donc bien le C++ moderne, auto, for range, lambda, smart pointer, STL bien qu'ayant commencé avec ce cours.

                          Il y a une critique qui revient souvent a propos de ce cours c'est que la gestion des exceptions arrive tard et on prend toujours l'exemple des new qui peuvent générés des erreurs. Franchement pour quelqu'un qui commence à programmer et qui va écrire de petits utilitaires en mode console (si on commence d'entrée à vouloir réécrire Photoshop c'est qu'on a vraiment rien compris à mon avis), quelle est la probabilité pour que sa machine manque de mémoire si son programme est correct ? Et si son programme est incorrect (une boucle de new sans les delete associés par exemple), celui-ci va s’arrêter tout seul, l'OS va libérer la mémoire et il devra debugger et corriger son programme. Évidement que dans les logiciels sérieux il faut tout tester mais quand on débute c'est impossible et contre productif, il vaut mieux peaufiner ses algos.

                          Il y a un point de l'article donné en lien ou je suis quand même septique: peut on réellement enseigner le C++ sans parler et expliquer assez tôt les pointeurs ? Je trouve l'utilisation des pointeurs vraiment pratique pour expliquer le RAII ou les itérateurs. Le livre d'OpenClassroom en parle assez tôt mais pour une autre raison. Un des buts du livre est d'amener le lecteur à utiliser Qt, qui utilise les pointeurs nus (avec moins de risque puisque la libération de la mémoire est gérée par Qt).

                          • Partager sur Facebook
                          • Partager sur Twitter
                            10 octobre 2019 à 0:41:56

                            Comme l'explique luc dans son article, "moderne" n'est pas réellement une question de syntaxes (pointeurs, auto, range, etc). D'autant plus que le RAII concerne la gestion des ressources en général, pas uniquement la mémoire. (files, threads, etc)

                            De mon point de vue, c'est pas le C++ qui est devenu "moderne", c'est l'ensemble de l'informatique qui a évolué. Le C++ "moderne" n'est en fait qu'une façon de concevoir la programmation (en C++, mais on pourrait l'étendre à tous les langages, voire à tout le processus de création d'application) qui s'adapte à ces changements de l'informatique.

                            Ce que tu décris, c'est en gros l'approche bottom-up (aller des détails au général). Cela avait du sens il y a 20 ans et a encore du sens dans certains cas (par exemple l'embarqué), en particulier parce que les applications étaient moins complexes, le matériel aussi, la gestion d'erreur inutile (ou tout au moins "crash à la moindre erreur" possible dans certains cas), la conception logicielle moins critique (du fait de la petite taille du code), etc.

                            Mais globalement, cette approche, de nos jours, n'a plus trop de sens. Et il faut faire des choix. Faire du bottom-up, c'est généralement moins bien comprendre (ou nécessiter plus de temps et de travail pour comprendre) tous les concepts haut niveau de la création d'application. On le voit particulièrement bien avec les devs C, qui ont beaucoup de mal à passer (et penser correctement) en C++.

                            Une autre critique sur l'approche bottom-up, c'est la justification de cette approche. Dans beaucoup de cas, les profs et auteurs justifient cette approche... "parce que c'est comme ça qu'on a toujours fait". Et on voit souvent que ces personnes n'ont pas du tout mis à jour leurs connaissances en C++ depuis des années (avec des bonnes justifications parfois, mais c'est un autre débat). Tous les experts en C++ sont unanimes (cf par exemple les talks de la CppCon ou les travaux du SG 20 Education) sur l'approche a ne pas faire.

                            -
                            Edité par gbdivers 10 octobre 2019 à 1:32:52

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Pour poser des questions ou simplement discuter informatique, vous pouvez rejoindre le discord NaN.
                              10 octobre 2019 à 4:16:18

                              ChristopheDrieu1 a écrit:

                               quelle est la probabilité pour que sa machine manque de mémoire si son programme est correct ?

                              Tout est résumé danns ces cinq mots : si son programme est correct...

                              Malheureusement, entre:

                              • la conception qui manque parfois de rigueur,
                              • les concepts dont on n'hésite pas à mettre l'adverbe "normalement" ou "généralement" que l'on trouve dans la définition pour s'écarter de l'esprit même du concept en question
                              • la logique qui rend parfois le code beaucoup plus complexe que ce qu'il pourrait | devrait être
                              • les principes (je pense essentiellement à SOLID) dont on respecte la lettre mais pas forcément l'esprit (ou est-ce l'inverse ?)
                              • la complexité intrinsèque du langage, qui nous offre souvent deux ou trois manière différentes de faire certaines choses
                              • les initialisations oubliées ou effectuées trop tard
                              • le RAII qui est souvent mal compris | mis en oeuvre
                              • j'en passe, et sans doute de meilleures

                              il y a tellement de raisons qui peuvent remettre le simple fait de considérer le programme comme "correct" (en justifiant systématiquement cette situaiton du sempiternel "mais on n'a pas toujours | forcément le choix") que cela en devient justement un défi qui va bien au delà de ce que l'on pourrait croire.

                              ChristopheDrieu1 a écrit:

                              Et si son programme est incorrect (une boucle de new sans les delete associés par exemple), celui-ci va s’arrêter tout seul,

                              Justement, il y a tellement d'autres raisons qui pourraient faire que le programme est incorrect sans forcément en provoquer le plantage.

                              Et puis, même :

                              • combien de temps le programme va-t-il fonctionner avant que la fuite mémoire ne finisse par le faire planter?
                              • qui te dit que ce n'est pas tout le système qui finira par devenir instable à cause de cette fuite mémoire?
                              • quelle autre catastrophe auras-tu provoqué avant que le programme finisse par planter ?

                              ChristopheDrieu1 a écrit:

                              Il y a un point de l'article donné en lien ou je suis quand même septique: peut on réellement enseigner le C++ sans parler et expliquer assez tôt les pointeurs ?

                              Bien sur, vu que l'utilisation des pointeurs devrait en fait être strictement limitée aux situations dans lesquelles on n'a absolument pas le choix.  C'est à dire : les situations dans lesquelles ont veut pouvoir manipuler une collection d'objets "passant pour être" d'un type différents (et a priori plus général") : l'utilisation de hiérarchies de classes, de l'héritage et d'objets polymorphes.

                              Pour tout le reste, les collections de la SL et la notion de référence fait amplement l'affaire ;)

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                                10 octobre 2019 à 9:35:32

                                Salut,

                                Pour répondre simplement a la première question, a savoir est ce que le cours de C++ de OC est bon ou mauvais. Je dirais qu'il est très bon et surtout très pédagogue!

                                J'ai appris le C pour faire de l'embarquée et le C++ pour faire du GUI avec QT, et franchement si on suis bien le cour tout est nickel .

                                Cordialement, Antoine

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  10 octobre 2019 à 12:12:05

                                  >si on suis bien le cour tout est nickel

                                  Pour apprendre du très très mauvais "C-with classes".

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                                    10 octobre 2019 à 13:38:15

                                    En français, il n'y a pas plus pédagogique sur ce sujet. Le livre de koala01 est très bien mais absolument pas fait pour le même public. Quant au "C++ Primer" que tout le monde plébiscite, 12 pages dès le début rien que sur le qualificatif "const" et en anglais, faut une certaine motivation !

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      10 octobre 2019 à 13:47:09

                                      Quelle idee aussi de vouloir programmer en c++ quand on n'a pas appris à programmer  avec un langage plus civilisé
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        10 octobre 2019 à 14:12:13

                                        Salut.
                                        Plusieurs choses

                                        > Il y a une critique qui revient souvent a propos de ce cours c'est que la gestion des exceptions arrive tard et on prend toujours l'exemple des new qui peuvent générés des erreurs. Franchement pour quelqu'un qui commence à programmer et qui va écrire de petits utilitaires en mode console (si on commence d'entrée à vouloir réécrire Photoshop c'est qu'on a vraiment rien compris à mon avis), quelle est la probabilité pour que sa machine manque de mémoire si son programme est correct ? Et si son programme est incorrect (une boucle de new sans les delete associés par exemple), celui-ci va s’arrêter tout seul, l'OS va libérer la mémoire et il devra debugger et corriger son programme.

                                        Ce n'est pas que la gestion des erreurs arrive tard, c'est que l'on commence avec des outils qui nécessitent une gestion des erreurs impeccable alors qu'il existe des outils bien plus simples. new[] -> vector, char* -> string, FILE -> fstream. Ne serait-ce que ces choix changerait plein de choses côté apprentissage. Le cours du sdz/oc est passé aux strings standards dans sa V2 suite à mes retours de l'époque. C'est déjà ça! Mais c'est maigre comme choix.

                                        Après, pour un débutant, que tu lui montre unique_ptr<T>, T*, ou les références du Java, pour lui, je ne suis pas sûr que cela changera grand chose. Ce qui est certain, c'est qu'avec un ordre corrigé il aura appris à manipuler correctement la mémoire sans même que l'on ait besoin d'insister sur la question. Ce n'est que dans un dernier temps que l'on peu creuser sous les rouages et montrer précisément les situations problématiques qu'on aurait shuntées dans une formation modernisée.

                                        Il est simple de faire les choses bien et de l'enseigner, pourquoi insister à le faire mal?

                                        > Pour répondre simplement a la première question, a savoir est ce que le cours de C++ de OC est bon ou mauvais. Je dirais qu'il est très bon et surtout très pédagogue!

                                        Au sujet d'un autre support de cours, je me souviens de Loic (je crois) qui comparait les impacts selon que le cours soit bon ou mauvais, et que l'enseignant soit pédagogue ou pas. La pire combinaison, c'est un bon/excellent pédagogue qui présente des choses incorrectes, pour ne pas dire dangereuses.

                                        L'autre grosse problématique du cours, c'est toutes ces entités qui sont copiées à tout va.

                                        -
                                        Edité par lmghs 10 octobre 2019 à 14:14:16

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                                          10 octobre 2019 à 14:35:19

                                          Le problème, c'est que le débutant, si tu lui montres unique_ptr, il peut rien faire parce qu'il a immédiatement besoin de shared_ptr (entre entités, il n'y a pas que des relations d'appartenance exclusive, même dans les exemples les plus simples), et aussi des weak_pointers.

                                          J'aimerais voir un texte pédagogique qui explique tout ça, ressemblances et différences, à des (vrais) débutants sans passer par la case "pointeur brut".

                                          Puisque c'est si simple, pourquoi personne ne se risque à montrer au moins un brouillon ? :-)

                                          -
                                          Edité par michelbillaud 10 octobre 2019 à 14:40:19

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            10 octobre 2019 à 14:52:40

                                            Bonne question. On est sur une question d'ordre. Sur le plan exercice, les premiers dont je vais avoir besoin sont les unique_ptr -- après les vecteurs et les chaines. Je peux retarder les "view" et les shared.

                                            Maintenant il est vrai que j'aurai tendance à partir à l'ancienne pour expliquer un pointeur: une variable qui contient une adresse. Je mets ça dans un coin de ma tête pour le faire mûrir.

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                                              10 octobre 2019 à 15:46:39

                                              A un niveau au dessus, on va dire qu'on représente des entités.

                                              Les entités, on va les représenter par des objets (une entité par objet), et qu'on a souvent besoin que les entités fassent référence à d'autres entités.

                                              Par exemple, on aura une collection d'abonnés d'un réseau social. Chaque abonné "like" d'autres abonnés.

                                              Donc l'annuaire, c'est (par exemple) un ensemble (vector si on veut) de références à des objets abonnés, et dans chaque abonné, il y a un vecteur de références à ceux qu'il "like".

                                              Question 1 : pourquoi des vecteurs de références, et pas d'objets directement ?

                                              Question 2 : par quels type de smart pointers matérialisez vous ces réferences ? 

                                              Vous détaillerez suffisammant les réponses pour qu'elles soient compréhensibles par un débutant qui ne sait pas ce qu'est un pointeur. Vous avez 2 heures.

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                10 octobre 2019 à 17:16:42

                                                michelbillaud a écrit:

                                                Le problème, c'est que le débutant, si tu lui montres unique_ptr, il peut rien faire parce qu'il a immédiatement besoin de shared_ptr (entre entités, il n'y a pas que des relations d'appartenance exclusive, même dans les exemples les plus simples), et aussi des weak_pointers.

                                                Dans mon cours, le concept général d'indirection est introduit dans la partie sur les collections d'objets (juste après la partie sur les variables, donc assez tôt), avec les itérateurs (vector, string).

                                                Un peu plus loin, lorsque l'on arrive aux fonctions, on ajoute les références.

                                                Les pointeurs n'arrivent que vers la fin, dans la partie sur les classes a sémantique d’entité. Donc quasiment a la fin.

                                                Ce qui me gène dans les arguments de ceux qui défendent l'approche "old school", c'est que j'ai l'impression que l'argument revient toujours a "on a toujours fait comme ça". Une grosse difficulté a mettre les choses a plat et réussir a repenser la structure pédagogique du cours.

                                                Pourquoi parler des pointeurs (en général) aussi tôt ?

                                                On n'a pas besoin des pointeurs nus pour expliquer les pointeurs intelligents. On a besoin des indirections pour expliquer les pointeurs intelligents. Et on peut expliquer les indirections très très longtemps avant les pointeurs nus et intelligents. (Et donc l'apprenant peut avoir manipulé longtemps avant les indirections et comprendre le concept avant d'avoir les pointeurs).

                                                La raison historique de parler des pointeurs nus, c'est qu'il n'y que ce type d'indirection en C. Si on veut accéder a un tableau = pointeurs nus. Si on veut passer une indirection dans une fonction = pointeurs nus.

                                                Cela a du sens de parler des pointeurs nus assez tôt en C. Pas en C++.

                                                Quand a-t-on besoin de parler des pointeurs ?

                                                A mon sens, quand on a besoin du polymorphisme d’héritage. Et donc des allocations dynamiques d'objet a sémantique d’entité. Avant, c'est accessoire.

                                                La encore, il y a une raison historique a parler d’héritage aussi tôt : parce que c'est l'approche "tout objet" qu'on avait avant. Concevoir toutes formes de polymorphisme principalement via le polymorphisme d’héritage. Comme en Java.

                                                En C++ (et encore plus dans les versions récentes du C++), on a d'autres formes de polymorphismes. On a la programmation générique. On a les templates. Etc.

                                                Montrer l’héritage très tôt, c'est un très gros probleme en termes de pédagogie, parce que l'apprenant arrivera difficilement a trouver des solutions plus propres et performants sans héritage. C'est le même phénomène que quand on voit un dev C écrire que des fonctions en C++, ou un dev Java qui n'utilise en C++ que de l’héritage.

                                                Typiquement, dans ton exemple avec des abonnés : a quel moment vois tu, dans ton explication, le besoin d'un polymorphisme d’héritage ? A priori, tu en as pas besoin. Donc pas de sémantique d’entité, pas de polymorphisme d’héritage, pas de pointeur du tout. Donc tout simplement une liste de valeurs, avec des iterateurs. Et tu ajoutes des unordored_map<T, iterator> pour créer les tables d'index.

                                                Je suis sur que tu arriverais a expliquer cette solution a tes étudiants en moins de 2 heures.

                                                La solution avec les pointeurs (nus ou intelligents) n'est pas moins bonne. Elle est complémentaire. Mais ce que j'attendrais d'un apprenant, c'est qu'il puisse proposer les différentes solutions, pas uniquement celle avec des pointeurs. Et de préférence dans l'ordre : solution sans pointeurs > solution avec des pointeurs intelligents > solution avec des pointeurs nus.

                                                Cet exercice peut bien sur être utilise dans un cours sur les pointeurs. Mais il ne justifie pas pour autant qu'on parle des pointeurs très tôt dans un cours. Parce que justement, il existe pleins de solutions sans pointeurs. Et que c'est un "échec" pédagogique si l'apprenant n'est pas capable de proposer d'autres solutions que celle avec pointeurs ou s'il n'est pas capable de justifier le choix de la sémantique d’entité et des pointeurs.

                                                michelbillaud a écrit:

                                                J'aimerais voir un texte pédagogique qui explique tout ça, ressemblances et différences, à des (vrais) débutants sans passer par la case "pointeur brut".

                                                Puisque c'est si simple, pourquoi personne ne se risque à montrer au moins un brouillon ? :-)

                                                Donc je suis bien incapable de présenter un tel texte. Parce que quand j'explique les pointeurs intelligents, je considère que le concept d'indirection est compris. Ainsi que le polymorphisme d’héritage (on n'a pas besoin de pointeurs pour parler de ça en C++). (Par contre, le polymorphisme d’héritage est vu peu de temps avant les pointeurs, donc je le considère comme connu, mais pas forcement comme maîtrisé. Contrairement aux indirections).

                                                Si tu parles d'expliquer a un "vrai" débutant (ie juste après avoir vu les variables par exemple) les pointeurs, je pense que c'est un mauvais choix pédagogique. Et dans ce cas, bien sur que tu es obligé d'expliquer les pointeurs nus. Mais c'est une mauvaise solution due a un mauvais choix.

                                                On a déjà eu cette discussion et je crois qu'on restera irréconciliable sur l'approche pédagogique :D 

                                                EDIT :

                                                linventeur716 a écrit:

                                                Je dirais qu'il est très bon et surtout très pédagogue!

                                                ChristopheDrieu1 a écrit:

                                                En français, il n'y a pas plus pédagogique sur ce sujet.

                                                Vous confondez "pédagogique" et "attractif". Donnez un cours de math de niveau collège a une classe de terminal, les élèves le trouveront très facile a suivre. Pour autant, ils seront incapables de répondre aux questions du bac en math.

                                                On le juge mauvais pédagogiquement parce qu'on voit ce que les apprenants savent en C++ en lisant ce cours : il manque des bases importantes. Des erreurs ont été apprises. Et même les notions vues dans le cours ne sont pas correctement comprises.

                                                Cela dit, je n'ai personnellement jamais interdit de lire ce cours. Je dis juste qu'il est mauvais et que si vous voulez apprendre réellement le C++, il faut lire un autre cours. Mais il faut reconnaître que certains veulent juste survoler le C++ puis l'oublier. Ça me va que ces personnes suivent le cours d'OC.

                                                -
                                                Edité par gbdivers 10 octobre 2019 à 17:33:15

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Pour poser des questions ou simplement discuter informatique, vous pouvez rejoindre le discord NaN.
                                                  10 octobre 2019 à 21:21:02

                                                  Le C++ moderne est basé sur la STL, qui est basée sur de la P.O.O. Pour bien utiliser ces objets, il faut comprendre les constructeurs par copie et par déplacement et pour faire ça tu parles de la copie ou du déplacement de la mémoire pointée par ces objets. Si l’étudiant comprend ça pourquoi ne pas lui parler des pointeurs ?

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    10 octobre 2019 à 21:38:10

                                                    michelbillaud a écrit:

                                                    Question 1 : pourquoi des vecteurs de références, et pas d'objets directement ?

                                                    Parce que, si tu commence à copier les utilisateurs, tu vas te retrouver dans le caca lorsqu'il s'agira de manipuler l'utilisateur en lui-même (ex : ajouter un like) : es tu réellement occupé à manipuler l'utilisateur pour lui ajouter un like, ou est tu occupé à n'en manipuler qu'une pâle copie qui se trouve dans la liste des like d'un autre utilisateur?

                                                    Pire encore : ta liste d'objets serait très rapidement désynchronisée en utilisant les copie, car, l'ajout d'un like à un utilisateur donné (qui n'est pas une pale copie de lui-même) nécessiterait la mise à jour de toutes les copies qui existent.  Ce serait faisable, mais à quel cout en termes de performances?

                                                    michelbillaud a écrit:

                                                    Question 2 : par quels type de smart pointers matérialisez vous ces réferences ? 

                                                    Aucun, mon capitaine : j'utilise un tableau (std::vector) de ... std::reference_wrapper ;)

                                                    De cette manière, les tableaux contiendront des alias vers les utilisateurs "like", ce qui nous permet d'éviter les "copies" qui risquent d'être -- à terme -- désynchronisées par rapport à l'objet d'origine ;)

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                                                      10 octobre 2019 à 21:58:51

                                                      ChristopheDrieu1 a écrit:

                                                      Si l’étudiant comprend ça pourquoi ne pas lui parler des pointeurs ?

                                                      Je te retourne la question : pourquoi lui en parler ? A ce moment là ?

                                                      Je ne critique pas l'objectif pédagogique d'enseigner les pointeurs, je critique le fait de mettre cet objectif inutilement tôt.

                                                      Est-ce que l'on a besoin d'expliquer les pointeurs pour expliquer ce qu'est une copie ? Un déplacement ?

                                                      On peut même aller plus loin et se poser la question de savoir si on peut apprendre ces concepts et les utiliser dans un premier temps et laisser l'apprentissage de comment implémenter ces concepts plus tard.

                                                      Quand on expliquer que ça :

                                                      int const i { 123 };
                                                      int const j { i };

                                                      ça fait une copie, on n'a absolument pas besoin d'expliquer le concept de copie en utilisant les pointeurs et le fonctionnement de la mémoire.

                                                      (Ce qui serait faux de toute facon dans l'absolu, parce que le compilateur peut virer tout ça à la compilation et donc que les explications avec des pointeurs et ce qui se passe en mémoire soit complètement faux en réalité).

                                                      Pour la move, un code simple pour aborder la notion :

                                                      void foo(int i) {
                                                          std::cout << i << std::endl;
                                                      }
                                                      
                                                      int main() {
                                                          int const i { 123 };
                                                          foo(i); // copie
                                                      
                                                          int j { 123 };
                                                          foo(std::move(i)); // déplacement
                                                      }

                                                      C'est suffisant pour expliquer le concept. On peut même ajouter un petit dessin pour que ça soit bien clair.

                                                      (Ces images viennent de mon cours et ne correspondent pas aux codes d'exemple précédents. C'est juste pour illustrer comment expliquer ces notions)

                                                      Donc, si on part de l'idée que ces notions (les concepts de pointeur, copie, deplacement) peuvent être séparées (quand on voit le concept ? Quand on voit l'utilisation ? Quand on voit comment l'implémenter soi-même ?) et que l'on se pose la question pédagogique "quand est-il pertinent d'aborder telle notion ?", de mon point de vue, les pointeurs doivent arriver assez tard.

                                                      -
                                                      Edité par gbdivers 10 octobre 2019 à 22:01:12

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                      Pour poser des questions ou simplement discuter informatique, vous pouvez rejoindre le discord NaN.
                                                        10 octobre 2019 à 22:43:56

                                                        Dans ton exemple après le move ta variable locale est toujours là, le move n'a d’intérêt que sur les objet ayant une partie alloué sur le tas.
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          10 octobre 2019 à 22:59:57

                                                          Jamais dit que la variable n'etait plus la. Par contre, elle n'est plus utilisable.

                                                          Et le déplacement est utilisé aussi pour les objets alloués sur le tas. Par exemple lors d'un appel de constructeur, lorsque l'objet n'est pas copiable, etc.

                                                          Et peut importe. Le but est d'expliquer le concept de déplacement. Les details et les cas particulier arriveront plus tard.

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          Pour poser des questions ou simplement discuter informatique, vous pouvez rejoindre le discord NaN.
                                                            11 octobre 2019 à 7:20:34

                                                            koala01 a écrit:

                                                            michelbillaud a écrit:

                                                            Question 1 : pourquoi des vecteurs de références, et pas d'objets directement ?

                                                            Parce que, si tu commence à copier les utilisateurs, tu vas te retrouver dans le caca lorsqu'il s'agira de manipuler l'utilisateur en lui-même (ex : ajouter un like) : es tu réellement occupé à manipuler l'utilisateur pour lui ajouter un like, ou est tu occupé à n'en manipuler qu'une pâle copie qui se trouve dans la liste des like d'un autre 


                                                            Perdu. C'est parce qu'un vector, ça planque un tableau alloué dynamiquement , qui sera réalloué de temps en temps quand on ajoute des éléments. Et reallouer, pas forcément au meme endroit.

                                                            Le résultat c'est que les éléments vont se balader en memoire sans prévenir, ce qui est très embêtant pour des entités, vu qu'on s'y référe par leur adresse.

                                                            Mise en évidence : déclarer un vecteur de quelque chose.

                                                            Faire une boucle (genre 20 fois) qui 

                                                            • Fait un push_back
                                                            • Affiche l'adresse du premier élément 

                                                            Ce Que Vous Allez Voir Va Vous Surprendre

                                                            -
                                                            Edité par michelbillaud 11 octobre 2019 à 7:34:41

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            Diffamation du cours d'openclassrooms(c++)

                                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                            • Editeur
                                                            • Markdown