Question:
Comment dois-je communiquer de graves défauts de programmation à quelqu'un pour qu'il ne le prenne pas personnellement?
pek
2016-03-15 11:47:09 UTC
view on stackexchange narkive permalink

Je suis un développeur avec seulement quelques années d'expérience, travaillant dans une petite entreprise de huit développeurs, sur un projet Java. Notre chef d'équipe, également l'un des gestionnaires, est plus âgé et très productif, et dit qu'il a une quinzaine d'années d'expérience en Java.

Le mois dernier, alors que nous discutions de certains modules de code source qu'il a écrits, J'ai remarqué dans le code source que l'une des classes remplace la méthode equals () , mais pas la méthode hashCode () - je fais référence aux deux méthodes déclarées dans le Java très basique classe Object . Quand j'ai signalé cela au chef d'équipe, d'une manière très calme et polie, il a nié qu'une classe doive passer outre les deux méthodes. Le problème finirait là, mais j'ai trouvé immoral de laisser une telle faille (bug) blesser le produit plus tard.

Quelques jours plus tard, je l'ai approché en personne et en privé et je lui ai tranquillement, sans manquer de respect, lui expliquer le problème et utilisé des références externes (comme le livre de Joshua Bloch 'Effective Java') . Eh bien, il a dit qu'il le regarderait, et finalement il l'a fait. Cependant, depuis, il me donne l’épaule froide.

Pire encore, j'ai récemment vu un problème sérieux dans le code source. Certaines classes qu'il a écrites implémentent l'interface Serializable , mais le champ serialVersionUID n'est pas un nombre fixe (constant). Au lieu de cela, cela varie. Je veux dire, nous obtenons un numéro différent à chaque fois que nous exécutons l'application.

Encore une fois, avec la motivation de livrer un produit sain d'esprit, j'aimerais communiquer cela correctement. Mais je ne sais pas comment le faire correctement, sans qu'il le prenne personnellement. Vous voyez, mes approches précédentes ont échoué. Comment pourrais-je le faire?

Tout conseil serait le bienvenu.

Modifier: Le but de cette question est de trouver des moyens efficaces, productifs, polis, respectueux et collaboratifs de communiquer les améliorations sur problèmes de code graves, et de ne pas remettre en question l'autorité ou les décisions de gestion, prises par des pairs, ou même des supérieurs.

