Warum ist C++ so schwer zu lernen?



  • CppLerner schrieb:

    Warum ist C++ so schwer zu lernen?

    weil es eine Jahrzehnte alte Sprache ist, die zudem großteils C enthält, das noch rund ein Jahrzehnt älter ist. Da sammelt sich einiges an, wenn man Rückwärtskompatibel bleiben will (und das möchte man in
    C++ gerne, wenn es geht).

    weil C++ eine sehr umfangreiche standard library hat - schon die Beschreibung der STL kann ein Buch füllen.

    weil viele Grundkonzepte von C++ aus der C-Vergangenheit stammen und entsprechend hardware-nah sind.

    weil C++ eine Multi-Paradigmensprache ist und die Kombination von OOP, generischer Programmierung und funktionalen Elementen sehr elegante und effiziente Programmierung möglich macht - Multi Paradigmen lernt man aber nicht an einem halben regnerischen Samstagnachmittag.

    weil C++ eine "zero-overhead" Programmierung möglich macht, die aber eine gute Vorstellung davon voraussetzt, was "im Inneren" des Programms vor sich geht - da hat man es mit Garbage Collection und dynamischer Typisierung oft einfacher, aber eben nicht "zero overhead".

    u.s.w.



  • großbuchstaben schrieb:

    weil C++ eine sehr umfangreiche standard library hat - schon die Beschreibung der STL kann ein Buch füllen.

    Die STL nennst du umfangreich? Die Bibliotheken die bei Java by Default dabei sind und dessen Größe ist dir bewusst, oder? 😃



  • nö - java interessiert mich nicht.



  • CppLerner schrieb:

    Warum ist C++ so schwer zu lernen?

    Ich würde sagen, weil C++ "technischer" ist und man genauer verstehen muss, was man macht. In anderen Sprachen funktioniert es oft einfach irgendwie und man muss sich erstmal keine Gedanken machen, wie das genau funktioniert. Da man in C++ aber mehr Kontrolle hat, muss man auch genauer verstehen, was da passiert. Wo ich am Anfang z.B. Probleme hatte, waren der Copy Constructor und der Unterschied zwischen Objekten und Referenzen. Gabs in anderen Sprachen die ich bis dahin gelernt hatte nicht oder hat man nicht unbedingt gebraucht. In C++ macht man dann "irgendwas" und fällt damit auf die Nase.
    Und wenn man schon andere Sprachen kann, fällt es irgendwie schwerer, C++ zu lernen, war zumindest bei mir so. Ich hab die Sprache an sich nicht ernst genommen, ich konnte ja schon ganz gut andere Sprachen und die Syntax hat auch ganz ähnlich ausgeschaut. Nur funktioniert hatte das alles irgendwie nicht. Man muss aber erstmal soweit kommen zu verstehen, dass man eher eine oberflächliche Vorstellung davon hat, wie das alles funktioniert, dann kann man das auch richtig lernen.



  • großbuchstaben schrieb:

    weil C++ eine sehr umfangreiche standard library hat - schon die Beschreibung der STL kann ein Buch füllen.

    weil viele Grundkonzepte von C++ aus der C-Vergangenheit stammen und entsprechend hardware-nah sind.

    So umfangreich ist die Standard library im Vergleich mit anderen Sprachen gar nicht. Dafuer ist sie aber so grundlegend, dass man in normalen Projekten (also jetzt nichts mit embedded) ohne nur schwer auskommt.

    Auch die Hardwarenahen Konzepte finde ich gar nicht mal schlimm, denn nach meiner Erfahrung arbeitet der Anfaenger viel lieber hardwarenahe als der Fortgeschrittene, weil er die Konzepte von Schritt fuer Schritt Anweisungen viel besser versteht, als irgendwelchen modularen Klassenstrukturen, iteratoren, Rekursionen, generische Funktionen (darum programmieren auch so viele der angeblichen C++-Programmierer C).
    Mein C++-Code ist derart High-level, dass kaum jemand meiner Kommilitonen (3. Semester) mit seinen Javakenntnissen den auch nur ansatzweise verstehen koennte.

    Als Hauptproblem sehe ich neben legacy-Kram die falsche Herangehensweise der Anfaenger. Statt auf fertige Funktionen zurueckzugreifen, neigt man dazu, sich erstmal alles selbst zu schreiben, u.A. weil einen die Libraries mit ihrer Vielzahl an Funktionen und Beschreibungen voellig erschlagen und man haeufig auch fortgeschrittene Konzepte wie iteratoren braucht und noch nicht versteht. Da legt man sich dann halt rohe arrays an und bietet fuer Einfuegen und Suchen eigene Funktionen an, erzeugt zweidimensionale Arrays mit Arrays in Arrays und im Extremfall castet verschiedene Typen zu einer gemeinsamen Basisklasse, weil man so ein komplexes Klassendesign zu umgehen glaubt.
    Waehrend man in Java mit Garbage Collector, Object und automatischen Typtests weich faellt, stuerzt man sich in C++ in memory leaks, double delete, dangling pointers und muss dann muehselig mit dem Debugger (dessen Bedienung ohnehin unuebersichtlich und schwer ist) hinterhersuchen und findet dann aber nur schwer verstendliche Fehler. Erst spaeter kann man dann erkennen, dass man eine Methode auf einem ungueltigen this-pointer aufgerufen hat.
    Die Fehler sind die gleichen, aber in Java scheitert man spaeter am Projektdesign und in C++ direkt am Anfang durch abstuerzende Programme.

    Ich bin sehr gespannt, wie das bei Rust wird, denn da gibt es diese ganzen Grundfunktionen zwar, aber gut versteckt in irgendwelchen Modulen und mit kryptischer Verwendung (unsafe, rohen pointern, spezielle Funktionen zur vearbeitung) und die Sprache zwingt einen quasi zu sicherem Code.



  • Artchi schrieb:

    Ein paar C++ler in diesem Forum sind Ideologen, und das ist unprofessionell. Die sind nicht besser wie die schlechten C++-Buchautoren.

    Besser in was? Bücher schreiben?
    Ich finde von solchen Leuten lernt man viel neues über C++.
    Wenn wir von den zuletzt aufgetauchen template-Fragen-Threads reden 🙂



  • Sehr interessante Kommentare hier, genau solche Threads unterscheiden ein Forum von Seiten wie Stackkoverflow, wo es rein um die Problemlösung geht und man Angst haben muss die Frage flasch zu formulieren.

    In welcher Reihenfolge würdet ihr denn einem Anfänger C++ beibringen?



  • Als Programmierer ist man Handwerker und Künstler zugleich.

    Du beginnst wie der Azubi im Handwerk. Man wiederholt einfache - vermeintlich langweilige Dinge -
    immer wieder, bis es in Fleisch und Blut übergeht. Keiner kann von 0 auf 100 programmieren.
    Dann traut man sich an weitere Werkstücke, entwickelt durch die bereits vorhandene Erfahrung
    eigene Ideen und was ganz wichtig ist, es entstehen eigene Fragen.

    Wenn man bereits ein Handwerk kennt, ist es sehr viel leichter ein anderes zu erlernen.
    Du hast gewisse Fertigkeiten, siehst Parallelen und die ein oder andere Verbesserung
    zum bereits Bekannten.

    Als Künstler hast Du dann Dein Handwerkszeug (in Deinem Stil) im Griff (100% Quote erreicht niemand)
    und es wird zum Selbstläufer.

    Im Unterscheid zu den Künstlern, sind leider viele C++ Programmierer elitär veranlagt
    und denken, dass ihr "Kung Fu" das Bessere ist und kritisieren an jeder Stelle den "Kollegen".
    Diese Unsitte ist überwiegend in genau der Sprache zu finden.

    Kurioserweise sind es aber genau die Leute, die auch nach 15 Jahren noch als "Codeäffchen"
    vor ihrem Highend Werkzeug sitzen und überhaupt keinen Begriff für das Endprodukt haben
    (wodurch man letztendlich bezahlt wird). Hauptsache der Code ist bis auf das letzte Bit
    (über-) optimiert.

    Was ist eigentlich sagen will: Hab Spaß und Interesse bei der Sache und fang mit winzig
    kleinen Schritten an und noch so "dummen" Programmen. Der Rest kommt mit jahrelanger
    Erfahrung. Ob man den Schritt gehen muss, jedes neues Sprachfeature einsetzen zu wollen,
    hängt auch davon ab wo Du arbeitest und was gefordert ist. In Abhängigkeit der Anwendung
    ist vieles einfach nur unnötig. (man befrage mal heutige Cobol-Programmierer was Sie von
    Lambda-Funktionen halten würden) 🙂

    just my 2 cents



  • c++4ever schrieb:

    (man befrage mal heutige Cobol-Programmierer was Sie von
    Lambda-Funktionen halten würden) 🙂

    Ja genau, frag mich mal. Ich hab mit Cobol angefangen, und zwar mit Cobol74. Nicht dem ganzen modernen Zeugs.

    Mein größtes Problem ist meistens, meinen eigenen Code nach einiger Zeit selber zu verstehen.
    Von wegen "Was hast du dir denn dabei gedacht und warum funktioniert das überhaupt?" und so.

    Real Programmers don't need comments-- the code is obvious.

    Ist auch mein Problem.



  • großbuchstaben schrieb:

    nö - java interessiert mich nicht.

    Java ist nicht für ernsthafte Programmierer gemacht sondern für kleine Mädchen, die sogar eine einfache Ausgabe in eine exception packen müssen, weil sie sich selbst da nicht sicher sind, ob sie nicht Müll programmiert haben.

    Constance (, die alles Wort für Wort von mir abgeschrieben hat und dann noch heulend eine bessere Note verlangte) wäre so ein Beispiel. Selbst wenn ich "I want to f*ck you" geschrieben hätte, hätte sie es 1 zu 1 kopiert.
    Sah aber verdammt geil aus. 😉

    Java ist wie "Besser schon gleich im Wartesaal der Notaufnahme trinken", weil "es könnte ja was passieren"

    Nix für "real programmers". 😉



  • Warum wird dann Java auf fast allen Smartphones eingesetzt? Und warum so stark im Wissenschaftlichen-Bereich, oder in Hochschulen und dem Web(ebay etc)?

    Nicht falsch verstehen, aber hier wird sehr oft propergiert, dass man sich mit Java später den Fuß abschießt, weil man die ganzen Fehler, die C++ schon zu Anfang moniert, bis zum bitteren Ende mitschleppt. Was is da in der Praxis dran? Da müssten ja die ganzen App-Entwickler ständig auf die Nase fallen mit Java und dann doch lieber C++ mit dem NDK nehmen?

    Für was ist denn Java nun geeignet und für was C++?



  • CppLerner schrieb:

    Warum wird dann Java auf fast allen Smartphones eingesetzt? Und warum so stark im Wissenschaftlichen-Bereich, oder in Hochschulen und dem Web(ebay etc)?

    ebay benutzt Java? Wohl weil sie nur kleine Mädchen als Programmierer anwerben konnten. :p



  • CppLerner schrieb:

    Warum wird dann Java auf fast allen Smartphones eingesetzt?

    Weil "fast alle" Smartphones Android fahren?



  • Caligulaminus schrieb:

    CppLerner schrieb:

    Warum wird dann Java auf fast allen Smartphones eingesetzt?

    Weil "fast alle" Smartphones Android fahren?

    Ja und? Android kann man auch mit dem NDK komplett in C++ programmieren.



  • Der Grundvorteil von Java ist einfach die Verbreitung.

    Du findest leichter Leute die etwas in Java zum Laufen kriegen, als Leute die etwas in C++ zum laufen kriegen.

    Für ein lebendiges Smartphone ecosystem ist die Verbreitung und die Anzahl an Apps einfach wichtig.



  • CppLerner schrieb:

    Warum wird dann Java auf fast allen Smartphones eingesetzt?

    Java wird eigentlich nur auf Android eingesetzt. Android hat halt einen recht großen Marktanteil...

    CppLerner schrieb:

    Und warum so stark im Wissenschaftlichen-Bereich, oder in Hochschulen und dem Web(ebay etc)?

    Also ich arbeite im "Wissenschaftlichen Bereich" und bei uns verwendet niemand Java. Generell hält sich der Einsatz von Java auf unserer Uni auch in der Lehre glücklicherweise in Grenzen, anderswo ist das leider nicht so...

    CppLerner schrieb:

    Nicht falsch verstehen, aber hier wird sehr oft propergiert, dass man sich mit Java später den Fuß abschießt, weil man die ganzen Fehler, die C++ schon zu Anfang moniert, bis zum bitteren Ende mitschleppt. Was is da in der Praxis dran?

    Geht weniger um das Mitschleppen von Fehlern, sondern viel mehr darum, dass Java einem von vorn herein die Möglichkeit nimmt, einige ganz fundamentale Dinge zu lernen und damit zu einem nicht besonders tollen Programmierstil erzieht...

    CppLerner schrieb:

    Da müssten ja die ganzen App-Entwickler ständig auf die Nase fallen mit Java und dann doch lieber C++ mit dem NDK nehmen?

    Der "native Support" auf Android ist leider ein Witz. Zum Glück muss ich mich nicht damit herumschlagen. Wenn du Apps für mehrere Plattformen entwickeln willst, dann wirst du auf jeden Fall den Kern in C++ schreiben wollen, weil Java nicht portable ist...



  • Ich dachte immer das Entwickeln mit dem NDK wäre dem mit Java ebenbürdig. Naja egal, das ist eh ein weinig offtopic. Also ist C++ schwerer zu lernen, weil es einfach viel mehr Möglichkeiten bietet ein Programm zu formen und zu steuern.

    Wie sieht es mit der Entwicklungszeit aus, ist man mit C++ eher schneller, langsamer oder gleich schnell fertig als mit anderen Sprachen? Sprachkenntnisse der vielen Programmiersprachen natürlich vorrausgesetzt. Worauf ich hinhaus will, ist das Folgende. Wie sehr entscheiden Libs den Einsatz einer Sprache im Verhältnis zur Sprache selbst. Ist es klüger in Java, Python oder PHP ein Projekt abzuschließen, weil einfach einige Libs besser handhabbar sind als in C++? Wie relevant ist es für ein Projekt, ob ich auch genügend guten Mitarbeiter bekomme, die die Sprache gut können? Was nutzt mir die optimale Sprache für mein Projekt, wenn ich ewig nach qualifizierten Programmierern suchen muss? Machen denn Kosten für Arbeitszeit und Suche nach Mitarbeiter die Vorteile von C++ nicht wieder wett? Ich meine, es gibt Projekte da muss es aus Sicht der Performance schon C++ sein, aber was ist mit den ganzen Projekten wo es eben nicht auf das letzte bisschen Speed und Speicherplatzersparnis ankommt?

    Sorry, für soviele Fragen, mein Kopf ist voll davon und es tun sich immer neue auf.



  • Gute Frage!
    wenn jemand das hinreichend beantworten kann, kann er damit viel Geld verdienen.

    Leute von Microsoft, die für die Entwicklung des Visual Studios mit verantwortlich sind, haben mir mal gesagt, dass der Hauptgrund für den Einsatz von C++ letzlich Performance ist.
    Zumindest wird dieser Grund immer genannt! Performance ist immer ein Killerargument, womit man jede Diskussion schnell beenden kann. Bjarne Stroustrup soll mal sinngemäß gesagt haben, dass der Erfolg einer Sprache davon abhängt, wie viel Spaß der Programmierer damit hat. Das lässt sich als Argument an Projektleitung und Geldgeber aber schwerlich unterbringen!

    Ich glaube, dass Du genau dann viel in wenig Zeit schaffst, wenn Du eine auf Dein Problem passende Library zur Verfügung hast - unabhängig von der Sprache selbst. Das kann auch eine in C++ selbst entwickelte Domain-spezifische 'Sprache' sein - aber so etwas bauen können nur sehr wenige wirklich gut.



  • Ich empfehle den Struppi zum Lernen! 👍 😋



  • CppLerner schrieb:

    Warum ist C++ so schwer zu lernen?

    Aus dem gleichen Grund, warum es so schwer ist zu lernen, ein Formel-1-Auto zu fahren.
    Es ist etwas ganz besonderes für ganz besondere Anlässe, nämlich wenn man ganz besonders schnell fahren will/muss oder Spaß damit haben will. Es geht oft kaputt, erfordert häufig viel manuelle Wartung und wenn man aus Versehen mal falsch zuckt, hat mans aus schon vor die Wand gefahren. Für den Alltag von normalen Entwicklern, äh Autofahrern, ist es absolut unbrauchbar.


Anmelden zum Antworten