Wie schwierig ist es, einen “Java School”-Programmierer in einen C- oder C++-Programmierer zu verwandeln? [closed]

Lesezeit: 10 Minuten

Benutzer-Avatar
Doug T.

Meine Firma, ein C++-Haus, ist immer auf der Suche nach neuen Absolventen. Aufgrund des Phänomens der Java-Schulen interviewen wir jedoch normalerweise starke Java-Programmierer mit vielleicht ein paar Brocken C++. Oft bereitet der C++-Unterricht die Schüler nicht wirklich auf die Arbeit mit C++ vor. Trotzdem sind es oft aufgeweckte Kinder, die lernbegierig sind und ihr Bestes geben.

Bei jedem Vorstellungsgespräch kämpfe ich mit dieser grundlegenden Frage:

Wie schwer ist es, einen “Java School”-Programmierer in einen C- oder C++-Programmierer zu verwandeln? Hat Ihr Unternehmen Erfahrung damit, aus dem stereotypen „Java Schools“-Programmierer einen starken C++-Programmierer zu machen? Lohnt sich der Aufwand?

Einer der Gründe, warum ich damit zu kämpfen habe, liegt nicht nur an einem Sprachunterschied zwischen C oder C++ und Java, es sind die grundlegenden Fähigkeiten, die mit dem Erlernen von C oder C++ einhergehen, die meiner Meinung nach in der Java School oft verloren gehen. Dazu gehören Datenstrukturen, Rechenkomplexität, manuelle Speicherverwaltung, wirklich alles, was Joel Spolsky sagt hier.

Soweit ich das beurteilen kann, verfügt ein Schüler oft über einige dieser grundlegenden Fähigkeiten (in der Lage, ein paar Fragen zu beantworten), aber ich habe immer noch einen großen Teil meines Verstandes, der äußerst skeptisch ist, wie gut jemand diese lernen kann Fähigkeiten, ohne sich in C oder C++ die Hände schmutzig zu machen. Vielleicht muss ich von diesem Klischee eines Besseren belehrt werden. Bin ich nur unfair?

Wie auch immer, was ist Ihre Erfahrung damit, den “Java School”-Programmierer in einen C- oder C++-Programmierer umzuwandeln?

  • Ich weiß nicht, an welchen Universitäten Sie Erfahrung mit Java hatten, aber meine spart definitiv nicht an Datenstrukturen oder algorithmischer Komplexität.

    – mmcdole

    30. Oktober 2008 um 18:12 Uhr

  • Ich bin sicher, sie alle nicht. Tatsächlich tun dies vielleicht die meisten nicht – aber genug knausern damit. Dies führt leider zu dem Klischee „Java School“, das auf einige Absolventen angewendet wird. Es ist nur schwieriger, diese Themen in C oder C++ zu vermeiden, um die Arbeit zu erledigen. Besonders wenn es in einigen Kursen gesagt wird – kein STL oder Boost.

    – Doug T.

    30. Oktober 2008 um 20:54 Uhr

  • Vielleicht muss man hinterfragen, warum Ihr Haus dann C++ ist. Sogar eingebettetes Zeug kann heutzutage Java ausführen.

    – Pyrolistisch

    31. Oktober 2008 um 0:18 Uhr

  • @Pyrolistical – auf die Gefahr hin, böse zu klingen (und glauben Sie mir, ich versuche nicht, böse zu sein), hat nicht jeder den Luxus, viel Legacy-Code in der Sprache du jour neu zu schreiben. Einige von uns stecken mit großen Investitionen in alte Codebasen fest.

    – Onorio Catenacci

    3. November 2008 um 0:56 Uhr

  • @Pyrolistical, Kann laufen? WAHR. Aber sollte laufen? Ich habe ein paar Freunde, die Videospielkonsolen programmieren und sich bei dem Gedanken, Java zu verwenden, im Grabe umdrehen würden, wenn sie tot wären.

    – Nosredna

    31. Mai 2009 um 0:53 Uhr