Quels problèmes réels, plutôt que théoriques, ces problèmes causent-ils dans votre code?
Si ce type fonde ses informations sur un seul livre, alors c'est mauvais. Posez la question concernant le code java sur SO. Au moins là, vous obtenez une garantie des experts java pour ce qui est bien et mal
@Philip Les problèmes décrits sont ceux qui peuvent souvent ne pas entraîner de bogues réels, mais si / quand ils aboutissent à des bogues, ils sont généralement difficiles à corriger. Même si ce n'était pas le cas ici, la question s'applique également aux questions de style de code et de propreté; que des bogues réels aient été identifiés ou non n'est pas pertinent.
Depuis combien de temps votre collègue vous donne-t-il une «épaule froide»? On dirait que vous avez réussi à le convaincre, donc vous n'avez peut-être pas échoué autant que vous le pensez - il faudra peut-être un peu de temps pour que sa fierté se rétablisse.
@PhilipKendall Je suis plus intéressé à communiquer efficacement certaines préoccupations sans lui causer de tort (ni à l'équipe et au produit). Néanmoins, le futur projet est de faire communiquer certains objets via JMS sur différents ordinateurs / JVM.
@Rob Merci pour votre contribution - cette situation existe depuis deux mois. Encore une fois, je devrais peut-être attendre un peu, comme vous le suggérez
"J'ai remarqué dans le code source que l'une des classes remplace la méthode est égale, mais pas la méthode hashCode." - si vous voulez communiquer efficacement à un programmeur pourquoi quelque chose comme ça est mauvais, trouvez des instances de bogues réels dans le code qui peuvent être directement reliées à cette mauvaise pratique. Ensuite, vous pouvez dire définitivement "si nous adoptons la pratique X, les bogues de ce type ne se produiront pas".
Vous n'avez pas à remplacer la fonction de hachage, tant que les objets comparant égaux ont le même code de hachage. Si la classe A compare les noms et les noms de hachage, et la sous-classe B compare les noms et les prénoms, l'ancienne méthode de hachage fonctionnera très bien. Vous n'avez pas non plus à remplacer la fonction de hachage si elle n'est jamais utilisée.
@Brandin Donc, je pense créer soit un cas de test, soit même un mini programme, pour prouver ce problème. Ce serait génial - si on me permettait de prendre le temps au chronomètre et ça (mais ok, je pourrais toujours le faire pendant les heures supplémentaires, si nécessaire). Cependant, je ne veux vraiment pas voir ces problèmes apparaître après la livraison et être découverts par les clients. Merci.
@pek Le mieux serait de trouver un bogue démontrable, de le classer dans le traqueur de bogues, de le corriger, puis de le signaler. Hé, j'ai corrigé le bug # 1234. Si nous nous assurons de toujours faire X, des bogues comme celui-ci ne se reproduiront plus. Je recommande de l'intégrer à partir de maintenant à la norme de codage. Le reste dépend vraiment du chef d'équipe.
@gnasher729 Merci d'avoir répondu. L'héritage n'est pas impliqué dans notre cas. Chacune de nos classes n'hériterait que de la classe Object (comme toujours). Cependant, nous avons un ensemble d'instances de ces classes.
@Brandin [Pour: le mieux serait ...] Vrai, vrai. Vous avez tout à fait raison qu'un bug réellement démontrable est une meilleure preuve. Merci beaucoup
Copie possible de [Comment puis-je m'empêcher de dépasser mon autorité avec mes collègues?] (Http://workplace.stackexchange.com/questions/23772/how-can-i-keep-myself-from-overstepping-my- autorité-avec-collègues)
Utilisez-vous TDD? Si vous pouvez créer un cas de test qui échoue, vous avez le seul bogue dont vous avez besoin - et vous déplacez le débat de son code vers votre cas de test. On dirait plus que vous êtes intéressé par la rigueur, et les programmeurs très productifs manquent souvent (pas toujours) de cette rigueur. Un processus TDD, ou au moins des cas de test, exploitera le processus pour remplacer (potentiellement) les mauvaises habitudes.
@gnat Je pense que ce n'est pas le cas, et honnêtement, merci d'avoir signalé l'autre sujet - cela permet d'éviter les malentendus. Je viens de faire une modification, aussi. Merci beaucoup
@jimm101 Merci d'avoir introduit TDD dans le sujet. Malheureusement, nous ne le faisons pas. Mais je pense que votre commentaire complète très bien les commentaires de Brandin ci-dessus. Merci
@pek: Intéressant, car un ensemble ne devrait pas fonctionner dès que vous avez deux pointeurs d'objet différents où les objets se comparent égaux.
Y a-t-il quelque chose que vous avez remarqué au cours des 2 dernières années qui vous donne un aperçu ou des sujets de préoccupation? Avez-vous déjà vu quelqu'un d'autre contredire cette personne? Vous sentez-vous à l'aise de demander?
Avoir un serialVersionuID différent pour chaque exécution est acceptable tant que les objets sérialisés ne sont réutilisés que dans cette exécution. Si tel est le cas, il peut être préférable que les versions changent à chaque exécution.
hashCode n'est utile qu'à des fins de performances lors de l'utilisation de hashSet / HashMap et de ce type d'objets, si le hashcode est identique, ils exécutent toujours equals (). Pour le numéro de série: je ne le mets pas, j'ajoute simplement Serializable afin de permettre la sérialisation en JSON et JSON n'utilise pas cette variable, c'est uniquement pour la sérialisation java brute, qui verrouille la communication pour être uniquement entre l'application java. Si le senior fait quelque chose de mal, ce ne devrait pas être qu'il n'a pas vu hashCode / serialNumberId en vous expliquant pourquoi vous n'en avez pas besoin.
Onze réponses:
keshlam
2016-03-15 14:54:32 UTC
view on stackexchange narkive permalink

Rappel général: il vaut toujours mieux éviter un ton critique ou de conférence. Faites-en une simple observation ("vous semblez avoir oublié d'implémenter le hashcode ici") ou faites-en une question ("y a-t-il une raison pour laquelle vous n'avez pas implémenté le hashcode?"). Laissez leur réponse conduire la discussion sur les raisons pour lesquelles cela compte, si nécessaire, mais partez de l'hypothèse qu'ils connaissent les principes et que la bizarrerie était soit une simple erreur / faute de frappe, soit une raison rationnelle derrière elle qui peut être discutée plutôt que

Les gens écoutent mieux si vous les traitez avec respect.

Et rappelez-vous, parfois, le malentendu sera le vôtre. Vous vous embarrasserez beaucoup moins de cette façon que si vous faites une déclaration plus absolue ou didactique.

L'approche de la question est très bonne!
@keshlam Certes, vous avez raison dans les trois sujets que vous avez abordés dans votre réponse détaillée. Surtout, le premier paragraphe, l'idée de suivre une «approche par questions», ouvre une toute nouvelle perspective sur le sujet, et sur les modes de communication, plus généraux. Vraiment merci beaucoup
Des questions telles que "y a-t-il une raison pour laquelle vous n'avez pas implémenté le hashcode?"fonctionne très bien lorsqu'il s'agit de fainéants intentionnels;mais ils ont tendance à se retourner contre les gens qui se sentent surchargés (soit parce qu'ils luttent, soit parce qu'ils ont trop de choses à faire).Cela les mettra sur la défensive et causera probablement des frictions.La question souligne intrinsèquement leur erreur _et_ leur demande de la justifier.Il est formulé avec gentillesse mais la réponse requise n'est pas simple et implique une culpabilité attribuée.
Philipp
2016-03-15 15:30:00 UTC
view on stackexchange narkive permalink

Peut-être que regarder cela d'un autre point de vue pourrait vous donner une meilleure vue.

Je suis chef d'équipe et aussi directeur dans une petite entreprise de huit développeurs. J'ai 15 ans d'expérience en programmation en Java. J'ai une nouvelle personne dans mon équipe qui est beaucoup plus jeune que moi avec seulement quelques années d'expérience.

Le mois dernier, alors que nous discutions de certains modules de code source que j'ai écrits, il a commencé à rabaisser mon code. Même s'il a beaucoup moins d'expérience que moi, il a prétendu voir des bogues dans le code qui fonctionnait parfaitement. Après une courte discussion, il me semblait que j'étais capable de lui expliquer cela.

Mais malheureusement, il ne peut tout simplement pas se reposer sur cette question. Il continue de saper mon autorité en exigeant que nous fassions tout par des manuels (comme le livre de Joshua Bloch `` Effective Java ''), même dans les cas où ce serait juste une perte de temps et n'entraînerait pas un avantage tangible pour notre produit. Comment puis-je amener ce développeur junior à faire confiance à mon expérience?

Il est difficile en tant que junior de convaincre un senior de changer ses pratiques. De plus, en tant que manager, il doit maintenir une aura de supériorité pour être capable de diriger efficacement.

Ainsi, lorsque vous souhaitez améliorer les normes de qualité dans votre lieu de travail sans l'autorisation de le faire, donnez l'exemple. Faites ce que les autres font de mal et montrez que votre chemin est meilleur car il en résulte un meilleur produit en moins de temps. Lorsque vous signalez des erreurs dans le code d'autres personnes, ne le faites pas en pinçant les fichiers de code source. Faites-le en présentant un défaut reproductible dans le produit lui-même et un moyen de le réparer en suivant les meilleures pratiques.

En passant, l'une des maladies professionnelles les plus courantes chez les programmeurs est un ego gonflé. Il en a peut-être déjà un, mais vous commencez également à montrer des symptômes des premiers stades.

Merci pour votre réponse, c'est génial dans la façon dont il essaie de me mettre à sa place. À propos de la partie narration: j'espère vraiment que la première discussion n'a pas été vraiment perçue comme un argument, et que les préoccupations de qualité n'étaient pas vraiment perçues comme «sapant l'autorité». Sinon, il y a eu un malentendu vraiment énorme.Pour le reste, je pense que votre approche de "montrer par bon exemple" et "montrer par cas de test" est très pratique, scientifique et peut éventuellement aider à construire un meilleur produit et peut-être des relations ... alors, oui, j'aime ça. Vraiment, merci beaucoup
Sensationnel. Prêchez-le, brotha.
Je ne suis pas un développeur Java, mais il semble tout à fait possible que le développeur senior ici ait de bonnes raisons de faire les choses comme elles l'ont été. Comme (d'après ma propre expérience) ne pas faire quelque chose comme vous l'avez fait à l'école donne un ordre de grandeur (ou plus) augmentation de la vitesse dans une application à temps critique ... Alors pourquoi ne pas commencer par simplement demander pourquoi cela a été fait par ici? Il est possible que vous appreniez quelque chose.
@jamesqf Les mêmes interfaces sont utilisées en C # et bien que le code fonctionnera dans la plupart des cas (selon l'implémentation), ne pas surcharger Hashcode () entraînera l'échec des structures de données de hachage (bien que tout le reste devrait fonctionner) et de même avec serialVersionUID aveccertains problèmes difficiles à déboguer indésirables. Il est facile de manquer de remplacer ces méthodes si vous ne comprenez pas entièrement la portée;quelque chose que pek s'attend à ce que son développeur principal comprenne.
_ "De plus, en tant que manager, il doit maintenir une aura de supériorité pour pouvoir diriger efficacement" _ Non.Vous n'avez pas besoin d'être supérieur pour diriger: vous devez être un bon communicateur qui donne de bons exemples à suivre par les autres, en faisant preuve d'engagement, de passion, d'empathie, d'honnêteté et d'intégrité.
Ce.C'est une manière parfaite de poser le problème.Ce commentaire m'a averti que c'était un problème de perspective: "J'ai trouvé immoral de laisser une telle faille (bug) blesser le produit plus tard."Le mot «immoral» implique que vous accordez beaucoup trop d'importance à ce genre de questions.
@JoeBradley Trop d'importance?Nous ne savons pas à quel type de logiciel OP fonctionne, mais si c'est ma banque, je préfère qu'il accorde "trop d'importance" à ces questions plutôt que de se retrouver avec quelques milliers de dollars de moins dans le compte, car certaines opérations n'ont pasJe ne trouve pas de réservation qui m’a transféré de l’argent et qui a donc sauté.Ce sont des questions importantes, la construction de logiciels appropriés est aussi importante que la construction de ponts appropriés (sans doute parfois plus parfois moins).Je suis d'accord que le voir psychologiquement de l'autre côté pourrait aider à obtenir le bon ton dans la conversation.
Cela étant dit, oui, le problème serialVersionUID a généralement moins d'impact, mais j'encouragerais toujours un junior ou un développeur à discuter du code jusqu'à ce qu'il comprenne pourquoi il est comme il est, c'est aussi pourquoi il y a des revues de code et pourquoi elles sont prises en compteimportant - pour impliquer toute l'équipe et repérer les problèmes qui, autrement, pourraient entraîner des problèmes plus tard.
Kilisi
2016-03-15 13:56:19 UTC
view on stackexchange narkive permalink

Un moyen d'atténuer ce genre de problème est de «donner et recevoir». J'ai réussi à plusieurs reprises avec cette stratégie. Les gens sont plus réceptifs à vos suggestions et critiques lorsque c'est dans les deux sens. Je posais donc des questions et des conseils lorsque j'en avais l'occasion et je prenais leurs réponses au sérieux. (Pour être honnête, parfois, je connaissais déjà la réponse, mais on ne sait jamais, j'ai aussi appris des choses intéressantes de cette façon.)

