Was ist der tatsächliche Wert eines konsistenten Codestils?

47

Ich bin Teil eines Beraterteams, das für einen Kunden eine neue Lösung implementiert. Ich bin für die Mehrheit der Codeüberprüfungen auf der clientseitigen Codebasis (React und Javascript) verantwortlich.

Ich habe festgestellt, dass einige Teammitglieder eindeutige Codierungsmuster verwenden, sodass ich nach dem Zufallsprinzip eine Datei auswählen und feststellen kann, wer der Autor des Stils ist.

Beispiel 1 (einmalige Inline-Funktionen)

React.createClass({
  render: function () {
    var someFunc = function () {
      ...
      return someValue;
    };
    return <div>{someFunc()}</div>
  }
});

Der Autor argumentiert, dass durch Zuweisen eines aussagekräftigen Namens zu someFunc der Code leichter zu lesen ist. Ich glaube, dass durch Inlinen der Funktion und Hinzufügen eines Kommentars derselbe Effekt erzielt werden kann.

Beispiel 2 (ungebundene Funktionen)

function renderSomePart(props, state) {
    return (
      <div>
        <p>{props.myProp}</p>
        <p>{state.myState}</p>
      </div>
    );
}

React.createClass({
  render: function () {
    return <div>{renderSomePart(this.props, this.state)}</div>;
  }
});

So machen wir es normalerweise (ohne Status und Requisiten übergeben zu müssen):

React.createClass({
  renderSomePart: function () {
    return (
      <div>
        <p>{this.props.myProp}</p>
        <p>{this.state.myState}</p>
      </div>
    );
  },
  render: function () {
    return <div>{this.renderSomePart()}</div>;
  }
});

Obwohl diese Codierungsmuster technisch korrekt sind, stimmen sie weder mit dem Rest der Codebasis noch mit dem Stil und den Mustern überein, auf die Facebook (der Autor von React) in Tutorials und Beispielen hinweist.

Wir müssen ein schnelles Tempo einhalten, um pünktlich zu liefern, und ich möchte das Team nicht unnötig belasten. Gleichzeitig müssen wir auf einem angemessenen Qualitätsniveau sein.

Ich versuche mir vorzustellen, dass ich als Wartungsentwickler des Kunden mit solchen Inkonsistenzen konfrontiert bin (jede Komponente erfordert möglicherweise, dass Sie eine andere Vorgehensweise verstehen).

Frage:

Was ist der Wert, den der Kunde und seine Wartungsentwickler für eine konsistente Codebasis halten, während sich solche Inkonsistenzen möglicherweise ausbreiten können?

Andreas Warberg
quelle
50
Was ist der Wert einer konsistenten Orthographie? Permanente und konstante Beschleunigung beim Lesen und Schreiben von Texten. Was ist der Wert eines konsistenten Codestils? Permanente, konsistente Beschleunigung beim Lesen und Schreiben von Code. Was willst du noch?
Kilian Foth
9
Wenn Sie Dinge lesen, gewöhnen Sie sich an Muster in dem, was Sie lesen, und überlegen, wie Sie zukünftige Dinge lesen sollen. Wenn es keine Konsistenz gibt, kann man Muster nicht vorhersehen und es muss mehr Code interpretiert werden, was den Leser verlangsamt.
Canadian Coder
1
Joel hat einige gute Ideen zu diesem Thema. Kurz gesagt, ein guter Kodierungsstandard macht Fehler leicht erkennbar. joelonsoftware.com/articles/Wrong.html
13
Ich möchte hinzufügen, dass benannte Funktionen in JavaScript fast immer anonymen Funktionen vorgezogen werden. Beim Debuggen hilft dies einer Tonne zu bestimmen, wo Sie sich im Stapel befinden.
Mike McMahon
1
@yoniLavi das solltest du auf meta fragen.
RubberDuck

Antworten:

48

Code Transfer Vorteil

Das Befolgen der von einer Bibliothek bereitgestellten Muster Reactbedeutet in Ihrem Fall, dass das von Ihnen gelieferte Produkt von anderen Entwicklern, die ebenfalls mit React vertraut sind, problemlos abgeholt und gewartet werden kann.

Mögliche Probleme mit der Rückwärtskompatibilität

Bei einigen Bibliotheken würde eine neue Hauptversion herauskommen, und die Abwärtskompatibilität könnte beeinträchtigt werden, wenn sich die Muster erheblich unterscheiden, wodurch das zukünftige Upgrade verlangsamt / angehalten wird. Ich bin mir nicht sicher, wie ich Reactmit neuen Releases umgehen soll, aber ich habe dies schon einmal gesehen.

Neue Mitglieder im Team werden schneller produktiv

