Bug or feature?

Bug or feature?

Qui s'est déjà prêté sérieusement à l'exercice du refactoring a probablement rencontré ce genre de code :

class Game {
  // tout plein de choses qui vous font saigner les yeux

  private didPlayerWin(): boolean {
    return this.points[this.currentPlayer] != 6;
  }
}

Il n’y a pas besoin d’être grand clerc pour voir qu'il y a un problème : les joueurs démarrant la partie avec 0 point, chaque joueur est gagnant alors que la partie n'a pas démarré 😳

Petit instant d'hésitation, quand-même : ne serait-ce pas une fonctionnalité "du troisième type" ?

Bug or feature?

Ici, le reste du code confirmerait votre intuition qu'il s'agit d'une erreur grossière. Mais dans bien des cas, la question reste en suspens. Peut-être mettrez-vous la main sur une documentation fonctionnelle, et dans ce cas-là, prions pour qu'elle soit à jour et ne contredise pas le code.

Le mieux serait donc de demander à quelqu'un, développeur ou product manager, sauf que tout ce beau monde vogue à présent vers de nouveaux horizons, tandis que vous restez seul(e) avec vos questions 🥲

Voilà, ben la mauvaise nouvelle c'est que je n'ai aucune solution pour vous. Vous pouvez y aller de votre bon sens, c'est déjà ça, mais c'est surtout votre connaissance approfondie du métier qui vous aidera.

Allez, salut 👋

Presque. En fait, il y a derrière cela une autre question, assez intéressante : que faire dans l'éventualité où le bug est avéré ?

Le corriger ? Oui, mais non en fait. Car si le bug est en place depuis des années, il y a fort à parier que le monde extérieur ait mis en place ses propres mesures correctrices pour "faire avec".

Exemple non-informatique : imaginons que votre robinet soit monté à l'envers. Quand vous demandez de l'eau froide, c'est de l'eau chaude qui sort, et réciproquement. Vous vous êtes bien brûlé une fois, mais vous n'aviez pas envie de tout démonter alors vous vous êtes adapté : pour obtenir de l'eau froide, vous demandez de l'eau chaude et réciproquement. Facile, après tout ; il suffit de le savoir.

Évidemment, si vous m'invitez chez vous et qu'à cette occasion je répare la chose sans rien vous dire, on vous entendra probablement pousser un grand cri la prochaine fois que vous vous laverez les mains.

Autrement dit, si vous corrigez le bug, tous les systèmes tiers qui utilisent votre service vont devoir supprimer les mesures de contournement qu'ils avaient mises en place pour faire avec. Vous devez donc être en mesure de les en informer et de coordonner tout ce beau monde.

A défaut de procéder ainsi, vous pouvez corriger le bug, mais alors vous devrez créer une surcouche entre votre code refactoré et le reste du monde pour réintroduire le bug (😮) afin de respecter le contrat qui existait implicitement jusqu'à présent.

Cela semble paradoxal à première vue, pourtant c'est une pratique courante quand les systèmes appelants sont nombreux ou inconnus (cela concerne donc notamment les bibliothèques de code).

Subscribe to Mathieu Eveillard

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe