Bei Codeüberprüfungen bei der Arbeit habe ich Code und Muster gesehen, die ich für "clever" halte, die aber nicht unbedingt die Gesamtqualität oder Wartbarkeit der Codebasis verbessern. Ich mache auf mein Feedback aufmerksam und bin von den Gegenargumenten nicht überzeugt. Ich bin etwas besorgt, wenn dieser Code in das Repo und später in die Produktion eingeht.
Ich möchte ein geschlossenes Team aufrechterhalten, damit ich keine Spannung aufbauen kann, wenn ich zu laut über meine Vorbehalte spreche. Ich möchte auch ein großartiges Produkt für unsere Kunden schaffen, ohne zu nachsichtig zu sein.
Wer hat traditionell das Vetorecht, was wie eingecheckt wird?
Wie kann Code, der funktioniert, aber zu kompliziert / klug entfernt werden, ohne auf die Zehen zu treten?
Antworten:
Ich liebe dieses Zitat:
Auf der einen Seite werden Sie des zu cleveren Codes überdrüssig, da es schwierig sein wird, ihn später zu debuggen und zu erweitern.
Auf der anderen Seite ist kluger Code, der funktioniert, eine großartige Möglichkeit zu lernen. Wahrscheinlich für das ganze Team. Wie wäre es, den Autor zu ermutigen, seinen Kollegen einen kleinen informellen Vortrag über den Code zu halten? Stellen Sie nur sicher, dass es wirklich wie beabsichtigt funktioniert und im gesamten Projekt sinnvoll ist. Sie wollen es nicht in einen sinnlosen Wettbewerb verwandeln!
Wenn Sie nicht der Meinung sind, dass es einen Mehrwert bringt, stellen Sie die Gegenforderung mit der Frage: "Wie können Sie diesen Teil umgestalten (Sie haben Tests, richtig?), Damit er besser lesbar ist?" Achten Sie darauf, dass es schwieriger ist, cleveren, lesbaren Code zu erstellen, um undurchdringliche Nuggets zu erstellen.
quelle
Mein Rat ist, den Idioten zu spielen, wenn es Zeit ist, Code-Reviews zu machen, können Sie sagen, dass Sie keine Ahnung haben, wie es funktioniert (wenn Ihr Ego eine Massage braucht, können Sie sagen, dass Sie keine Zeit hatten, es herauszufinden ) und den Entwickler bitten, es zu erklären. Wenn er fertig ist, können Sie vorschlagen, dass er das alles als Kommentar für zukünftige Wartungsarbeiten aufschreibt, mit dem impliziten Hinweis, dass es zu kompliziert ist, um als "guter" Code angesehen zu werden.
Wenn sein guter Code nur ein bisschen zu kompliziert ist, werden die meisten Leute den Hinweis bekommen, ohne dass etwas über die Codequalität oder das Know-how der Entwickler gesagt wurde.
PS. Offensichtlich ist der größte Teil dieses Codes ohnehin subjektiv, so dass der unglaublich clevere Code einer Person ein vernünftiger und vielleicht sogar branchenüblicher Algorithmus für einen anderen Entwickler sein kann. Sie können also niemanden direkt beschuldigen, schlechten Code geschrieben zu haben (außer, wenn seine Verdrehung offensichtlich ist wie der Auftragnehmer, der ein Byte-Array in eine STL-Liste kopiert, in eine Verschlüsselungsroutine überführt und dann wieder in ein Byte-Array konvertiert hat!)
quelle
Meine Faustregel ist, die Richtlinien zur Codequalität zugunsten starker Entwicklerpersönlichkeiten zu biegen. Ich benutze es immer, wenn ich keine Zeit habe, tief genug zu graben - ein solches Graben ist im Übrigen normalerweise recht mühsam (mehr dazu weiter unten).
Diese Regel basiert auf persönlichen Erfahrungen. Ich begann (wahrscheinlich wie jeder Neuling) damit, fanatisch den Richtlinien zu folgen und jede Abweichung gründlich zu bekämpfen. Mit der Zeit habe ich genügend Fähigkeiten erworben und genug Tricks gelernt, um solche Kämpfe relativ leicht zu gewinnen - was es mir wiederum ermöglichte, mich mehr darauf zu konzentrieren, die Gesamtwirkung meiner "Siege" zu lernen. Soweit ich das beurteilen kann, war die Auswirkung eher negativ - Leute, die "den Kampf verloren" hatten, litten und wurden weniger produktiv - und die Tatsache, dass ihr Code zu 200% den Qualitätsrichtlinien entsprach, hat dies nicht kompensiert.
Aufgrund dieser Entdeckung musste ich die meisten Kämpfe einstellen, was wiederum dazu führte, dass ich mehr Zeit hatte, um problematische Fälle zu analysieren. Und ich stellte fest, dass, wenn ich tief genug grabe, irgendwo dahinter ein interessantes Designproblem liegt, ein subtiles (oder nicht allzu subtiles) Problem, das sich nur hinter den Kämpfen der Persönlichkeiten versteckt.
Eine solche Entdeckung mag aus Sicht des Endbenutzers manchmal nicht sehr nützlich sein (obwohl sie manchmal tiefgreifende Auswirkungen haben kann), aber ich muss zugeben, dass der Spaß, den ich beim Knacken einer solchen Nuss bekomme, die Mühe auf jeden Fall wert ist ... und als das i-Tüpfelchen auf dem i-Tüpfelchen geht auch kampflos verloren. :)
quelle
Ihre Organisation sollte über ein Dokument mit Kodierungsrichtlinien / -standards verfügen, das regelmäßig mit Beiträgen des Entwicklungsteams aktualisiert wird. In diesem Dokument können bestimmte Details beschrieben werden, z. B .: Benennen von Variablen, Formatieren von Code usw. Das Dokument sollte auch die Werte erläutern, die die Organisation von Programmierern beim Schreiben von Code erwartet, einschließlich der relativen Bedeutung von Dingen wie Lesbarkeit, Wartbarkeit, Korrektheit, Effizienz und Einhaltung von Standards.
Codeprüfungen sollten unter Verwendung dieses Kodierungsstandards durchgeführt werden. Wenn die Codierungsstandards besagen, dass Programmierer die Lesbarkeit der Kürze vorziehen sollten, wenn sich die beiden widersprechen, werden Sie eine gewisse Unterstützung haben, wenn Sie gegen den "cleveren" Code argumentieren. Wenn die Standards das nicht sagen und Sie denken, dass sie es sollten, können Sie auf dem Coding-Standards-Meeting abstrakt darüber streiten, anstatt zu versuchen, es herauszufinden, wenn jemandes Ego auf dem Spiel steht.
Letztendlich kommt es manchmal zu einem Urteilsspruch, und in diesen Fällen sollte das letzte Wort an die Person gehen, die letztendlich für den Code und / oder das Produkt verantwortlich ist. Das ist normalerweise jemand wie ein leitender Entwickler, technischer Leiter, Projektleiter oder technischer Direktor. Wenn Sie der Verantwortliche sind und der Meinung sind, dass bestimmter Code nicht ausreichend wartbar ist, sollten Sie keine Angst davor haben, dies zu sagen. Darüber können Sie diplomatisch sein:
Wenn Sie jedoch nicht der Verantwortliche sind, können Sie Ihre Position am besten klar erläutern und versuchen, den Rest des Teams zu überzeugen. Wenn Sie keine Unterstützung vom Manager erhalten, akzeptieren Sie, dass dies nicht Ihr Anruf ist, und fahren Sie fort.
quelle
An Ihrem Platz (und manchmal bin ich einer dieser Schlauen) würde ich es nicht entfernen, sondern persönlich den witzigen / klugen Autor bitten, es in Kommentaren sehr gut zu dokumentieren und, wenn möglich, eine Diskussion über alternative und einfachere Schriften, die er hätte verwenden können, mit Beispielen.
Ich möchte betonen, dass dies das Beste ist, denn selbst er wird sich in zwei Monaten wahrscheinlich nicht mehr an alle Details erinnern, die in diesen Zeilen zu finden sind.
Er wird wahrscheinlich den intelligenten Code zugunsten des einfachsten Codes ablegen, sobald er gezwungen ist, ihn als Beispiel zu schreiben.
Warum sollte das funktionieren?
(Ohne diese letzte Andeutung kann diese Art von Anfrage von Seiten des Unternehmens als Versuch empfangen werden , den Programmierer zu kommodifizieren , so dass er jederzeit mit jedem anderen Code-Affen austauschbar ist. )
quelle
Nach meiner Erfahrung ist es in der Regel sehr schwierig, Code aus der Codebasis zu erhalten, der alle Anforderungen erfüllt.
Wenn der Code das nächste Mal gewartet werden soll, können Sie leicht argumentieren, dass er als zukünftige Kosteneinsparungsmaßnahme ersetzt werden soll, da der alte Code schwerer zu pflegen war.
Was das Vetorecht angeht, hat das Management dies offensichtlich.
Manchmal handelt es sich um Teams oder Komitees, die für die Codequalität zuständig sind. In diesem Fall verfügen sie auch über diese Befugnisse.
Es wäre auch hilfreich, wenn Sie ein Beispiel für ein „cleveres“ Muster geben würden. Vielleicht überreagierst du nur ...
'clever' ist in meinem Buch fast nie eine schlechte Sache, aber ich kann zustimmen, dass es einen rutschigen Hang zwischen clever und verworren geben kann.
quelle
Wie viele andere Praktiken denke ich, hängt die Antwort davon ab .
quelle
Ich kann mich definitiv auf diese Frage beziehen. Ich bin derzeit der technische Leiter für 2 Teams und es ist meine Aufgabe, sicherzustellen, dass der von uns erstellte Code so lesbar und wartbar wie möglich ist. Gleichzeitig ist mir bekannt, dass ich einen "cleveren" Code produziere, und ich weiß, dass die meisten meiner Teamkollegen es sehr schwer haben werden, ihm zu folgen.
Einige Beobachtungen, die ich anbieten kann:
Ihr Team benötigt eine Führungskraft, die bei Uneinigkeit die endgültige Entscheidung trifft. In der letzten Veröffentlichung war ich in einem Team ohne Führung und es war schrecklich. Alles wurde zu einem Streit, und wenn es nur wenige Menschen mit starken Persönlichkeiten gibt, wird sich keiner von ihnen rühren. Wenn Sie einen Lead haben, MUSS jeder im Team verstehen, was der Lead sagt, unabhängig davon, welche Entscheidung getroffen wurde. Deshalb hat das Management ihn zur Führungskraft gemacht.
Es ist sehr wichtig, die Menschen bei Laune zu halten. Anstatt das gesamte Team auf Ihren Standpunkt zu lenken, schieben Sie es einfach dorthin. Erläutern Sie die SOLID-Prinzipien, erklären Sie die Bedeutung kleiner und zusammenhängender Klassen / Methoden / Schnittstellen und wiederholen Sie diese Dinge jedes Mal, wenn Sie feststellen, dass sie verletzt werden (z. B. in einer Codeüberprüfung). Lassen Sie sie gleichzeitig nicht alles neu schreiben, was Ihnen nicht gefällt. Letztendlich brauchen Sie ein Gleichgewicht zwischen persönlichem Ausdruck und den folgenden Gruppenstandards. Hoffentlich werden die beiden zusammenwachsen, wenn sich die persönlichen Vorlieben in Richtung der allgemeinen Funktionsweise der Gruppe verschieben.
Ich glaube, es ist viel wichtiger, saubere, leicht verständliche Klassenschnittstellen zu haben, als jemals einen "cleveren" Code zu haben. Zum Beispiel haben wir eine Klasse, die eine Liste von Einträgen verwaltet, die auf drei verschiedene Arten nachgeschlagen werden. Derzeit wird lediglich die lineare Suche für alle Suchvorgänge verwendet, die in kleinem Maßstab ausgeführt werden können. Da sich diese Klasse jedoch auf einem sehr niedrigen Niveau befindet, wird sie meiner Ansicht nach nicht sehr gut skaliert. Ich werde es durch eine andere Klasse ersetzen, die Boost Intrusive-Container verwendet. Jedes Element unterstützt das gleichzeitige Platzieren in jedem der Indizes, und die Suche erfolgt in O (sqrt (N)). Ja, es wird innen viel komplizierter und viele Leute mögen Boost nicht, aber außen bleiben 3 Methoden: Hinzufügen, Entfernen, Holen. Fazit ist, dass die Leute jeden Code schreiben können, den sie wollen (innerhalb der Vernunft),
Behalten Sie die Idee der Code-Inhaberschaft bei. Obwohl es manchmal schwierig ist, dies zu erreichen, da verschiedene Personen möglicherweise Code hinzufügen / ändern müssen. Wenn der Code geschrieben wird, ist der ursprüngliche Entwickler der endgültige Verwalter dieses Codes. Das heißt nicht, dass es niemand anders anfassen kann. Wenn andere ihren Code ändern, ist das in Ordnung, aber am Ende des Tages überprüft der ursprüngliche Entwickler ihn und bleibt verantwortlich für alles, was dort reinkommt. Ob dieser Code einfach oder clever ist, es ist sein Baby. Wenn / wann, wie Sie vorhersagen, Fehler aufgrund der getroffenen Design- / Codierungsentscheidungen häufen sich, anstatt diese Fehler einfach zu beheben, wenn sie eingehen, setzen Sie sich mit dem Entwickler in Verbindung (der übrigens alle diese Fehler beheben sollte). und reflektieren Sie diese Entscheidungen, um zu sehen, wie sie anders hätten getroffen werden können.
quelle
Ich habe viele Jahre lang Entwicklungsteams geleitet und geleitet. Von Natur aus bin ich ein bisschen OCD in Bezug auf Code und sehr schwarz-weiß. Ich habe durch Erfahrung gelernt, dass es eine der schwierigsten Fähigkeiten ist, als Teamleiter zu lernen, Ihre Kämpfe zu gewinnen. Ja, Standards sind wichtig. Ja, Lesbarkeit und Wartbarkeit sind unglaublich wichtig. Ja, wir sollten uns alle bemühen, einheitlichen, standardkonformen Code zu schreiben. Entwickler sind Menschen, aber keine Werkzeuge zur Codegenerierung. Wir haben Persönlichkeiten, Meinungen, wir langweilen uns und wir wollen neue Dinge lernen.
OK ... sie fügen also nichts hinzu, aber lenken sie ab? Sprechen wir nur über persönliche Vorlieben in Bezug auf Codierungsstile oder ist das Schreiben von Code völlig unnötig (z. B. Verwenden von Ausdrucksbäumen und Reflektion, nur weil es Spaß macht, Ausdrucksbäume und Reflektion zu verwenden)? Wenn es das erstere ist, lass es los. Ein Teil des Spaßes, ein Entwickler zu sein, besteht darin, kreative Lösungen für Probleme zu finden. Vielleicht (und die meisten von uns geben dies nicht gerne zu) fühlen wir uns manchmal von Ansätzen eingeschüchtert, die wir nicht verstehen, und wollen entweder nicht fragen oder haben nicht die zusätzliche Energie, um den neuen Ansatz zu erlernen.
Wenn Kreativität zu unnötigem Code und völlig ungerechtfertigter Komplexität führt, sollten Sie auf jeden Fall lautstark sein und Ihre Argumente vertreten. Teamplayer zu sein ist wichtig, aber auch andere zur Rechenschaft zu ziehen. Bei Code-Überprüfungen geht es sowohl um Verantwortlichkeit als auch um Qualitätssicherung und Lernen. Sie werden auf einige Zehenspitzen treten, aber wenn Sie das Gefühl haben, ein starkes Argument dafür zu haben, warum Mühe (Geld) für das Umschreiben des Arbeitscodes aufgewendet werden sollte UND dabei ein Ego verletzt werden sollte UND Sie das Risiko eingehen möchten, die Begeisterung eines Menschen für sein Handwerk zu unterdrücken , dann sollten Sie nicht davor zurückschrecken, es auf den Tisch zu legen. Wenn Sie der Teamleiter sind, ist dies Ihre Aufgabe. Seien Sie sich der Auswirkungen bewusst und tun Sie es. Wenn Sie kein Teamleiter sind und keine Autorität haben, überlassen Sie dies dem Team, um zu entscheiden.
Der beste Weg, Ihrem Team Rechenschaft abzulegen, besteht darin, andere zu ermutigen, Sie zur Rechenschaft zu ziehen. Wenn Sie aufgeschlossen sind und die Mitarbeiter nicht ausschalten, wenn sie Verbesserungen für Ihren Code vorschlagen, sind sie möglicherweise empfänglicher für Ihre Vorschläge.
quelle
Aus persönlicher Erfahrung würde ich in diesem Fall die Erlaubnis einholen , freiwilliger Prüfer einer gegnerischen Einheit zu sein, um Tests zu schreiben, um die unbekannte Implementierung zu foltern.
Ich werde mich sehr bemühen, die Funktionsweise des Codes wirklich zu verstehen und ihn auf viele verschiedene Arten zu untersuchen.
Beachten Sie, dass dies eine zeitliche Verpflichtung ist. Es können Stunden oder Dutzende von Stunden oder sogar ein guter Teil einer Woche sein. Ob dies gerechtfertigt ist, hängt davon ab, ob die Komplexität des Codes der Komplexität der Anforderung entspricht.
Wenn ich mich nicht durchsetzen würde, dh wenn der Code die vielen Tests übersteht, würde ich mich davon überzeugen, dass die Implementierung möglicherweise wirklich aufschlussreicher ist als ich und ich werde die Aufnahme in das Hauptprodukt unterstützen.
Abhängig von der Versionsverwaltungsmethode muss der Code möglicherweise vorläufig in das Versionsverwaltungssystem (möglicherweise in einer Verzweigung) übertragen werden, bevor diese Testphase beginnen kann.
Meine Antwort ist von meiner Erfahrung mit OpenCV geprägt. Es gibt Algorithmen, die viel ausgefeilter sind, als jeder Programmierer selbst implementieren kann. Nicht einmal die Doktoranden - vielleicht die Top-Prozent der Doktoranden. Wenn der Code ist , dass gut, muss man das Vertrauen, wirkt gegen die eigenen Instinkte und Vorurteile, auch wenn Sie nicht wirksames Mittel , das Niveau des Vertrauens haben sie zu quantifizieren.
quelle