Ayez peur de vos désirs, ils peuvent se réaliser.Sagesse populaire.
Un couple a souhaité se marier et trouver le bonheur éternel. J'ai fait exploser leur voiture à l'église immédiatement après le mariage.One Wish Grant, film Route 60.

Une autre note philosophique sur la gestion, et dans ce cas la qualité, se compose de trois parties: très abstraite, modérément abstraite, concrète et une conclusion séparée. Il critique la pratique actuelle d'utilisation du linter.
Une partie très abstraite sur la qualité
Tout d'abord, je veux parler de la qualité, ou plutôt de la gestion de la qualité de tout, d'un produit au sens large, d'un produit résultant de l'activité humaine, qu'il s'agisse d'en créer un nouveau (écrire un code ou une image, concevoir un vaisseau spatial), couper l'excès (sculpture , mouture, sélection de bons fruits), ou transformation (transport, congélation, emballage, production d'essence et de plastique à partir de gaz).
Un bon produit a des signes de haute qualité. Différents produits ont des signes différents. Par exemple, les bons fruits sentent bon, ont fière allure, ont bon goût.
Maintenant, je vais donner un exemple hyperbolique, et plus tard j'irai directement au code.
Imaginez que nous avons un magasin de fruits et qu'il y a un problème, nos fruits ont commencé à se vendre moins bien et le concurrent a des lignes directes. Nous menons une étude et découvrons que l'odeur près de nos comptoirs n'est pas agréable aux visiteurs. Et l'odeur dans les magasins d'un concurrent est comme. Oh, nous avons trouvé un problème, un indice de satisfaction des visiteurs par l'odeur! Résolvez-le, il y a du marketing d'aromathérapie, nous allons simplement installer des installations automatiques près des étagères et obtenir une merveilleuse odeur de verger. Ils l'ont fait. Et l'indice de satisfaction client par l'odeur a naturellement augmenté. Seulement maintenant, il y a encore moins d'acheteurs.
Si vous regardez sérieusement, le problème d'origine pourrait être complètement différent:
- Nos concurrents vendent des fruits tout aussi de haute qualité, mais ils ont fait du marketing aromatique avant nous et ont attiré des visiteurs avec l'odeur.
- Nos fruits sont bons, mais les fruits des concurrents sont vraiment meilleurs que les nôtres (variétés, stockage, peu importe)
- Nos fruits sont pourris. Ils ont juste pourri et puent.
- Les fruits de l'an dernier, qui se trouvent derrière la vitrine, sont pourris, et nous espérons pouvoir encore les vendre. Et ils puent à partir de là.
- Le concurrent a plus d'assortiment
- Le concurrent a joliment présenté ses fruits, en général, les mêmes que les nôtres.
- C'est bêtement moins cher là-bas
- Là, le vendeur est beau, et chez nous Baba Manya est venu se substituer ...
Évidemment, ce n'est que dans le premier cas que le marketing aromatique nous aidera. Dans certains cas, cela peut aider, mais cela peut masquer le vrai problème, mais dans le troisième, il ne prendra aucune mesure ou provoquera encore plus de dégoût. Et oh, combien de fois le problème est que le fruit est pourri.
En fait, lorsqu'un tel problème se pose, il est nécessaire d'analyser de manière approfondie les causes et, dans chaque cas, de prendre une décision spécifique au cas.
Encore plus hyperbolique
Vous avez des tomates vertes et vous savez que seules les rouges sont vendues. Pas besoin de peindre les tomates. Il est bon que vous puissiez
accélérer la maturation avec de l'éthylène . Et ce sera la pleine maturation, pas la peinture. S'il était impossible d'accélérer, il faudrait alors jeter ces tomates et en obtenir de nouvelles, déjà bonnes.
En d'autres termes, si vous n'êtes pas satisfait de la qualité du produit résultant, il y a des problèmes dans la chaîne de production et vous devez analyser et modifier le processus, et non le peindre en sortie.
Eh bien, vous obtenez le point. Si quelque chose sent mauvais, le parfum n'aidera pas.
Partie modérément abstraite sur la qualité du code
Parmi les propriétés d'un bon code, on trouvera (sans trier par importance):
- cohérence du style
- lisibilité
- performance
- extensibilité
- transparence de l'architecture et des motifs.
Ceci est réalisé principalement par l'autodiscipline et le niveau de compétence des développeurs, ainsi que lorsqu'il y a de nombreux développeurs, par le biais d'accords de style de code et d'accords d'architecture (MVC, MVVM, ECS, des milliers d'entre eux).
Le code de haute qualité est apparu bien avant le linter, les conventions et les modèles architecturaux.La plupart des règles de linter sont purement cosmétiques et résolvent le problème de l'augmentation de la lisibilité du code en raison de l'application uniforme de petites pratiques locales. La longueur des lignes, les noms des variables, const partout où il n'y a pas de modification, parfois même des restrictions sont introduites sur la complexité cyclomatique des fonctions. Il ne s'agit pas de règles spécifiques, mais du fait que ces règles sont généralement cosmétiques, elles aident le code à mieux
paraître . Le mot clé ici est de
regarder .
Lorsqu'un indicateur commence à être utilisé comme objectif, il perd sa valeur d'outil.Interprétation gratuite de la
loi de Goodhart .
Maintenant, dessinons une analogie avec les tomates. Notre pas assez mature. Un linter automatique nous dira: "Regardez ici et il n'y a pas la bonne couleur." Que fera le programmeur? Très souvent peint. Et c'est l'idée principale de ma critique du linter. Je vais maintenant donner un exemple concret, puis tirer une conclusion.
Spécificités
PixiJS 2 février 2018 (il y a un an).
Le pool de demandes arrive . L'essentiel, c'est qu'auparavant, un nombre constant de points était utilisé pour tracer la courbe, ce qui n'est évidemment pas optimal. Il est proposé d'utiliser un algorithme astucieux pour estimer la longueur de la courbe. L'algorithme n'est pas sorcier, mais certainement pas évident, publié en 2013 et cité
avec un article de son auteur (il y a des problèmes avec https). Le bonheur qu'il a généralement conservé sur sa page personnelle.
Il existe un code C (16 lignes):
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); };
Et le code suivant (JS) a été envoyé au pool de demandes:
_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); }
Le code est conçu en totale conformité avec les paramètres du linter. Des descriptions de tous les paramètres sont indiquées, un lien vers l'algorithme d'origine, un tas de constantes, conformément à l'exigence du linter sans opérateur mixte: 1 parenthèses sont disposées. Même pour les performances, l'api ne se fait pas objectivement, mais avec des paramètres séparés, il est donc généralement meilleur en JS.
Il y a un problème. Ce code rend les ordures complètes. (Une tentative de marquer l'expression foutue en russe, qui est assez utilisée dans les publications occidentales pour exprimer le degré du problème et semble appropriée).
C'est ce que linter a dit en regardant ce code sans parenthèsesc:\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
Une énorme longueur revient et beaucoup de points se détachent dessus, c'est bien qu'il y ait eu une restriction d'en haut, ça a marché. Auparavant, ce mode était désactivé par défaut, mais activé pour tout le monde (en raison d'un autre bug en passant).
Fix déjà piétiné en passant . Je n'ai pas contacté l'auteur du commit et je ne lui ai pas demandé pourquoi il avait décidé de mettre les crochets, mais je pense qu'il a lancé le linter, dont le fichier de configuration est déjà dans PixiJS. Ce linter lui a dit que votre code est mauvais, car il manque des crochets, ajoutez des crochets. L'option "opérateurs non mixtes" indique que vous n'avez pas le droit d'écrire
2*2+2*2
car cela peut conduire à une mauvaise lisibilité. Quelqu'un a créé cette option, puis quelqu'un l'a incluse dans le projet, ce qui signifie que beaucoup de gens la trouvent utile.
Conclusion
Je ne veux pas dire que le linter est mauvais, mais je considère leur utilisation comme mauvaise. Nous (dans le sens de l'humanité) avons pu automatiser la détection d'une petite partie seulement des signes d'un bon code, principalement des produits cosmétiques tels que des supports. Les linters sont de bons outils pour analyser la qualité du code, mais dès que nous élevons la conformité avec les exigences du linter au cadre de l'exigence obligatoire, nous obtenons cette même conformité. Nous ne gagnons rien d'autre que la conformité. Voici comment placer l'appareil photo sur un convoyeur de tomates et envoyer pour peindre tout ce qui n'est pas assez rouge. Jusqu'à ce que nous donnions au développeur un outil pour évaluer la qualité de l'apparence du code, il pouvait envoyer un mauvais code, et nous pouvions le voir.
Maintenant, le mauvais code sera mieux déguisé. Il imitera un bon, car il y a tous les signes externes d'un bon code dessus. Et nous perdrons le linter comme outil d'évaluation, car tout le code est cohérent. Nous avions un outil d'évaluation, mais maintenant il n'est pas là, mais le code entre parenthèses, bien que parfois pas là, mais ce sont les détails. Au total, je
considère linter
comme un outil génial, mais seulement si le respect des exigences ne devient pas un objectif .
Et oui, nous pouvons dire ici qu'il n'y a pas de tests, que vous n'avez pas besoin de copier-coller le code, que c'est du développement stackOverflow, que vous n'insérez pas de code dans le projet que vous ne comprenez pas. C'est tout oui. Et c'est un signe de mauvais code. Mais le linter a contribué à le rendre visuellement similaire à tout le reste du projet. Mais le linter ne vérifiera jamais si vous comprenez bien ce que vous avez écrit.
En d'autres termes, je crois que l'utilisation correcte du linter consiste à le lancer régulièrement sur le projet en tant que responsable et à évaluer comment et ce qui se passe. Eh bien, des règles comme plus de parenthèses au dieu des parenthèses, en principe, je considère nocif. Quand nous voyons que quelqu'un commet un code de mauvaise qualité, cela vaut la peine de comprendre pourquoi il fait cela et de résoudre ce problème à un niveau plus profond. Naturellement, vous n'avez pas besoin de formater le code avec vos mains; je salue les formats automatiques de toutes les manières possibles, mais jusqu'à ce qu'ils touchent la partie sémantique du code de quelque manière que ce soit. Si nous forçons la personne à mettre le code aux normes avec un linter, nous peindrons essentiellement la tomate verte en rouge. Et il sera encore plus difficile de comprendre qu'il est en fait vert. Que faire dans les projets open source avec un tas de personnes différentes, la question est plus compliquée, mais même ici, vous pourriez penser quoi faire.
Il vaut la peine de dire que mon attitude envers le linter a été formée il y a longtemps, il y a plus de trois ans, mais je n'ai pas pu trouver d'exemple approprié dans la pratique lorsque le linter a joué une blague cruelle. Et donc je l'ai trouvé. Le fait que je le recherche depuis si longtemps indique que le problème n'est pas à si grande échelle, ou combien il est difficile de remarquer l'effet négatif, mais je pense que cet article sera utile. N'oubliez pas, un linter est un outil, et comme tout outil, il peut être utilisé au détriment et pour le bien, et comment vous pouvez parfois vous couper avec n'importe quel outil.