Bus Number – le plugin GitHub que mes collègues m’ont dit de ne pas écrire
(scannedinavian.com)- Un développeur, après avoir vécu le cas où l’unique contributeur d’un code source générant du revenu a disparu à la suite d’un licenciement, a voulu créer sur GitHub Enterprise un plugin de truck factor pour repérer les personnes « qu’il ne faut surtout pas perdre »
- Ses collègues craignaient que cet indicateur tombe rapidement sous le coup de la loi de Goodhart et devienne un outil de gestion servant non pas à protéger les personnes clés, mais à repérer « celles qu’on peut licencier »
- Le dépôt Truck-Factor d’origine et ses données restaient utilisables, mais la date de collecte des données était inconnue et la procédure du README n’était plus directement reproductible, ce qui a nécessité des ajustements manuels
- Le recalcul consistait à cloner plusieurs dépôts GitHub avec
gnu parallel, puis à exécuter du code Java ; pour le noyau Linux, le truck factor ressort à 12 sans filtre linguist, puis à 8 avec le filtre - Le résultat est inférieur aux chiffres de l’article d’origine — 90 dans le preprint de 2015, 57 dans la publication finale — ce qui ne permet pas vraiment de conclure à une amélioration du bus factor du noyau Linux
Bus Factor et une idée de plugin risquée
- Le Bus Factor ou Truck Factor désigne le nombre minimal de membres d’une équipe qui devraient disparaître soudainement pour qu’un projet s’arrête faute de personnes connaissant suffisamment le sujet
- Le point de départ remonte à une vague de licenciements autour de 2015, au cours de laquelle l’unique contributeur à une partie du codebase qui rapportait de l’argent à l’entreprise a été licencié
- Après avoir pensé au Truck Number, l’idée a émergé d’en faire un plugin GitHub Enterprise calculant les personnes « qu’il ne faut pas licencier »
- Lorsqu’il a présenté ce plugin pendant 5 minutes lors d’un lightning talk un jeudi après-midi, ses collègues ont estimé que des managers pourraient s’en servir pour identifier « les personnes qu’on peut licencier »
- Le cœur de cette réaction tenait à la loi de Goodhart
Recherche existante sur le Truck Factor et tentative de reproduction
- L’étude d’origine calculait, sur plusieurs projets GitHub populaires, combien de personnes devaient disparaître pour que le projet s’arrête
- Le noyau Linux faisait partie des sujets étudiés
- Au début du texte, il est indiqué que le premier preprint affirmait qu’il fallait le départ de 80 personnes pour arrêter Linux ; plus loin, les chiffres sont récapitulés à 90 dans le preprint de 2015 et 57 dans la publication complète
- Avec mclare, l’auteur a tenté de reproduire les résultats près de 10 ans plus tard pour vérifier si le truck factor s’était amélioré
- Le dépôt GitHub des auteurs d’origine était toujours exploitable
Contraintes liées aux données et à l’environnement d’exécution
- Les données de l’article étaient fournies en JSON, et la visualisation d’origine reposait sur un CSV récupérable par scraping
- En revanche, il était impossible de connaître la date de collecte des données
- Les instructions du README ne fonctionnaient plus telles quelles, et il a fallu consulter les issues GitHub pour corriger la procédure d’exécution
- La liste complète des dépôts GitHub a été extraite de la première colonne du CSV d’origine, puis tous les dépôts ont été clonés
- Plusieurs commandes
git cloneont été lancées en parallèle avecgnu parallel
gnu parallel, linguist et blocages sous NixOS
- Même avec
-j 8surgnu parallel, les 32 cœurs du laptop semblaient tous utilisés - On voyait bien 8 processus
git cloneen parallèle, mais de nombreux processusgit index-packconsommaient tous les cœurs - Une explication possible est que
git index-pack, en tant que sous-processus forké, amenaitparallelà lancer d’autresgit clone - Le code Truck Factor utilise linguist de GitHub pour exclure les fichiers de documentation
- Dans un environnement NixOS, faute d’expérience avec Ruby, l’auteur n’a pas réussi à résoudre à temps l’installation des Ruby Gems ; il demande donc une méthode pour installer le plugin linguist dans un flake Nix ou une pull request
Procédure réelle de recalcul
- Le dépôt d’origine a été forké puis cloné en local, et la méthode d’exécution a été ajustée en suivant le README
- Les sources Java ont été compilées en jar avec
mvn package - Un premier test a été fait sur le dépôt GitHub de numpy, avant de recalculer l’ensemble des dépôts
- mclare a téléchargé le CSV de la visualisation d’origine et converti sa première colonne en liste de dépôts GitHub
- Le flux d’exécution était le suivant
- clonage des dépôts avec
parallel -j 8 git clone ::: $(cat ../meta/repo_list.txt) - déplacement dans le répertoire
gittruckfactor/scriptspour éviter une erreur awk - extraction des informations de commit git pour chaque dépôt avec
commit_log_script.sh - traitement des données de commit extraites en exécutant
gittruckfactor-1.0.jar
- clonage des dépôts avec
- Avec une connexion Internet domestique gigabit rapide, le clonage séquentiel de tous les dépôts a pris 17,5 minutes
- Le traitement de chaque dépôt semble lui aussi avoir pris environ 18 minutes
Résultats du recalcul sur le noyau Linux
- L’exemple de sortie pour le noyau Linux affichait TF = 12, coverage = 49.98%
- Parmi les TF authors figuraient Linus Torvalds, Mauro Carvalho Chehab, Rob Herring, Thomas Gleixner et Krzysztof Kozlowski
- Linus Torvalds apparaissait avec 5 712 fichiers et 6,59 %
- Sans le plugin linguist, donc sans filtrer la documentation ni les bibliothèques tierces, le truck factor du noyau Linux était de 12
- Après installation du plugin linguist par mclare sur son système, le truck factor du noyau Linux obtenu était de 8
Éléments absents du calcul et pistes à vérifier ensuite
- Ce calcul ne prend pas en compte le processus de review
- Or, plus un développeur progresse en carrière, plus il est censé faire de review plutôt que taper directement du code au clavier
- Les points à vérifier ensuite sont les suivants
- si le calcul du truck factor prend en compte les en-têtes git
co-authored-byet reviewer - si ce n’est pas le cas, s’il est possible de les intégrer au calcul
- pourquoi la valeur Linux diffère autant 10 ans plus tard
- si le fait de ne pas avoir appliqué une distance de Levenshtein de 1 pour fusionner les alias de développeurs, comme dans l’article d’origine, a influencé le résultat
- si un checkout du dépôt du noyau Linux à la mi-2015 produit toujours 80 sur le même code
- si, l’algorithme ayant été mis à jour en 2016, il est possible de recalculer des valeurs ultérieures
- si le calcul du truck factor prend en compte les en-têtes git
- Il est aussi possible de consulter les 156 citations de l’article d’origine pour voir s’il existe une meilleure méthode de calcul
- Des projets récents majeurs comme Rust n’étaient pas inclus dans l’article de 2015 ; on peut donc comparer les projets populaires actuels à leur historique passé
- On pourrait également créer un script trouvant le truck number année par année pour n’importe quel dépôt git
Un Bus Factor encore plus bas
- La question à vérifier était de savoir si le truck factor s’était amélioré avec le temps
- La réponse semble être non : il s’est plutôt dégradé
- Pour le noyau Linux, le résultat de cette exécution est nettement inférieur aux chiffres de l’article d’origine
- Selon que la documentation et les bibliothèques tierces sont filtrées ou non, le résultat pour le noyau Linux descend encore de 12 à 8
- Plus de visualisations et de détails sont disponibles dans l’article de mclare
1 commentaires
Avis de Hacker News
C’est précisément l’une des fonctionnalités de https://codescene.com/
Elle repère les îlots de connaissance et les met en relation avec le code qui change fréquemment, afin d’identifier les hotspots risqués : beaucoup de changements, mais une faible diffusion des connaissances.
Quand quelqu’un annonce son départ, on peut facilement voir le code que seule cette personne connaît, ce qui permet aussi de préparer plus facilement le plan de passation.
Je n’ai jamais pensé que cela pouvait être détourné ; à l’origine, c’est un outil de visibilité. Un manager qui l’utiliserait de cette manière serait un mauvais manager, et s’il est déjà comme ça, cet outil ne changera rien.
Si l’on vise une promotion, on pourrait demander au service chargé du recrutement « 8 agentes ayant reçu une formation spéciale pour se rapprocher des nerds », ainsi que, en réserve, 8 doses de polonium au cas où cela échouerait.
Cela peut sembler entièrement fictif, mais je sais qu’un CEO de startup licorne qui cherchait un seed round a réellement vécu quelque chose correspondant à la première partie.
Dans la troisième, les développeurs ont reconnu ce schéma de loin et ont refusé d’utiliser l’outil ou même d’être évalués avec.
Ces outils coûtent absurdement cher, donc ceux qui les approuvent doivent forcément en tirer un retour sur investissement. Comme il n’existe pas de bonne façon de mesurer la productivité, les livrables ou les silos de connaissance, on finit par des remarques du genre « Jose a fait peu de PR cette semaine ».
Le problème, c’est que les développeurs peuvent aussi le voir et chercher à se placer sur des projets ou composants cibles pour entrer dans la liste des employés impossibles à licencier. Idéalement, les travailleurs pourraient se coordonner pour faire tomber le truck factor à 0, rendant le licenciement de quiconque difficile.
Bien sûr, cela deviendrait alors une perte de temps presque totale, et confirmerait le point initial soulevé par les collègues du blogueur : « ça tombera immédiatement sous le coup de la loi de Goodhart ».
Chez Amazon, ce genre de chiffres est facilement accessible sous forme de rapports exécutables par n’importe quel manager dans le système de code, et il existe aussi beaucoup d’autres moyens de voir ce que fait une équipe et quels risques elle porte. Personnellement, je trouve cela utile.
Le bus factor n’est qu’un angle de vue ; sous un autre angle, cela permet de repérer et corriger les silos, les ingénieurs qui ne collaborent pas avec les autres, ou les domaines où il est difficile de déplacer des ingénieurs.
Certains développeurs craignent d’être remplaçables et pensent qu’un système qu’eux seuls connaissent constitue une sécurité de l’emploi, mais à l’inverse, c’est un risque technique et cela peut aussi empêcher un bon ingénieur de passer sur un projet plus important. C’est aussi une porte de sortie pour faire autre chose quand on en a assez d’un système que l’on déteste.
En revanche, l’idée de remplaçabilité crée beaucoup d’overhead et empêche d’utiliser les personnes talentueuses au maximum de leurs capacités. Parce qu’en réalité, elles ne sont pas remplaçables.
Dans certains endroits, c’est nécessaire, mais dans d’autres, l’overhead de process devient un risque bien plus grand pour la réussite du projet que le bus factor.
Résultat : il est parti dans les 3 mois.
L’une des raisons pour lesquelles j’utilise beaucoup TypeScript côté backend est que cela réduit à un seul le nombre de langages qu’une petite équipe doit connaître. Ainsi, quand un développeur frontend part en vacances, il peut réellement déconnecter, et quelqu’un d’autre peut couvrir. Quand quelqu’un change d’entreprise, c’est moins douloureux.
Cela n’a jamais été un problème, et je considère la remplaçabilité comme une partie d’un système sain. Après quelques années côté management, l’une des premières choses que l’on apprend est que « tout le monde est remplaçable, ce n’est qu’une question de coût ». Donc un niveau de connaissance trop élevé peut même se retourner contre vous, si la direction cherche à réduire ce risque. Les licenciements pour raisons économiques, en particulier, sont aussi assez aléatoires.
Cela dit, je n’aurais pas envie de travailler dans un endroit qui utilise ce genre d’indicateurs ridicules. Plus on met de paperasse autour du bon travail, moins j’ai de chances de vouloir collaborer. Ce genre de choses pousse facilement les gens à jouer avec les indicateurs plutôt qu’à faire du bon travail, et crée une culture mauvaise pour la productivité comme pour la qualité.
gnu parallelexécute bien, comme demandé, 8 opérationsgit cloneen même temps, et chaquegit clonelance à sa guise de nombreux threadsindex-packIci, définir temporairement
pack.threadsà 1 avecgit configpeut aiderComme cela croît au carré, plus il y a de CPU, plus le problème s’aggrave. Avec 32 cœurs, cela fait 32² = 1024, et dans ce cas précis, comme Parallel était réglé sur 8, cela s’est probablement arrêté autour d’un maximum de 256 processus
index-pack. Même ainsi, il faut beaucoup de mémoire pour encaisser cela, et en pratique il n’y a aucun bénéficeLa solution consiste à ne paralléliser qu’une seule des deux couches
À propos de
pack.threads,man git-configdit ceci : indique le nombre de threads à créer lors de la recherche des meilleures correspondances de delta, et exige quegit-pack-objects(1)ait été compilé avec pthreads. Sinon, l’option est ignorée avec un avertissement. C’est une option destinée à réduire le temps de packing sur les machines multiprocesseurs, mais la mémoire nécessaire à la fenêtre de recherche de delta est multipliée par le nombre de threads. Si l’on indique 0, Git détecte automatiquement le nombre de CPU et règle le nombre de threads en conséquencegit config, il suffit d’utilisergit -c pack.threads=1 clone: https://git-scm.com/docs/git#Documentation/git.txt--cltnameg...Cette interprétation n’est pas terrible. Je vois cet article comme un texte destiné à tous les responsables d’ingénierie
Le bus factor désigne à quel point une équipe souffre si quelqu’un de l’équipe, ou soi-même, se fait renverser par un bus
Le bus factor idéal pour chaque membre de l’équipe est 0. Au début, cela peut sonner comme « rendez tout le monde jetable », mais en réalité c’est presque l’inverse, et c’est précisément le point important
Une équipe doit être suffisamment bonne pour être a) autonome et b) dépourvue de zones mystérieuses. Dans l’état idéal, tout le monde comprend comment tout fonctionne. Les nouvelles recrues doivent pouvoir commencer à produire de la valeur immédiatement, et les personnes qui partent doivent pouvoir être rassurées par le fait qu’il ne reste pas de territoire inconnu
Une équipe idéale où tout le monde a un BF de 0 est souhaitable. Cela signifie que les membres sont remplaçables, et que si quelqu’un tombe malade, part en vacances, quitte réellement l’équipe ou est retiré, n’importe quel autre membre peut combler le vide
Plus important encore, un BF de 0 est le reflet de la simplicité. Le logiciel, les pipelines de build, test et déploiement, la documentation et les dispositifs de support doivent tous être cohérents et homogènes. Cloisonner l’information dans certaines personnes est mauvais, et tout le monde doit pouvoir builder et déployer
Un BF de 0 est un indicateur sain, mais il ne se mesure absolument pas au nombre d’e-mails, de commits, de PR, de lignes de code, à la vitesse de réponse ou aux heatmaps GitHub. Ces métriques ne montrent rien et sont au contraire nuisibles et épouvantables
Évaluer les gens avec ce genre de métriques ne vaut pas mieux que des singes devant une machine à écrire. Davantage de startups devraient entendre ça
On semble parler du même concept, mais c’est surprenant de voir que ce nombre n’est pas toujours utilisé dans le même sens
Dans les projets qui repoussent les limites du possible, la simplicité n’est parfois pas une option. Bien sûr, cela ne représente qu’une petite part de l’ensemble des projets logiciels, mais quand on fait quelque chose d’inédit, la préoccupation principale est moins de garder le code aussi simple que possible que de se demander « comment diable va-t-on réussir à faire ça ? »
Cela ne veut pas dire qu’une faible qualité de code est acceptable. Simplement, quand on s’attaque à des choses difficiles, il arrive qu’un code complexe soit nécessaire, et ce n’est parfois qu’après plusieurs générations que des design patterns se stabilisent et permettent de réaliser cette chose difficile avec un code moins complexe. Cela peut être dix ans plus tard
Si la chose la plus complexe que l’on puisse construire est une application de todo list, je ne pense pas qu’on crée beaucoup de valeur pour la société
Avoir un bus factor élevé signifie que votre employeur vous retient pour ce que vous avez fait par le passé, plutôt que pour votre potentiel futur
L’argument central de l’article original est ce passage
« Notre estimation repose sur une hypothèse de couverture. Si l’ensemble actuel des auteurs couvre moins de 50 % de l’ensemble actuel des fichiers du système, il est très probable que le système subisse de sérieux retards ou s’arrête »
Ici, l’auteur d’un fichier est défini comme un utilisateur ayant apporté une contribution significative à ce fichier selon un poids précalculé
D’un côté, je serais plutôt surpris que ce genre de métriques de dashboard ne soit pas déjà présent dans certains logiciels d’entreprise. Dans une ancienne boîte, la direction avait réellement demandé s’il était possible de produire un rapport quotidien indiquant qui, dans le département, envoyait et recevait le plus d’e-mails
Je n’aimais pas la direction que cela risquait de prendre, donc j’ai refusé, mais un autre collègue l’a fait. Comme prévu, la personne qui recevait et envoyait le plus d’e-mails était l’administrateur système, parce que son compte était configuré comme expéditeur automatique pour plusieurs serveurs. Il s’envoyait à lui-même des centaines d’e-mails d’alerte par jour, auxquels s’ajoutaient les newsletters et e-mails récapitulatifs auxquels il était abonné
D’un autre côté, si vos collègues vous ont tous demandé de ne pas faire quelque chose qui pourrait affecter leur emploi et que vous persistez à le faire comme projet perso, cela semble être un comportement assez méchant
Je voulais simplement voir si les logiciels open source que j’utilise diffusent suffisamment bien les connaissances pour augmenter leurs chances de survie
J’ai refusé de faire ce truc méchant
Je pense que « plus un développeur monte dans l’échelle de carrière, moins il doit taper lui-même au clavier et plus il doit faire de reviews » est un malentendu courant dans les entreprises tech
On ne cherche pas à transformer un excellent développeur en manager médiocre
Il serait largement mieux comme développeur senior que comme tech lead. Il est difficile d’imaginer à quel point l’équipe souffrirait s’il devenait manager
La triste ironie, dans cette affaire, c’est que la question reste mal posée
Quand une startup doit procéder à des licenciements, la question n’est pas « qui peut-on licencier tout en maintenant l’activité existante ? », mais « quelle est l’équipe capable de construire assez vite la prochaine version du produit pour éviter de couler ? »
Chaque bifurcation reste une bifurcation, et beaucoup d’entreprises sont mortes faute d’avoir choisi une voie assez rapidement
CPAN suit depuis longtemps le bus factor. Par exemple, https://metacpan.org/pod/Moose affiche un Bus Factor de 5 dans la colonne d’informations à gauche
Nous préférons appeler cela le facteur loto
L’idée étant : le projet peut-il continuer si quelqu’un gagne au loto et part sur une île tropicale sans électricité ni réseau télécom ?
Formulé ainsi, c’est moins sinistre
Quelqu’un percuté par un bus disparaît immédiatement. Ce n’est pas la même chose
Certaines personnes n’aiment pas non plus les métaphores sportives, mais je pense qu’elles valent au moins mieux que les métaphores militaires
De toute façon, il arrive souvent qu’il n’y ait pas vraiment de passation, donc le caractère soudain n’est peut-être pas un facteur si important