Forum Programmation.autre Quel est le meilleur moyen d'apprendre à utiliser un langage de programmation ?

Posté par . Licence CC by-sa
3
8
jan.
2016

Bonjour,

je cherche à évoluer en informatique et je me demande comment commencer à travailler ?

Je cherche en particulier à maîtriser les spécificités du C++ et du java.

Je connais un peu le langage C et je me débrouille pas trop mal avec python.

Pensez vous qu'il soit une bonne idée de me concentrer sur des projets concrets, plutôt de suivre des cours ou des ouvrages « pas à pas », enfin, devrais-je plutôt mettre à jour mes compétences théoriques ?

Merci beaucoup pour vos réponses.

Cordialement.

  • # Objet

    Posté par (page perso) . Évalué à 1.

    Si tu fais déjà de l'objet avec python, ça va être plus simple que dans le cas contraire. En ce dernier cas un ouvrage et/ou un tuto sur la programmation objet pourra t'aider.

    La gelée de coings est une chose à ne pas avaler de travers.

  • # Un projet concret est plus formateur.

    Posté par . Évalué à 3.

    Par contre il ne faut pas placer la barre trop haut, et c'est ce qui est le plus difficile.

    Sinon, par rapport à C++ et Java, je pense que tu devrais en même temps si possible aborder la modélisation UML : tu en trouves partout (doc de classes, etc …), et tu dois pouvoir trouver des bouquins avec des exemples que tu pourras porter d'un langage à l'autre.

  • # Projet

    Posté par (page perso) . Évalué à 6. Dernière modification le 08/01/16 à 23:25.

    Trouves un projet sur lequel tu as envie de travailler,
    soit un truc perso, soit une appli que tu utilises quasiment au quotidien. Tu auras besoin d'aller chercher dans les doc ou sur des tutos pour des problèmes concrets.
    Pour mon avis perso, j'ai trouvé plus simple de se greffer sur un projet existant, un application que tu utilises régulièrement, mets les mains dans le code, essayes de comprendre comment c'est architecturé, commence par envoyer des petits patchs, corrections de warnings, nettoyage de variables, etc .. et petit a petit ça fait son chemin … ou pas, et alors il est temps de chercher un autre projet :)
    A moins que tu aies une envie particulière, comme développer un client mail révolutionnaire, un énième clone d'arkanoid, ou que sais-je ! Dans ce cas, fais toi plaisir !

    • [^] # Re: Projet

      Posté par (page perso) . Évalué à 2.

      Patcher des softs me semble une bonne idée, ça permet de voir du code pour apprendre les bases et en même temps de faire du code.
      Partir de rien y aura des problèmes d'architecture, c'est compliqué…
      Sinon il y a codingame, ça fait plein de petits exo sympa pour une première approche.

  • # ca depend de ta maniere d'apprendre

    Posté par . Évalué à 5.

    moi perso j'apprends plutot par la pratique et l'exemple plutot que par la theorie,
    je vais donc tester, modifier, "bidouiller" plutot que de lire 4 bouquins avant de commencer.

    maintenant certains vont preferer lire 4 bouquins avec d'avoir fait une seule ligne de code.

    donc à toi de voir comment tu apprend le mieux.

    evidemment c'est toujours plus motivant quand tu fais un code pour lequel tu as un interet.

    • [^] # Re: ca depend de ta maniere d'apprendre

      Posté par . Évalué à 2. Dernière modification le 09/01/16 à 00:43.

      Un bon livre apprentissage n’est pas un simple manuel de références (qui est malgré tout un compagnon bien utile) et comporte des exercices et des projets à réaliser afin de montrer progressivement tous les aspects du langage avec une difficulté croissante. Pour le C++ et le Java, qui sont parmi les langages les plus savants, je pense que cette approche est indispensable.

      Et rien n’empêche d'intercaler ses propres projets en parallèle à tout ça.

      • [^] # Re: ca depend de ta maniere d'apprendre

        Posté par (page perso) . Évalué à 3.

        Pour le C++ et le Java, qui sont parmi les langages les plus savants

        C++ est clairement très complexe, voire compliqué.

        Java le langage en revanche est plutôt simple, voire simpliste (ce qui ne veut pas dire non plus qu'on en connaît les moindres subtilités en 2 heures évidemment). Après il existe tout un tas de bibliothèques/outils permettant justement de pallier les lacunes du langage. Du coup c'est l'écosystème Java qui est assez complexe.

        Ça ne remet pas en cause ce que tu dis, et mixer pratique et théorie est effectivement la bonne approche.

        • [^] # Re: ca depend de ta maniere d'apprendre

          Posté par . Évalué à 0. Dernière modification le 09/01/16 à 13:02.

          Salut,

          Java le langage en revanche est plutôt simple, voire simpliste

          Ref. needed.

          De quel "java" parles-tu, et à quel "C++" le compares-tu ?

          Faire un itérateur ou une fonction lambda, un hash personnalisé, ça te semble à la portée de n'importe qui ? Et les GUI, le modèle MVC, c'est si simpliste ?

          Si c'est une bête question d'algorithmie, je dirais que les deux se vallent (je ne connais que peu le C++). Si on veut pousser plus loin (l'OP dit vouloir maitriser), on peut se faire une petite idée sur codereview.stackexchange des deux langages, de ce que peut être un bon design dans les deux…

          On voit très vite que faire du code propre (je ne parle pas d'un programme sur un bout de serviette), donc maintenable, réutilisable, n'est pas si direct que ça. Dans aucun des deux.

          Pour l'OP : tu peux choisir de poster sur stackexchange de petits problèmes résolus, les soumettre et apprendre des commentaires dans les deux langages pour progresser.

          • [^] # Re: ca depend de ta maniere d'apprendre

            Posté par (page perso) . Évalué à 5.

            De quel "java" parles-tu, et à quel "C++" le compares-tu ?

            Même les dernières versions de Java sont loin d'être aussi expressives que l'état de l'art d'il y a 15 ans (youpi il y a enfin les lambdas, la concurrence tremble), donc peu importe la version du langage Java, cela reste un langage plutôt simple. Rien que le langage de template de C++ déja présent il y a 20 ans (mais pas toujours implémenté par les compilateurs C++ tellement il est complexe), face aux generics poussifs de Java permet de voir l'abîme de complexité qui sépare les 2 langages. Note que je dis juste que C++ est plus complexe, je ne dis en aucun cas si un des 2 langages est mieux que l'autre (ils sont différents, avec des qualités différentes), ni s'ils sont bien (là c'est l'assurance de lancer une discussion interminable, ce n'était pas le but).

            Faire un itérateur ou une fonction lambda, un hash personnalisé, ça te semble à la portée de n'importe qui ?

            • Dans un langage qui gère automatiquement la mémoire (comme Java), si écrire un itérateur ou une fonction lambda s'avère difficile, c'est éventuellement parce le langage utilisé n'est pas très puissant, par exemple s'il est simpliste. En gros, langage simpliste implique que le programmeur doive en baver pour faire des choses non triviales. En C++, c'est différent, on doit se soucier de plus de choses comme la mémoire (où est-ce qu'on alloue, qui désalloue…), les difficultés viennent de l'aspect bas-niveau.
            • Écrire une bonne fonction de hash est difficile dans tous les langages.

            Et les GUI, le modèle MVC, c'est si simpliste ?

            C'est quoi le rapport avec les langages ? Ce sont des choses qu'on peut être amené à coder dans n'importe quel langage. Le fait que cela soit difficile, c'est parce que coder c'est difficile, cela n'a rien a voir avec le côté simpliste ou non du langage.

            On voit très vite que faire du code propre (je ne parle pas d'un programme sur un bout de serviette), donc maintenable, réutilisable, n'est pas si direct que ça. Dans aucun des deux.

            Ça sera difficile dans tous les langages, parce que faire de la qualité c'est difficile par principe.
            Après selon le projet, le langage choisi pourra être plus ou moins adapté (et donc rendre ça un peu moins difficile), et les difficultés techniques seront de natures différentes (ex: se battre avec les cycles de références en C++ qui provoquent des fuites mémoires, se battre avec le GC qui défonce les performances en Java).

            Il est possible d'écrire du code non trivial (voire très complexe) même avec un langage simpliste. Et Java est relativement simpliste ; par exemple il a fallut attendre des plombes pour avoir des lambdas, alors que tous les langages avec gestion automatique de la mémoire les avaient depuis longtemps ; avoir des classes anonymes était une solution simple à ce manque, mais en pratique avoir un concept de moins pour garder le langage simple obligeait les codeurs à écrire plus de code moche ; ce qui s'appelle être simpliste (trop simple, la simplicité n'est plus une force, mais une faiblesse). Et le fait d'avoir des lambdas aujourd'hui ne ramène pas Java au niveau de l'état de l'art, ca le rend juste moins simple. Au contraire C++ dispose de beaucoup de concepts, ce qui le rend très (voire trop) complexe.

            Maintenant un codeur qui veut maîtriser Java devra au final connaître l’écosystème Java, et cela sera difficile aussi (parce que devenir compétent c'est difficile).

            • [^] # Re: ca depend de ta maniere d'apprendre

              Posté par . Évalué à -1.

              Salut GuieA_7,

              Merci d'avoir pris le temps de ta réponse, mais je te redemande de référencer tes sources si tu le veux bien :)

              Peux-tu documenter là dessus ?

              Même les dernières versions de Java sont loin d'être aussi expressives que l'état de l'art d'il y a 15 ans […] et aussi
              face aux generics poussifs de Java permet de voir l'abîme de complexité qui sépare les 2 langages

              Ce n'est pas que je veuille faire peur au posteur original, mais ça serait bien de lui faire comprendre ces notions, qui ne sont pas triviales (je te jure).

              Sinon, à l'arrache :

              Dans un langage qui gère automatiquement la mémoire (comme Java) […]

              Hmm, t'as jamais testé jni ou quoi ? Ou mettre plusieurs GC en race concurence ? Et tu te limite à un seul langage dans tes applis (et tu teste pas différents GCs) ? :(

              Et les GUI, le modèle MVC, c'est si simpliste ?
              C'est quoi le rapport avec les langages ? Ce sont des choses qu'on peut être amené à coder dans n'importe quel langage. Le fait que cela soit difficile, c'est parce que coder c'est difficile, cela n'a rien a voir avec le côté simpliste ou non du langage.

              Ce que je souhaitais dire, c'est que tu met en avant la complexité du C++ (je rappelle, je ne connais pas trop) par rapport à un écosystème "complet", mais dont tu casse les branches en faisant la comparaison, en enlevant la complexité trop facile de faire juste du println

              Il est possible d'écrire du code non trivial (voire très complexe) même avec un langage simpliste
              BRAINF**K POWER ! (si tu suis mon idée)

              Et non, je ne considère pas le langage java dans son ensemble (jdk) comme simpliste ; Je crois que nous nous comprenons mal et bien : pour moi, connaître java, c'est connaître son jdk (qu'il soit open, ou pas). Je dis pas mieux pour le C++ hein.

              Ca va être à l'OP de dire ce qu'il veut suivre…

              • [^] # Re: ca depend de ta maniere d'apprendre

                Posté par (page perso) . Évalué à 5.

                1) Je pense que l'incompréhension vient que ce ce j'appelle langage, c'est seulement le langage (sa grammaire, sa sémantique), mais :

                • j'ai fait systématiquement l'effort de parler du langage Java quand il je parlais du langage.
                • j'ai fait systématiquement l'effort de parler de l'écosystème Java (qui comprend le JDK) le reste du temps. J'ai précisé dans mes 2 derniers messages que le maîtriser était difficile, donc je ne comprends pas pourquoi tu tiens tellement à me l'expliquer vu qu'on est d'accord…

                J'ai aussi dit que coder correctement était difficile dans tous les langages, et que maîtriser même un langage simple était difficile. Je fais du Python, langage simple, depuis plus de 10 ans, il m'arrive encore d'apprendre des choses dessus ; et je ne parle pas de fonctions de la lib standard (il est évident que je ne la connaît pas par cœur), mais bien d'aspect du langage lui-même. Là encore on est d'accord mais tu me le réexpliques quand même.

                J'ai aussi dit que l’excès de simplicité du langage pouvait justement être une source de difficulté pour le programmeur (il manque des notions qui auraient permis que le langage fasse les choses à notre place, donc le programmeur doit faire plus d'efforts). Donc le fait que le langage soit simpliste n'implique pas que coder des choses complexes soit simple, c'est très exactement le contraire.

                2) La phrase originelle disait que le langage Java faisait partie des plus savants. C'est faux il fait partie des langages les plus simples parmi les langages les plus utilisés. Et c'est normal Java a été conçu dans cet optique :

                "Le langage Java reprend en grande partie la syntaxe du langage C++, très utilisée par les informaticiens. Néanmoins, Java a été épuré des concepts les plus subtils du C++ et à la fois les plus déroutants, tels que les pointeurs et références, ou l’héritage multiple contourné par l’implémentation des interfaces. Les concepteurs ont privilégié l’approche orientée objet de sorte qu’en Java, tout est objet à l’exception des types primitifs (nombres entiers, nombres à virgule flottante, etc.)."

                "L’équipe envisageait initialement d’utiliser le langage C++, mais l’abandonna pour différentes raisons. Tout d’abord, ils développaient sur un système embarqué avec des ressources limitées et estimaient que l’utilisation du C++ demandait un investissement trop important et que cette complexité était une source d’erreur pour les développeurs. L'absence de ramasse-miettes impliquait que la gestion de la mémoire devait être programmée manuellement, un défi mais aussi une source d’erreurs."

                "Il faut noter que les évolutions successives du langage ne portent guère sur sa syntaxe -relativement stable depuis le début- mais principalement sur l'enrichissement de ses fonctions, avec l'embarquement et l'optimisation de bibliothèques logicielles (API) dans des domaines très variés de l'informatique : bases de données, gestion XML, informatique distribuée et web, multimédia, sécurité…"

                Tiré de https://fr.wikipedia.org/wiki/Java_%28langage%29

                Note que le fait qu'il fasse partie des plus simples n'implique pas qu'il soit simple dans l'absolu. Donc oui il a des subtilités, mais il y en a aussi dans les autres langages (et particulièrement en C++).

                Hmm, t'as jamais testé jni ou quoi ?

                • JNI fait parti de la lib standard, pas du langage en tant que tel. Il y a des API complexes dans tous les langages.
                • Il y a des API comparables dans tous les langages ; tous les langages bien conçus permettent de s'interfacer avec du C, et quand il y gestion automatique de la mémoire ça peut être source de complexité oui, mais ça reste vrai dans plein de langages 'simple' (ex: Go, Python). Donc ça ne rend pas Java plus complexe que les autres, désolé.
                • As-tu essayé de maîtriser la STL ? :)
                • Programmer avec un GC facilite globalement la vie du programmeur (c'est pour ça qu'il y en a un dans Java—cf l'historique plus haut) ; maintenant chaque solution amène aussi des problèmes. Donc l'existence de problèmes ne prouve pas qu'on est plus complexe que le reste du monde.

                Et tu te limite à un seul langage dans tes applis ?

                Quel rapport avec Java au juste ? Oui programmer c'est difficile ; oui mélanger des langages c'est difficiles ; oui si certains ont un GC ça va provoquer un certain type de problème, mais Java n'est pas le seul à avoir un GC (anecdote: on peut mettre un GC en C++, mais pas gérer sa mémoire manuellement en Java) et le GC facilite la vie 99% du temps, donc encore une fois ça ne rend pas Java plus complexe que les autres.

                • [^] # Re: ca depend de ta maniere d'apprendre

                  Posté par . Évalué à 1.

                  Salut GuieA_7,

                  Merci pour cette réponse longue et argumentée (et sourcée).

                  Je pense que l'incompréhension vient que ce ce j'appelle langage, c'est seulement le langage (sa grammaire, sa sémantique)

                  En effet, c'est probable. C'est pourquoi je disais que j'incluais la connaissance (partielle) du jdk.

                  Tu peux me corriger, mais ton approche est plutôt théorique (connaître un langage, sa grammaire) --ce qui est bien en soi ; et certainement la base de mon argumentation aussi-- alors que mon approche, par rapport au post original est pragmatique : connaître un langage (C++, java, whatever else) sans son environnement proche (ce que tu dois appeler l'écosystème) n'est pas un levier.

                  Je peux me tromper, et j'en serais bien désolé en ce cas mais forcé d'admettre que j'ai tord, je pense que l'OP souhaite apprendre pour trouver du travail. Mis à part s'il souhaite bosser pour une boîte qui développe son propre langage, la "maîtrise" absolue des théories mathématiques soutenant ce qui fait un langage est à mettre au second plan par rapport à la connaissance de cet écosystème (j'espère utiliser tes termes, du coup).

                  En prenant un exemple très bête, je bosse avec des gens (sûrement comme plein de monde, ça c'était un défonçage de porte ouverte). Les formules sont mathématiques et le recrutement s'est fait pour des compétences poussées en ce sens. Si je leur parle de XOR, je ne suis même pas sûr qu'ils me répondront « le shérif de l'espace ? ». Pour autant, leur valeur ajoutée est significativement positive (sinon, y'aurait un problème).

                  XOR fait partie d'une base de langage. Faut-il le connaître pour travailler ? J'ai bien peur de bosser avec des gens qui ne connaissent pas et pour qui ça n'est pas une tare de ne pas connaître cet opérateur.

                  Par contre, pour être opérationnels, ils doivent avoir l'écosystème en main pour fournir un logiciel fini.

                  Attendons un petit retour de l'OP pour savoir ce qu'il souhaite lui. ;)

                  • [^] # Re: ca depend de ta maniere d'apprendre

                    Posté par (page perso) . Évalué à 5.

                    En parlant de grammaire j'ai peut-être porté à confusion, mais c'est surtout le terme 'sémantique' qui m'importait (je n'ai pas trop su comment le formuler) ; on se tape de savoir si on fait des blocs avec des {} ou des BEGIN/END, c'est juste cosmétique. En revanche est-ce de l'impératif ou du fonctionnel (ex: 'if' peut exister dans les 2 cas, mais avoir une sémantique différente), de l'objet à classe ou à prototype, fait-on de l'héritage de type ou bien de trait, du typage dynamique/statique, avec de l'inférence ou pas, du typage fort/faible, quel est le modèle mémoire etc…

                    Je fais partis des gens qui pensent que celui qui ne connaît qu'un langage n'en maîtrise aucun. Et inversement un codeur qui comprend les différentes notions de mon paragraphe précédent (parce qu'il a étudié la théorie et pratiqué des langages divers) n'aura pas de mal à appréhender le langage Java, parce qu'il est assez pauvre et n'a pas de fonctionnalité qu'on ne retrouve ailleurs (et ce n'est pas forcément un défaut). Ça ne veut pas dire être un dieu du Java en 3 jours, mais ça veut sûrement dire être à peu prés opérationnel en 1 mois au sein d'une équipe.

                    Tu penses que je suis très théorique, et c'est sûrement le cas ; mais l'entreprise que j'ai créée avec 3 associés a fêté ses 10 ans il y a peu, alors peut-être me croiras-tu si je te dis que je suis aussi pragmatique. J'ai eu l'occasion de briller à des entretiens avec mes (petites) connaissances théoriques, et sans avoir à démontré que je connais par cœur telle ou telle API ; mais il s'agissait de recruteurs intelligents cherchant de bons techniciens (spoil: ce n'était pas des SSII :) ). J'ai aussi pu mener un certains nombres d'entretiens du coté recruteur ; et j'ai toujours été content de mes choix, que j'ai fait avec des entretiens ouverts et assez théoriques, et jamais portant sur la maîtrise de tel subtilité d'un langage ou de sa lib standard ; les personnes recrutées ont toujours rapidement été efficaces sur le terrain en peu de temps. Je pense qu'une personne qui connaît bien un, et un seul, langage et sa lib standard, ne pourra jamais envisager une solution optimale si son langage se prête mal au problème rencontré.

                    Les formules sont mathématiques et le recrutement s'est fait pour des compétences poussées en ce sens. Si je leur parle de XOR, je ne suis même pas sûr qu'ils me répondront

                    Je n'ai pas compris ce passage. Tes collègues sont brillants en maths mais ne connaissent pas XOR ?! Si oui, alors j'imagine qu'ils connaissent le concept de 'ou exclusif' sans connaître le sobriquet que lui donne les informaticiens, ce qui n'est pas vraiment un souci à mon sens ni une lacune théorique (ils trouveront le jour où ils en auront besoin). Si c'est autre chose alors explique plus clairement stp.

                    Par contre, pour être opérationnels, ils doivent avoir l'écosystème en main pour fournir un logiciel fini.

                    En ce qui me concerne, si les gens ne sont pas opérationnels dans l'heure, ça ne me semble pas choquant s'ils ont les bases pour le devenir rapidement (pour moi c'est ça un bon informaticien). "Quoi tu as fait du Qt/GTK/… mais jamais de Swing ! Tu ne dois sûrement pas être capable de faire une GUI, car pour ça il faut connaître par cœur la signature du constructeur de JButton !". En ce qui me concerne une boite qui me dirait ça, je n'aurai probablement pas envie de travailler pour elle dans tous les cas ; après je ne sais pas quels sont les plans de notre posteur, car sa demande était assez vague, nous sommes d'accord.

                    • [^] # Re: ca depend de ta maniere d'apprendre

                      Posté par . Évalué à 1. Dernière modification le 13/01/16 à 00:09.

                      Salut,

                      Vu qu'on est plutôt d'accord, je ne répond que rapidement en attendant l'OP, mais pour répondre à certaines interrogations :

                      Je fais partis des gens qui pensent que celui qui ne connaît qu'un langage n'en maîtrise aucun

                      Ca, ça demande beaucoup, beaucoup de temps (tu l'as dit et je ne peux qu'aquiesser).

                      j'imagine qu'ils connaissent le concept de 'ou exclusif' sans connaître le sobriquet

                      Oui. Même bien pire :) Je ne m'en fais pas pour leur expliquer le jour où ils en auront besoin.

                      En ce qui me concerne une boite qui me dirait ça, je n'aurai probablement pas envie de travailler pour elle dans tous les cas

                      C'est tout à fait ça, j'ai des collègues qui m'en apprennent ou à qui j'apprend. Chacun son domaine :)

  • # Manque d'inspiration ?

    Posté par . Évalué à 1. Dernière modification le 09/01/16 à 14:25.

    Salut,

    Dans d'autres commentaires, certains t'ont indiqué de prendre soit un bouquin, soit un projet perso. C'est bien pour commencer.

    Si la recherche que tu souhaite est "à maîtriser les spécificités du C++ et du java", tu peux aussi regarder du côté de codegolf.stackexchange. Le codegolfing est un art de maîtrise du langage (et de la résolution de problèmes). Les petits exercices tombent régulièrement, la contrainte étant : le plus court possible gagne.

    C++ et Java perdent en général, étant des langages très verbeux par rapport aux autres, mais on y trouve des astuces parfois.

    Surtout, comme ce sont des exercices rigolos, ça peut te motiver (même si tu ne participe pas à la compétition) pour trouver des solutions, si tu es en manque d'inspiration journalier.

    Contrairement à codereview que je proposais plus haut, ce n'est pas du code propre, cependant.

  • # Coursera ?

    Posté par (page perso) . Évalué à 1.

    Ayant quelques notions de C, j'ai bien apprécié ce module coursera : https://www.coursera.org/course/intropoocpp
    (J'avais fait le module précédent https://www.coursera.org/course/initprogcpp auparavant pour me rafraîchir les idées, mais il n'y a pas de session prévue dans un avenir proche).
    Le bon côté c'est que tu as quelques exercices avec correction et échange avec les autres élèves et les enseignants, qui sont très disponibles sur le forum.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.