Serait-ce une mauvaise idée d'exécuter périodiquement des formateurs de code sur un référentiel?

68

Je songe à créer un travail cron qui extrait du code, y exécute des formateurs de code et, le cas échéant, validant les modifications et les repoussant.

La plupart des projets qui utilisent autoformatters les mettent dans un crochet Git, mais le faire automatiquement toutes les quelques heures supprime le fardeau pour chaque développeur d'installer le crochet Git.

J'encouragerais néanmoins tout le monde à écrire du code propre et bien formaté. Peut-être que je pourrais faire en sorte que le système envoie automatiquement un ping aux développeurs lorsque le code qu'ils ont écrit est reformaté, afin qu'ils sachent quoi faire à l'avenir.

grosse blinde
la source
105
Il y a une erreur logique ici. Cette méthode n'encouragerait pas les gens à écrire du code bien formaté; cela encouragerait plutôt les gens à ne pas formater et à ne pas compter sur le système! Si votre souci est que la base de code soit cohérente, ce n'est pas grave. Si votre objectif est d’entraîner les codeurs à écrire proprement, c’est un énorme bug.
Kilian Foth le
52
Cela tient également compte de l’effet que cela aura sur des fonctionnalités telles que blâme - en particulier si le formateur apporte beaucoup de modifications, si la plupart des lignes du fichier sont marquées comme étant modifiées par le formateur, vous perdrez une partie de la valeur.
Neil P
13
J'ai eu des problèmes avec un autoformatter ne pas être mis à jour correctement et casser mon code. Quelque chose à garder à l'esprit.
isaacg
22
Si cela est important pour vous, vous pouvez échouer à la construction lorsque le code n'est pas correctement formaté. C'est un peu dur, mais un examen par les pairs approprié ferait plus ou moins la même chose.
Erno
18
C'est une excellente idée si votre objectif est d'amener les gens à vous haïr. Il atteint très peu, mais causera certainement des problèmes imprévus.
TonyK

Réponses:

129

Cela semble bien, mais je préférerais que des personnes soient responsables des modifications du code, pas des robots.

En outre, vous voulez vous assurer que ces modifications ne cassent rien. Par exemple, nous avons une règle qui classe les propriétés et les méthodes par ordre alphabétique. Cela peut avoir un impact sur les fonctionnalités , par exemple avec l'ordre des données et des méthodes dans les fichiers WSDL des contrats WCF.

Marcel
la source
50
En outre, il casse un peu le VCS. Vous ne saurez pas qui blâme facilement qui a écrit une ligne, et en cas de conflit, votre VCS ne sera pas en mesure de savoir que les modifications apportées à l'outil ne sont que du style et doivent être ignorées à chaque fois.
Pierre.Sassoulas
2
Un sujet lié de manière tangentielle applique certaines "actions de sauvegarde" dans un IDE, comme rendre les champs finaux si possible. C'est un problème car (du moins en Java) de nombreux frameworks les définissent par réflexion (par exemple, Spring et Hibernate).
Captain Man
20
@JeffO git blamene cherche pas seulement à déterminer qui a la faute d'un bogue, mais à trouver le commit lorsque quelque chose a été ajouté / supprimé, ce qui peut être utile pour plusieurs raisons.
Pokechu22
2
"nous avons une règle qui ordonne les propriétés et les méthodes par ordre alphabétique" Bon Dieu, ça sonne terriblement! Il faudrait constamment espérer dans tout le dossier
Alexander
1
Également pour Java, la combinaison d'un vérificateur de style qui cherche des dérivés du style convenu (peut-être même en faire un avertissement de compilation) et d'un IDE configuré pour formater le style convenu facilite la détection et la correction. Il est important que le code se règle (faute d'un meilleur mot) lorsqu'il change réellement de fonctionnalité - et non lorsqu'un bot le reformate.
Thorbjørn Ravn Andersen
72

J'essaierais plutôt de rendre très facile pour tout le monde dans l'équipe d'appliquer un formatage de code automatique selon le standard de votre équipe directement dans votre éditeur ou IDE , au fichier de code source actuel (ou à une partie de celui-ci). Cela donne aux membres de votre équipe plus de contrôle sur le moment et le formatage, laissez-les inspecter le code avant qu'il ne soit validé dans le formulaire final et testez-le après le formatage , pas avant.

Si tous ou la plupart des membres de votre équipe utilisent le même éditeur, cela ne devrait pas être trop difficile. Si tout le monde en utilise un autre, votre approche pourrait être la deuxième meilleure solution, à condition que l'équipe le soutienne. Toutefois, je vous recommande de prévoir des mesures de sécurité supplémentaires, telles que des versions nocturnes et des tests automatisés exécutés après chaque modification de code automatique.

Doc Brown
la source
7
"Un formateur à portée de main où vous êtes sûr à 100% que rien ne casse" - Quand avez-vous déjà rencontré un morceau de code que vous étiez, honnêtement, à 100% sûr de ne jamais casser?
Zibbobz
2
@Zibbobz: l'un des outils que nous utilisons pour éditer le code, le compiler et le lier, ainsi que le VCS, peuvent avoir des bogues, ce qui ne nous empêche pas d'essayer de développer des programmes de travail ;-) Mais voyez mon édition.
Doc Brown
J'approuve l'édition - ne serait-ce que parce qu'une once supplémentaire de prudence vaut une livre de débogage. ;)
Zibbobz
@Zibbobz Assez souvent! Notez qu'être sûr à 100% de quelque chose ne signifie pas qu'il a 100% de chance d'être vrai.
user253751
@immibis: vous avez peut-être oublié que le commentaire faisait référence à une phrase que j'avais retirée de ma réponse il y a quelques jours.
Doc Brown
37

