Comment convaincre mes coéquipiers de ne pas ignorer les avertissements du compilateur?

51

Je travaille sur un énorme projet (plutôt une combinaison enchevêtrée de dizaines de mini-projets qui ne peuvent pas être séparés facilement en raison d'une gestion médiocre des dépendances, mais c'est une discussion différente) en Java avec Eclipse. Nous avons déjà désactivé un certain nombre d'avertissements dans les paramètres du compilateur et le projet compte toujours plus de 10 000 avertissements.

Je suis un grand partisan d’essayer de répondre à tous les avertissements, de les corriger si possible, et de les supprimer pour ceux qui sont examinés et jugés sûrs. (Il en va de même pour mon obsession religieuse de marquer toutes les méthodes implémentées / annulées comme @Override). Mon plus gros argument est que généralement les avertissements vous aident à trouver des bugs potentiels pendant la compilation. Peut-être que 99 fois sur 100, les avertissements sont insignifiants, mais je pense que la tête qui gratte, cela enregistre pour la première fois qu’il évite un bug majeur, en vaut la peine. (Mon autre raison est mon OCD apparent avec la pureté du code).

Cependant, beaucoup de mes coéquipiers ne semblent pas s'en soucier. Je corrige parfois des avertissements lorsque je tombe sur eux (mais vous savez que c'est délicat lorsque vous touchez du code écrit par un collègue). Maintenant, avec littéralement plus d'avertissements que de classes, les avantages des avertissements sont très minimisés, car lorsque les avertissements sont si courants, personne ne se soucie de les examiner tous.

Comment puis-je convaincre mes coéquipiers (ou les pouvoirs en place) que les avertissements doivent être adressés (ou supprimés lorsqu'ils font l'objet d'une enquête approfondie)? Ou devrais-je me convaincre que je suis fou?

Merci

(PS j'ai oublié de mentionner ce qui m'a finalement poussé à poster cette question est que j'ai malheureusement remarqué que je corrige les avertissements plus lentement qu'ils ne sont produits)


la source
5
Tous types: rawtype, import inutilisé, variable inutilisée, méthodes privées inutilisées, suppression inutile, décoché, transtypage inutile, condition inutile (toujours vrai ou faux), méthodes surchargées non annotées, référence à une classe / à des méthodes obsolètes, etc.
1
«Je veux commencer à appliquer l'analyse de« code »statique aux cartes de jeu et à traiter les avertissements comme des erreurs. »Citation récente de John Carmack. Si vous êtes fou, vous êtes à vous. En fait, nous sommes trois.
deadalnix le
1
@RAY: Ce sont des avertissements de l'analyse de code d'Eclipse. Je ne suis pas sûr que vous puissiez tous les obtenir à partir de la vanille javac.
yatima2975
4
mais vous savez que c'est délicat quand vous touchez du code écrit par un collègue - si votre lieu de travail a ce genre de problème de territorialité, je considère cela comme un grand drapeau rouge.
JSB ձոգչ
1
@deadalnix: étant un gars en C ++, je n'ai qu'une seule façon de faire les choses -Wall -Wextra -Werror(c'est-à-dire, activer la plupart des avertissements disponibles, les traiter tous comme des erreurs). Eclipse C ++ est presque inutilisable cependant: /
Matthieu M.

Réponses:

37

Vous pouvez faire deux choses.

  1. Faites remarquer que les avertissements sont là pour une raison. Les auteurs de compilateur ne les mettent pas parce qu'ils sont mesquins. Les gens de notre industrie sont généralement utiles. De nombreux avertissements sont utiles.

  2. Rassemblez une histoire d'échecs spectaculaires résultant d'alertes ignorées. Une recherche sur le Web pour "Faites attention aux avertissements du compilateur" renvoie des anecdotes.

Votre obsession avec @Overriden'est pas une "obsession". C'est une bonne chose. Jamais mal orthographié un nom de méthode?

Ray Toal
la source
8
J'aimerais ajouter que vous ne pouvez pas faire aimer les autres, alors soyez pragmatique et choisissez bien vos batailles.
Daniel Werner
@ Daniel: triste, mais vrai. S'ils ne s'en soucient pas, même s'ils savent (ou au moins croient ) que vous avez raison, alors ce n'est pas une tâche confiante.
Joachim Sauer le
2
Il arrive souvent que les avertissements ne soient que des avertissements. Vous pouvez être vigilant, mais je préfère souvent passer ce temps à écrire des cas de test beaucoup plus spécifiques à votre base de code.
Ghayes
Je pense que le PO cherche à amener ses collègues à cesser de faire preuve de dédain. Certes, de nombreux avertissements ne doivent pas être pris en compte, et ils ne devraient pas l'être tous! Mais être blasé et permettre à 10 000 d’entre eux de s’insérer dans le code n’est pas une bonne chose. Les avertissements doivent être examinés, pris en compte et, s'ils ne sont pas applicables, ils peuvent être désactivés ou une annotation de suppression doit être appliquée.
3
J'ai récemment rangé des avertissements dans un projet open source et j'ai trouvé un bogue clair qui a été signalé via un avertissement: if (error = 0)au lieu de if (error == 0). En outre, de nombreux avertissements facilitent également la recherche d’ erreurs de compilation sans avoir à parcourir beaucoup d’alertes.
Hugo
12

Lecture pertinente ici . C ++, mais toujours d'actualité. J'aime particulièrement cet exemple (le commentaire de code est le mien):

int searchArray(int to_search[], int len, int to_find)
{
    int i;
    for( i = 0; i < len; ++i )
    {       
        if ( to_search[i] == to_find )
        {
            return i;
        }
    }
    // should be returning designated 'not found' value (0, -1, etc)
}

Très souvent, un avertissement fera la différence entre le plantage de l'application avec une erreur, ce qui vous aidera réellement à repérer un défaut de conception et à le réparer (comme une transtypage en mode sûr ), ou à faire des hypothèses sur l'application, puis de vous comporter de manière incorrecte. ou de manière erronée (ce qui serait le cas avec une conversion de type non sécurisée ). De la même manière, ils indiquent également le code cru ou mort qui peut être supprimé (blocs de code inaccessibles, variables inutilisées), ce qui peut être considéré comme une optimisation du code ou des cas non comptabilisés qui apparaîtront dans les tests, comme l'exemple ci-dessus pour C ++. Notez que cet exemple entraîne une erreur de compilation en Java.

La résolution des avertissements présente donc (au moins) plusieurs avantages pour la gestion:

  1. Moins de chances que le code se comporte de manière incorrecte avec des données entrées par l'utilisateur qui, pour les plus grands concernés par l'image de la société et la façon dont elle traite les données de ses clients, devraient constituer un «Big Deal (tm)». Il est préférable de se bloquer pour empêcher un utilisateur de faire une bêtise que de ne pas se planter et de le laisser faire.
  2. S'ils veulent remanier leur personnel, ils peuvent entrer dans une base de code sans avertissement (et ne pas paniquer ni se plaindre autant ..). Cela réduira peut-être le nombre de grommelements ou d'avis sur la maintenabilité ou la qualité de la contribution de l'équipe X au projet Y.
  3. Optimiser le code en supprimant les avertissements du compilateur, tout en n'apportant aucune amélioration significative du temps d'exécution, va améliorer de nombreux scores en matière de test:
    • Tous les scores de couverture de code vont probablement augmenter.
    • Le test des cas limites et des tests non valables aboutira probablement plus souvent (notamment grâce à la classification sécurisée susmentionnée ).
    • Lorsqu'un scénario de test échoue, vous n'avez pas à déterminer si cela est dû à l'un des avertissements du compilateur dans ce fichier source.
    • On peut facilement soutenir que zéro avertissement du compilateur est préférable à des milliers. Aucun avertissement ou erreur ne parle de la qualité du code. Vous pouvez donc affirmer que la qualité du code améliore les avertissements moins nombreux.
  4. Si vous n'avez pas d'avertissement du compilateur et qu'un ou plusieurs sont introduits, il est beaucoup plus facile de savoir qui a fait en sorte qu'ils apparaissent dans la base de code. Si vous avez une politique "pas d'avertissements", cela les aiderait à identifier les personnes qui ne font pas leur travail correctement, peut-être? Écrire du code ne consiste pas seulement à faire fonctionner quelque chose, mais bien à le faire fonctionner correctement .

Notez que je ne suis encore qu'un jeune développeur qui connaît peu de choses sur la gestion de projet, donc si j'ai dit quelque chose de mal, corrigez mes pensées et donnez-moi une chance de faire des modifications avant que vous ne perdiez ma vie :)

darvids0n
la source
2
très bien pensé à travers la réponse. Je vous remercie. L'exemple que vous donnez sera une erreur plutôt qu'un avertissement sous Java. :)
@Ray: Ah, assez bien. Cela fait un an que je n'ai pas fait de développement Java, je devais donc oublier quelque chose. Je vais éditer mon post pour le mentionner. Merci!
darvids0n
Cela fait un moment que je suis en C ++. Qu'est-ce que cette fonction retourne si vous atteignez le commentaire à la fin? Est-ce 0? Comportement indéfini?
MatrixFrog
1
@ MatrixFrog: Non défini. Peut être un int arbitraire, ce qui provoquera toutes sortes de méchants. Citation de cette réponse: " C ++ 03 §6.6.3 / 2: Décaler la fin d'une fonction équivaut à un retour sans valeur. Cela entraîne un comportement non défini dans une fonction renvoyant une valeur. "
darvids0n
7

