Traiter avec un développeur ignorant continuellement les cas marginaux dans son travail

25

J'ai un problème intéressant, assez courant, je suppose, avec l'un des développeurs de mon équipe. Le gars est un excellent développeur, travaille vite et est productif, produit un code de assez bonne qualité et tout. Bon ingénieur. Mais il a un problème avec lui - très souvent, il ne parvient pas à traiter les cas marginaux dans son code.

Nous en avons parlé plusieurs fois avec lui et il essaie mais je suppose qu'il ne pense pas de cette façon. Donc, ce qui finit par arriver, c'est que QA trouverait beaucoup de problèmes avec son code et le retournerait encore et encore pour le développement, entraînant finalement des délais manqués et tout le monde dans l'équipe mécontent.

Je ne sais pas quoi faire de lui et comment l'aider à surmonter ce problème. Peut-être que quelqu'un avec plus d'expérience pourrait vous conseiller?

Alex N.
la source
11
Demandez à quelqu'un de couvrir son code avec des tests unitaires.
Job
8
La personne la mieux qualifiée pour tester le code est son auteur.
16
@Developer Art: Complètement en désaccord. La pire personne à faire un test de code est la personne qui a développé ce code. Tout le monde a des angles morts mais la personne qui fait la création a le plus grand angle mort par rapport à son code.
James P. Wright
2
@Developer Art: Je pense que l'écriture de tests automatisés est en fait un rôle assez courant. Généralement, c'est quelque chose que vous faites pendant un an ou deux si vous n'êtes pas tout à fait prêt pour les heures de grande écoute dans l'entreprise où vous vous trouvez. C'est en quelque sorte une période de purgatoire.
Morgan Herlocker
19
Vous le décrivez comme un "grand développeur", "productif", un "bon ingénieur" et produisant du "code de bonne qualité". Mais le contrôle qualité continue de trouver des problèmes avec son travail. Utiliseriez-vous vraiment ces termes pour décrire quelqu'un qui régulièrement et régulièrement injecte des défauts dans leur code? Je me demande s'il y a plus dans cette histoire, car la description de l'individu en tant que professionnel et le travail qu'il fait ne correspondent pas du tout.
Thomas Owens

Réponses:

29

Lui demander d'écrire des tests unitaires automatisés pour son code. L'écriture de tests unitaires oblige à réfléchir aux cas marginaux.

Quelques détails:

  1. Pour qu'il ne se sente pas isolé, cela devrait être institué pour toute votre équipe. Exiger que tout le monde écrive des tests unitaires automatisés pour le nouveau code ou le code qu'ils modifient.
  2. Exiger que les noms des tests unitaires soient descriptifs quant au cas qu'ils testent.
  3. Couvrir les tests unitaires automatisés dans la revue de code à un niveau élevé. Demandez aux examinateurs de rechercher les cas de test manqués (c.-à-d. Les cas marginaux qu'il manque constamment). Après un certain nombre de commentaires de son équipe sur les cas marginaux manqués, il apprendra probablement à les prendre en compte avant l'examen.
  4. Appliquez cette règle à toute l'équipe: si QA trouve un bogue, le développeur responsable doit le test automatisé qui confirme l'échec et prouve ensuite qu'il l'a corrigé. (avant de faire tout autre travail)
Matthew Rodatus
la source
Amen, encore mieux, tout le monde doit d'abord écrire son code de test. L'utilisation d'un cadre BDD réduit généralement la douleur de cela
George Mauer
@George Bonne idée. TDD aiderait encore plus ici.
Matthew Rodatus
3
Les tests unitaires ne consistent pas à trouver des bogues - blog.stevensanderson.com/2009/08/24/…
Dainius
1
@Dainius, je suis d'accord. Les tests unitaires permettent au développeur de réfléchir aux cas marginaux, ce qui peut empêcher (mais non identifier) ​​les bogues.
Matthew Rodatus du
After some amount of feedback from his team about missed edge cases, he will probably learn to consider thoseLes développeurs qui ont de mauvaises pratiques soutiennent souvent la non pertinence de l'effort supplémentaire requis pour une bonne pratique (car ils ne voient pas l'avantage de le faire). Bien que le développeur puisse acquiescer lorsque vous ajoutez des cas supplémentaires, cela ne signifie pas qu'il pense que cela est pertinent ou s'il va les ajouter lui-même.
Flater
23

Donnez-lui une liste de contrôle, par exemple

  • entrées nulles
  • entrées à très grande extrémité de plage
  • entrées à l'extrémité extrêmement petite de la plage
  • combinaisons
  • entrées violant les invariants supposés (par exemple si x = y)

Les gens d'AQ peuvent aider à élaborer la liste de contrôle

Donnez la liste de contrôle à tous les développeurs, pas seulement à celui-ci.