Finalement, vous établissez un rapport où vous vous soutenez et les choses se passent beaucoup mieux à bien des égards. Et s'il a 15 ans d'expérience, je parie qu'il pourrait vous dire beaucoup de choses qui valent la peine d'être connues.

Je ne m'inquiéterais pas pour lui et son épaule froide, c'est assez normal après ce qui s'est passé. Selon toute vraisemblance, il aura pris en compte votre contribution et sera prudent avec vous, et vous l'avez probablement un peu contrarié. Mais ce n'est pas un concours de popularité, alors à moins qu'il ne devienne incontrôlable, donnez-lui un peu d'espace. Restez amical et solidaire et il reviendra.

Bon point, bonne stratégie! Cela peut effectivement conduire à un lien (rapport) plus fort. Merci!
Thorbjørn Ravn Andersen
2019-01-08 21:56:24 UTC
view on stackexchange narkive permalink

Au lieu d'en faire une discussion "Je pense que vous devriez" qui est désormais claire et qui ne vous mènera nulle part, transformez-la en discussion technique.

Après avoir examiné le code J'ai trouvé un problème et j'ai écrit le test X qui le démontre.

(Vous pouvez en écrire plusieurs si nécessaire). Il appartient ensuite à l'équipe de discuter de la manière de résoudre le problème afin que votre test réussisse.

