Wie überprüfe ich Code, den ich nicht verstehe?

25

Mir wurde die Aufgabe übertragen, die Entwicklung in unserem Unternehmen zu verbessern. Das erste, was ich starten wollte, waren Codeüberprüfungen, da dies hier noch nie zuvor durchgeführt wurde.

Es gibt 3 Programmierer in unserer Firma. Ich bin ein Webprogrammierer, meine bekannten Sprachen sind hauptsächlich PHP, ActionScript und JavaScript. Die anderen 2 Entwickler schreiben interne Anwendungen in VB.net

Wir machen jetzt seit ein paar Wochen Code-Reviews. Ich finde es schwer, VB-Code zu verstehen. Wenn sie also sagen, was es tut, muss ich größtenteils nur ihr Wort dafür nehmen.

Wenn ich etwas sehe, das falsch aussieht, erkläre ich meine Meinung und erkläre, wie ich es in einer der Sprachen ansprechen würde, die ich kenne.

Manchmal sind meine Vorschläge begrüßt , aber oft mir Dinge gesagt wie : „Das ist der beste Weg , es in zu tun , diese Sprache“ oder „das gilt nicht für diesen Sprache" oder ähnliche Dinge dieser Art.

Das mag stimmen, aber ohne die Sprache zu kennen, bin ich mir nicht sicher, wie ich diese Behauptungen bestätigen oder widerlegen soll.

Ich weiß, dass eine mögliche Lösung darin besteht, vb zu lernen, damit ich bessere Codeüberprüfungen durchführen kann. Ich habe wirklich kein Interesse daran, vb zu lernen (zumal ich eine Liste anderer Technologien habe, die ich für meine eigenen Projekte zu lernen versuche) und möchte dies als letzten Ausweg behalten, aber es ist eine Option.

Eine andere Idee, die mir gekommen ist, ist, dass sie beide Interesse an C # haben und ich auch. Es ist relativ zu ihnen, weil es .net ist und relativ zu mir, weil es den Sprachen ähnlicher ist, die ich kenne. Dennoch ist es für uns alle neu. Ich dachte darüber nach, welche Vorteile es für uns alle hat, an einem C # .net-Projekt mitzuarbeiten und den Code des jeweils anderen zu überprüfen.

Ich denke, es gibt auch die Möglichkeit, einen Berater zu beauftragen, der uns einige Code-Reviews gibt.

Was würdest du mir in dieser Situation empfehlen?

JD Isaacks
quelle
6
Fällt es Ihnen schwer , VB-Code zu verstehen? bist du sicher? lass mich das nochmal fragen bist du dir sicher! :)
Darknight
4
Sie haben kein Interesse daran, VB zu lernen? Dann sollten Sie wahrscheinlich die Aufgabe ablehnen, Codeüberprüfungen von VB-Code durchzuführen!
JacquesB

Antworten:

22

Ihr persönlicher Wunsch, andere Dinge zu lernen, sollte dahinter zurückstehen, was Sie tatsächlich gerade für Ihren Job benötigen. Lerne VB.net. Sie können effektiv Code überprüfen, den Sie nicht verstehen, wenn Sie die Sprache kennen, in der er sich befindet, indem Sie viele Fragen stellen Warum). Wenn Sie den Code jedoch nicht verstehen, ist das Beste, was Sie tun können, dass sie ihn Ihnen erklären und hoffen, dass sie alle Fehler während des Erklärungsprozesses erkennen. Nicht, dass ich auf diese Weise in einer Überprüfung keine Fehler in meinem eigenen Code gefunden hätte, aber es ist nicht die effektivste Methode zur Codeüberprüfung. Die Codeüberprüfung ist jetzt Teil Ihrer Arbeit. Beschäftigen Sie sich damit und lernen Sie, was Sie brauchen, um es effektiv zu machen.

Während Sie lernen, lassen Sie sich von ihnen eine Quelle zeigen, die besagt, dass es sich um eine gute Technik handelt, wenn sie sagen, dass dies nicht so ist, wie wir es in dieser Sprache tun. Es liegt an ihnen, Sie in einer Codeüberprüfung zu rechtfertigen, nicht umgekehrt. Die Sprache wird auch besser, sobald Sie diese Links sehen.