C'est une mauvaise idée, non seulement parce que cela dissuade les gens d'écrire du code correct, mais aussi parce que le reformatage apparaîtra à mesure que le code change dans votre VCS (vous en utilisez un, j'espère), masquant le flux historique du développement du code. Pire encore, chaque action de formatage du code (en fait chaque modification du code) a la possibilité d'introduire des bogues, qu'ils soient manuels ou automatisés. Ainsi, votre formateur peut maintenant introduire des bogues dans votre code qui ne passeront pas par des révisions de code, des tests unitaires, des tests d'intégration, etc. jusqu'à éventuellement plusieurs mois plus tard.

jwenting
la source
10
Je pense que s'il parle d'avoir un bot pour vérifier les entrées et les sorties d'un référentiel, VCS est-il une donnée?
StarWeaver
11
@ StarWeaver on pourrait penser. Mais j'ai travaillé dans des endroits où le "référentiel de code" était un répertoire blindé accessible uniquement par un logiciel exécuté sous son propre compte utilisateur. Aucun contrôle de version, sauf une sauvegarde hebdomadaire du répertoire sous un nom de répertoire horodaté.
Jwenting
14
C’est… je vais faire des cauchemars maintenant>.>
StarWeaver
7
@ StarWeaver, pourquoi pensez-vous que je me souviens encore de cet environnement 14 ans plus tard;)
jwenting
28