WendyG
2019-01-09 18:25:21 UTC
view on stackexchange narkive permalink

Avez-vous des rencontres matinales? ou d'autres réunions d'équipe où vous pouvez le mentionner de manière informelle.

En les adressant à tout le monde de manière totalement impersonnelle "Oh dérange, j'ai trouvé que ce problème que cette classe a implémenté équivaut à pas de hashcode, cela peut vraiment causer des problèmes si la classe est jamais utilisé dans un hashmap car seule l'identité de l'objet est utilisée comme clé "et ensuite discuter du moment où cela peut être corrigé.

Vous n'avez accusé personne d'avoir écrit du mauvais code, tout le monde sait maintenant pourquoi c'est un problème , le code est corrigé.

Trevor
2019-01-10 00:37:27 UTC
view on stackexchange narkive permalink

Soyez poli et professionnel. Soumettez un ticket pour le bogue, dans votre ticket, détaillez le problème et une solution potentielle, et laissez une ouverture pour que vous soyez contacté pour plus d'informations ou une explication du problème. En rester là. Lorsque vos tickets sont examinés, ils seront attribués soit à vous-même pour corriger le bogue que vous avez trouvé, soit au développeur d'origine. Espérons que l'autre développeur comprendra et résoudra le problème, ou reviendra vers vous pour plus d'informations. Si ni l'un ni l'autre ne se produit, alors c'est un problème de gestion maintenant.

Cette méthode n'appelle aucun développeur spécifique pour les erreurs, et permet de tenir compte du temps de réparation et peut-être même d'inclure dans une mêlée (si vous le faites cela).

Trouver des bogues dans le code d'autres personnes est une pratique courante. Chaque fois qu'un nouveau développeur entre dans un projet, il trouve des problèmes. Attribuer le blâme n'est pas important. Créez simplement un ticket et laissez les processus de l'entreprise le gérer. Les développeurs expérimentés ne devraient pas être offensés par les autres qui découvrent des problèmes dans leur code. Et s'ils le font, ils ne devraient probablement pas être des développeurs.

Ben
2019-01-11 18:06:35 UTC
view on stackexchange narkive permalink

Je pense que Keshlam fait valoir un bon point. Il est également important de garder à l’esprit que l’équipe est propriétaire du code, et non un individu. J’éviterais donc d’utiliser le mot «Vous» lorsque vous posez des questions sur des problèmes potentiels avec le code. Vous pouvez plutôt demander

"Bonjour, j'ai remarqué que nous n'avons pas implémenté le hashcode ici, y a-t-il une raison à cela?"

Vous êtes résoudre le problème potentiel avec le code, mais aussi demander une raison possible du problème et donner au chef d'équipe l'occasion d'en faire une expérience d'apprentissage pour vous.

520 says Reinstate Monica
2019-01-11 20:00:49 UTC
view on stackexchange narkive permalink

Quelques indications générales, mais à partir de ces informations, je pense que les points 4 et 5 pourraient être les plus appropriés:

  1. Séparez le code de son auteur. Vous êtes ici pour évaluer le premier, pas le second. "Ce code est [X]" est meilleur que "Vous avez créé ce code [X]".
  2. Soyez précis. Ne donnez pas de descriptions vagues pour l'ensemble de la base de code. «Des commentaires descriptifs seraient appréciés en X, Y et Z concernant le libellé de cette fonction» est infiniment plus apprécié que «Tout est grec pour moi».
  3. Soyez positif aussi! le terme pour ce processus est «révision du code», et non «dépeçage verbal du code» pour une raison. Dans la plupart des revues publiées, un critique parlera des bons et des mauvais aspects d'un produit. Vous devriez faire de même.
  4. Choisissez vos batailles. Ne traitez pas tout comme un facteur décisif. Si c'est un peu bizarre mais que cela fonctionne parfaitement bien, donnez-lui au mieux une note de bas de page et résolvez-le comme un `` problème mineur '' ou une `` question rapide ''. En général, si vous devez ouvrir un débogueur / décompilateur pour créer un scénario de casse, cela ne compte pas comme quelque chose de grave.
  5. Assurez-vous que les choses dont vous parlez ne sont pas seulement «théoriques». Testez l'application vous-même ou parlez à l'équipe de test de quelque chose qui, selon vous, pourrait poser problème.
Sascha
2019-01-12 00:17:17 UTC
view on stackexchange narkive permalink

Écrivez un cas de test, décrivez le comportement auquel vous vous attendez et montrez que le problème rompt le test.

(O garçon, quelles choses insensées nous avons découvertes lorsque nous avons commencé à tester hashCode et est systématiquement égal dans notre projet .....)

HotBreakfast
2016-03-15 15:09:43 UTC
view on stackexchange narkive permalink

Super bonne question. J'adore apprendre, mais quand quelqu'un me calme, je sens que je devrais arrêter. Je recommande de revoir le «style de codage» de vos collègues et d'identifier ses forces pour qu'il ne se sente pas comme si tout ce temps qu'il a passé à apprendre était inutile. PUIS identifier les OPPORTUNITÉS. De cette façon, vous affichez les forces pour l'avenir qui aident l'entreprise et travaillent également sur les «opportunités» que vous avez déjà identifiées. Je dirige des équipes en donnant un calendrier de 30-60-90 jours, puis je loue les ajustements où nous avons capitalisé sur les «opportunités». Cela fonctionne très bien et constitue un moyen équitable d'identifier les leaders par rapport aux personnes qui ne sont pas et ne devraient pas être des leaders.

Eh bien, merci d'avoir répondu, mais je ne suis pas sûr de vous comprendre. Juste pour clarifier de ma part: je ne remets pas en question le leadership. Ni l'un ni l'autre ne souhaitent assumer un rôle de leadership.
Quelqu'un doit diriger. Je parle d'expérience personnelle. Je ne voulais pas vous embrouiller.
J'ai pitié de l'imbécile qui «vous rend moelleux».
Tombo
2019-01-11 00:43:11 UTC
view on stackexchange narkive permalink

Réparez-le vous-même. Créez une branche, corrigez-la, testez-la par les développeurs et si vous avez besoin d'une approbation, effectuez simplement une révision du code. Cela change le fardeau pour vous, mais vous êtes celui qui pense que c'est important, donc le fardeau retombe vraiment sur vous, même si c'est le code de quelqu'un d'autre.

Le seul problème avec cette approche est que si le produit casse, et qu'il remonte à ce correctif, alors l'OP perd de sa crédibilité puisque son correctif pourrait être une "meilleure pratique" théorique et non un correctif réel.
@Dan, était d'accord.Il ferait mieux de s'assurer qu'il a raison.C'est pourquoi j'ai inclus le test de développement dans les étapes.S'il pense que cela devrait être fait, il devrait porter la responsabilité non seulement de le tester, mais si sa suggestion casse quelque chose aussi, non?Proposez-vous qu'il passe la responsabilité de sa suggestion à quelqu'un d'autre?
@Dan, dans le dernier commentaire, j'aurais dû dire: "Sinon, il passerait la responsabilité à quelqu'un d'autre pour sa suggestion."Ne me laisse pas modifier les commentaires après 5 minutes.


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...