Est-ce que d'autres personnes corrigent des bogues quand elles les voient ou attendent-elles jusqu'à ce qu'il y ait un crash / une perte de données / des personnes meurent avant de le réparer?
Exemple 1
Customer customer = null;
...
customer.Save();
Le code est clairement faux, et il n'y a aucune solution, il appelle une méthode sur une référence nulle. Il arrive de ne pas planter car Save
il n’accède à aucune donnée d’instance; c'est comme appeler une fonction statique. Mais tout petit changement n'importe où peut provoquer soudainement un code cassé qui ne plante pas: commencer à planter.
Mais , il n'est pas non plus inconcevable de corriger le code:
Customer customer = null;
...
customer = new Customer();
try
...
customer.Save();
...
finally
customer.Free();
end;
pourrait introduire un crash; une non découverte par des tests unitaires avec une couverture complète et des tests manuels par l'utilisateur.
Exemple 2
float speed = 0.5 * ((G * mass1 * mass2) / R) * Pow(time, 2);
Les personnes connaissant la physique reconnaîtront qu'elle est supposée être R 2 au dénominateur.
Le code est faux, c'est absolument faux. Et surestimer la vitesse provoquera un tir trop tôt des fusées rétro, tuant tous les occupants du vaisseau spatial.
Mais il est également possible que le fait de surestimer la vitesse masque un autre problème: les coussins gonflables ne peuvent pas se déployer tant que la navette se déplace trop rapidement. Si nous corrigeons soudainement le code:
float speed = 0.5 * ((G * mass1 * mass2) / Pow(R, 2)) * Pow(time, 2);
Maintenant, la vitesse est précise et, tout à coup, les airbags se déploient alors qu'ils ne le devraient pas.
Exemple 3
Voici un exemple que j'avais récemment, vérifiant si une chaîne contient des caractères non valides:
if (StrPos(Address, "PO BOX") >= 0)
{
//Do something
}
Et s'il s'avère qu'il y a un bug dans la Do something
branche? Correction du code manifestement incorrect:
if (StrPos("PO BOX", Address) >= 0)
{
//Do something
}
Corrige le code, mais introduit un bogue.
À mon avis, il y a deux possibilités:
- corrige le code et est blâmé pour l'avoir brisé
- attendre que le code plante, et se faire reprocher d'avoir un bogue
Que faites- vous politiquement?
Exemple 4 - Le bug du monde réel d'aujourd'hui
Je construis un objet, mais j'appelle le mauvais constructeur:
Customer customer = new Customer();
Il s'avère que le constructeur "sans paramètre" est en réalité un constructeur paramétré à partir de l'arrière de la chaîne d'héritage:
public Customer(SomeObjectThatNobodyShouldBeUsingDirectly thingy = null)
public Customer(InjectedDependancy depends)
L'appeler est une erreur, car il contourne tous les constructeurs suivants.
Je pourrais changer la lignée de l'objet pour ne pas exposer un constructeur aussi dangereux, mais je dois maintenant changer le code pour:
Customer customer = new Customer(depends);
Mais je ne peux pas garantir que ce changement ne cassera rien. Comme dans l' exemple 1 ci-dessus, peut-être que quelqu'un, quelque part, dans certaines conditions ésotériques, dépend de ce qui est construit Customer
pour être invalide et rempli de bric-à-brac.
Peut-être que l' Customer
objet, maintenant qu'il est correctement construit, permettra à du code de s'exécuter comme jamais auparavant, et je peux maintenant avoir un crash.
Je ne peux pas parier la vie de votre femme dessus.
Et je peux le tester d'ici à mardi, je ne peux pas jurer sur la vie de votre fille que je n'ai pas introduit de régression.
Est ce que je:
- Corriger le code et se faire reprocher de l'avoir brisé? ou
- Quitter le bogue et se faire blâmer quand le client le trouve?