J'aurais tendance à croire que c'est une bonne idée (d'exécuter automatiquement les formateurs de code), mais ce n'est que mon opinion.

Je ne les exécuterai pas périodiquement, mais si possible avant que le contrôle de version ne soit validé.

Avec git , un hook pré-commit serait utile. Dans de nombreux projets C ou C ++ construits avec un Makefile , j'ajoute une indentcible (qui exécute correctement les formateurs de code tels que indentou astyle) et m'attends à ce que les contributeurs s'exécutent make indentrégulièrement. En passant, vous pouvez même ajouter des makerègles pour vous assurer que les hooks git ont été installés (ou pour les installer).

Mais en réalité, il s’agit plus d’un problème social que technique . Vous voulez que votre équipe commette du code propre et bien formaté, ce qui est une règle sociale de votre projet. (Il n'y a pas toujours de réponse technique à tous les problèmes sociaux).

Le contrôle de version est principalement un outil d'aide à la communication entre développeurs humains (y compris vous-même dans quelques mois). Votre logiciel n'a pas besoin de VC ni de formatage, mais votre équipe en a besoin.

BTW, différentes communautés et différents langages de programmation ont des points de vue différents sur le formatage du code. Par exemple, Go n'a qu'un seul style de formatage de code, mais C ou C ++ en a beaucoup.

Basile Starynkevitch
la source
Oui, mais cela signifie que chaque développeur doit installer le hook de validation.
bigblind
17
Oui, mais c'est une règle sociale, et vous en avez besoin de plusieurs. Vous ne pouvez pas trouver une solution technique à tous les problèmes sociaux. Vous devez convaincre les gens. En outre, chaque développeur doit installer un compilateur et le système de contrôle de version lui-même.
Basile Starynkevitch
Bon, vous dites donc que la règle sociale consistant à installer un git hook est préférable à un système automatisé qui le fait? (question sérieuse, sans
prétention
15
Oui, je dis ça.
Basile Starynkevitch
17

Je pense que c'est une mauvaise idée. Beaucoup de réponses déjà évoquées disaient que cela saccage l’histoire en rendant difficile la tâche de déterminer qui a réellement ajouté une ligne et que cela encourage les gens à commettre n'importe quoi et que le bot en forme le gérera.

Une meilleure approche consisterait à incorporer un vérificateur de format dans votre outil de génération. (En Java, il y a Checkstyle ) Ensuite, n'autorisez les personnes à fusionner leurs branches avec la branche principale que si la construction est réussie (y compris le formatage).

Si vous autorisez les utilisateurs à s’engager directement dans la branche principale (comme dans Subversion, par exemple), vous devrez toujours vous assurer que tout le monde a la discipline nécessaire pour n’engager que du code formaté (ou que le serveur n’accepte que les validations une fois que certaines vérifications ont été exécutées. ).

Capitaine homme
la source
2
mais assurez-vous que le vérificateur de style est sain d'esprit et n'impose pas de choses étranges qui vont à l'encontre de toute pratique acceptée (et acceptable) (et oui, j'ai déjà vu cela). Vous pouvez également demander à la génération automatique que la génération automatique échoue lorsque la vérification de style génère des erreurs (nouvelles).
Jwenting
2
J'ai vu de nombreux cas où le formatage automatique produit un code illisible. Surtout pour beaucoup de groupes de clôture (il est judicieux de laisser certains d'entre eux sur des lignes séparées, mais le robot ne s'en soucie pas). Un autre exemple est le fractionnement automatique de longues chaînes Java (elles sont longues car elles contiennent des requêtes SQL, mais le robot n'en a aucune idée.).
18446744073709551615
@ 18446744073709551615 Je ne suggère pas la mise en forme automatique, je suggère une vérification automatique . Vos règles pourraient permettre ces choses.
Captain Man
16

En général, je pense que c'est une mauvaise idée. En principe, c'est une idée valable, mais cela peut être problématique en réalité. Demander au formateur de code de casser votre code est une possibilité réelle, et il ne faut qu'un seul travail de formatage pour que vos développeurs répondent avec une hostilité (probablement justifiée) (par exemple, "Votre mauvais formateur de code a cassé la construction, éteignez-le maintenant! " ).

Dans la même veine que la recommandation de @ BasileStarynkevitch, nous utilisons des points d'ancrage post-réception git côté serveur pour envoyer des "courriels de mise en garde" sur le style de code.

Si j'applique un commit contenant des violations de style, le serveur d'origine git m'enverra un email m'informant que j'ai enfreint les règles de style et me recommande de corriger mon code. Toutefois, cela ne l’applique pas car il peut exister des raisons valables de rompre le style de maison (les longues chaînes dépassant la limite de longueur de ligne, par exemple).

Si c'est un problème systémique qui nuit à la base de code, il est peut-être temps de commencer à évoquer les problèmes de style de code dans les révisions de code. Un style de code médiocre peut masquer des bogues et rendre le code plus difficile à lire. Il peut donc s'agir d'un problème de révision de code valide.

Pour ajouter à l'aspect "problème social" des choses, il peut être intéressant d'encourager les gens à réparer les défauts cosmétiques et stylistiques au fur et à mesure qu'ils les trouvent. Nous avons un message standard de validation "cosmétique". pour les correctifs de style de code que les autres développeurs savent ne pas contenir de modifications radicales.

Comme @DocBrown le dit, une autre option consiste à appliquer le style de code dans votre IDE. Nous utilisons CodeMaid avec Visual Studio pour corriger de nombreuses erreurs de style courantes. Il fonctionnera lors de la sauvegarde des fichiers de code, ce qui signifie qu'un code de style défectueux ne devrait même jamais figurer dans le référentiel ... en théorie :-).

Karl Nicoll
la source
J'ai voté en faveur de celui-ci, car il s'adresse directement aux deux côtés (désir d'un meilleur code + sécurité contre la rupture de la construction). Une fois que la base de code est vraiment en bon état, cependant, je considère que la "mauvaise idée" est un libellé plutôt fort pour automatiser les modifications futures.
Donjuedo
10

Oui, je pense que c'est une mauvaise idée. Ne vous méprenez pas, la raison de le faire semble bien, mais le résultat pourrait quand même être horrible.

Vous aurez des conflits de fusion lorsque vous tirez une branche suivie, du moins je crains que ce ne soit le cas, mais je peux me tromper.

Je ne veux pas le tester maintenant au travail, mais vous devriez l'essayer vous-même.

En fait, vous pouvez simplement consulter un commit récent. Créez une nouvelle branche, commettez quelque chose de mesquin, choisissez une cerise ou fusionnez sans autocommit.

Ensuite, lancez votre script, tirez et si votre résultat est un désordre de fusion horrible, alors vous devriez absolument ne pas le faire, à la lumière du jour.

Au lieu de cela, vous pouvez potentiellement le placer dans une version nocturne ou hebdomadaire.

Mais même une nuit peut être une mauvaise idée.

Vous pouvez soit l'exécuter chaque semaine, quand vous êtes certain qu'aucun conflit de fusion ne se produira car tout est terminé le lundi.

Sinon, exécutez-le une à deux fois par an en période de vacances, lorsque les conflits de fusion ne se produiront pas.

Mais la solution peut dépendre de votre priorité pour le style de code.

Je pense qu’il serait préférable de créer un script de configuration qui crée automatiquement le référentiel git et définit les points d'ancrage du projet.

Vous pouvez également inclure le script de configuration du hook dans un dossier de vos développeurs dans le projet et le vérifier simplement dans git.

Si tout va bien utile
la source
7

Ce que je n'ai pas vu, c'est le fait qu'il y a parfois des raisons légitimes de ne pas formater quelque chose selon un ensemble de règles. Parfois, la clarté du code est améliorée en allant à l'encontre d'une directive donnée selon laquelle 99% du temps est logique. Les humains doivent faire cet appel. Dans ces cas, le formatage automatique du code rendrait les choses moins lisibles.

Andy Lester
la source
Entièrement d'accord. Par exemple, alignement des identificateurs de variable à gauche, de tous les signes égaux dans une seule colonne et de toutes les valeurs à droite des signes égaux. Un formateur déprécierait la lisibilité dans ce cas en réduisant les onglets / espaces chacun à un seul espace. Bien sûr, des règles de formateur pourraient être écrites pour empêcher cela, mais vous aurez alors besoin d'un développeur affecté à l'écriture du formateur de code. Cela semble être une mauvaise idée tout autour. Adoptez de meilleures conventions internes et appliquez-les lors de la révision du code.
ThisClark
7

C'est une idée terrible.

Si l'un de mes collègues développeurs apportait des modifications gratuites aux fichiers source, il ne passerait pas l'examen du code. Cela rend la vie plus difficile pour tout le monde. Changer le code qui a besoin de changer, rien d'autre. Des modifications inutiles entraînent la fusion de conflits, ce qui peut entraîner des erreurs et créer un travail inutile.

Si vous voulez faire cela régulièrement, c'est affreux.

Et puis il y a la question de quel type de changements le formateur de code apporte. J'utilise le formatage automatique dans mon éditeur, cela fonctionne raisonnablement bien et je peux améliorer les choses lorsque le formatage automatique n'est pas parfait. Si vous utilisez un formateur de code qui va au-delà, vous n'allez pas améliorer le code, vous allez l'aggraver.

Et puis il y a le problème social. Il y a des gens qui veulent forcer tout le monde à utiliser leur style de code, et il y a des gens plus flexibles. Une solution de ce type serait probablement suggérée par le type de développeur "grammer-nazi" (orthographe intentionnelle) qui souhaite imposer son style à tous les autres. Attendez-vous à un retour de bâton et attendez-vous à ce que les développeurs flexibles, généralement faciles à vivre, se mettent en quatre

gnasher729
la source
4

Vous ne mentionnez pas le VCS que vous utilisez, mais en fonction de cela, une autre option consiste à avoir un raccordement côté serveur. Un VCS comme git le supporte. Vous pouvez installer un crochet côté serveur qui exécute le formateur sur la version poussée, puis compare le fichier formaté à la version poussée. S'ils diffèrent, le développeur n'a pas utilisé le formatage correct et le serveur peut rejeter le push. Cela obligerait vos développeurs à ne pousser que du code avec le formatage souhaité, les incitant ainsi à écrire du code vierge dès le début, ce qui obligerait les développeurs à tester le code correctement formaté et à éviter à vos développeurs d'avoir à installer manuellement un côté client. crochet.

sigy
la source
C’est ce que Go fait, par exemple, à l’exception de Mercurial. Pousser quelque chose qui n'est pas invariant go fmtest automatiquement rejeté.
Jörg W Mittag Le
1

C'est un compromis entre un format de code plus propre et un historique plus précis et plus facile à comprendre. Cela dépend de la nature de votre projet et de la fréquence à laquelle vous plongez dans l’histoire ou la culpabilité pour comprendre ce qui se passe. Si vous travaillez sur quelque chose de nouveau et que vous ne devez pas maintenir une compatibilité ascendante, l'historique ne joue généralement pas un rôle aussi important.

Max Yankov
la source
1

Cette idée est similaire à d'autres réponses, mais je ne peux pas commenter mes suggestions.

Une option consiste à définir un alias (ou un raccord, ou autre) sur la fonction de validation, qui exécute le programme de formatage de code sur le code à engager avant sa validation.

Il pourrait avoir 2 résultats (ou plus):

1) Montrez à l'utilisateur les modifications proposées et demandez leur approbation pour les appliquer et les valider.

2) Ignorer les modifications proposées et valider le code d'origine.