Wenn Sie den Angaben des Autors folgen, stellen Sie mit größerer Wahrscheinlichkeit talentierte Entwickler ein, die Ihr Framework verwenden, und beginnen sie schneller mit Ihrem System, anstatt neue Muster beizubringen.

Potenzielle unentdeckte Probleme

Möglicherweise gibt es in Zukunft Probleme, die Sie bei Ihrem Ansatz noch nicht entdeckt haben und die durch den Ansatz des Autors gelöst werden.

Davon abgesehen ist Innovation immer ein Risiko. Wenn Sie der Meinung sind, dass Ihr Ansatz besser ist und für Ihr Team funktioniert, entscheiden Sie sich dafür!

Alexus
quelle
Vielen Dank für diese hervorragenden Punkte. Wir folgen im Allgemeinen den von der Bibliothek bereitgestellten Mustern. Die Beispiele, die ich gegeben habe (in Code-Reviews gefunden), weichen davon ab. Ich habe mir Sorgen gemacht, dass der Kunde einen Teil unserer Lieferung ablehnen und von uns verlangen könnte, ihn erneut zu liefern, weil er nicht so aussah, als würde er reagieren. Jetzt weiß ich, warum sie das tun würden.
Andreas Warberg
2
+1 "rather than teaching new patterns"- Das prozedurale Training ist eine sehr große Zeitsenke bei Neueinstellungen.
Versuchen Sie
1
@Alexus: In Bezug auf die Abwärtskompatibilität ist React noch nicht auf Version 1.0. Die aktuelle Version 0.13 hat die Kompatibilität auf ziemlich drastische Weise beeinträchtigt. Ob diese Fehler auftreten, hängt jedoch davon ab, welcher Mechanismus zum Aufrufen von React-Komponenten verwendet wird. Sehr konsistente Regeln für das Aufrufen von React verhindern möglicherweise nicht, dass React-Upgrades den Code beschädigen. Das Korrigieren von konsistentem Code ist jedoch einfacher, schneller und zuverlässiger. Ihre Bedenken in Bezug auf Probleme mit der Abwärtskompatibilität sind im Fall von React auf jeden Fall berechtigt. Siehe z. B. meinen Kommentar zu stackoverflow.com/a/20913637/18192
Brian
53

Inkonsistenzen lassen Sie innehalten und darüber nachdenken, warum , welches und wo :

  • Wenn Sie einen Teil des Codes lesen und feststellen, dass er einen anderen Stil als der Rest des Codes verwendet, wundern Sie sich: Warum unterscheidet sich dieser bestimmte Teil? Hat es einen besonderen Grund, den ich beachten muss? Das ist gefährlich, denn wenn es wirklich einen Grund dafür gibt, dass dieser Teil anders ist, müssen Sie sich dessen bewusst sein, andernfalls können böse Fehler auftreten. Anstatt über das ursprüngliche Problem nachzudenken, das Sie veranlasst hat, diesen Code zu berühren, verschwenden Sie jetzt Zeit damit, darüber nachzudenken, warum es anders ist, und Sie können das nicht herausfinden Schlimmer noch - dabei verlieren Sie beide das mentale Modell der Probleme, an denen Sie gearbeitet haben.

    Multiplizieren Sie dies mit jedem anderen Entwickler im Team, der diesen Code berühren / lesen muss.

  • Wenn Sie einem Code hinzufügen müssen, der mehrere Stile verwendet, müssen Sie anhalten und entscheiden, welchen Stil Sie hinzufügen möchten. Sie müssen genügend wichtige Entscheidungen treffen - es ist Zeitverschwendung, über unwichtige Entscheidungen nachzudenken.

  • Wenn der Stil konsistent ist, können Sie problemlos im Code navigieren, da Sie durch die Konsistenz schnell feststellen können, wo sich die Elemente befinden. Mit inkonsistentem Stil wird sogar das Greifen schwieriger, da Sie nicht wissen, welchen Stil das Gesuchte verwendet.

Idan Arye
quelle
6
Großartige, fantastische Einsicht. Warum scheinen einige Entwickler dies nur zu "verstehen" und andere dagegen anzukämpfen?
Dogweather
2
Der Verdacht, dass ein jetzt vorgeschlagener konsistenter Stil zutiefst nicht mit dem übereinstimmt, an dem sie in früheren Projekten gearbeitet haben. Besonders für diejenigen mit viel Erfahrung in verschiedenen Umgebungen.
Kickstart
4

Der Code ist möglicherweise gut geschrieben, aber nicht perfekt konsistent, sodass es einigen Clients egal ist. Wenn die Dinge schlecht werden, wollen Sie sie noch einmal gegen Sie anstoßen? Wenn ich ein Unternehmen mit der Arbeit an einem Projekt mit mehreren Entwicklern beauftragte und sie mir nicht sagten, dass sie einen Kodierungsstandard haben und ihn befolgen, wäre ich skeptisch.

Wir müssen ein schnelles Tempo einhalten, um pünktlich zu liefern, und ich möchte das Team nicht unnötig belasten.

Solange die Codierungsstandards nicht zu verrückt sind, sollte es nicht für alle so schwer sein, an Bord zu kommen. Projekte kommen zum Stillstand, weil die Leute nicht wissen, welchen Code sie schreiben sollen oder nicht und nicht, weil sie tippen und formatieren. Sie werden wissen, dass Sie zu weit gegangen sind, wenn die Einhaltung unverhältnismäßig lange dauert. Hoffentlich ist dies nicht dein erstes Rodeo.

Führen Sie Ihren eigenen Test durch. Alles, was Sie tun müssen, ist, die Aufgaben auf halbem Weg von einem Entwickler zum anderen zu wechseln und die Datei eines anderen zu bearbeiten. Verbringen sie Zeit damit, Dinge komplett auf ihre Version umzustellen? Ist es zu schwer zu folgen? Für das Wartungsteam Ihres Kunden wird es noch schlimmer.

JeffO
quelle
2

Ich hatte viel Glück beim Behandeln von Codestilen, genau wie beim Behandeln von Schreibstilen in natürlichem Englisch. Es gibt eine breite Palette von Stilen, von Konversationsenglisch, das die Art und Weise nachahmt, wie wir im täglichen Gespräch sprechen, bis hin zu formellem Englisch, das oft schwerfällig und von immer sehr präziser Bedeutung ist.

Überlegen Sie, wie das Endprodukt in diesem Sinne aussehen soll. Einige Situationen unterstützen die Verwendung der jeweils besten Struktur. Andere erfordern eine einheitliche Trittfrequenz und Struktur. Dies gilt insbesondere dann, wenn Ihr Produkt das Beste ist, als ob es in formellem Englisch verfasst wurde. Umgangssprache mag in diesem Fall hilfreich sein, aber sie zerreißt das übergreifende Gefühl des Produkts.

Je konsistenter Ihr Codierungsstandard ist, desto weniger Aufwand muss ein Entwickler betreiben, um seine Aufmerksamkeit auf etwas Interessantes zu lenken. Wenn Sie eine große Vielfalt an Codierungsstandards unterstützen, müssen Entwickler lauter sein, wenn sie mitteilen, dass sie etwas Ungewöhnliches oder Einzigartiges tun. Dieser Versuch, das auszudrücken, was ein Entwickler für wichtig hält, kann häufig den dynamischen Bereich des Codes selbst überschatten. Wenn dies passiert, kann es leicht passieren, dass Fehler überspringen, da sie einfach zu schwer zu erkennen sind.

Je lockerer Ihre Codierungsstandards sind, desto mehr Freiheit haben Entwickler, ihre Syntax an das Problem anzupassen. Im ironischen Gegensatz zum Argument der Pro-Coding-Standards kann eine zu starke Standardisierung zu einer verkrüppelten Codestruktur führen, die auch das Durchrutschen von Fehlern erleichtert.

Was Sie suchen, ist das glückliche Medium Ihres eigenen Teams.

Cort Ammon
quelle
2

Wie einige andere bereits betont haben, wird ein Codeabschnitt in einem anderen Stil dazu führen, dass die Wartungsentwickler anhalten und herausfinden, was an diesem Abschnitt besonders ist. Es besteht auch die sehr reale Gefahr, dass der inkonsistente Stil auf andere Abschnitte übertragen wird, was später zu einem großen Durcheinander führt.

Ich habe den Eindruck, dass Sie die Antwort auf diese Frage tief im Inneren bereits kennen und Sie sich nicht einmal damit auseinandersetzen würden, wenn dies nicht so wäre:

Wir müssen ein schnelles Tempo einhalten, um pünktlich zu liefern, und ich möchte das Team nicht unnötig belasten.

Dies scheint immer der universelle Kompromiss zu sein ... es schnell zu machen oder es richtig zu machen. Nur Sie können die Konsequenzen der Beeinträchtigung der guten Codierungspraxis für die Änderung der Kundenfristen abschätzen. Allerdings muss ich JeffO zustimmen, wenn er feststellt, dass das Befolgen eines (möglicherweise ungewöhnlichen oder nicht intuitiven) Codierungsstils Ihr Team nicht so drastisch verlangsamen sollte, dass die Fristen erheblich verkürzen.

Obwohl ich das Konzept seit Jahren kenne, habe ich erst vor kurzem den Begriff " technische Schulden " gelernt . Sie müssen wirklich die technischen Schulden berücksichtigen, die letztendlich bezahlt werden müssen, wenn Sie jetzt nicht diszipliniert vorgehen.

Leider ist es für eBusiness schwierig, den Wert konsistenter Codierungsstandards einzuschätzen, es sei denn, Ihr Kunde ist technisch besonders versiert oder wird den Code später selbst pflegen. Jeder vernünftige Geschäftsmann sollte jedoch in der Lage sein, das Konzept zu verstehen, dass "ein bisschen vorbeugende Wartung jetzt" (in Form einer guten Codierung) "dazu beiträgt, erhebliche Reparaturkosten später zu vermeiden" (in Form von verschwendeter Entwicklerzeit späterer Reinigung des Computers) Chaos).

Michael C
quelle
Der Kunde ist technisch versiert und wird höchstwahrscheinlich irgendwann die Wartung und Weiterentwicklung der Lösung übernehmen. Die bisherigen Fragen und Antworten konzentrierten sich auf das visuelle Layout und nicht so sehr auf die Funktionalität. Sobald Funktionsstörungen auftreten, werden wir ein Gefühl dafür bekommen, wie Wartung ist. Ich denke, Code-Überprüfungen wären schneller und konsistenter (reduzieren Sie überraschende neue Möglichkeiten, das Gleiche zu tun). Der Kunde wünscht sich offensichtlich die maximale Konsistenz (zahlt aber möglicherweise nicht extra dafür).
Andreas Warberg
2

Die hier aufgeführten Antworten wiederholen die leicht verständlichen theoretischen Best Practices, die detailliert beschreiben, wie wir alle unsere Codebasen haben möchten. Aber echter Code sieht irgendwie nie so aus. Wenn Sie versuchen, diese perfekte Codebasis zu erstellen, werden Sie fast zwangsläufig scheitern. Das heißt nicht, dass wir nicht versuchen sollten, es besser zu machen, aber es muss eine Grenze dafür geben, wie weit wir von dem realistisch Erreichbaren entfernt sind, das wir uns zum Ziel gesetzt haben.

Wenn Sie sich zu sehr auf kleinere Dinge konzentrieren, besteht die Gefahr, dass Sie sich nicht mehr auf wichtigere Themen konzentrieren, z. B. darauf, wie Sie den Job insgesamt am effizientesten lösen können.

Ich würde Sie als erstes Beispiel nicht als Stil bezeichnen, Stil ist die Wahl, bei der es kein klares Richtig oder Falsch gibt. In diesem Fall ist die zusätzliche Funktion Code Bloat ohne Kopf. Es sind nur zwei zusätzliche Zeilen, die immer noch leicht zu lesen und zu korrigieren sind, sodass dieses Beispiel selbst kein großes Problem darstellt.

Das weitaus größere Problem ist das Aufblähen von Code. Wrapper-Funktionen, Klassenhierarchien und alle möglichen anderen Konstrukte, bei denen der umgebende Code so komplex ist, dass es nicht offensichtlich ist, dass sie keinem wirklichen Zweck dienen. Wenn der Code offensichtlich aufgedunsen ist, gibt es wahrscheinlich viel mehr nicht offensichtliche Aufgedunsenheit. Es ist viel schwieriger, etwas zu tun und es ist schwerer zu erkennen, aber auch ein weitaus größeres Problem.

Über Kunden

Kunden tendieren dazu, sich auf ein funktionierendes Produkt zu konzentrieren, das ihre Anforderungen erfüllt. Selbst wenn Sie einen der wenigen Kunden haben, die sich Sorgen um die Codequalität machen, wird dies eine sekundäre Priorität haben, und ihre Vorstellung von der Codequalität stimmt möglicherweise nicht perfekt mit Ihrer überein. Die Kundenfirma hat zwar eigene Programmierer, aber das Management entscheidet immer noch, ob Sie gute Arbeit geleistet haben oder nicht, und das Management weiß höchstwahrscheinlich nicht einmal, was Codequalität bedeutet.

aaaaaaaaaaa
quelle
Wenn ich Code überprüfe, suche ich nach einigen Dingen, von denen ich glaube, dass sie definitiv wichtig sind, wie direkte DOM-Manipulation, nicht lokalisierte benutzerbezogene Zeichenfolgen, Möglichkeiten zur Wiederverwendung (eine vorhandene Komponente, ein Hilfsprogramm, eine bereits geladene Bibliothek von Drittanbietern usw.), inkompatible oder nicht ordnungsgemäße Änderungen zu Shared Code, Abweichung von den Kunden- und Teamkonventionen. Der Wert der Konsistenz von Stil und Codierungsmustern war mir nicht klar, daher war ich mir nicht sicher, wie ich auf diese in Codereviews reagieren sollte.
Andreas Warberg
0

Es geht sehr viel um die Lesbarkeit der Unterschiede. Wenn der Codestil herumwirbelt, werden durch die Diffs Änderungen ausgeblendet, die keine semantische Bedeutung für das Programm haben, und Zusammenführungen können schwierig oder unmöglich werden.

rauben
quelle