Warum ist C++ so schwer zu lernen?
-
Es gibt da ein Missverständnis was C++ als Sprache angeht.
Nehmen wir mal als Konkurrenten Java. Ich kenne beide Sprachen aus der täglichen Praxis seit mind. 15 Jahren. Kann also gut vergleichen, was die Lernkurve angeht.
Wenn ich Java nehme, und nur den Sprachkern betrachte, ist dieser viel weniger Umfangreich. Man hat tatsächlich ggü. dem C++-Sprachkern viel weniger zu lernen.
Jetzt kommt aber Haken von Java und anderen einfacheren Sprachen: für größere Projekte kommt man mit dem Sprachkern nicht aus. Um ein größeres Projekt zu stemmen und wartbar zu halten, muss ich das, was mir C++ im Sprachumfang anbietet, in Java & Co. durch zusätzliche Frameworks, Tools und sogar VM-Erweiterungen kompensieren.
Ein sehr gutes Beispiel ist OSGi. Wir benutzen OSGi und die Eclipse RCP (nicht die IDE) um das nachzuholen, was ich mit C++ und den Betriebssystem-Funktionen (z.B. COM und ActiveX) direkt im Zugriff habe. Dabei macht OSGi genau das was COM/ActiveX macht, in dem es die JavaVM im Kern verändert! Weil wir mit der Standard-JVM einfach nicht die Möglichkeiten haben, die uns C++ mit seiner Möglichkeit der nativen OS-Features ermöglicht.
Und jeder der bei uns im Projekt mitarbeitet, darf erstmal sich in OSGi und Eclipse RCP einarbeiten.
Dann gibt es so nette Sachen wie Annotationen in Java. Das haben wir doch auch in C+++ mit Metaprogrammierung und Makros?
In OSGi die Package-Exports in den Bundels? Da haben wir in C++ die Header-Dateien.
In OSGi die Friend-Bundles? Da haben wir in C++ das friend-Schlüsselwort.
Das Problem bei C++ ist, das irgendwie alles als Grundlage gilt, was in anderen Sprachen erst mit Projektanforderung zu erlernen ist. In Java-Einsteigerbüchern gibt es kein Springframework, kein OSGi usw. Aber jeder der als Java-Entwickler in die Unternehmens-Projekte einsteigt, wird sich die Java EE Edition antun müssen. Und dann wird er merken, das da echt ein Brocken auf einen zu kommt.
OK, es gibt auch in C++ echt noch so Legacy-"Features" auf die man heute echt verzichten könnte. Z.B. wird heute immer noch in den Büchern mit Pointern und new[] delete[] um sich geworfen, obwohl man erstmal mit std::vector anfangen könnte. Kein C++-Einsteiger muss wissen, wie man einen eigenen Container programmiert! Das Erfolgsgefühl wird dadurch unnötig hinaus gezögert. Und das ohne Grund!
Das Argument, man muss ja wissen, wie etwas funktioniert, ist für einen Anfänger einer OOP-Sprache völlig irrelevant! Gerade bei OOP zählt: wenn ich nicht weiß wie dahinter genau etwas funktioniert, dann ist es OO sprich Kapselung.
Und kein Anfänger hat am Anfang die Sorge, ob sein Programm skaliert oder eine Millisekunde schneller läuft, als Variante 2.
Aber das ist den C++ Büchern und Ideologen geschuldet, die sich nicht in einen Einsteiger einfühlen können.
@CppLerner! Wenn du etwas in C++ nicht verstehst, vor allem die Lowlevel-Sachen, dann mach in deine Buch weiter. meistens kommt der Aha-Effekt später! Und kaufe dir das Buch "Effektiv C++ Programmieren" und danach "Der pragmatische Programmierer".
„Die C++ Programmiersprache“ von Bjarne ist NICHT zu empfehlen. Es ist genau das was es nicht soll: den Einsteiger mit Low-Level verwirren! Das sagt Bjarne selbst, deshalb hat Bjarne ein anderes neues Buch geschrieben.Es gibt keinen Grund nicht effektiv und nicht pragmatisch zu handeln. Nur so kommt man weiter. Ein paar C++ler in diesem Forum sind Ideologen, und das ist unprofessionell. Die sind nicht besser wie die schlechten C++-Buchautoren.
-
Meine Buchempfehlungen:
Einsteiger (nur eines davon):
- Der C++-Programmierer: C++ lernen - professionell anwenden - Lösungen nutzen von Ulrich Breymann
- C++ Primer - Schneller und effizienter Programmieren lernen von Stanley B. Lippman und Josée Lajoie
Das sind die zwei einzigen deutschen Bücher die ich empfehlen kann, da sie beim Einstieg nicht zu sehr mit Low-Level nerven.
Weiterführend in der Reihenfolge:
- Effektiv C++ Programmieren von Scott Meyers
- Der Pragmatische Programmierer von David Thomas und Andrew Hunt
Letzteres Buch ist nicht speziell für C++, aber für jeden Programierer gedacht. Da werden einem mal die Augen geöffnet, wie man wirklich mit Projekte weiter kommen kann.
-
Programmieren ist eben schwer und als Folge davon ist Programmieren lernen halt auch schwer...
-
Artchi schrieb:
Es gibt da ein Missverständnis was C++ als Sprache angeht...
Sehr gut
-
@Artchi:
Danke für die sehr ausfürhliche Darstellung von C++ und wie man C++ NICHT lehren sollte. Genau mit dieser didaktische Grundregel, vom Einfachen zum Komplizierten, würde das C++ Lernen viel besser klappen. Wenn ich hier Lösungvorschläge von Profis, für ganz einfach Probleme, sehe, dann fällt mir die Kinnlade runter. Da werden Streams umgeschrieben und mit Templates um sich geworfen und alles auf Execption- und Threadsicherheit hin optimiert und geprüft. Dabei hätte eine Lösung, die etws langsamer und länger wäre, dem Fragesteller mit Sicherheit tausendmal mehr gebracht. Da kommt es einem so vor, als müssten die Lösungsgeber sich selbst mir ihrem Wissen künstlich aufplustern, indem sie jeden Kniff, den sie kennen, in die Antwort mit rein pressen, damit man nicht mehr gegen Mekka betetet, sondern in seine Richtung.@dot:
Das Programmieren an sich habe ich durch zehn Jahre Berufserfahrung eigentlich soweit im Griff. Ich bin dann aber ausgestiegen, denn ich wollte nicht immer an dem Misserfolg von Deadlines schuld sein. Ich konnte bis zum Schluss den Aufwand eines Projektes nicht wirklich abschätzen, da oft immer was Neues dabei war, was ich erst lernen musste. Der Dumme war letztendlich immer ich, dabei habe ich mir den Arsch aufgerissen. In meinen jetzigen Job wird mein Wissen geschätzt und keiner sagt mir dass dieses Problem doch schnell mal runterprogrammiert sein müsste.
-
Artchi schießt da ein wenig übers Ziel hinaus. Türlich kann man in einem Einsteigerbuch Container implementieren (vollkommen ohne Konflikt mit CppLerners "Vom Einfachen zum Schwierigen"). Und es gibt schätzungsweise zwei- bis dreimal so viele gute Einsteigerbücher, wie er meint.
-
Ich weiß nicht wie es dem TE geht, aber wenn es noch bessere Bücher gibt würde es mich auch recht interessieren, welche das denn wären, damit ich auch die richtige Wahl treffen kann.
-
CppLerner schrieb:
Da kommt es einem so vor, als müssten die Lösungsgeber sich selbst mir ihrem Wissen künstlich aufplustern, indem sie jeden Kniff, den sie kennen, in die Antwort mit rein pressen
Ja, manche machen einen auf dicke Hose. Von wegen "Kuck mal, was ich alles draufhab".
Gewöhnt man sich dran und denkt sich nur noch "Ach du wieder mit deiner Profilneurose".
Manchmal lenken die einen von einer einfachen, vernünftigen Lösung nur ab.
Das ist sicher manchmal ein Problem.EDIT:
Ich muß zugeben, daß ich auch manchmal thread-hijacking betreibe, aber immer nur wenn ich den Eindruck habe, "alles ist schon gesagt" oder "dem ist sowieso nicht zu helfen".
-
Dann gibt es also unter den Programmierern auch die BWM- und Mercedesfahrer, wie in jeder anderen Branche auch, nur dass hier das Wissen die Schwanzverlängerung ist. Ich dachte immer, bei halbwegs intelligenten Menschen ist das nicht so stark ausgeprägt, sie sind aber auch nicht anders als der Rest, was ja auch logisch ist.
-
CppLerner schrieb:
Dann gibt es also unter den Programmierern auch die BWM- und Mercedesfahrer, wie in jeder anderen Branche auch, nur dass hier das Wissen die Schwanzverlängerung ist. Ich dachte immer, bei halbwegs intelligenten Menschen ist das nicht so stark ausgeprägt, sie sind aber auch nicht anders als der Rest, was ja auch logisch ist.
LOL. Ja, die Porschefahrer mit viel PS und wenig ... findest du auch hier. Wie überall in der Welt.
EDIT:
Ich hab auch schon mehrfach einen auf den Deckel gekriegt, weil ich wüst C und C++ mische (Sakrileg!).Damit kann ich leben.
Schön ist es aber nicht (das Mischen :p)
-
EOP schrieb:
Ja, manche machen einen auf dicke Hose. Von wegen "Kuck mal, was ich alles draufhab".
Gewöhnt man sich dran und denkt sich nur noch "Ach du wieder mit deiner Profilneurose".
Manchmal lenken die einen von einer einfachen, vernünftigen Lösung nur ab.
Das ist sicher manchmal ein Problem.Das passiert, wie ich finde und ind en Fällend ann auch unterstütze, meistens, wenn ein unwilliger Anfänger ankommt mit "Ich muss hier mehrere Zahlen einlesen und die Summe berechnen. Bin Anfänger also macht mal!".
Und dann kommen immer wieder coole und interessante Lösungen, die zwar dem OP absolut nicht helfen (und auch nicht helfen sollen), aber immer wieder Lernstoff bieten. Z.B. Template Meta Magie.In threads wo der OP jedoch was Eigeninitiative zeigt kommt das eig nur extremst selten vor.
-
Skym0sh0 schrieb:
Das passiert, wie ich finde und ind en Fällend ann auch unterstütze, meistens, wenn ein unwilliger Anfänger ankommt mit "Ich muss hier mehrere Zahlen einlesen und die Summe berechnen. Bin Anfänger also macht mal!".
Und dann kommen immer wieder coole und interessante Lösungen, die zwar dem OP absolut nicht helfen (und auch nicht helfen sollen), aber immer wieder Lernstoff bieten. Z.B. Template Meta Magie.In threads wo der OP jedoch was Eigeninitiative zeigt kommt das eig nur extremst selten vor.
Ja, auf threads wie "HILFE!!! Muß bis übermorgen dringend meine Semesterarbeit fertig kriegen"
main() { }
"hab ich schon", antworte ich entweder gar nicht oder es gibt nen fiesen Kommentar.
-
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