Vous pouvez également ajouter plus de flexibilité à ces options, comme la possibilité de modifier les modifications proposées dans l’option 1. Une autre idée (en fonction de la difficulté à appliquer ces normes de codage) consiste à ce que le système vous envoie un rapport l'option 2 est sélectionnée.

Cela peut constituer un bon équilibre entre la vérification automatique de tout le code que vous voulez, tout en laissant aux développeurs une flexibilité qui leur permet de répondre à leurs besoins. Cela permet également de ne pas «rejeter automatiquement» le code avec les différences de formatage mentionnées dans d'autres réponses. Avec le 'j'ai révisé et approuvé les corrections de formatage automatiques; L'option "commit" conserve toujours la responsabilité personnelle de chaque développeur et ne plaisante pas avec VCS.

Madison Coooper
la source
0

Je ne le ferai pas sur le référentiel mais je le ferai sur la sauvegarde si l'outil le permet. Eclipse en est un et je ferais en outre le nettoyage du code, y compris le tri.

La partie intéressante est que cela fait partie du projet et que chaque développeur l’obtiendra pour son projet.

En tant que bonus supplémentaire, les fusions seraient considérablement simplifiées car les choses ne vont pas bouger.

Les révisions de code éviteront les erreurs.

Un autre endroit que je ferais, c’est qu’il fasse partie de la construction. Dans mon cas, il est tel que les constructions maven reformateront le XML, nettoieront les fichiers pom et reformateront le code.

Ainsi, lorsque les développeurs seront prêts à faire pression, tout sera nettoyé pour leur demande d'extraction.

Archimedes Trajano
la source