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

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

  1. Bonjour Benoit,

    C’est intéressant. Effectivement les auteurs clean code ont toujours mis en avant la maintenabilité sans jamais vraiment mettre en garde sur les consequences en terme de performance.

    Certains détracteurs du clean code s’amusent même a compter les cycles de processeur sur des exemples simples en arguant qu’ils divisent par 15 les cycles en transgressant les recommandations du clean code (j’ai vu une video youtube sur ça)… Je trouve qu’il y a très peu de réflexions autour de la maintenabilité vs performance dans ce domaine.

    C’est pourtant un aspect important à prendre en compte en tant qu’architecte logiciel. Je ne crois pas que tu es d’ailleurs évoqué ce sujet dans tes podcasts. J’aurai pourtant grand plaisir à ecouter quelque chose là-dessus 🙂

    J’en profite pour te féliciter pour ton travail et tout ce que tu partages avec la communauté !
    Bon code !

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.