Nun, wenn sie Datenstrukturen und algorithmische Komplexität nicht verstehen, werden sie nicht sehr gut in der ernsthaften Java-Programmierung sein, also sehe ich nicht, dass die Sprache hier ein Problem darstellt.

Sie werden Zeiger nicht verstehen, aber gute C++-Programmierung verwendet Zeiger normalerweise nicht auf komplizierte Weise. (Es gibt Ausnahmen, aber da ich nicht weiß, was Ihr Unternehmen tut, kann ich nicht sagen, ob sie gelten würden.) Schließlich möchten Sie wahrscheinlich nicht, dass Ihre Entwickler ihre eigenen verknüpften Listen schreiben, anstatt std:: aufführen.

Sie werden die manuelle Speicherverwaltung nicht verstehen, aber das ist in C++ viel einfacher als früher. In modernem C++ ist die eigene Speicherverwaltung aufgrund des Potenzials von Ausnahmen schwieriger geworden, sodass Sie RAII mit so ziemlich allem üben möchten (mit auto_ptr, boost::shared_ptr, was auch immer).

Wenn ich Dinge leiten würde, würde ich sie einstellen, wenn sie gut aussehen. Ich wäre mir bewusst, dass es Probleme geben könnte (C++ ist schließlich eine anspruchsvollere Sprache als Java), und hätte eine Art Idee, wie man damit umgeht.

Es gibt keinen Grund, es zu vermeiden, Leute vom College einzustellen, nur weil sie nicht genau die Fähigkeiten haben, die Sie wollen. Die Klugen werden lernen, und Sie möchten wahrscheinlich nicht die einstellen, die nicht Klug sind.

  • Ich bin anderer Meinung, Zeiger sind für Datenstrukturen von grundlegender Bedeutung, und Referenzen sind für Kopierctoren erforderlich.

    – jkeys

    15. Juli 2009 um 19:54 Uhr

  • Auf welche Datenstrukturen sind Zeiger grundlegend? Die meisten Grundlagen sind in zeigerloser Form aus der Standardbibliothek oder Boost verfügbar. Referenzen sollten auch nicht zu schwer zu finden sein. Lassen Sie sie beginnen und bringen Sie sie dann in die Details auf niedrigerer Ebene.

    – David Thornley

    15. Juli 2009 um 20:10 Uhr

  • @Hooked: Zeiger sind nur erforderlich, wenn sie Java-Referenzen entsprechen, daher sollte ein Java-Hintergrund ausreichen.

    – David Rodríguez – Dribeas

    9. Dezember 2009 um 16:48 Uhr

  • @David Rodriguez: Was ist mit Zeigern auf Stack-Variablen? Das ist oft nützlich, wenn Sie Pass-by-Reference-Semantik wünschen. Dies kann nicht direkt in Java durchgeführt werden.

    – Jörgen Fogh

    3. August 2010 um 20:51 Uhr

  • @Jørgen Fogh: Wenn Sie Pass-by-Reference-Semantik wünschen, sollten Sie eher Referenzen als Zeiger verwenden, und das Konzept ist nicht schwer zu verstehen: Eine Referenz (c++, nicht Java) ist nur ein Alias ​​für eine andere Variable, sei es in der Stack oder dynamisch allokiert ist irrelevant.

    – David Rodríguez – Dribeas

    3. August 2010 um 22:05 Uhr