HLGEM
quelle
5
+1 Um zu lernen, was Sie lernen müssen, anstatt was Sie lernen möchten. Am liebsten beide - Sprachen lernen ist eine schnelle Sache.
Orbling
1
+1: In Bezug auf "Lassen Sie sich von ihnen zeigen" ist die sanftere Art zu fragen, ob sie Bücher haben oder so, in denen diese Prinzipien erklärt werden, damit Sie auch lernen können. Es ist dasselbe, nur weniger angreifend. Und die Leute wollen nicht angegriffen werden.
Joris Meys
@Joris Meys, ja, du kannst und solltest es höflich tun, aber sie müssen dazu gedrängt werden, dir zu antworten, bevor du die Code-Pässe zertifizieren kannst, wenn sie auf "weil ich es gesagt habe" zurückgreifen.
HLGEM
1
@ Jeff O: Ich betrachte Höflichkeit nicht immer als Privileg. In einer Arbeitsumgebung ist es auch ein wichtiges Werkzeug, um das zu bekommen, was Sie wollen. Oder eine Nachricht auf eine Weise durchzubringen, die schwer zu kontern ist. Niemand kann Sie als höflich bezeichnen ...
Joris Meys
1
@ Jeff O, höflich zu sein bedeutet nicht, eine Fußmatte zu sein. Es bedeutet, professionell und neutral zu fragen. Sie können auf einer Antwort bestehen, ohne unhöflich zu sein. Unhöflichkeit ist am Arbeitsplatz niemals angebracht. Sie werden immer mit Leuten arbeiten müssen, die Sie nicht mögen oder die Sie wütend machen, aber es ist niemals angebracht, sich ihnen gegenüber schlecht zu verhalten. Wenn Sie dies tun, ist die Hauptperson, die Sie verletzen, Sie selbst, weil andere ihren Respekt für Sie verlieren.
HLGEM
13

Eigentlich bin ich mit all dem nicht einverstanden. Mit JS / PHP / ActiopnScript haben Sie ein grundlegendes Verständnis dafür, was eine Programmiersprache hat und wie sie funktioniert. Tatsächlich würde ich argumentieren, dass es viele Ähnlichkeiten zwischen VB und JS gibt. Das ist jedoch nicht mein Punkt. Selbst wenn Sie mit der Sprache sehr kompetent sind, ist es leicht, etwas zu übersehen, wenn Sie versuchen, den Denkprozessen eines anderen zu folgen. Daher sollte die Überprüfung dem Programmierer die Möglichkeit bieten, zu erklären, was (s) er getan hat und warum.

Ein Freund hat dies einmal als "The Janitor Theory" beschrieben: Indem er jemandem, selbst dem Hausmeister, die Details erklärt, deckt der Programmierer Schwachstellen im Code für sich selbst auf, was natürlich das ultimative Ziel der Überprüfung ist verarbeiten. Es erfordert jedoch, dass der Code gründlich und offen erklärt wird (Überprüfungen funktionieren nicht, wenn die Entwickler defensiv sind).

fishywiki
quelle
4
+1 Für die Hausmeistertheorie - was ich normalerweise als "Resonanzboden" bezeichne - ist jeder, der zuhören und Fragen stellen kann, gut, auch wenn er nur da steht, es hilft.
Orbling
1
Der Schlüssel ist, dass alle miteinander reden und zusammenarbeiten. Stellen Sie Ihr Team nicht in die Defensive - nichts kann die Produktivität schneller beeinträchtigen als jeder, der für sich selbst arbeitet.
IAbstrakter
7

Sie haben den Fokus auf das Problem verloren und eine schlechte Lösung gefunden. Sie haben die Aufgabe, die Entwicklung zu verbessern, und Ihre Lösung besteht darin, eine Person mit der Codeüberprüfung zu beauftragen (Sie selbst), die die Sprache nicht versteht. Wer überprüft Ihren Code? Warum können sie sich nicht gegenseitig überprüfen, bis Sie die Sprache gelernt haben?

Es muss einen anderen Problembereich geben, der für eine sofortigere Verbesserung ausgewählt werden könnte. Auf diese Weise blasen sie nur Rauch auf dich und nichts verbessert sich.

Es wird lange dauern, bis Sie die Neuentwicklung auf eine Sprache umgestellt haben, die keiner von Ihnen versteht (C #). Dies zahlt sich vor allem dann aus, wenn Sie alle Ihre schlechten Gewohnheiten mitbringen.

Fokus auf Design (das wurde schon erwähnt.) Wenn sie Probleme haben, den aktuellen Code zu verwalten, schauen Sie sich einige Refactoring-Tools für VB an. Viele der grundlegenden Praktiken sind gleich.

JeffO
quelle
6

Die kurze Version

  1. Denken Sie daran, dass Code-Überprüfungen sowohl für den Überprüfer als auch für den Benutzer eine Chance darstellen , etwas zu lernen.
  2. Phrasenfeedback als Frage.
  3. Lassen Sie sich nicht von mangelndem Wissen davon abhalten, Feedback zu geben (solange Sie Schritt 2 ausführen).
  4. Vermeiden Sie "Präferenzprüfungen" oder machen Sie zumindest klar, dass es sich um Ihre eigenen persönlichen Präferenzen handelt und dass diese nicht unbedingt einer Meinung sein müssen.
  5. Versuchen Sie, Patches einzureichen, anstatt ein "Armchair Code Reviewer" zu sein.

Die längere Version

Denken Sie zuallererst daran, dass die Codeüberprüfung nicht nur eine Gelegenheit für den Überprüfer ist, dies zu lernen. Es ist auch eine Gelegenheit für den Rezensenten zu lernen. Tatsächlich habe ich von mehreren Organisationen gehört, die neue Programmierer dazu veranlassen, Codeüberprüfungen durchzuführen, damit sie ein Gefühl für den Code bekommen.

Vor diesem Hintergrund gibt es einen Ratschlag zur Codeüberprüfung, den ich im Allgemeinen immer für nützlich befunden habe, der jedoch für Ihre Position von besonderer Bedeutung ist. Formulieren Sie Ihr Feedback nicht als Aussage, sondern in Form einer Frage. Mit anderen Worten, anstatt "Dieser Code ist zum Kotzen!" Zu sagen, könnte man sagen "Warum haben Sie den Code auf diese Weise geschrieben, anstatt zu tun ..." Dies macht den Codeüberprüfungsprozess angenehmer und ermöglicht es Ihnen, auch zu lernen.

Ein weiterer Ratschlag, den ich Ihnen geben kann, ist, dass Sie sich von Ihrem mangelnden Wissen nicht wieder unterkriegen lassen. Wenn Sie etwas sehen, das Sie als falsch empfinden, und Sie eine handgewellte Antwort vom Rezensenten erhalten, machen Sie keinen Rückzieher (zumindest nicht aufgrund mangelnden Wissens). Denken Sie daran, was einen guten Code in einer Sprache ausmacht, unterscheidet sich selten von dem, was einen guten Code in einer anderen Sprache ausmacht. Ja, bestimmte Sprachen haben unterschiedliche Redewendungen, um Ihnen beim Schreiben von gutem Code zu helfen. Es ist jedoch wichtig zu wissen, dass diese Redewendungen eher Werkzeuge als Selbstzweck sind .

Versuchen Sie als nächstes, "Präferenzprüfungen" zu vermeiden. Daran muss ich (und viele andere) sehr bewusst arbeiten. Mit anderen Worten, vermeiden Sie Überprüfungen nach dem Motto "Sie haben x , aber ich bevorzuge y ". Nun, es ist nichts Falsches daran, Präferenzen anzugeben, aber Sie sollten sie eindeutig als solche kennzeichnen und notieren, dass die andere Partei anderer Meinung sein kann. Dies ist wichtig, da die meisten sprachlichen Unterschiede in diese Kategorie fallen.

Verwendet ihr schließlich ein verteiltes Versionskontrollsystem? Eine Sache, die helfen könnte, ist, anstatt nur zu bemerken, was mit dem Code nicht stimmt, den Code so umzuschreiben, wie Sie ihn geschrieben hätten, ihn zu testen und dann einen Patch dafür einzureichen. Dies hilft zu zeigen, dass Sie wirklich daran interessiert sind, ihren Code zu verbessern und nicht nur ein "Armchair Code Reviewer" zu sein, und gibt Ihnen die Möglichkeit, die Sprache besser zu lernen. Außerdem ist es in der Regel einfacher, mit "Ich denke, Sie sollten das tun" nicht einverstanden zu sein, als mit "So hätte ich das gemacht, und hier ist ein Patch, wenn Sie einverstanden sind". Ich nehme an, Sie müssen nicht unbedingt brauchen eine DVCS für diese, aber es hilft sicherlich.

Jason Baker
quelle
Zu den "Einstellungen": Stellen Sie sich vor, ich habe den Code geschrieben, Sie haben ihn überprüft und ich musste ihn aufgrund Ihrer Einstellungen ändern. Jetzt nehmen Sie eine kleine Änderung vor, ich überprüfe sie und ich veranlasse Sie, alles aufgrund meiner Vorlieben zurück zu ändern. Es sollte offensichtlich sein, dass dies extremer Unsinn ist.
gnasher729
5

Sie können Dinge, die Sie nicht wirklich kennen, "Korrekturlesen", aber nicht ausreichend überprüfen . Ich bin sehr kompetent in C, kenne C ++ ziemlich gut, aber ich würde nicht davon träumen, etwas in C # zu wiederholen.

Ich glaube nicht, dass Sie so weit gehen müssen, einen Berater hinzuzuziehen, da einige Unternehmen darauf spezialisiert sind, Ihren Code tonnenweise zu testen und Ihnen zu sagen, was möglicherweise daran falsch ist.

Es wäre jedoch Sache des einzelnen Entwicklers, der die Sprache kennt, um das Ergebnis zu interpretieren. Wenn mich zum Beispiel ein Code-Prüfer beschimpfte, den Rückgabewert von nicht zu verwenden printf(), schaute ich sie seltsam an und stellte ihre Nüchternheit in Frage. Dann fragte ich "Ok, großartig, was kann ich tun, wenn nichts auf der Konsole ausgegeben werden kann, was dies würde sei hilfreich?"

Möglicherweise möchten Sie mit Ihren Vorgesetzten über die Einrichtung von Abteilungen und Teamleitern sprechen, damit Sie in Ihrer Domäne effektiv sind, während jemand anderes in seiner Domäne effektiv ist.

Trotzdem denke ich, dass Sie möglicherweise einen Dritten für die Prüfung heranziehen können. Die meisten Programmierer, die ihr Salz wert sind, werden berechtigte Bedenken berücksichtigen, auch wenn sie die Hälfte als Schwindel abtun (wie ich es in meinem printf()Beispiel getan hätte ).

Tim Post
quelle
4

Eine Anleitung für etwas zu geben, das Sie nicht verstehen, ist, wie Sie wissen, mit dem Führen eines Blinden vergleichbar.

Ein Ansatz wäre die Verwendung von Flusenwerkzeugen wie FxCop und StyleCop, die sich mit der statischen Analyse der Codebasis befassen. Dies bietet Ihnen einen Ausgangspunkt für die Diskussion der Berichte, die aus den Tools generiert werden.

Ein anderer Ansatz wäre, die Codeüberprüfungen in Entwurfsüberprüfungen umzuwandeln. Design Reviews decken oft Probleme auf, lange bevor der Code überhaupt geschrieben wurde. Wenn ein Programmierer ein Design hat, mit dem er arbeiten kann, ist sein Ansatz im Allgemeinen viel effizienter, und die Anzahl der Fehler nimmt daher ab. Wenn ein Design nicht existiert, wird es im Ansatz ad-hoc und der Code leidet mit zunehmender Fehleranzahl. Ermitteln Sie die Probleme in der Entwurfsüberprüfung, bevor sie in der Codeüberprüfung auftauchen, indem Sie sicherstellen, dass jeder von Ihnen einen konkreten Entwurf zur Implementierung hat. UML ist hier Ihr Freund und Tools wie umlet sind schnell und einfach zu bedienen.

Aaron McIver
quelle
4

Die schlechte Nachricht ist, dass Sie VB lernen müssen, um effektiv an Code-Reviews teilnehmen zu können. Es wird auch hilfreich sein, VB in einer Art Projekt zu verwenden (nicht unbedingt für die Produktion).

Die gute Nachricht ist, dass, wenn Sie dies getan haben, einiges von dem, was Sie gelernt haben, immer noch nützlich ist, wenn Sie zu C # wechseln.

Larry Coleman
quelle
9
Das Lesen von VB ist nicht dasselbe wie das Kennen von VB. Ich habe VB gut genug gelesen, um alten VB-Code in Java umzuschreiben. Ich schreibe nicht (und kann nicht) VB. Ich denke, es gibt einen Mittelweg, um genug VB zu lernen .
S.Lott
1
@ S.Lott - gut artikuliert und durchaus auf zwei beliebige Sprachen anwendbar.
Tim Post
2
@ S. Lott: Wenn Sie VB gut genug lesen kann es in Java neu zu schreiben, dann sind Sie tun VB wissen, und es kann schreiben. Möglicherweise müssen Sie unterwegs nachsehen, aber das würde nur ein paar Wochen dauern.
Larry Coleman
@ Larry Coleman: Ich vermute, du kennst VB ziemlich gut. Ich konnte es nicht schreiben. Ja wirklich. Ich bin ein Python / Java-Programmierer und die Einschränkungen und Verrücktheiten von VB verwirren mich. Viel. Ich würde nicht einfach nach der Syntax suchen. Ich wäre ziemlich unfähig, richtige Programme zu schreiben, weil ich einfach nicht so zu denken scheine.
S.Lott
@S.Lott: Ich kenne VB recht gut, obwohl ich mich bemüht habe, es zu vergessen. Wenn VBs Verrücktheit / Einschränkungen Sie verwirren, würde das dann nicht auch Probleme verursachen, wenn Sie Code in eine andere Sprache portieren?
Larry Coleman
3

Der Gedanke, den Sie beim Peer Review immer behalten sollten, ist:

"ICH BIN DER NÄCHSTE, DER DIESEN CODE BEIBEHÄLT!"

Sie müssen es gut genug verstehen, um dies als Teil Ihrer Vorbereitung auf die Überprüfung zu können, und es ist Ihre Aufgabe, den ursprünglichen Programmierer auf Mängel aufmerksam zu machen, die es umständlicher als nötig gemacht haben, den Code gut genug zu verstehen, um ihn zu warten .

Wenn Sie nicht in VB programmieren können, können Sie den Code nicht verwalten und sind nicht als Peer-Reviewer qualifiziert.


quelle
1

Sie sollten keinen Code überprüfen, den Sie nicht verstehen. Das ärgert nur die Entwickler, die jedes seltsam aussehende Ding erklären müssen, das sie getan haben.

Was Sie tun können, wählen / definieren Sie Codierungsrichtlinien und überprüfen Sie den Code anhand dieser Richtlinien. Wenn etwas nicht den Richtlinien entspricht, können Sie den Entwickler um Erklärung bitten.

Ich würde mit der Auswahl bestehender Richtlinien beginnen (ich kenne keine VB.net-Codierungsstandards, aber Google gab mir:

Verwenden Sie stylecop-ähnliche Tools für VB .net

Analysieren Sie die Quellen mit NDepend (es gibt Regeln für die zyklomatische Komplexität, Länge, Tiefe usw.)

Wenn Sie das getan haben, können Sie sagen, dass der Code den gewählten Standards entspricht, es sagt nichts darüber aus, dass die Funktionalität korrekt ist oder der Code die richtigen OOP-Prinzipien verwendet. Aber zumindest ist es etwas.

KeesDijk
quelle
1

Bei einer guten Codeüberprüfung geht es um Dinge, bei denen Sie die Sprache verstehen müssen - die richtige Verwendung der Sprache, der APIs und Bibliotheken, des Stils, der Variablennamen usw. - und darum, wie gut der Code das Problem löst - gute Kommentare, die richtige Architektur und das relevante Design Wenn Sie zum ersten Mal Code-Reviews durchführen, konzentrieren Sie sich in der Regel auf die ersteren. Sie sind leichter zu sehen und leichter anzuziehen. (Ich mag zB Ihre Variablennamen nicht. Sie sollten XXXX-Stilnamen verwenden.)

Die Codeüberprüfung wird wertvoller, wenn mehr darauf geachtet wird, wie gut der Code Probleme löst. Da Sie im ersten Bereich nicht so viel Wert schaffen können, konzentrieren Sie sich darauf, Fragen zu stellen und Ratschläge zur Lösung des Problems zu geben, nicht darauf, wie es hergestellt wurde.

Natürlich gibt es eine Überlappung zwischen den beiden. Wenn Sie VB.NET kennen, können Sie sich beraten lassen, warum ein bestimmtes Entwurfsmuster beispielsweise in einer bestimmten Situation keine gute Wahl ist.

Seien Sie in dieser Phase vor allem demütig. Der Änderungsprozess ist schwierig. Selbst wenn Sie ein VB.NET-Guru wären, wäre die Änderung wahrscheinlich nicht einfach. Leute, die die Codeüberprüfung nicht verwendet haben, mögen sie zunächst nicht. Andere dazu zu bringen, sich Ihren Code anzusehen, ist eine schwierige Erfahrung. Es braucht Zeit, um den Wert und die Geduld zu erkennen. Es ist ein großartiger Prozess, wenn Sie ein Buy-In erhalten, aber es wird einige Zeit dauern.

Wayne Johnston
quelle
0

Könnten Sie den Fokus mehr auf Tests richten, anstatt den Code direkt zu betrachten? Ich sage nicht, dass die Codeüberprüfungen aufgegeben werden sollen, aber anfangs ist es möglicherweise sinnvoller, diese internen Apps mit genügend Tests auszustatten, die dabei helfen können, einige der Vorgänge zu dekodieren. Die Idee dabei ist, dass die Tests Ihnen auch dabei helfen könnten, sich mit einigen Funktionen vertraut zu machen. Ich sehe das nur als einen anderen Weg. Die Idee dabei ist, dass die Reviews später wiederkommen und in ein paar Teilen durchgeführt werden können, da es sich lohnen kann, einen Überblick / eine Vorab-Sitzung zu haben und dann eine kleine Pause einzulegen. Diese Pause dauert bis zum nächsten oder zweiten Tag, so dass genug Zeit für alle bleibt, die nachts über den Code oder etwas Ähnliches nachdenken möchten, bevor sie mit Fragen zurückkehren und eine Diskussion führen.

Natürlich, wenn Sie bereits Tests haben, ist dies leider nicht so aussagekräftig. Der andere Gedanke ist, ein Beispiel dafür zu geben, wo sie behaupten, dass dies in VB.Net auf eine bestimmte Weise geschieht, da dies dazu beitragen könnte, diese Frage in einer Weise klarer zu machen, wie ich es mir vorstellen kann, von kleinen Codestandards zu Teilen zu variieren das Herzstück dessen, wie VB.Net in gewissem Sinne aufgebaut wurde.

JB King
quelle
0

Selbst wenn Sie die Grundlagen von VB kennen, können Sie die Verwendung unsicherer Funktionen in der Sprache nicht erkennen, wenn Sie eine Codeüberprüfung durchführen, ohne alle Funktionen der Sprache zu kennen.

Angenommen, Sie wussten nicht, dass die input () - Funktion in Python 2 die Eingabe tatsächlich ausgewertet hat, bevor sie zurückgegeben wurde, um das Parsen von Eingabetypen zu vereinfachen, die keine Zeichenfolgen sind. In diesem Fall ist der Code für die Ausführung willkürlichen Codes anfällig, sodass der Benutzer so etwas wie __import__('os').execl('/bin/sh', '/bin/sh')auf einem Linux-System eingeben kann , um den Python-Prozess in eine Shell umzuwandeln. Stattdessen sollte raw_input () verwendet werden, um die unverarbeiteten Eingabedaten abzurufen.

Der Versuch, eine Codeüberprüfung durchzuführen, ohne alle Funktionen der Sprache zu kennen, kann nicht nur verhindern, dass Sie einen besseren Weg finden, ein bestimmtes Verfahren in der Sprache durchzuführen. es könnte auch zu nachteiligen Sicherheitsmängeln führen.

Arcanum
quelle