Wie kann ich eine Codeüberprüfung ablehnen, die ich für unnötig halte?


89

Ich bin in einer Position, in der ich gebeten wurde, einen Code zu überprüfen, der ein Problem behebt, von dem ich nicht glaube, dass es existiert.

Der Fixer, der älter als ich ist, besteht darauf, dass sein Fix notwendig ist, aber es scheint für mich nicht mehr als C ++ Sophistik zu sein. Ein Teil unseres Bereitstellungsprozesses ist eine Codeüberprüfung. Als zweithöchster Ingenieur in einem kleinen Unternehmen werden von mir Änderungen erwartet.

Ich bin der Meinung, dass Prüfer für Codeänderungen genauso verantwortlich sind wie der ursprüngliche Kodierer, und ich bin nicht bereit, die Verantwortung für diese Änderung zu übernehmen. Wie würden Sie vorgehen, um diese Bewertung abzulehnen?


113
Scheint mir offensichtlich. Sie weisen in der Rezension darauf hin, dass es sich bei dem Code um eine intellektuelle C ++ - Masturbation handelt, mit der ein nicht vorhandenes Problem behoben werden soll. Und dann lehnen Sie im Rahmen des Überprüfungsprozesses den Code ab.
user16764

86
Verwenden Sie die Wörter "intellektuelle Masturbation" nicht, wenn Sie es ablehnen. Wenn Sie diese Formulierung verwenden, werden Sie ihn verärgern und er wird nicht sehen, was Sie als potenziell korrekte technische Kritik zu sagen haben, er wird es als persönlichen Angriff ansehen. Es kann durchaus eine intellektuelle Masturbation sein, aber Sie können absolut sicher sein, dass er das nicht so sieht.
Michael Shaw

15
James - Ich habe die Emotionen aus Ihrer Frage herausgenommen, damit sich die Community auf Ihre Kernfrage konzentrieren kann. Wie andere darauf hinweisen, wird die Verwendung einer geladenen Terminologie in Ihrer Überprüfung nur die eindeutig heikle Situation verschlimmern.

8
C und C ++ sind voll von Dingen, die anscheinend funktionieren, aber tatsächlich undefiniertes Verhalten sind. UB ist ein echter Defekt, auch wenn Sie keinen Test schreiben können, der zeigt, dass er nicht so funktioniert, wie er sollte. Beispielsweise verwenden viele Compiler UB als Optimierungsmöglichkeit, indem sie davon ausgehen, dass der nicht definierte Fall niemals eintritt. Wenn Sie beispielsweise size > size+1eine Ganzzahl mit Vorzeichen auf Überlauf überprüft haben, ersetzt der Compiler diesen Ausdruck möglicherweise einfach durch false, da der Überlauf von Ganzzahlen mit Vorzeichen undefiniert ist. Siehe blog.llvm.org/2011/05/…
CodesInChaos

5
@MichaelShaw "Er wird es als persönlichen Angriff sehen." Wonach der Wortlaut der Frage für mich klingt, ein persönlicher Angriff auf einen älteren Entwickler, mit dem OP eine Meinungsverschiedenheit hat, die er jetzt "gewinnen" kann, weil er in eine Machtposition versetzt wurde.
Jwenting

Antworten:


274

Bitten Sie um einen Testfall, der ohne die Änderung fehlschlägt, die mit der Änderung erfolgreich ist.

Wenn er keinen vorweisen kann, verwenden Sie das als Rechtfertigung.

Wenn er einen vorweisen kann, müssen Sie erklären, warum der Test ungültig ist.


245
Oder wenn er eines hervorbringen kann, überprüfen Sie Ihre Vermutungen erneut und gehen davon aus, dass er doch recht gehabt haben könnte. Vermutlich geht es darum, den Kodex zu verbessern und nicht die Debatte zu gewinnen.
Caleb

99
Nur weil Sie keinen Test schreiben können, heißt das nicht, dass er nicht kaputt ist. Undefiniertes Verhalten, das normalerweise wie erwartet funktioniert (C und C ++ sind voll davon), Rennbedingungen, mögliche Neuordnung aufgrund eines schwachen Speichermodells ...
CodesInChaos

29
Und was ist mit Standard-Refactoring? Wie schreibt man einen nicht bestandenen Test für eine Umgestaltungsarbeit?
Mike Weller

62
"Bitten Sie ihn zu beweisen, warum es notwendig ist ..." Bitten Sie ihn vielleicht , Ihnen beizubringen , warum es notwendig ist.
Mike Sherrill "Cat Recall"

8
@ RhysW: Falsche Annahme. Auch hier kann der vorhandene Code mit der Racebedingung nicht getestet werden. Der neue Code ist also theoretisch besser und empirisch äquivalent. Ihre Annahme ist nur dann zutreffend, wenn der alte Code empirisch besser ist.
MSalters

152

Gutachter sollten objektiv sein.

Es ist klar, dass Sie sich eine Meinung zu dem fraglichen Code gebildet haben, bevor Sie ihn überhaupt überprüft haben, und es scheint, als hätten Sie und der Fixierer Positionen abgesteckt. Wenn dem so ist, werden Sie eine schwierige Zeit haben, objektiv zu erscheinen, und eine noch schwierigere Zeit , objektiv zu sein. Nichts davon hilft dem Prozess, und es kann sein, dass das Beste und objektivste, was Sie tun können, darin besteht, sich aus dem Grund zu beugen, dass Sie dem Problem zu nahe stehen.

Betrachten Sie einen Teamansatz.

Wenn es nicht möglich ist, sich selbst zu entfernen, können Sie möglicherweise mehrere andere Techniker gleichzeitig den Code überprüfen lassen. Entweder stimmen sie mit Ihnen überein, dass der Code abgelehnt werden sollte, oder sie werden nicht. Wenn sie mit Ihnen übereinstimmen, sind Sie nicht mehr nur Sie selbst im Vergleich zum Fixer, und Sie können einen stärkeren Beweis dafür erbringen, dass das Team den Fix objektiv betrachtet und sich gegen eine Annahme entschieden hat. Auf der anderen Seite wird auch dies eine Teamentscheidung sein, wenn sie sich dazu entschließen, das Update zu akzeptieren. Es sollte selbstverständlich sein, dass Sie so offen wie möglich mitmachen und nicht versuchen sollten, die Meinungen der anderen Teammitglieder durch etwas anderes als rationale Diskussionen zu beeinflussen. Wichtig: Wenn es später zu einem schlechten Ergebnis kommt, werfen Sie das Team nicht unter den Bus, indem Sie sagen: "Nun, ich Ich habe immer gesagt, dass es ein schlechter Code ist, aber ich war den anderen Teammitgliedern unterlegen. "

Ablehnungen sind ein natürlicher Bestandteil des Code-Überprüfungsprozesses.

Der Code-Überprüfungsprozess ist nicht dazu da, Stempel von älteren Leuten zu korrigieren. Es ist dazu da, die Qualität des Codes zu schützen und zu verbessern. Es ist nichts Falsches daran, ein Update abzulehnen, vorausgesetzt, Sie tun dies aus dem richtigen Grund, dh, dass das Update den Code nicht verbessert. Wenn Sie nach einer aufgeschlossenen Überprüfung des Codes immer noch der Ansicht sind, dass die Korrektur das Risiko und / oder die Größe eines nachweisbaren Problems nicht verringert, sollten Sie ihn ablehnen. Es ist nicht persönlich, nur deine ehrliche Meinung. Wenn der Fixierer nicht einverstanden ist, ist das auch in Ordnung, und an diesem Punkt wird es für das Management zu einem Problem, dies herauszufinden. Seien Sie einfach sicher, ehrlich, offen und professionell zu bleiben.

Verantwortung schneidet in beide Richtungen.

Sie sagten, dass Sie nicht für diese Änderung verantwortlich sein möchten, anscheinend, weil Sie nicht glauben, dass es ein Problem gibt. Allerdings müssen Sie erkennen , dass , wenn Sie falsch sind , und es ist ein Problem, dann können Sie den Code verantwortlich am Ende für die Ablehnung, die das Problem vermieden hätte.

Mache Notizen.

Wenn Sie ein schriftliches Protokoll des Überprüfungsprozesses führen, können Sie Ihre Fakten klarstellen. Notieren Sie sich Ihre Gedanken und Bedenken, und überprüfen Sie die Beschreibung und die Ergebnisse aller Tests, die Sie möglicherweise durchführen, um das mutmaßliche Problem und die Behebung usw. zu messen. Wenn das Problem eskaliert, haben Sie Aufzeichnungen darüber, was Sie getan haben, um Ihr Problem zu unterstützen Position. Wenn die Angelegenheit in Zukunft erneut auftaucht (wahrscheinlich, wenn der Fixierer seiner eigenen Ansicht angehängt ist), haben Sie etwas, das Sie in Erinnerung behalten können.


24
+1 das ist viel nützlicher als die akzeptierte Antwort
Simon Bergot

2
Bestimmt. Die akzeptierte Antwort ist spezifisch für einen Fall, eindeutig nicht so allgemein und gut durchdacht wie dieser.
Florian Margaine

40

Notieren Sie die Gründe für die Ablehnung und die Abwehr möglicher Gegenargumente. Besprechen Sie sich dann rational mit dem Fixierer und eskalieren Sie gegebenenfalls zum Management.

Wenn Sie über ausreichende Dokumentation verfügen (einschließlich Codelisten, Testergebnissen und objektiven Argumenten), sind Sie gut abgesichert.

Sie werden einen schlechten Willen mit dem Fixierer verursachen, stellen Sie also sicher, dass sich das Problem lohnt (dh verursacht das Nicht-Fixieren Schaden?)

Wenn der Fixierer in irgendeiner Weise mit den Eigentümern in Beziehung steht, vergessen Sie diese Antwort.


9
Ich würde zweimal allein für den letzten Teil Ihrer Antwort stimmen. Sehr solide Antwort.

31

Kürzlich gab es in den LinkedIn-Nachrichten einen Artikel über Konfliktlösung am Arbeitsplatz und Bescheidenheit, anstatt arrogant zu wirken. Leider kann ich den Link jetzt nicht finden, aber der Kerngedanke bestand darin, Fragen nicht konfrontativ zu formulieren. Bitte nehmen Sie das nicht so, als ob ich impliziere, dass Sie arrogant sind. Es ist nur die Art und Weise, wie der Artikel geschrieben wurde.

Wie auch immer, wenn Sie dem erfahrenen Programmierer sagen, dass er sich in seiner Annahme irrt, wird dies nur dazu führen, dass er einen defensiven Ansatz verfolgt und Sie in seiner Antwort angreift. Wenn Sie jedoch die Frage stellen, warum er glaubt, dass das Problem besteht, ist es wahrscheinlich, dass er / sie offener ist, die Angelegenheit zu erörtern.

Anstatt also zu sagen "Das Problem existiert nicht, also sollte ich es nicht überprüfen müssen", müssen Sie vielleicht etwas fragen wie "Um dies richtig zu überprüfen, muss ich das Problem verstehen. Können Sie es bitte anhand Ihrer erläutern." Perspektive?"

Als Beispiel beschreibt der Artikel einen Test für Kinder, bei dem ein Erwachsener einen Würfel hochhielt, dessen Gesichter alle eine Farbe hatten, mit Ausnahme desjenigen, das dem Erwachsenen zugewandt war. Wenn die Kinder gefragt wurden, welche Gesichtsfarbe der Erwachsene sieht, sagten die unter 5-Jährigen fast immer die Farbe, die sie sehen konnten, da sie nicht verstehen konnten, dass der Erwachsene eine andere Sichtweise als sie selbst haben könnte.


8
Hervorragender Punkt, aber ich verstehe nicht, wie das Beispiel unten zusammenhängt (ich behaupte nicht, dass es nicht zusammenhängt, natürlich, weise nur auf meinen Mangel an Verständnis für die Beziehung hin).
Ugoren

8
@ugoren Ha ha, ich mag was du da gemacht hast!
TheDarkKnight

1
@ugoren die Beziehung ist "es sei denn, Sie können das ganze Bild sehen, keine konkreten Meinungen bilden"
RhysW

2
Ich mag immer die bescheidene Herangehensweise, ich würde die Änderung auf der Grundlage ablehnen, dass ich nicht verstehe, und ich bin daher nicht qualifiziert, sie zu genehmigen.
PhilDin

2
@PhilDin Es ist bescheiden und dann wird gesagt, dass Sie nicht für den Job qualifiziert sind. Wenn er in der Lage ist, Code zu überprüfen, gehen die Leute, die ihn in diese Position gebracht haben, davon aus, dass er dafür qualifiziert ist.
Andy

9

C / C ++ kann voll von undefinierten Verhalten sein. Einerseits ist es schlecht, da es zu unerwarteten Verhaltensweisen führen kann. Auf der anderen Seite erlaubt es aggressive Optimierungen und wenn Sie C / C ++ verwenden, sind Sie in der Regel an Geschwindigkeit interessiert.

Das Schreiben eines Testfalls, der bricht, kann schwierig sein - es kann eine seltsame Architektur oder einen Compiler beinhalten, der nicht mehr existiert. Auch könnte es wie auf jeder vernünftigen Architektur scheinen, "sollte es keine Probleme verursachen".

Zu irgendeinem Zeitpunkt werden Sie jedoch die Plattform wechseln (z. B. möchten Sie mobil werden, um auf ARM zu portieren, oder Sie möchten die Dinge beschleunigen und die GPU verwenden). An diesem Punkt kann es zu Problemen kommen, und Sie müssen das Debuggen durchführen. Es kann so trivial sein, wie den Compiler auf eine neuere Version zu aktualisieren (und Sie möchten es vielleicht / brauchen es).

Der problematische Code war:

int d[16];

int SATD (void)
{
   int satd = 0, dd, k;
   for (dd=d[k=0]; k<16; dd=d[++k]) {
     satd += (dd < 0 ? -dd : dd);
   }
   return satd;
 }

Während der letzten Iteration d[++k] => d[++15] => d[16]wird zugegriffen. Da normalerweise das nächste Element der legale Speicher war (in Bezug auf Paging kein C-Speichermodell), haben selbst die trivialen Compiler keine ausführbare Datei mit seltsamem Verhalten erstellt. Die einzige Möglichkeit, den Testfall zu schreiben, bestand darin, eine Plattform mit genau demselben Speichermodell wie C (wahrscheinlich VM) zu finden.

Allerdings ist gcc 4.8 vorab zu sehen, d[++k]das in jeder Schleife ausgeführt wird. So k < 16sonst wäre der Zugang illegal und die Rechtmäßigkeit des Programms Compiler zugeführt ist Teil des Vertrages. Die Schleifenbedingung ist also immer wahr, vorausgesetzt, sie ist eine Endlosschleife. Das mag seltsam klingen, aber es war vollkommen legale Optimierung - Aussenden system("dd if=/dev/zero of=/dev/sda"); system("format c:")wäre auch der richtige Ersatz für Schleife. Es gibt subtilere Möglichkeiten, Verhaltensweisen zu zeigen. Zum Beispiel erinnere ich mich, dass der Moderator während eines Vortrags über Transaktionsspeicher mehrmals versucht hat, einen falschen Wert zu erhalten, wenn 2 Threads den gleichen Wert inkrementiert haben.

C / C ++ ist jedoch im Gegensatz zu einigen Sprachen standardisiert, so dass ein solcher Streit mit Bezug auf die objektive Quelle geführt werden kann:

  • Wenn Sie der Meinung sind, dass dies kein Problem ist, versuchen Sie, es mit dem C / C ++ - Standard zu beweisen (dh, es führt zu einem definierten Wert und Verhalten).
  • Wenn er der Meinung ist, dass dies ein Problem ist, bitten Sie ihn, es mithilfe des C / C ++ - Standards zu beweisen (dh, dass dies zu undefiniertem Wert oder Verhalten führt).

Wenn Ihr Team in C / C ++ schreibt, ist es im Allgemeinen nützlich, Standard zur Hand zu haben - selbst Teamexperten können dort gelegentlich etwas Merkwürdiges finden.


4

Dies klingt eher nach einem Problem mit Ihrer Teamrichtlinie als mit dieser speziellen Überprüfung. Als ich in einem großen Softwarehaus in einem 9-köpfigen Team arbeitete, hatte ein Prüfer ein Vetorecht über Code, und dies war ein Standard, den wir alle respektierten. Wir waren talentiert und klug genug - nämlich. "ausgereift", aber eher im Sinne von "nicht kindisch" als "erfahren" - dass unser Teamleiter zu Recht davon ausgehen kann, dass wir in einem vernünftigen Zeitraum immer zu einer Einigung kommen, ohne uns auf Auseinandersetzungen einzulassen.

Ich möchte Sie lediglich auf der Grundlage Ihrer Sprache in Ihrem Beitrag warnen, dass es sich so anhört, als würden Sie sich dieser Situation auf eine Art und Weise nähern, die zu einem übergeordneten Streit führen könnte. Vielleicht ist es "intellektuelle Masturbation", aber es gibt wahrscheinlich einen Grund, warum er oder sie es getan hat, und die Last für Sie wird sein, einen einfacheren Weg zu finden, um dieses Problem zu lösen - und wenn es keinen solchen Weg gibt, dokumentieren Sie in Kommentaren, warum Der Masturbationscode war in der Tat notwendig.


1
"... aber es gibt wahrscheinlich einen Grund, warum er oder sie es getan hat ..." - Das ist eine große Annahme, die Sie machen. Und Sie vermissen auch den Punkt, dass die Frage besagt, dass (nach Ansicht des OP) kein Problem besteht. Sicherlich sollte die Person, die eine "Lösung" vorschlägt, die Verantwortung tragen, um zu demonstrieren, dass es ein echtes Problem gibt, das behoben werden muss. Es ist sinnlos, eine "einfachere Lösung" für ein nicht existierendes Problem vorzuschlagen.
Stephen C

4
@StephenC ja, und ich stehe zu der Meinung, dass das OP in diesem Fall den Vorteil des Zweifels geben sollte. Oder es wird eine wirklich konfrontative Überprüfung sein.
Djechlin

3

Zeigen Sie dem Absender, dass sein Code das Problem behebt. Wenn er testen und Ihnen Beweise vorlegen kann, dann sind Sie derjenige, der Unrecht hat und sollten einfach aufhören, sich zu beschweren und damit umgehen. Wenn er keine Beweise vorweisen kann, die seine Behauptung stützen, liegt ein Problem vor, und wenn er nachweisen kann, dass sein Patch das Problem behebt, schicke ich ihn zurück an die Ablage.

Natürlich könnte dies zu einer sensiblen internen Politik führen. Aber das ist der Weg, den ich gehen würde (köstlich).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.