Software craftsmanship : une question de compromis

Aujourd’hui, j’ai du écrire un code affreux. 😭
Alors j’ai besoin d’écrire cet article pour m’excuser.

Photo by Caleb Jones on Unsplash

Non en fait j’assume. Et je pense que c’est important de t’expliquer ce qui s’est passé.

Optimiser le code

Tu vois ce bel algorithme avec des décalages binaires ?

function _countNumbers(uint40 numbers) internal pure returns (uint256 count) {
  for (uint i = 0; i < 40; i++) {
    if (numbers & 1 == 1) {
      count++;
    }
    numbers = numbers >> 1;
  }
}

Et bien il s’est transformé en ça…

function _countNumbers(uint40 numbers) internal pure returns (uint256 count) {
  if (numbers & 0x1 > 0) count++;
  if (numbers & 0x2 > 0) count++;
  if (numbers & 0x4 > 0) count++;
  if (numbers & 0x8 > 0) count++;

  if (numbers & 0x10 > 0) count++;
  if (numbers & 0x20 > 0) count++;
  if (numbers & 0x40 > 0) count++;
  if (numbers & 0x80 > 0) count++;

  if (numbers & 0x100 > 0) count++;
  if (numbers & 0x200 > 0) count++;
  if (numbers & 0x400 > 0) count++;
  if (numbers & 0x800 > 0) count++;

  if (numbers & 0x1000 > 0) count++;
  if (numbers & 0x2000 > 0) count++;
  if (numbers & 0x4000 > 0) count++;
  if (numbers & 0x8000 > 0) count++;

  if (numbers & 0x10000 > 0) count++;
  if (numbers & 0x20000 > 0) count++;
  if (numbers & 0x40000 > 0) count++;
  if (numbers & 0x80000 > 0) count++;

  if (numbers & 0x100000 > 0) count++;
  if (numbers & 0x200000 > 0) count++;
  if (numbers & 0x400000 > 0) count++;
  if (numbers & 0x800000 > 0) count++;

  if (numbers & 0x1000000 > 0) count++;
  if (numbers & 0x2000000 > 0) count++;
  if (numbers & 0x4000000 > 0) count++;
  if (numbers & 0x8000000 > 0) count++;

  if (numbers & 0x10000000 > 0) count++;
  if (numbers & 0x20000000 > 0) count++;
  if (numbers & 0x40000000 > 0) count++;
  if (numbers & 0x80000000 > 0) count++;

  if (numbers & 0x100000000 > 0) count++;
  if (numbers & 0x200000000 > 0) count++;
  if (numbers & 0x400000000 > 0) count++;
  if (numbers & 0x800000000 > 0) count++;

  if (numbers & 0x1000000000 > 0) count++;
  if (numbers & 0x2000000000 > 0) count++;
  if (numbers & 0x4000000000 > 0) count++;
  if (numbers & 0x8000000000 > 0) count++;
}

Autant te dire que mes yeux saignent et mon coeur est inconsolable.
Surtout que des algos avec décalage binaire, soyons honnêtes, c’est pas tous les jours qu’on en écrit un.
Mais j’assume.
Car cette modification fait gagner 6k de gas à l’exécution. 🤯
Sachant qu’une fonction principale du jeu appelle deux fois la fonction, c’est 12k de gas économisé par appel. Donc là, mon cerveau est 2x🤯🤯

Alors je sais, tu vas me dire que ça te parle pas beaucoup. Mais en fait c’est beaucoup sur la blockchain.
Si par contre ça te parle et que comme moi tu te dis « bien joué mec », prenons un café. ☕️

La leçon de l’histoire

Avoir du beau code, c’est un peu ma bataille au quotidien. C’est aussi un point central de la démarche du software craftsmanship.
Mais il faut garder en tête notre mission : on est là pour des utilisateurs.
Du coup, il faut savoir faire les compromis qui vont permettre des les rendre heureux.

Mais ce que je trouve le plus important, c’est de sortir du dogmatisme et être capable de s’adapter à son contexte.
Alors oui, je sais, certains diront que c’est la porte ouverte aux dérapages incontrôlés…

C’est vrai.

C’est pour ça qu’il faut affûter ses compétences et aiguiser son jugement : pour savoir faire la différence entre compromis et compromission

2 réflexions sur « Software craftsmanship : une question de compromis »

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.