Wie ich sehe, ist das wohl nicht ganz so rübergekommen, wie es von mir gedacht war. Ich bin nicht der Meinung, dass ein Anfänger möglichst weit unten beginnen soll, genausowenig wie ich der Meinung bin, dass ein Anfänger möglichst weit oben beginnen soll. Das hängt sehr von der jeweiligen Person ab, ob man eher ein top-down oder ein bottom-up Typ ist. Hauptgrund, wieso ich im konkreten Fall hier zu C++ rate, ist in erster Linie einmal, dass der Fragesteller bereits mit C++ angefangen hat und ich einen Sprachwechsel absolut nicht indiziert sehe. Abgesehen davon, habe ich die Erfahrung gemacht, dass manche Sprachen, die ich persönlich zwar mag und oft sehr praktisch finde (beispielsweise Python und C#), sich nicht besonders gut als Lehrsprachen eigenen. Und der Grund dafür ist nicht, dass diese Sprachen den Anfänger nicht mit genügend technischen Details konfrontieren, C++ ist sehr viel komplizierter als nötig wäre und es wäre natürlich toll, wenn es eine bessere Alternative gäbe. Möglicherweise wäre z.B. D eine solche Alternative, dazu gibt es aber weniger Material und ich hab damit keine direkte Erfahrung. Man beachte: Ich habe nicht gesagt, dass man in Java nicht ordentlich programmieren kann, oder gar dass Java Programmierer nicht programmieren könnten, sondern dass man mit Java nicht ordentlich Programmieren
lernen kann, bzw. dass die Sprache sich zumindest imo nicht besonders gut dafür eignet. Und Java war dabei nur ein Beispiel, es ging mir hier eigentlich überhaupt nicht um Java, sondern um etwas ganz Allgemeines, Prinzipielles.
Insbesondere Sprachen mit Garbage Collection wurden
bewusst so designed, dass konzeptionell wesentliche Dinge vor dem Programmierer versteckt ablaufen. Jemandem, dem es ausschließlich darum geht, möglichst schnell eine gewisse Anwendung zu realisieren, würde ich selbstverständlich zu Java, C# etc. raten, sofern diese für die jeweilige Aufgabe geeignet wären. Jemandem, der richtig Programmieren lernen will, kann ich nach bestem Wissen und Gewissen eine solche Sprache aber nicht empfehlen. Ich habe selbst nicht mit C++ angefangen, sondern mit VB. Und ich weiß, dass ich heute noch auf dem Stand von vor 10 Jahren stehen würde, wenn ich bei VB geblieben wäre. Und dabei geht es mir nicht um die technischen Hintergründe, sondern um Einsichten völlig abstrakter, theoretischer Natur. Eine Sprache, in der es nur Referenztypen gibt, wird dich niemals dazu zwingen, dich mit dem fundamentalen Unterschied zwischen Wertsemantik und Referenzsemantik zu beschäftigen. Eine Sprache, die kein klares Konzept von Scope aufweißt, wird dich nicht zu einer klaren Denk- und Ausdrucksweise erziehen. Eine Sprache, die Dinge wie Speicherverwaltung vor dir versteckt, wird dich niemals die im Design essentielle Bedeutung von Besitzverhältnissen erkennen lassen. Ein dynamisches Typsystem, macht es schwer, überhaupt den Sinn von Typen zu begreifen...
Daher bin ich mittlerweile immer mehr zu der Ansicht gelangt, dass Sprachen wie Java, C#, Python etc. wunderbare Werkzeuge für erfahrene Programmierer sind, die sich bewusst für eine Sprache entscheiden, weil sie deren Vor- und Nachteilen kennen und gegeneinander abwägen können; jemanden, der die Dinge bereits von außen betrachtet. Ich kann z.B. mit Python einfach, elegant und extrem schnell Skripte für komplexe Aufgaben maßfertigen. Auch wenn mir manche Dinge an Python nicht gefallen, so ist es dennoch in vielen Fällen die Sprache meiner Wahl. Gleiches gilt selbstverständlich für C++, C# usw. So dachte ich einige Zeit, Python wäre wohl die ideale Sprache, um jemandem Programmieren beizubringen. Bis ich es dann tatsächlich mal ausprobiert hab. Ich war selbst erstaunt, was ich fand, im Nachhinein scheint es mir aber sonnenklar. Ich hab selten jemanden gesehen, der sich bei seinen ersten Schritten bereits so geschickt angestellt hat. Dennoch hatte die betreffende Person an einem gewissen Punkt plötzlich irgendwie Probleme mit der Verwendung von Variablen und dem Konzept von Funktionsparametern (wieso verwenden wir das x da drinnen und dann da draußen nochmal? wieso ist das x hier auf einmal etwas anderes als dort?). Der extrem entspannte Umgang mit Gültigkeitsbereichen in Python war mir bis dahin selbst noch nichtmal wirklich bewusst aufgefallen, wurde ihm nun aber zum Verhängnis, da er zwar bereits richtig dachte, es aber keinen Weg gab, seine Gedanken in Python auszudrücken, das von ihm beobachtete Verhalten ihm völlig willkürlich erschien und er nur noch verwirrt im Nebel stochern konnte. Dann wollte ich benutzerdefinierte Typen erklären und musste feststellen, dass es in Python aufgrund des dynamischen Typsystems praktisch unmöglich ist, selbst eine simple Struktur für Punktkoordinaten in einer Art und Weise aufzuschreiben, die das Konzept eines Typs vermitteln würde (wofür brauchen wir so einen "Typ", wenn wir einfach jedem beliebigen Objekt ein .x und ein .y geben können?).
Für einen erfahrenen Programmierer ist es kein Problem, wenn gewisse Dinge nirgendwo explizit ausgedrückt sind, denn er geht bereits von vornherein mit einer gewissen Denkweise an die Sache heran; er sieht immer auch das, was nicht dort steht, denn in seinem Kopf existiert das ganze Gebilde. Ein erfahrener Programmierer wird sich von verschwommenen Scopes nicht verwirren lassen und auch ein dynamisches Typsystem zu seinem Vorteil zu nutzen verstehen. Ein erfahrener Programmierer wird auch in einer Sprache mit Garbage Collection ein klares Design verfolgen, denn er weiß genau, wie es um die Beziehungen zwischen seinen Objekten steht. Aber was für einen erfahrenen Programmierer unter Umständen produktivitätssteigernd sein mag, ist für einen unerfahrenen Programmierer, der die Dinge noch von innen betrachtet und sich erst seinen Weg nach draußen bahnen muss, meiner Erfahrung nach nicht unbedingt hilfreich. Ein erfahrener Programmierer kann sich in einer Sprache mit weniger strenger Struktur evtl. freier bewegen, ungezwungener Ausdrücken; man könnte Sprachen wie Python als eine Art Umgangssprache für Programmierer verstehen. Aber jemand, der erst Programmieren lernen muss, braucht eine gewisse Struktur um sich überhaupt erstmal zu orientieren. Eine Sprache, die gewisse Konzepte nicht explizit macht, ist für jemanden, der dennoch in diesen Konzepten zu denken vermag möglicherweise eine Entlastung, aber keine Hilfe für jemanden, der diese Konzepte erst erkennen muss.
Vergessen wir einfach mal C++ bzw. überhaupt irgendeine konkrete Programmiersprache. Es geht mir hier nicht darum, alle von C++ zu überzeugen oder gegen Java zu wettern (das tu ich zugegebenermaßen auch gern, aber ich versuche in der Regel, das auf Diskussionen zu beschränken, in denen es nicht ganz daneben ist
). Ich bin eigentlich immer bemüht, objektiv zu sein und ich hoff, ich hab nun auch auf rein rationaler Ebene nachvollziehbar begründet, wieso genau ich denke, was ich denke. Früher dachte ich anders und in nicht allzu ferner Zukunft werd ich hoffentlich wieder anders denken, denn alles Andere würde bedeuten, dass ich mich nicht weiterentwickelt hab
. Wenn ich hier und jetzt, basierend auf all meinen bisherigen Erfahrungen meine ideale Anfängersprache charakterisieren müsste, dann wohl folgendermaßen:
- Statisch starkes Typsystem
- Feingranulares Scoping mit lexikalischer Bindung
- Benutzerdefinierte Typen mit Wertsemantik und Referenzsemantik
- Deterministische Lebensdauer von Objekten
Leider kenn ich nur drei einigermaßen populäre, imperative Sprachen, die alle diese Punkte erfüllen: C, C++ und D. Nachdem ich längere Zeit darüber nachgedacht hatte, bin ich genau auf diesem Weg zu dem Schluss gekommen, dass ich oben erwähnter Person nun C++ zeigen werde. Wie das ausgehen wird, weiß ich noch nicht, aber meine Erwartungen sind positiv...