Programmierer programmieren. Jemand, der wirklich programmieren kann, kann jede Sprache lernen. Sicher, es gibt eine Lernkurve, aber ein guter Programmierer kann sich relativ schnell einarbeiten. Wenn Sie jemanden mit fortgeschrittenem Wissen erwarten, würden Sie sowieso nicht nach frischen Absolventen suchen, oder? Es wird also so oder so eine Lernkurve geben.

  • Ich bin mir nicht sicher, ob das bei C/C++ der Fall ist. Wenn der betreffende Programmierer nur „moderne“ Sprachen und nie Arbeit mit Assemblersprache gemacht hat, dann kann es für ihn oder sie wirklich schwierig sein, die Speicherverwaltung zu verstehen, egal wie gut sie in Java oder C# sind.

    – Jim in Texas

    30. Oktober 2008 um 22:43 Uhr

  • Ich bin mir auch nicht sicher, ob dies der Fall wäre, wenn Sie beispielsweise eine funktionale Sprache ausführen, wenn Sie nur Java oder C # ausgeführt haben. Ich denke, das Erlernen einer neuen Sprache ist trivial, wenn Sie etwas in derselben Sprachklasse ausgesetzt waren, aber ich denke nicht, dass es allgemein trivial ist, von einer zur anderen zu wechseln.

    – Doug T.

    31. Oktober 2008 um 13:31 Uhr

  • Dies übersieht den grundlegenden Unterschied in den Fähigkeiten zwischen C* und Java. Es ist sehr einfach, sich in Java hervorzuheben, ohne die entscheidenden Programmierkenntnisse zu erlernen, die für die meisten Arten kommerzieller Programmierung erforderlich sind. Der “Programmierer-Programm”-Ansatz hat zu einem massiven Zustrom von Programmierern geführt, die nicht versuchen, zu programmieren.

    – David Frenkel

    5. August 2010 um 23:01 Uhr

  • Und was noch schlimmer ist, Dave, ist, dass es den meisten egal ist, dass sie es nicht wissen. Ich werde mir einen schnelleren Prozessor besorgen. Du kämpfst, wie du trainierst.. du denkst nie an die kleinen Dinge und du wirst für die großen bezahlen.

    – bash05

    22. November 2011 um 12:02 Uhr

  • Oh .. Ich liebe das “moderne” btw .. und wie wäre es mit “managed”.. Ich habe mein Gedächtnis jahrelang verwaltet, vielen Dank.

    – bash05

    22. November 2011 um 12:02 Uhr

Rein aus der Perspektive eines C++-Programmierers würde ich denken, dass ein Java-Entwickler, der C++ lernen möchte, eine ziemlich steile Lernkurve durchlaufen muss. Ja, bis zu einem gewissen Grad ist die Entwicklung von Code in allen Sprachen ähnlich. Ich wurde einmal aufgefordert, Code in der Makrosprache von Excel (vor VBA) zu schreiben. Ich schaffte es, aber es war, als würde ich versuchen zu schreiben Krieg und Frieden mit einem Vokabular der fünften Klasse.

Es gibt andere Probleme mit C++ (Zeiger, Speicherverwaltung, Überladen von Operatoren), die meines Wissens in Java einfach nicht vorhanden sind und auch keine kleinen Probleme sind. Besonders wenn Sie nach jemandem suchen, der Ihnen mit altem C++-Code hilft, könnte dies große Hindernisse darstellen. Und ich denke, ich würde jede neue Einstellung zunächst mit zumindest einigen Wartungsarbeiten beginnen.

  • Upvote würdig allein für die Metapher 🙂

    – Schluckauf

    30. Oktober 2008 um 19:29 Uhr

Ich habe in vielen Sprachen programmiert und finde es sehr schwierig, C++ zu verstehen und darin produktiv zu sein, verglichen mit anderen Sprachen, die ich verwendet habe, wie Java, C, Python, Fortan, Javascript, ASP und Perl. Ich würde fast sagen, es ist eine eigene Kategorie. Ich glaube NICHT, dass die Kompetenz in einer der gerade aufgeführten Sprachen (einschließlich Java) ein guter Indikator dafür ist, wie gut ein C++-Programmierer eine Person sein könnte. Ich denke, C++ erfordert fast eine andere Art des Denkens und sicherlich die Fähigkeit, beim Codieren eine riesige Menge an Informationen im Kopf zu behalten, anstatt sich hauptsächlich auf die geschäftlichen Anforderungen zu konzentrieren.

Ich habe jahrelang versucht, C++ zu beherrschen, obwohl ich es nie bei der Arbeit verwenden musste (dh während ich in meiner Freizeit studierte). Es ist sehr hart und nach all dieser Zeit bin ich mir nicht sicher, ob ich als C++-Programmierer erfolgreich und produktiv sein würde. Ich denke, dass ich in diesen anderen Sprachen insgesamt einigermaßen kompetent bin.