Steven A. Lowe
la source
1
Bon point que tous les développeurs devraient utiliser la liste de contrôle, le fait de choisir un développeur peut provoquer de mauvais sentiments. Et cela pourrait aider à améliorer la qualité du code de chacun .
FrustratedWithFormsDesigner
Bonne idée, même si je suis curieux de savoir comment cela pourrait être considéré du point de vue des développeurs. Je n'ai jamais rencontré cette pratique dans ma carrière de développeur, il est donc difficile d'évaluer la réaction. Des idées là-bas?
Alex N.
@Alex: les listes de contrôle sont une pratique courante pour certains développeurs et une horrible insulte pour d'autres. Essaye le et regarde ce qu'il se passe. S'il quitte, la qualité de votre code s'améliorera ;-)
Steven A. Lowe
4
Vos développeurs n'utiliseront pas de listes de contrôle? Si une liste de contrôle pouvait sauver des vies, les utiliserait-elle? Beaucoup de médecins ne le font pas et les patients souffrent. Lisez ceci: newyorker.com/reporting/2007/12/10/071210fa_fact_gawande
Barry Brown
1
@Barry, je n'ai pas dit qu'ils ne le feraient pas. Les listes de contrôle dans ce cas sonnent, à mon humble avis, comme un remède pour les symptômes d'un problème, pas pour le problème lui-même. Le problème étant la discipline et la diligence dans ce cas. Lorsque le problème est la complexité d'un système qui nécessite une maintenance d'urgence avec un haut niveau de responsabilité et de stress, ce qui se traduit par un niveau dégradé d'attention aux détails, alors oui, les listes de contrôle ftw (pilotes, médecins, etc.) Mais c'est plus d'un débat philosophique, je suppose, en dehors de la portée de cette question.
Alex N.
17

Bon ingénieur.

D'accord.

Mais il a un problème avec lui - très souvent, il ne parvient pas à traiter les cas marginaux dans son code.

C'est une qualité que les bons ingénieurs ne partagent pas.


La surveillance des cas marginaux est une caractéristique qui est présente ou non chez les personnes. Cela n'a rien à voir avec le fait d'être ingénieur ou programmeur. Le développement de cette caractéristique est influencé par le contexte culturel, le cadre de vie, les événements de l'enfance et les expériences de vie. Ensuite, l'attitude est simplement appliquée à tout travail effectué par un individu.

Ce dont vous avez besoin est de savoir si votre gars est de ce type qui n'a pas développé ce certain sens (peut-être encore). Il est également très probable qu'il ne se soucie simplement pas d'une raison ou d'une autre. Vous devez analyser toute la situation, qu'il soit satisfait de son travail. Sinon, vous devriez peut-être faire quelque chose pour l'aider en premier.

S'il est d'accord avec le travail mais n'a pas encore connu le danger de cas marginaux, vous pouvez commencer à l'éduquer. S'il le prend au sérieux, il pourrait changer ses habitudes au fil du temps. Bien que je sceptique sur celui-ci, vous pouvez toujours l'essayer.

Si toutefois il se révèle être ce type de personne qui n'est pas bonne dans les cas marginaux, il ne vous reste plus qu'à le retirer de l'équipe. Cette caractéristique est essentielle à la programmation pratique. Malheureusement, sans elle, même une grande personne ne produirait pas un bon travail.


la source
6
+1 C'est une compétence que certaines personnes ont et que certaines personnes doivent apprendre à être un bon programmeur. Cependant, je noterais qu'il existe deux types de cas marginaux: les cas marginaux liés aux exigences commerciales ("Si nous commandons 27 formateurs gauches et 28 formateurs droitiers, cette commande est probablement erronée") qui devraient être traités dans les exigences du projet, et les cas réels les cas de bord de codage (traiter des entrées invalides, itérer constamment dans les listes lorsqu'un hachage est plus sensible en termes de vitesse lorsque l'ensemble devient plus grand que x, etc.), ce qui est plus quelque chose que vous n'avez qu'à apprendre.
Ed James
Merci pour votre perspicacité. J'apprécie beaucoup. Vous avez tout à fait raison sur tous les fronts ici, bien que je sois curieux, s'il est une personne formidable mais qu'il lui manque juste quelque chose qui fait de grands ingénieurs, comment puis-je encore le mettre à faire d'autres travaux et le garder dans l'organisation, peut-être passer à une autre équipe ou quelque chose ... Bien que je suppose que je peux répondre à cette question :)
Alex N.
J'y ai pensé mais je ne suis pas sûr. Un autre rôle pour devenir acceptable pour ce genre de personne ne devrait pas nécessiter d'attention aux détails et il n'y en a pas beaucoup dans une société de logiciels.
Le monde n'est pas aussi noir et blanc que votre première phrase l'indique. Je pense qu'il existe des développeurs qui peuvent identifier certains cas marginaux mais pas tous.
Mike Partridge
5

Pourriez-vous faire des revues de code ou de conception plus tôt dans le processus?

PSU_Kardi
la source
4

Apprenez-lui à programmer le test d'abord. Associez-le avec lui. Vous écrirez les cas de test et il écrira le code pour passer les tests.

Kevin Cline
la source
3

Est-ce que l'implication de l'AQ assez tôt dans le développement des fonctionnalités pourrait lui fournir une liste de cas marginaux à traiter? Bien que certains puissent voir cela comme ne s'attendant pas à ce que le développeur couvre tout, cela peut être un moyen de contourner ce problème s'il a tendance à manquer ces cas limites qu'un testeur pourrait bien détecter initialement.

L'autre idée que j'aurais ici est de savoir comment il voit ce problème. Est-il vraiment ennuyé et se moque-t-il de ce modèle ou le considère-t-il simplement comme normal et pas quelque chose pour lui de s'inquiéter de la résolution? Certes, cela nécessite beaucoup de confiance et lui permet d'être ouvert sur son point de vue, mais je pense qu'il y a un certain degré d'empathie ici qui peut aider si vous pouvez voir les choses de son point de vue.

JB King
la source
3

Il existe un nombre infini de cas de bord, il est impossible de les couvrir tous. Et si quelqu'un le fait #define TRUE FALSE? Il ajoute des cas de bord, les vérifierez-vous aussi?

De plus, je ne considérerais pas à toute épreuve toutes les fonctions d'une classe privée ou d'une fonction interne.

L'approche que je choisis pour le code qui doit être très solide et stable est la suivante:

if(conditions_met)
{
DoStuff();
}
else
{
CrashAppAndDumpMemory();
}

De cette façon, vous obtenez des vidages d'application solides dans QA, et au moment où vous arrivez à une version, l'application est solide et sûre.

Il est mauvais de contourner les erreurs. Ok, vous pouvez enregistrer une fonction si le descripteur de fichier est nul et renvoie null, mais dans la plupart des cas, il y a une erreur de conception quelque part et le plantage de l'application est un meilleur moyen de vous forcer à trouver la cause. La plupart des cas marginaux masquent simplement l'erreur en masquant un problème, par exemple - le bouton a cessé de fonctionner. Crash vous indique que certaines hypothèses sur le produit sont erronées et que vous devez réviser la logique à l'origine du crash.

Codeur
la source
#define TRUE FALSE n'est pas une affaire marginale, c'est une infraction de limogeage.
gnasher729
1

S'il s'agit d'un cas de bord, doit-il même être pris en considération? Si les cas marginaux sont importants, les cas marginaux doivent être introduits dans les exigences / fonctionnalité / histoire utilisateur.

Si les caisses de bord ont été considérées comme faisant partie d'une pièce de travail et que des dispositifs doivent être mis en place, ils doivent faire partie de l'élément de travail et, par définition, l'élément de travail n'est pas complet tant que le mécanisme de gestion de l'étui de bord n'est pas en place.

Cela vous donne en tant que chef d'équipe quelque chose à vérifier une fois le travail terminé pendant la discussion post-travail et cela donne au développeur quelque chose à vérifier pendant qu'il termine le travail.

Bronumski
la source
Il y a toujours des cas marginaux. Si quelqu'un prétend que les cas de bord ne seront jamais rencontrés, ce ne sont pas les cas de bord droit.
Barry Brown
1
@Barry Brown Je conviens qu'il y a toujours des cas marginaux mais il y a une différence entre les cas marginaux importants que les parties prenantes jugent importants que nous pouvons appeler des scénarios et les cas marginaux qu'un développeur juge importants. Si un intervenant pense que quelque chose est important, il devrait être discuté lors de la session de planification et inclus en tant que scénario sur une histoire utilisateur et non laissé au développeur de réfléchir, cela devrait être une exigence appropriée contre la tâche. Cela prend beaucoup de temps et n'est pas nécessaire, mais des vérifications nulles par rapport aux paramètres de chaque méthode non publique unique.
Bronumski
1

Catching edge cases est la raison pour laquelle l'AQ existe. Les programmeurs ont la responsabilité de faire sortir le travail en temps opportun. Passer tout son temps à chercher des cas de pointe est très inefficace. Si vous avez un cycle itératif assez rapide, cela ne devrait poser aucun problème. Les cas de bord sont presque infinis en nombre. Si c'était un problème avec les cas "Core", je serais un peu inquiet. Tout comme les développeurs sont experts en développement, un testeur devrait être un expert en tests. Lorsqu'un testeur trouve un problème, il le renvoie au développement. Le développeur résout le problème. Problème résolu. Le temps nécessaire à un développeur pour rechercher chaque cas périphérique est beaucoup plus long que le cycle de test itératif devrait prendre. Notez également que lorsque je parle de tests, je ne parle pas de tests unitaires en boîte blanche, mais de tests strictement en boîte noire.

Morgan Herlocker
la source
1
Ce n'est vraiment pas la bonne réponse. Être récompensé pour avoir produit un travail de qualité inférieure est une mauvaise pratique. L'équipe de développement devrait dans son ensemble être responsable d'un travail de haute qualité.
David
Un développeur décent n'a pas à chercher des cas de bord. Certains codes sont écrits pour ne pas avoir de cas marginaux, dans d'autres cas, les cas marginaux sont évidents. Le code ne traitant pas les cas marginaux est un code incomplet.
gnasher729
0

C'est l'un des cas où je crois que le développement piloté par les tests vient à la rescousse car il aide à penser en termes de cas marginaux et de tout ce qui peut casser le code.

Billal Begueradj
la source