Ich benutze viel Meta-Programmierung, um sich wiederholende Aufgaben zu vermeiden und sicherere Abstraktionen zu erstellen.
Ich bin kürzlich zu einem neuen Job gewechselt, bei dem ich in einem größeren Team arbeite, und das macht einigen meiner Kollegen Sorgen, weil sie es nicht verstehen.
Ich versuche immer, das volle Potenzial der Sprache auszuschöpfen, aber einige (nicht alle) meiner Kollegen sehen dies als Risiko an (einige begrüßen den Ansatz).
Ich bin damit einverstanden, dass es ein Problem ist, Code zu schreiben, den niemand im Team verstehen kann. Andererseits sind wir alle professionelle C ++ - Entwickler und ich denke, wir sollten einen höheren Standard anstreben als das Schreiben von C mit Klassen.
Meine Frage ist, wer hat Recht, was soll ich tun?
Klarstellung: Der Versuch, das volle Potenzial der Sprache auszuschöpfen, bedeutet nicht, dass ich bei jedem Problem mit TMP werfe. C ++ ist eine Toolbox und für mich bedeutet C ++, alle Tools aus der Box nutzen zu können und das richtige für einen bestimmten Job auszuwählen.
quelle
Antworten:
Die Metaprogrammierung ist in Ordnung. Was Sie versuchen zu tun, ist nicht in Ordnung.
Ich benutze die Metaprogrammierung die ganze Zeit in meinem Job. Es ist ein leistungsfähiges Tool, mit dem sich viele Dinge besser lesen und warten lassen. Es ist auch eine der schwieriger zu verstehenden Programmierstile, daher muss es sich wirklich seinen Unterhalt verdienen. Ich mag es, wenn ich 1000 Codezeilen auf 50 reduzieren kann, aber ich versuche, es als solches zu begrenzen.
Das Problem ist nicht die Metaprogrammierung, sondern Folgendes:
Hier geraten Sie in Schwierigkeiten. Sie haben eine Meinung. Es ist in Ordnung, eine Meinung zu haben, dass Metaprogrammierung gut ist. Es ist in Ordnung, eine Meinung zu haben, dass wir alle danach streben sollten, bessere C ++ - Entwickler zu sein.
Es ist nicht in Ordnung, sowohl Ihre Kollegen als auch zukünftige Mitarbeiter dazu zu zwingen , den von Ihnen geschriebenen Code beizubehalten, um Ihrer Meinung zuzustimmen. Das ist die Aufgabe Ihres Chefs. Ihr Chef ist derjenige, der sich darum kümmern sollte, dass Ihr Code auf lange Sicht gewartet werden kann. Sie haben (hoffentlich) viel mehr Erfahrung im Geschäftsleben, denn glauben Sie mir, wenn ich sage, dass es sich um eine Geschäftsentscheidung handelt, nicht um eine ideologische Entscheidung.
Es ist in Ordnung, ein Metaprogramm zu wollen. Es ist in Ordnung, anderen das Metaprogramm beibringen zu wollen. Aber verstehe, dass es auch für andere in Ordnung ist, das Metaprogramm nicht zu lernen, und das wird wahr sein, bis du in einer Machtposition bist. (Und als Industriegeheimnis: Wenn Sie schließlich ein leitender Entwickler sind, haben Sie in einer Machtposition überhaupt keine Machtposition. Es gibt jemanden, der die Verfolgung kontrolliert, der an der Macht ist.)
Wenn Sie sie dazu ermutigen möchten, mit der Metaprogrammierung einverstanden zu sein, fangen Sie klein an . Beginnen Sie mit einer einzigen
enable_if
, die das Lesen der API erleichtert. Dann kommentiere das Tageslicht aus. Dann finden Sie vielleicht einen Fall, in dem eine Template-Metafunktion 10 große repetitive Klassen mit 10 kleinen Helfern in eine Klasse verwandelt. Kommentar zum Teufel raus. Rückmeldung bekommen. Finde heraus, was die Leute darüber denken. Sei in Ordnung, wenn sie dir sagen, dass du es nicht tun sollst. Finden Sie eine Nische, in der die Metaprogrammierung so gut funktioniert, dass alle Kollegen (widerwillig) zustimmen, dass sie das richtige Werkzeug für den Job ist.Als Kurzgeschichte habe ich einmal eine wunderschöne Bibliothek mit umfangreichen Metaprogrammierungen geschrieben. Es hat genau das getan , was wir damals brauchten, als kein anderer Ansatz aus der Ferne in die Nähe kommen konnte. Es änderte tatsächlich die Richtung der Anwendung, in der ich schrieb. Aber es war eine Metaprogrammierung. Nur ein oder zwei andere Leute in meiner gesamten Firma konnten es lesen.
Später ging mein Kollege noch einmal auf das Problem ein. Anstatt Metaprogrammierung zu nutzen, um genau das zu tun, was benötigt wurde, arbeitete er mit der Führung zusammen, um die Einschränkungen zu lockern, die dem Problem auferlegt worden waren, sodass Metaprogrammierung nicht erforderlich war. Genauer gesagt war eine Metaprogrammierung weniger erforderlich. Er konnte es auf das beschränken, was Metaprogrammierung am besten kann.
Die resultierende Bibliothek kann nun in einem bemerkenswert breiten Markt eingesetzt werden, und das ist sicherlich nicht zuletzt deshalb so, weil der neue Code von einer viel größeren Bandbreite von Entwicklern gepflegt werden kann. Ich bin stolz darauf, mit der Metaprogrammierung den Weg zu ebnen, aber es ist der Code meines Kollegen, der das breite Publikum erreichen wird, und dafür gibt es gute Gründe.
quelle
In erster Linie ist dies das Problem des Teams, und Sie müssen es mit dem Team lösen. Wenn Sie eine Sicherungskopie des Teams zur Programmierung mit bestimmten Elementen und Konstrukten haben, führen Sie diese aus. Wenn nicht, besprechen Sie es mit ihnen, und wenn Sie sie nicht überzeugen können und überzeugen, warum "Ihr Ansatz" eindeutig besser ist, sollten Sie ihn nicht anwenden.
Beachten Sie, dass die Verwendung der Template-Metaprogrammierung in C ++ immer ein Kompromiss ist: Sicher, es kann manchmal hilfreich sein, bestimmte Teile einer Anwendung trockener zu gestalten, und es ist definitiv hilfreich, um hocheffiziente und wiederverwendbare Bibliotheken zu erstellen.
Auf der anderen Seite sind diese Vorteile mit einem gewissen Preis verbunden: Der Code wird abstrakter, oft viel schwieriger zu lesen, viel schwieriger zu debuggen und viel schwieriger zu warten. Dies macht den Nutzen der Metaprogrammierung bei der Anwendungsprogrammierung oft fraglich. Unter der Annahme, dass Sie nicht die nächste STL erstellen werden, sollten Sie sich jedes Mal, wenn Sie versucht sind, Metaprogramme zu verwenden, fragen, ob sich diese Nachteile wirklich lohnen. Wenn Sie sich nicht sicher sind, besprechen Sie dies mit Ihrem Peer Reviewer während der Codeüberprüfung.
quelle
Meine allgemeine Meinung: Wenn Sie wie so oft die Wahl haben zwischen den folgenden drei Optionen:
dann ist die Metaprogrammierung von Vorlagen, wenn sie ordnungsgemäß durchgeführt wird, wahrscheinlich die lesbarste und am besten wartbare der drei Optionen. Dies ist das Argument, das ich dem Team vorbringen würde, wenn ich in Ihrer Position wäre. Beispiele mit tatsächlichem Code würden helfen, sie zu überzeugen.
Wenn Sie Template Meta-Programming ( TMP ) verwenden, um Wiederholungen zu vermeiden, sollten Sie damit gut dokumentierte, sorgfältig getestete Abstraktionen erstellen, die die Komplexität im TMP-Code lokalisieren und das Schreiben des richtigen Client-Codes vereinfachen. Dies ist das Design der C ++ - Standardbibliothek.
Ich glaube nicht, dass wir beurteilen können, wer richtig oder falsch ist, ohne ein Beispiel für die Art von Code zu sehen, die Sie zu schreiben versuchen.
quelle
Softwareentwickler sollten danach streben, Code zu schreiben, der funktioniert, der offensichtlich funktioniert, der getestet werden kann, der überprüft werden kann, der debuggt werden kann und der angepasst werden kann, wenn Änderungen erforderlich sind. Wenn das Schreiben von "C mit Klassen" dies erreicht, ist es in Ordnung.
Und das sind die Standards, an denen Sie Ihren Code messen sollten. Insbesondere: Funktioniert es offensichtlich, kann es getestet, überprüft, debuggt und bei Bedarf angepasst werden?
quelle
Ein Argument aus Mitgefühl:
Gibt Ihnen Ihr Job Zeit zum Lernen oder können Sie Ihre Vorgesetzten alternativ dazu überreden, einige Stunden für das Erlernen dieser Sprachfunktionen aufzuwenden?
Wenn nicht, bedeutet dies im Wesentlichen, dass sie zusätzliche unbezahlte Arbeit erhalten. Sie mögen denken, dass ein C ++ Programmierer sollten die ganze Sprache kennen, oder so etwas, aber ein akademischer Punkt entlastet nicht die Last , die Sie auf sie auferlegen werden. Ihre Kollegen haben Kinder, kranke Eltern, kranke Ehepartner - oder die Hölle, nur ein vernünftiges soziales Leben, in dem es nicht darum geht, C ++ zu lernen. Der lautstärkere Gegner Ihres Vorschlags ist möglicherweise faul - oder er macht eine harte Zeit durch und braucht im Moment keinen zusätzlichen Scheiß in seinem Leben.
quelle
Code sollte zuerst für den Menschen zum Lesen geschrieben werden und nur im Übrigen für den Compiler zum Parsen.
Das Wichtigste an nicht trivialem TMP ist, dass Sie die Anzahl der Personen einschränken, die diesen Code lesen können. Dies kann ein gültiger Kompromiss sein kleines spezialistenteam dann ist es in einer größeren anwendung.
Wenn Sie alle Tricks aus dem Buch herausholen, erlegen Sie allen anderen Kosten auf, indem sie jetzt die Sprache einschließlich aller von Ihnen ausgenutzten Fälle von Anwaltskanzleien verstehen müssen auf nützliche Weise an der Anwendung zu arbeiten, das lohnt sich vielleicht, aber achten Sie auf die Kosten ...
Für mich ist ein bisschen mehr Tippen, vielleicht sogar ein bisschen Code-Duplizieren, aber das ich es vor Mr "C mit Klassen plus AWL" stellen kann, wenn es modifiziert werden muss, viel nützlicher als einige unglaublich elegante TMP-Dinge, die nur ich beibehalten kann (Und wird daher für immer erhalten bleiben). Denken Sie auch daran, dass der C mit Klassen-Typ der Fachexperte sein könnte und dass Fachwissen in der Regel viel wertvoller ist, als ein Sprachjurist zu sein.
Ich vergesse, wer es gesagt hat, aber "Jeder weiß, dass das Debuggen schwieriger ist, als es zu schreiben. Wenn Sie es also so geschickt wie möglich programmieren, wie werden Sie es dann jemals debuggen?"
Auch wenn ich dort wirklich modernes C ++ schreiben kann, ziehe ich es normalerweise vor, es nicht zu tun, bedeutet dies, dass ich weniger Wartungsprogrammierung durchführen muss.
quelle
Nein solltest du nicht. Sie sind damit beschäftigt, Code zu erstellen, der einer Spezifikation entspricht. Dieser Code muss pflegbar sein, keine Ego-Reise. Sie könnten morgen von einem Bus überfahren werden, daher muss jemand in der Lage sein, Ihren Code abzurufen und die anstehende Aufgabe zu erledigen. Es ist jedoch von Vorteil, Ihre Arbeitgeber davon zu überzeugen, neue Techniken in ihre Programmierstandards aufzunehmen.
quelle
Die einzige Möglichkeit, diese Frage im Kontext zu beantworten, besteht darin, die spezifischen Probleme und die Art und Weise zu betrachten, wie Sie sie mit Metaprogrammierung gelöst haben. Wenn Sie hier keine Postleitzahl eingeben, können wir nicht wissen, ob Sie sich einer unnötigen Komplikation hingegeben haben, die Ihnen allein Spaß macht, ein nicht vorhandenes Problem zu "lösen". oder ob Sie die volle Kraft der Sprache eingesetzt haben, um eine einfache, elegante Lösung zu schreiben, die auf andere Weise nicht verfügbar ist.
In letzterem Fall möchte ich Sie ermutigen, dies gemeinsam mit Ihrem Team fortzusetzen .Jedes gute Team muss aussagekräftige Codeüberprüfungen durchführen, in denen nicht nur Stilfragen erörtert werden, sondern auch, ob die Lösung des Programmierers den besten Ansatz verwendet, die entsprechenden Sprachfunktionen verwendet, wartbar und testbar ist usw. Ihre Metaprogrammierlösung sollte eine solche Überprüfungssitzung ausfüllen, wahrscheinlich a ganzer Nachmittag. Die Programmierer, die Ihren Ansatz ablehnen, sollten Alternativen (wie die Codegenerierung mit Perl, Codeduplizierung usw.) auslegen und zeigen, wie sie im Vergleich zu Ihrer Lösung die genannten Kriterien erfüllen. Ihre Aufgabe ist es, als freundlicher "Gegner" des Arguments zu zeigen, dass dies eine Möglichkeit ist, die Arbeit schnell zu erledigen, dass die Wartung einfach ist, das Testen einfach ist und der Code tatsächlich lesbar ist, sobald Sie die Hürde überwunden haben Analyse der lustigen Grammatik.
Die meisten Programmierer sind faul und freuen sich über elegante, kleine Lösungen. Wenn Sie es sind, können Sie sie wahrscheinlich überzeugen, insbesondere wenn die aufgezeigten Alternativen nicht ausreichen.
quelle
Es gibt keine einzige richtige Antwort auf diese Frage.
Denn als Erstes sollten Sie sich fragen: In welche Situation bringen Sie Ihre Beschäftigung? Einige Leute werden tatsächlich als Code-Affen eingesetzt, um Spezifikationen zu kodieren, andere als Teamplayer, andere als Wissensarbeiter oder Experten.
Die einzige Konstante ist, dass Sie sie aus Sicht Ihres Arbeitgebers betrachten müssen, da dies im Wesentlichen bedeutet, ein Arbeitnehmer zu sein. Manchmal ist es in der Tat im besten Interesse Ihres Arbeitgebers, Ihre Kollegen dazu zu bewegen, besser zu werden und fortgeschrittene Techniken zu beherrschen. In einer anderen Situation können Sie jedoch viele Probleme und Verpflichtungen aufwerfen und den Erfolg der Projekte gefährden, an denen Sie beteiligt sind.
quelle
Die Frage ist nicht wirklich, ob Metaprogrammierung in Ordnung ist oder nicht, sondern ob es in Ordnung ist, besser zu sein als die anderen im Team. Hier sind ein paar kontroverse Punkte, wie ich es sehe ...
Sie haben Angst, dass du besser bist als sie. Das ist gut. Du wirst der neue Experte sein. Sie haben gerade ihre Status-Quo-Welt zerstört.
Sicher, niemand mag es, weniger geschickt zu sein als jeder andere. Deshalb versuchen sie, Sie davon abzuhalten, Techniken anzuwenden, die für ihn zu komplex sind. Sie können es entweder nicht verstehen oder werden es nicht verstehen, weil sie sich jetzt sicher fühlen.
Ich nicht. Ich denke, es zeigt Ihr Fachwissen.
Sie sollten alle Ihre Fähigkeiten nutzen, um den besten Code zu schreiben, den Sie schreiben können, und nicht auf diejenigen schauen, die ihn nicht verstehen. Andernfalls bleiben Sie auf ihrem Niveau stecken und sind nur ein gewöhnlicher Programmierer. Es ist gut, besser zu sein als andere, und es ist gut, sich zu bemühen, besser zu sein als sie. Sie werden nie neue Erfahrungen sammeln, wenn Sie nicht versuchen, etwas Neues zu verwenden oder Dinge anders zu machen.
Ich weiß, dass ich abgelehnt werde, aber so sieht es aus. Es ist kein Verbrechen, besser als andere im Team zu sein, und es ist kein Verbrechen, seine Fähigkeiten einzusetzen. Es ist nur so, dass jeder Angst hat, es zuzugeben ... weil sie auf der unqualifizierten Seite sind und es hassen, dass der Neue plötzlich etwas kann, was sie nicht können. Wenn sie klug wären, würden sie Sie um Hilfe und Rat bitten und Ihren Code nicht als unverständlich kritisieren.
BEARBEITEN
Es scheint viel Verwirrung um diese Frage zu geben. Wie die Kommentare zeigen, denken viele Menschen, dass es um die allgemeine Lesbarkeit von Code geht. Nein, ist es nicht. Es geht darum, ob bestimmte Sprachmerkmale / Konstrukte verboten oder vermieden werden sollten, weil einige Teammitglieder sie nicht verstehen.
Meine Antwort ist nein . Sie sollten nicht verboten werden. Wenn du etwas verbieten willst, wie würdest du das tun? Sie müssten eine Art Fragebogen erstellen, um herauszufinden, was Ihre Teammitglieder können und was nicht - oder besser gesagt, nicht lernen wollen, da ich denke, dass alle sprachlichen Funktionen irgendwo nützlich sind. Daher ist es immer wichtig, sie zu kennen und sie zu verwenden Gut und je mehr Sie wissen, desto besser ist der Code, den Sie schreiben können. Sie benötigen auch eine Skala, um zu definieren, welche Funktionen Anfänger, Mittelstufe oder Fortgeschrittene sind.
Um zu demonstrieren, wie albern solche Einschränkungen sind, nehmen wir ein wirklich einfaches Beispiel: Sie werden als Softwareingenieur eingestellt, aber Ihr zukünftiger Chef teilt Ihnen mit, dass Sie keine
do/while
Loops verwenden dürfen, weil ein paar Leute anwesend sind Das Team, das sie noch nie benutzt hat und auch nicht benutzt hat, weil sie immerfor
Schleifen für alles benutzt haben, sodass siedo/while
Schleifen verwirrend finden.Jetzt denkst du, das ist dumm und verrückt, nicht wahr? Das verbietet aber auch andere Funktionen. Einige Leute können sie benutzen und andere wollen sie nicht lernen.
Warum sollten Sie schlechteren Code produzieren, wenn Sie wissen, dass es etwas gibt, das es Ihnen ermöglicht, dasselbe mit viel weniger Aufwand zu tun und dennoch zu einem viel besser lesbaren, robusten Code zu führen?
Unabhängig davon, ob Sie nur grundlegende oder fortgeschrittene Sprachfunktionen verwenden, können Sie mit einer dieser beiden Funktionen einen ebenso unkomplizierbaren wie nicht verwaltbaren Code erstellen. Dies ist also ein völlig anderes Thema.
quelle