Basierend auf meiner kleinen und eindeutig voreingenommenen Stichprobe einer Person (mich!) würde ich vorschlagen, sich an Entwickler zu wenden, die eine beträchtliche Menge an C++-Erfahrung in der Vergangenheit demonstriert haben, wenn es das ist, was sie täglich bei der Arbeit tun werden. Sie müssen mehr Zeit damit verbringen, diese Kandidaten zu finden, aber Sie werden langfristig bessere Erfolgschancen haben, denke ich.

Meine Faustregel lautet: Ich würde lieber einen C/C++-Programmierer dazu bringen, Java zu schreiben, als einen Java-Programmierer, der C/C++ schreibt. Ich kann nicht sagen, welche Java-Programmierer mit Speicherverwaltung und Zeigern umgehen können, bis sie es versuchen.

Wenn ich nur Java-Schulkinder zur Auswahl hätte, würde ich ihnen ein paar Horrorgeschichten über Assembly und C erzählen und dann versuchen, sie in drei Kategorien zu unterteilen.

  1. Furchtlos. Sie haben nicht aufgepasst.
  2. Ängstlich und panisch, weil sie wissen, dass sie mit dieser Art von Komplexität nicht umgehen können.
  3. Ängstlich und eifrig, weil sie verstehen, dass sogar Menschen, die klüger sind als sie, von seltsamen Speicher- und Hardwareproblemen in den Magen geschlagen werden können, aber verdammt, es klingt nach einer guten Herausforderung.

Ich würde ab Gruppe 3 einstellen.

Benutzer-Avatar
Larry OBrien

“Du kannst nicht groß lehren.” — ein berühmter Basketballtrainer.

Bei der Einstellung suchen Sie nach jemandem, der neue Konzepte schnell und schnell lernen kann verlernen Gewohnheiten. Letzteres kann sich an dich heranschleichen. Im Falle eines Java->C++-Übergangs können Sie mit dem „Verlernen“ von Dingen wie starker Abhängigkeit von der IDE, „Alles ist ein Objekt“, einem zu hohen mentalen Modell von Objekten und Programmen usw. konfrontiert werden.

Ich würde vorschlagen, dass Sie nach Dingen suchen, die Flexibilität suggerieren – lassen Sie sie ein kleines Programm sowohl in einer IDE als auch in einem Klartext-Editor schreiben, zeigen Sie ihnen eine einfache C++-Funktion, die einen Zeiger übergibt und den zugrunde liegenden Wert ändert, und sehen Sie, ob sie stolpern , etc.

Benutzer-Avatar
As

Als jemand, der in erster Linie ein “Java-Schooler” ist und noch dazu ein ziemlich frischer Absolvent, denke ich definitiv, dass es für mich möglich wäre, C oder C++ ohne allzu große Schmerzen zu lernen …

Allerdings will ich das wirklich nicht. Ich kann nur für mich sprechen, aber C kann eine ziemlich hässliche Sprache sein, wenn Sie mit Java aufgewachsen sind. Ich denke, Motivation wird das größere Hindernis sein. Motivation und vielleicht etwas Jammern darüber “in Java das ist soo viel einfacher, warum ist C Java?” 🙂

Wenn Sie jemanden mit der richtigen Motivation finden, wird der Rest gut funktionieren. 🙂

  • Motivation ist auf jeden Fall groß. Außerdem … niemand sonst im Team wird Sympathie haben, wenn der Neuling hereinkommt und über alles jammert, was C++ nicht kann, was seine “alte” Sprache getan hat (und praktischerweise alles ignoriert, was C++ besser kann als seine alte Sprache).

    – Tom

    31. Januar 2009 um 16:37 Uhr

1370010cookie-checkWie schwierig ist es, einen “Java School”-Programmierer in einen C- oder C++-Programmierer zu verwandeln? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy