Wie Sie die Codequalität gegen starke Entwicklerpersönlichkeiten abwägen

15

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?

Ivo
quelle
7
Können Sie ein Beispiel für das hinzufügen, was Sie als "clever" betrachten, damit wir alle auf einer Seite sind?
Blackjack
Wie ist die Hierarchie der beteiligten Personen?
2
Was ist die clevere Lösung? Ich würde Ihnen nicht gerne sagen, wie Sie die Lösung ablehnen sollen, wenn die Möglichkeit besteht, dass sie Ihrer eigenen Idee tatsächlich überlegen ist.
Jojo
Ist der 'clevere' Code vorzeitig optimiert oder vorzeitig verallgemeinert? Normalerweise gewinnt der kürzeste Code für ein angemessenes Maß an Kürze (DRYness oder Token, keine Zeichen).
Kevin Cline
3
Bieten Sie eine Alternative an. Ansonsten sind Sie wirklich nur ein Hindernis für die Produktivität. Ohne einen alternativen Ansatz ist es schwierig, der Kritik "Gegenargumente" zu liefern. Es ist ein bisschen wie die Beweislast auf den Angeklagten zu legen. Sie bitten sie, sich gegen alle möglichen Gegenszenarien zu verteidigen.
Nicole

Antworten:

16

Ich liebe dieses Zitat:

"Das Debuggen ist doppelt so schwierig wie das Schreiben des Codes. Wenn Sie den Code also so geschickt wie möglich schreiben, sind Sie per Definition nicht klug genug, um ihn zu debuggen." - Brian W. Kernighan

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.

Javier
quelle
Fast -1, Debugging ist nicht schwer, es sei denn, Ihr Code ist ein Chaos und super zerbrechlich. Das einzige Problem beim Debuggen ist, dass viele Entwickler keine Ahnung haben, wie sie die Debugging-Tools verwenden sollen. Das Schreiben von sehr belastbarem und fehlersicherem Code ist um ein Vielfaches schwieriger.
Coder
Ich denke, dass das Debuggen sicherlich schwieriger ist. Denken Sie so darüber nach. Wenn der Code ursprünglich korrekt geschrieben wurde, ist das Debuggen kein Problem, da beim Testen (Einheit und Integration) keine Fehler festgestellt werden.
Tehnyit
10

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!)

gbjbaanb
quelle
4
Mein Test lautet: "Kann ein Absolventen-Programmierer (kann 1-2 Jahre alt sein) ihn warten?" .... Er kann klug sein, muss aber auch klar und prägnant sein.
Mattnz
1
@mattnz - Wenn ich diesen Test verwenden würde, würde die Hälfte des Codes, den ich im Laufe der Jahre geschrieben habe (oder sonst jemand), als schlecht angesehen. Programmierer mit Abschluss (1-2 Jahre) sind nicht alle, die sie für sich halten. Nicht zu sagen, dass wir schlechten Code schreiben sollen; nur dass dieser "Test" nicht so viel Sinn macht.
Rook
6

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.

  • Es ist, wie Sie wissen, wie sagen, ich finde 31K Quelldatei, die die empfohlene Größenbeschränkung überschreitet, die sagen, 30K ist. Ich kann entweder ein paar Minuten / Stunden damit verbringen, den Dateibesitzer dazu zu zwingen, dieses zusätzliche Kilobyte irgendwie herauszuquetschen, oder ein oder zwei Tage damit zu verbringen, nachzudenken und herauszufinden, dass beispielsweise eine Bibliotheks-API verwendet werden kann den Code in dieser Datei (damit er einfach entfernt werden kann).

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. :)

Mücke
quelle
2

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:

Sam, ich bin beeindruckt von deinem Einfallsreichtum, aber ich mache mir Sorgen, dass es vielleicht etwas zu klug ist. Sie müssen in einem Jahr an einer neuen Entwicklung arbeiten, anstatt diese aufrechtzuerhalten, und ich bin besorgt, dass jeder, der sie warten muss, ihre Attraktivität möglicherweise nicht vollständig erfasst. Ich weiß, dass Sie es hassen, es zu tun, aber ich würde es begrüßen, wenn Sie zu der einfachen Implementierung zurückkehren würden, die wir besprochen haben.

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.

Caleb
quelle
2

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?

  • Sie haben zugegeben, dass Sie sich für das interessieren, was er schreibt ,
  • Sie zeigten ihm Respekt, indem Sie fragten ,
  • Indem Sie Probleme mit dem Gedächtnis / der Fokussierung anführen, entwickeln Sie ein Szenario, in dem dieser Code geändert werden muss und nicht geändert werden kann, solange er noch für das Unternehmen oder das Team arbeitet

(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. )

ZJR
quelle
1

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.

user606723
quelle
0

Wie viele andere Praktiken denke ich, hängt die Antwort davon ab .

  • Wenn es sich um einen Defekt handelt, muss dieser unbedingt behoben werden.
  • Wenn der Code funktioniert, müssen Sie den Wert des Beharrens darauf, dass der Code geändert wird, gegen die zukünftigen Kosten des cleveren Codes abwägen. Zwar gibt es Faustregeln hinsichtlich des Verhältnisses zwischen Entwicklungs- und Wartungsarbeiten, doch diese variieren von Projekt zu Projekt erheblich. Sei vernünftig.
  • Überlegen Sie, warum Sie Ihren Teamkollegen nicht davon überzeugen können, dass der Code vereinfacht werden muss.
  • Man muss nicht immer alles perfekt machen. Das würde bedeuten, dass Code in einer Endlosschleife überprüft und nichts eingecheckt wird, da nichts (außer meinem Code, haha) perfekt ist.
  • Meine persönliche Präferenz ist, dass der Autor des Codes das letzte Wort hat. Offensichtlich müssen sie, wenn sie kontinuierlich eine sehr schlechte Arbeit leisten, andere Maßnahmen ergreifen, aber wie Sie sagen, kann der negative Wert, den Entwickler zu zwingen, den Code zu ändern, höher sein als der Gewinn, der durch die Korrektur erzielt wird, wenn dies eine sehr seltene Situation ist .
Guy Sirton
quelle
0

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:

  1. 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.

  2. 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.

  3. 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),

  4. 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.

DXM
quelle
0

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.

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.

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.

DVK
quelle
0

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.

rwong
quelle