C++ Programmierer

Fragen zum Studium, zu IT-Beruf
Xeon
Beiträge: 169
Registriert: So Dez 17, 2017 4:10 pm

C++ programmierer

Beitrag von Xeon » Fr Nov 12, 2021 1:05 pm

Xin hat geschrieben:
Do Jun 04, 2020 11:22 am
Xeon hat geschrieben:
Mi Jun 03, 2020 3:15 pm
Was meinst du sollte ich vielleicht auch C++ lernen?
Könnte es für mich zum Vorteil sein wenn ich auch C++ lerne?
C++ wird nie von Nachteil sein. Wenn Du mit C++ umgehen kannst, wirst Du für manche Dinge vielleicht überqualifiziert sein. Du wirst aber vermutlich auch besser verstehen, was bei Java oder C# im Hintergrund passiert. Als Java-Entwickler habe ich ja auch weniger geschrieben, als verstanden, was andere geschrieben haben und warum das so nicht geht.
Ich weiß es ist schon länger her, aber ich frage trotzdem noch etwas: Könntest du ein Beispiel sagen für was man überqualifiziert sein würde?


Liebe Grüße
Von Artur

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C++ programmierer

Beitrag von Xin » Fr Nov 12, 2021 1:51 pm

Xeon hat geschrieben:
Fr Nov 12, 2021 1:05 pm
Xin hat geschrieben:
Do Jun 04, 2020 11:22 am
C++ wird nie von Nachteil sein. Wenn Du mit C++ umgehen kannst, wirst Du für manche Dinge vielleicht überqualifiziert sein. Du wirst aber vermutlich auch besser verstehen, was bei Java oder C# im Hintergrund passiert. Als Java-Entwickler habe ich ja auch weniger geschrieben, als verstanden, was andere geschrieben haben und warum das so nicht geht.
Ich weiß es ist schon länger her, aber ich frage trotzdem noch etwas: Könntest du ein Beispiel sagen für was man überqualifiziert sein würde?
Nun, mit überqualifiziert meine ich Fähigkeiten zu besitzen, die Du im Job einfach nicht brauchst, nicht ausnutzen kannst.

Mit C++ kann ich Software-Architekturen aufbauen, die in anderen Sprachen einfach nicht ausdrückbar sind. Das sind teils absolut triviale Dinge:

Code: Alles auswählen

Point2d punkt;

punkt.x = 1;
punkt.y = 2;
In C++ habe ich hier eine Instanz vom Typ "Point2d" definiert und x und y beschrieben.
In Java habe ich hier eine "Referenz" auf eine Instanz des Referenztyp "Point2d" programmiert. Die Instanz gibt es aber nicht, weswegen das Programm mit einer Null-Pointer-Exception abbricht.

Code: Alles auswählen

Point2d * punkt;

punkt->x = 1;
punkt->y = 2;
Das knallt auch in C++ - es ist schließlich identisch zu dem Java-Code dadrüber.

Ich kann in Java aber die C++-Bedeutung des ersten Beispiels in Java gar nicht formulieren. Ich kann Architekturen also ganz anders denken. Was ich nicht kann, ist sie in Java zu beschreiben. Oder C#. Oder PHP. Oder Python.
Das ist tatsächlich der elementare Unterschied zwischen C++ und den anderen Sprachen, denn dass sich Instanzen ohne "new" anlegen lassen, verändert die komplette Denke der Programmierung.
Diese Denke ist aber gar nicht mehr so üblich, denn die meisten Sprachen unterstützen das ja gar nicht. Nun gehören C und C++ zu den effizientesten Sprachen überhaupt. Irgendwas muss an dieser Denke also lernenswert sein.

Oder ich kann

Code: Alles auswählen

void printData( Data const & data ) {...}
in den meisten populären Sprachen nicht formulieren. Da sieht das so aus:

Code: Alles auswählen

void printData( Data data ) {...}
Das entspricht in C++

Code: Alles auswählen

void printData( Data * data ) {...}
Nicht nur, dass ich jetzt einen Pointer haben muss, also gar nicht sicher sein kann, dass ich Daten bekomme - auch das Const ist weg. Wenn ich Daten bekomme, darf ich die ändern.
Und das ist tatsächlich ein Fehler, den ich mal in einem Java-Programm gefunden habe, auch wenn die Funktion nicht printData hieß.

Code: Alles auswählen

void printData( Data data )
{
  data.modifyValue();
}
Der aufrufende ging davon aus, dass seine Daten kurz benutzt werden, aber er ging auch davon aus, dass er sie unverändert zurück bekommt. Das garantiert Dir aber in vielen populären Sprachen niemand. Also hat ein Entwickler da was geändert und durfte das auch, denn "data" konnte man ja nicht mit const schützen. Den Fehler hatte ich recht schnell gefunden, weil ich als C++-Entwickler mit dachte, dass ich eine solche Funktion mit const schützen würde. Das geht in Java nicht, also macht sich der Java-Entwickler dazu keinen Kopf, verändert die Daten ohne zu berücksichtigen, dass anderswo jemand davon ausgeht, dass die Daten bei dem Funktionsaufruf unverändert bleiben. Anschließend muss man also jeden Funktionsaufruf suchen und sich überlegen, ob hier die Daten implizit verändert werden sollen oder nicht.

Als ich C und C++ lernte, lernte ich die Lösung für ein Problem, was ich damals noch nicht kannte. Ein Problem, was in Übungsprogrammen eher nicht vorkommt. Als Java-Entwickler lernst Du weder die Lösung für das Problem - weil man sie nicht ausdrücken kann - noch lernst Du das Problem kennen. Und um Java zu können, musst Du das Problem auch nicht kennen, weil Java ja keine Lösung dazu anbietet.
Ohne Java-Erfahrung habe ich Code von Leuten debuggt, die in Java ausgebildet waren, die sich über sowas aber keinen Kopf machten.

Das Wissen ist also auch in Java hilfreich, aber Du kannst es nicht in die Architektur einbringen, damit die Sprache es überprüft, sondern im Kopf behalten musst, welche Methode etwas verändern darf und welche nicht. Und Du weißt, dass es eben nicht egal ist. Und gelernt habe ich das nicht, weil ich tatsächlich das Problem hatte, sondern weil C++ mir die Lösung präsentierte und mir auffiel, da könnte ein Problem sein.
Und als ich meine Software mit Const-Correctness erweiterte, fielen beiläufig zwei Bugs auf, wo das Programm falsch lief, was aber noch niemandem aufgefallen ist. Mir war erst durch die Anwendung der Problemlösung bewusst geworden, dass ich das Problem tatsächlich hatte. Hätte ich nicht C++ gelernt, hätte ich weder die Bugs bemerkt, noch wäre mir bewusst geworden, dass ich da fehlerhaft programmiert habe. Heute weiß ich besser, worauf ich zu achten habe und bin damit qualifizierter darin, solche Bugs zu finden als ein Java-Entwickler.
Es wird Dich kaum jemand bei einem Jobinterview abfragen. Aber zugebenermaßen habe ich als Java-Entwickler ohne Erfahrung in Java, aber mit C++ im Hintergrund mehr Geld verlangt und bekommen als ein ausgebildeter Java-Entwickler mit Java-Erfahrung. Das sagte man mir im Jobinterview... ein Java-Entwickler sei billiger als meine Forderung. Bezahlt hat man meine Forderung trotzdem und hätte ich gewusst, dass ich dann deren Code debuggen muss, hätte ich mehr verlangt. ;-)

C++ ist deutlich näher an der Maschine und so kommt man ganz selbstverständlich mit mehr Dingen in Kontakt. Viele Probleme erschließen sich mir dadurch, dass ich mir überlege, wie ich das programmieren würde und auf welche Probleme ich stoßen würde. Weil ich nicht überlege, wie die Funktion im Framework dafür heißen kann, sondern wie die Maschine das Problem löst und welche Schwierigkeiten dabei auftreten könnten. Ich kann also auch Code in Frage stellen, den ich gar nicht sehe, aber abschätzen kann, was er tun müsste, damit passiert, was ich da sehe.

Wenn Du weißt, wie eine Maschine funktioniert, dann weißt Du auch, wenn Dinge anders funktionieren, dass da ein Bug vorliegt. Oder ein ungewünschtes Verhalten. So habe ich Bugs in SWI-Prolog oder .NET-Framework gefunden oder auch Ungereimtheiten in alten Java-Versionen, bei denen ich sagen kann, dass ich verstehe, warum Prolog, .NET und Java hier Mist bauen, statt zu sagen, ich verstehe nicht, warum hier Prolog, .NET und Java sich unerwartet verhalten, ist hier jemand das der das erklären kann, damit ich weiterarbeiten kann?

Man kann über die Grenzen vieler Sprachen hinwegdenken. Weil die meisten Sprachen eine Untermenge dessen sind, was C++ kann.
Und das überqualifiziert einen auch dann, wenn man von der benutzten Sprache eigentlich nicht viel Ahnung hat. Man weiß ja, wie es sein müsste, damit es funktioniert. Man muss es nun nur in den eingeschränkten Möglichkeiten formulieren, die einem die Sprache im Vergleich zu C++ bietet.

Nachteil dabei ist: Eine kleinere Sprache kann ich schneller lernen. An C++ lernt man ein Leben lang.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Xeon
Beiträge: 169
Registriert: So Dez 17, 2017 4:10 pm

C++ Embedded Programmierer

Beitrag von Xeon » Mo Nov 15, 2021 1:49 pm

Danke Xin, es ist interessant was du geschrieben hast. Ich habe vor einer Weile mit Java ein bisschen herumgespielt und war überrascht, dass es in Java keine Zeiger gibt.

Wie du weist habe ich bei deinem Tutorial C++ gelernt. Ich habe mir überlegt mit C++ Embedded Programmierung zu lernen, meinst du es ist eine Nummer zu groß für mich?


Liebe Grüße
Von Xeon

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C++ Programmierer

Beitrag von Xin » Mo Nov 15, 2021 3:09 pm

Alles ist zu groß, bevor man es gelernt hat.
Wenn ich sage, dass ich eine Programmiersprache schreibe, sagen mir viele, das das nicht möglich ist alleine.

Sie ist inzwischen etwa 20mal schneller als Python und hält mit Java mit.

Was daran liegt, dass Java alles mit Zeigen machen muss. Das ist ein Designfehler, der in C und C++ nicht gemacht wurde.
Und in meiner auch nicht.

Man braucht in Java sehr viel mehr Zeiger als in C++. Dass es keine Zeiger in Java gäbe ist vollkommener Unsinn, der sich nur verbreitet, weil das in der Java-Community ein Dogma ist. Das ist Religion unfäd hast nichts mit Vernunft zu tun.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten