Fürchte dich vor deinen Wünschen, sie können wahr werden.Volksweisheit.
Ein Paar wollte heiraten und ewiges Glück finden. Ich habe ihr Auto sofort nach der Hochzeit in der Kirche in die Luft gesprengt.One Wish Grant, Film Route 60.

Eine weitere philosophische Anmerkung zum Management und in diesem Fall zur Qualität besteht aus drei Teilen: sehr abstrakt, mäßig abstrakt, konkret und einer separaten Schlussfolgerung. Es kritisiert die derzeitige Praxis der Verwendung von Linter.
Ein sehr abstrakter Teil über Qualität
Zunächst möchte ich über Qualität oder vielmehr über das Qualitätsmanagement von irgendetwas sprechen, über ein Produkt im weitesten Sinne, ein Produkt als Ergebnis menschlicher Aktivität, ob es ein neues schafft (einen Code oder ein Bild schreiben, ein Raumschiff entwerfen), den Überschuss abschneiden (Skulptur) , Mahlen, Auswahl guter Früchte) oder Umwandlung (Transport, Einfrieren, Verpacken, Herstellung von Benzin und Kunststoff aus Gas).
Ein gutes Produkt hat einige Anzeichen dafür, dass es von hoher Qualität ist. Unterschiedliche Produkte haben unterschiedliche Vorzeichen. Zum Beispiel riechen gute Früchte köstlich, sehen gut aus, schmecken gut.
Jetzt werde ich ein hyperbolisches Beispiel geben und später direkt zum Code gehen.
Stellen Sie sich vor, wir haben einen Obstladen und es gibt ein Problem, unsere Früchte verkaufen sich schlechter und der Konkurrent hat direkte Verbindungen. Wir führen eine Studie durch und stellen fest, dass der Geruch in der Nähe unserer Schalter für Besucher nicht angenehm ist. Und der Geruch in den Läden eines Konkurrenten ist wie. Oh, wir haben ein Problem gefunden, einen Besucherzufriedenheitsindex nach Geruch! Lösen wir es, es gibt Aromatherapie-Marketing. Wir stellen einfach automatische Installationen in die Nähe der Regale und bekommen einen wunderbaren Geruch nach Apfelgarten. Sie haben es geschafft. Und der Kundenzufriedenheitsindex nach Geruch stieg natürlich an. Erst jetzt gibt es noch weniger Käufer.
Wenn Sie ernsthaft schauen, könnte das ursprüngliche Problem völlig anders sein:
- Unsere Konkurrenten verkaufen ebenso hochwertige Früchte, aber sie haben vor uns aromatisches Marketing betrieben und Besucher mit dem Geruch angezogen.
- Unsere Früchte sind gut, aber die Früchte der Wettbewerber sind wirklich besser als unsere (Sorten, Lagerung, was auch immer)
- Unsere Früchte sind faul. Sie sind nur verfault und stinken.
- Die Früchte des letzten Jahres, die sich hinter der Vitrine befinden, sind faul und wir hoffen, dass wir sie noch verkaufen können. Und sie stinken von dort.
- Der Konkurrent hat mehr Sortiment
- Die Konkurrenten legten ihre Früchte im Allgemeinen genauso schön aus wie unsere.
- Es ist dort dumm billiger
- Dort ist der Verkäufer wunderschön, und bei uns kam Baba Manya als Ersatz ...
Natürlich hilft uns nur im ersten Fall aromatisches Marketing. In einigen Fällen kann es helfen, aber es kann das eigentliche Problem maskieren, aber im dritten Fall wird es entweder keine Maßnahmen ergreifen oder noch mehr Ekel hervorrufen. Und oh, wie oft ist das Problem, dass die Früchte faul sind.
In der Tat ist es bei einem solchen Problem erforderlich, die Ursachen umfassend zu analysieren und jeweils eine fallspezifische Entscheidung zu treffen.
Noch hyperbolischer
Sie haben grüne Tomaten und wissen, dass nur rote verkauft werden. Keine Notwendigkeit, Tomaten zu malen. Es ist gut, dass Sie die
Reifung mit Ethylen beschleunigen können. Und es wird voll reifen, nicht malen. Wenn es unmöglich wäre, zu beschleunigen, wäre es notwendig, diese Tomaten wegzuwerfen und neue zu bekommen, die bereits gut sind.
Mit anderen Worten, wenn Sie mit der Qualität des resultierenden Produkts nicht zufrieden sind, gibt es Probleme in der Produktionskette, und Sie müssen den Prozess analysieren und ändern und dürfen ihn nicht am Ausgang malen.
Nun, du verstehst, worum es geht. Wenn etwas schlecht riecht, hilft Parfüm nicht.
Mäßig abstrakter Teil zur Codequalität
Unter den Eigenschaften von gutem Code finden wir (ohne nach Wichtigkeit zu sortieren):
- Konsistenz des Stils
- Lesbarkeit
- Leistung
- Erweiterbarkeit
- Transparenz von Architektur und Mustern.
Dies wird in erster Linie durch die Selbstdisziplin und das Können der Entwickler sowie bei vielen Entwicklern durch Vereinbarungen im Codestil und Architekturvereinbarungen (MVC, MVVM, ECS, Tausende von ihnen) erreicht.
Hochwertiger Code erschien viel früher als Linter, Konventionen und Architekturmuster.Die meisten Linter-Regeln sind rein kosmetischer Natur und lösen das Problem der Verbesserung der Lesbarkeit des Codes aufgrund der einheitlichen Anwendung kleiner und lokaler Praktiken. Die Länge der Zeilen dort, die Namen der Variablen, const, wo keine Änderungen vorgenommen werden, manchmal werden sogar Einschränkungen für die zyklomatische Komplexität von Funktionen eingeführt. Hier geht es nicht um bestimmte Regeln, sondern um die Tatsache, dass diese Regeln im Allgemeinen kosmetischer Natur sind. Sie helfen dem Code
, besser
auszusehen . Das Schlüsselwort hier ist zu
schauen .
Wenn ein Indikator als Ziel verwendet wird, verliert er seinen Wert als Werkzeug.Freie Auslegung des
Gesetzes von Goodhart .
Zeichnen wir nun eine Analogie zu Tomaten. Unsere sind nicht reif genug. Ein automatischer Linter sagt uns: "Schauen Sie hier und da ist nicht die richtige Farbe." Was wird der Programmierer tun? Sehr oft gemalt. Und das ist die Hauptidee meiner Kritik an Linter. Jetzt werde ich ein konkretes Beispiel geben und dann eine Schlussfolgerung ziehen.
Besonderheiten
PixiJS 2. Februar 2018 (vor einem Jahr).
Der Anforderungspool kommt an . Die Quintessenz ist, dass zuvor eine konstante Anzahl von Punkten verwendet wurde, um die Kurve zu zeichnen, was offensichtlich nicht optimal ist. Es wird vorgeschlagen, einen listigen Algorithmus zu verwenden, um die Länge der Kurve zu schätzen. Der Algorithmus ist keine Raketenwissenschaft, aber definitiv nicht offensichtlich. Er wurde 2013 veröffentlicht und
mit einem Artikel des Autors zitiert (es gibt Probleme mit https). Das Glück, das er allgemein auf seiner persönlichen Seite bewahrte.
Es gibt einen C-Code (16 Zeilen):
float blen(v* p0, v* p1, v* p2) { va,b; ax = p0->x - 2*p1->x + p2->x; ay = p0->y - 2*p1->y + p2->y; bx = 2*p1->x - 2*p0->x; by = 2*p1->y - 2*p0->y; float A = 4*(ax*ax + ay*ay); float B = 4*(ax*bx + ay*by); float C = bx*bx + by*by; float Sabc = 2*sqrt(A+B+C); float A_2 = sqrt(A); float A_32 = 2*A*A_2; float C_2 = 2*sqrt(C); float BA = B/A_2; return ( A_32*Sabc + A_2*B*(Sabc-C_2) + (4*C*AB*B)*log( (2*A_2+BA+Sabc)/(BA+C_2) ) )/(4*A_32); };
Der folgende Code (JS) wurde an den Anforderungspool gesendet:
_quadraticCurveLength(fromX, fromY, cpX, cpY, toX, toY) { const ax = fromX - ((2.0 * cpX) + toX); const ay = fromY - ((2.0 * cpY) + toY); const bx = 2.0 * ((cpX - 2.0) * fromX); const by = 2.0 * ((cpY - 2.0) * fromY); const a = 4.0 * ((ax * ax) + (ay * ay)); const b = 4.0 * ((ax * bx) + (ay * by)); const c = (bx * bx) + (by * by); const s = 2.0 * Math.sqrt(a + b + c); const a2 = Math.sqrt(a); const a32 = 2.0 * a * a2; const c2 = 2.0 * Math.sqrt(c); const ba = b / a2; return ( (a32 * s) + (a2 * b * (s - c2)) + ( ((4.0 * c * a) - (b * b)) * Math.log(((2.0 * a2) + ba + s) / (ba + c2)) ) ) / (4.0 * a32); }
Der Code ist vollständig in Übereinstimmung mit den Einstellungen des Linter gestaltet. Beschreibungen aller Parameter werden angezeigt, eine Verknüpfung zum ursprünglichen Algorithmus, eine Reihe von Konstanten, gemäß der Anforderung des No-Mixed-Operator-Linter: 1 Klammern sind angeordnet. Selbst für die Leistung wird die API nicht objektiv erstellt, sondern mit separaten Parametern. Daher ist sie in JS normalerweise besser.
Es gibt ein Problem. Dieser Code macht vollständigen Müll. (Ein Versuch, den auf Russisch beschissenen Ausdruck zu markieren, der in westlichen Veröffentlichungen häufig verwendet wird, um den Grad des Problems auszudrücken, und angemessen erscheint).
Das hat Linter gesagt, als er diesen Code ohne Klammern betrachtetec:\rep\pixi\pixi.js\src\core\graphics\Graphics.js
258:26 warning Unexpected mix of '-' and '*' no-mixed-operators
258:32 warning Unexpected mix of '-' and '*' no-mixed-operators
259:26 warning Unexpected mix of '-' and '*' no-mixed-operators
259:32 warning Unexpected mix of '-' and '*' no-mixed-operators
260:24 warning Unexpected mix of '*' and '-' no-mixed-operators
260:30 warning Unexpected mix of '*' and '-' no-mixed-operators
260:30 warning Unexpected mix of '-' and '*' no-mixed-operators
260:36 warning Unexpected mix of '-' and '*' no-mixed-operators
261:24 warning Unexpected mix of '*' and '-' no-mixed-operators
261:30 warning Unexpected mix of '*' and '-' no-mixed-operators
261:30 warning Unexpected mix of '-' and '*' no-mixed-operators
261:36 warning Unexpected mix of '-' and '*' no-mixed-operators
Eine riesige Länge kommt zurück und viele Punkte fallen auf. Es ist gut, dass es eine Einschränkung von oben gab, es hat funktioniert. Bisher war dieser Modus standardmäßig deaktiviert, dann aber für alle aktiviert (übrigens aufgrund eines anderen Fehlers).
Fix übrigens schon mit Füßen getreten . Ich habe den Autor des Commits nicht kontaktiert und ihn nicht gefragt, warum er beschlossen hat, die Klammern zu setzen, aber ich habe das Gefühl, dass er den Linter gestartet hat, dessen Konfigurationsdatei bereits in PixiJS enthalten ist. Dieser Linter sagte ihm, Ihr Code sei schlecht, weil ihm Klammern fehlen, fügen Sie Klammern hinzu. Die Option "No-Mixed-Operatoren" besagt, dass Sie nicht das Recht haben zu schreiben
2*2+2*2
weil es zu schlechter Lesbarkeit führen kann. Jemand hat diese Option erstellt, dann hat sie jemand in das Projekt aufgenommen, was bedeutet, dass viele Leute sie nützlich finden.
Fazit
Ich möchte nicht sagen, dass Linter böse ist, aber ich betrachte ihre Verwendung als böse. Wir (im Sinne der Menschheit) konnten die Erkennung nur eines kleinen Teils der Zeichen eines guten Codes automatisieren, hauptsächlich Kosmetika wie Klammern. Linters eignen sich gut zur Analyse der Codequalität. Sobald wir jedoch die Einhaltung der Anforderungen des Linters an den Rahmen der obligatorischen Anforderung anpassen, erhalten wir genau diese Konformität. Wir gewinnen nichts als Compliance. Auf diese Weise stellen Sie die Kamera auf ein Förderband mit Tomaten und lassen alles malen, was nicht rot genug ist. Bis wir dem Entwickler ein Tool zur Bewertung der Qualität des Erscheinungsbilds des Codes zur Verfügung stellten, konnte er einen fehlerhaften Code senden und wir konnten ihn sehen.
Jetzt wird der schlechte Code besser getarnt. Es wird einen guten nachahmen, da alle äußeren Anzeichen für guten Code darauf sind. Und wir werden den Linter als Bewertungswerkzeug verlieren, weil der gesamte Code konsistent ist. Wir hatten ein Bewertungswerkzeug, aber jetzt ist es nicht da, sondern der Code mit Klammern, obwohl manchmal nicht da, aber das sind die Details. Insgesamt
halte ich Linter für
ein cooles Werkzeug, aber nur, wenn die Einhaltung der Anforderungen kein Ziel wird .
Und ja, hier können wir sagen, dass es keine Tests gibt, dass Sie den Code nicht kopieren und einfügen müssen, dass dies eine StackOverflow-Entwicklung ist und dass Sie keinen Code in das Projekt einfügen, den Sie nicht verstehen. Das ist alles ja. Und das ist ein Zeichen für schlechten Code. Aber der Linter hat dazu beigetragen, dass er optisch mit allem anderen im Projekt vergleichbar ist. Aber der Linter wird niemals prüfen, ob Sie verstehen, was Sie gut geschrieben haben.
Mit anderen Worten, ich glaube, dass der richtige Einsatz des Linters darin besteht, ihn regelmäßig als Lead für das Projekt zu starten und zu bewerten, wie und was vor sich geht. Nun, Regeln wie mehr Klammern für den Gott der Klammern halte ich im Prinzip für schädlich. Wenn wir sehen, dass jemand einen Code von schlechter Qualität festlegt, lohnt es sich zu verstehen, warum er dies tut und dieses Problem auf einer tieferen Ebene zu lösen. Natürlich müssen Sie den Code nicht mit Ihren Händen formatieren. Ich begrüße Autoformater auf jede mögliche Weise, aber bis sie den semantischen Teil des Codes in irgendeiner Weise berühren. Wenn wir die Person zwingen, den Code mit einem Linter auf den neuesten Stand zu bringen, malen wir die grüne Tomate im Wesentlichen rot. Und es wird noch schwieriger zu verstehen sein, dass es tatsächlich grün ist. Was in Open Source-Projekten mit einer Reihe verschiedener Leute zu tun ist, ist die Frage komplizierter, aber selbst hier könnten Sie sich überlegen, was zu tun ist.
Es ist erwähnenswert, dass meine Einstellung zum Linter vor langer Zeit, vor mehr als drei Jahren, entstanden ist, aber ich konnte in der Praxis kein geeignetes Beispiel finden, als der Linter einen grausamen Witz spielte. Und so habe ich ihn gefunden. Die Tatsache, dass ich so lange danach gesucht habe, sagt, dass das Problem nicht so groß ist oder wie schwierig es ist, den negativen Effekt zu bemerken, aber ich denke, dieser Artikel wird nützlich sein. Denken Sie daran, ein Linter ist ein Werkzeug, und wie jedes Werkzeug kann es zum Nachteil und zum Wohle verwendet werden und wie Sie sich manchmal mit jedem Werkzeug schneiden können.