Warum ist C++ so schwer zu lernen?
-
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
-
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++?