J'ai déjà travaillé sur un projet présentant des caractéristiques similaires. Celui-ci en particulier a été écrit à l'origine en Java 1.4. Une fois que Java 5 avec les génériques est sorti, on peut imaginer le nombre d’avertissements émis par le compilateur pour chaque utilisation de l’API Collections.

Il aurait fallu un certain temps pour se débarrasser de tous les avertissements, en commençant à utiliser des médicaments génériques. C’est un facteur qui doit être pris en compte, mais lorsque vous devez convaincre quelqu'un (en particulier votre responsable) qu'il doit être corrigé, vous aurez besoin de données fiables, telles que

le temps passé sur des bogues dans du code conforme hérité ou non standard (le standard étant la norme de codage de votre projet) aurait pu être évité.

Vous pouvez continuer à présenter un projet de loi qui montre comment vous perdez du temps et de l'argent en ignorant "certains" avertissements. Quelqu'un en comprendra l'idée. L’essentiel est que tous les avertissements ne valent pas la peine d’être examinés, du moins pas tout de suite; en termes plus simples, vous devrez établir la priorité des avertissements à traiter immédiatement. Pour commencer, considérez ceux qui sont pertinents pour les bogues que vous voyez dans votre projet.

Lorsque vous corrigez des bogues, vous pouvez également noter dans le suivi des bogues que celui-ci aurait pu être évité en ignorant un avertissement (ou peut-être en exécutant PMD ou FindBugs si vous avez un système de configuration ou un système de compilation). Tant qu'il y a un nombre suffisant de bogues qui peuvent être corrigés en tenant compte des avertissements du compilateur, votre remarque sur la consultation des avertissements du compilateur sera valide. Autrement, il s’agit d’une décision commerciale et, habituellement, il ne vaut pas la peine de consacrer du temps à cette bataille.

Vineet Reynolds
la source
Oui, exactement. Je pense que l'explosion initiale du nombre d'exceptions s'est produite lors de la transition 1.4-> 1.5, et depuis lors, personne n'a prêté attention aux avertissements car il y en a trop ...
2

Si vous réussissez et que votre équipe décide de respecter les avertissements, vous devez adopter une approche progressive. Personne ne peut et ne voudra 10000 avertissements en une fois. Vous pouvez donc sélectionner les plus importants (ceux qui présentent un risque élevé) et désactiver les moins importants. S'ils sont fixes, augmentez à nouveau le niveau d'avertissement. En outre, vous pouvez commencer par FindBugs, qui signale que le code est presque toujours un bogue.


la source
2
Ou concentrez-vous sur la correction des avertissements lorsque vous examinez du code (les nouvelles classes ne doivent avoir aucun avertissement, les classes que vous modifiez doivent en contenir moins).
Réintégrer Monica le
Question sérieuse: Comment savoir quels sont ceux qui risquent le plus de provoquer de vrais bugs?
MatrixFrog
1

Je suis tout à fait d'accord avec vous, il est préférable de nettoyer les avertissements de compilation autant que possible. Vous avez mentionné que votre équipe utilise Eclipse comme outil de développement. Eclipse est un très bon outil pour vous aider à nettoyer le code et à en rendre le style cohérent.

  1. Définissez 'Enregistrer l'action' pour chaque projet Java, tel que le code de formatage, les variables locales inutilisées, l'organisation des importations (personne ne s'oppose à ce type de nettoyage).
  2. définir des options de compilation spécifiques à chaque projet. Par exemple, niveau de compilation (si votre code doit être compatible avec la version 1.4 pour nettoyer les avertissements liés au générique), l’affectation n’a aucun effet (par exemple, «x = x»), etc. Votre coéquipier et vous-même pouvez vous mettre d'accord sur ces éléments. Eclipse les signalera comme "Erreur" lors de votre phase de développement une fois que vous aurez convenu de l'erreur de compilation.

Eclipse créera des fichiers de propriétés correspondant à ces préférences dans le dossier .settings. Vous pourrez les copier dans d'autres projets Java et les archiver dans SCM dans le code source.

Vous pouvez consulter le code d'Eclipse pour voir comment les développeurs Eclipse le font.

Kane
la source
1

Vous avez deux moyens de vous débarrasser de tous les avertissements (et je conviens que cela peut cacher un bogue subtil):

  1. Convaincre toute l'équipe que c'est la meilleure chose à faire et demandez-leur de la réparer.
  2. Convainquez votre patron que c'est la meilleure chose à faire et rendez-le obligatoire. Ensuite, ils doivent le réparer.

Je crois que 1 n'est plus faisable dans votre cas. En outre, cela prendra probablement si longtemps en raison du nombre d'avertissements que cela affichera dans la productivité, de sorte que la direction devra de toute façon savoir ce qu'elle en est.

Donc, ma suggestion est la suivante: prenez contact avec le patron, convainquez-le de la bombe à retardement et faites-le officialiser.

Thorbjørn Ravn Andersen
la source
1

Je voudrais juste leur dire que la plupart de ces avertissements sont des avertissements insignifiants et qu'il est essentiel que nous les retirions de la liste. Pour que nous ne manquions pas le véritable avertissement significatif dans la foule, comme cela se produit!

WinW
la source
Exactement. Il est important de s'en débarrasser car ils sont insignifiants.
MatrixFrog
0

Vous aurez besoin de beaucoup de patience pour essayer de les convaincre, supprimer les avertissements lors de la programmation en binôme aidera les autres à prendre l'habitude. Suggérez-leur de lire Effective Java 'Élément 24: Éliminer les avertissements non vérifiés' (pour la collecte générique). Et ignorez probablement de nombreux cas où les gens ne suivent pas vos conseils;)

Mehul Lalan
la source
0

Une approche efficace consiste à installer un serveur d’ intégration continue qui construit automatiquement le projet et exécute les tests chaque fois que des personnes archivent du code. Si vous ne l'utilisez pas déjà, vous devriez le faire et il n'est pas très difficile de convaincre les autres des avantages de le faire.

  1. Convaincre les chefs d’équipe / dirigeants des avantages de cette opération (éviter le déploiement de mauvaises versions, la détection précoce des bogues, en particulier ceux affectant accidentellement d’autres parties du logiciel, la maintenance des tests de régression, des tests rapides et fréquents, etc.).

  2. Installez le serveur CI avec tous les tests réussis (si vous n'avez pas de test, écrivez-en un rapide qui passe, pour que tout le monde voie qu'il est vert).

  3. Configurez des e-mails ou d’autres notifications sur l’état de chaque construction. Il est important ici d'inclure qui a enregistré dans le code, ce que la modification était (ou un lien vers la validation), et le statut + la sortie de la construction. Il s'agit d'une étape importante, car elle confère une visibilité à la fois aux succès et aux échecs pour l'ensemble de l'équipe.

  4. Mettez à jour le serveur CI pour que les tests échouent s'il y a des avertissements. La direction et les chefs d’équipe y verront une augmentation systématique de la discipline de l’équipe, et personne ne veut être responsable de tous les courriels d’échec envoyés.

  5. (optionnel) soyez sympa et geek avec ceci, en ajoutant des tableaux de bord visibles, des lampes à lave, des lumières clignotantes, etc. pour indiquer le statut de la construction et qui l'a cassé / réparé.

Ben Taitelbaum
la source