Bus Number – das GitHub-Plugin, das meine Kollegen mir auszureden versuchten
(scannedinavian.com)- Ein Entwickler wollte, angestoßen durch die Erfahrung, dass nach einer Entlassung der einzige Contributor an umsatzrelevantem Code verschwunden war, ein truck-factor-Plugin für GitHub Enterprise bauen, um in Projekten die unverzichtbaren Personen zu finden
- Kollegen warnten, dass diese Kennzahl schnell unter Goodhart’s Law fallen und statt zum Schutz wichtiger Personen zu einem Management-Tool werden könnte, um herauszufinden, wen man entlassen kann
- Das ursprüngliche Truck-Factor-Repository und die Daten waren weiterhin nutzbar, aber das Datum der Datenerhebung war unklar, und die README-Anweisungen ließen sich nicht unverändert reproduzieren, sodass manuell nachgebessert werden musste
- Die Neuberechnung erfolgte, indem mehrere GitHub-Repositories mit
gnu parallelgeklont und anschließend Java-Code ausgeführt wurde; für den Linux kernel ergab sich ein truck factor von 12 ohne linguist-Filter und 8 mit Filter - Damit lag das Ergebnis unter den Werten aus dem ursprünglichen Paper – 90 im Preprint von 2015, 57 in der veröffentlichten Fassung – sodass sich kaum sagen lässt, dass sich der bus factor des Linux kernel verbessert hat
Bus Factor und die riskante Plugin-Idee
- Bus Factor oder Truck Factor bezeichnet die minimale Zahl von Teammitgliedern, die plötzlich ausfallen müssten, bevor ein Projekt wegen fehlenden Wissens zum Stillstand kommt
- Ausgangspunkt war ein Entlassungsprozess im Unternehmen um 2015, bei dem der einzige Contributor an einem Teil der Codebasis, die dem Unternehmen Geld einbrachte, entlassen wurde
- Daraus entstand die Idee eines GitHub-Enterprise-Plugins, das berechnet, wen man nicht entlassen darf
- Als dieses Plugin in einem fünfminütigen Lightning Talk an einem Donnerstagnachmittag vorgestellt wurde, meinten Kollegen, Manager könnten es als Werkzeug verwenden, um herauszufinden, wen sie entlassen können
- Im Kern dieser Reaktion stand Goodhart’s Law
Frühere Truck-Factor-Forschung und der Reproduktionsversuch
- Die ursprüngliche Studie berechnete für mehrere populäre GitHub-Projekte, wie viele Personen ausfallen müssten, bevor das Projekt zum Erliegen kommt
- Dazu gehörte auch der Linux kernel
- Zu Beginn des Textes heißt es, der erste Preprint habe für Linux angegeben, dass 80 Personen ausfallen müssten; später werden die Werte als 90 im Preprint von 2015 und 57 in der vollständigen Veröffentlichung zusammengefasst
- Gemeinsam mit mclare wurde versucht, rund zehn Jahre später zu prüfen, ob sich der truck factor verbessert hat, indem die Ergebnisse reproduziert wurden
- Das GitHub-Repository der ursprünglichen Autoren war weiterhin verfügbar
Einschränkungen bei Daten und Laufzeitumgebung
- Die Paper-Daten wurden als JSON bereitgestellt, und die ursprüngliche Visualisierung basierte auf einem scrapbaren CSV
- Allerdings ließ sich das Datum der Datenerhebung nicht feststellen
- Die README-Anweisungen funktionierten nicht mehr unverändert, daher musste die Ausführung mithilfe von GitHub-Issues angepasst werden
- Aus der ersten Spalte des ursprünglichen CSV wurde eine Liste der GitHub-Repositories extrahiert und anschließend alles geklont
- Mit
gnu parallelwurden mehreregit clone-Befehle gleichzeitig ausgeführt
Hürden mit gnu parallel, linguist und NixOS
- Für
gnu parallelwurde-j 8gesetzt, trotzdem wurden offenbar alle 32 Kerne des Laptops ausgelastet - Sichtbar waren gleichzeitig 8
git clone-Prozesse, dazu aber zahlreichegit index-pack-Prozesse, die sämtliche Kerne nutzten - Als mögliche Ursache wurde vermutet, dass
git index-packein geforkter Unterprozess ist undparalleldeshalb weiteregit clone-Prozesse startet - Der Truck-Factor-Code verwendet GitHubs linguist, um Dokumentationsdateien auszuschließen
- In der NixOS-Umgebung ließ sich die Installation der Ruby Gems mangels Ruby-Erfahrung nicht rechtzeitig lösen; gesucht wurden daher Hinweise zur Installation des linguist-Plugins in einem Nix flake oder ein Pull Request
Das konkrete Verfahren zur Neuberechnung
- Das Original-Repository wurde geforkt, lokal geklont und dann gemäß README mit angepasstem Ablauf ausgeführt
- Mit
mvn packagewurde der Java-Quellcode in ein jar kompiliert - Zunächst wurden die einzelnen Schritte mit dem GitHub-Repository von numpy getestet, danach erfolgte die Neuberechnung über alle Repositories
- mclare lud das CSV der ursprünglichen Visualisierung herunter und wandelte die erste Spalte in eine Liste von GitHub-Repositories um
- Der Ablauf sah so aus
- Mit
parallel -j 8 git clone ::: $(cat ../meta/repo_list.txt)wurden die Repositories geklont - Anschließend wurde in das Verzeichnis
gittruckfactor/scriptsgewechselt, um awk-Fehler zu vermeiden - Mit
commit_log_script.shwurden für jedes Repository die Git-Commit-Informationen extrahiert - Danach wurde
gittruckfactor-1.0.jarausgeführt, um die extrahierten Commit-Daten zu verarbeiten
- Mit
- Über die schnelle Gigabit-Internetverbindung zu Hause dauerte das sequenzielle Klonen aller Repositories 17,5 Minuten
- Die Verarbeitung der einzelnen Repositories scheint ebenfalls ungefähr 18 Minuten gedauert zu haben
Ergebnis der Neuberechnung für den Linux kernel
- Die Beispielausgabe für den Linux kernel lautete TF = 12, coverage = 49.98%
- Zu den TF authors gehörten unter anderem Linus Torvalds, Mauro Carvalho Chehab, Rob Herring, Thomas Gleixner und Krzysztof Kozlowski
- Linus Torvalds wurde mit 5.712 Dateien und 6,59 % ausgewiesen
- Ohne das linguist-Plugin, also ohne das Herausfiltern von Dokumentation und Third-Party-Libraries, ergab sich für den Linux kernel ein truck factor von 12
- Nachdem mclare das linguist-Plugin auf dem eigenen System installiert hatte, ergab sich für den Linux kernel ein truck factor von 8
Nicht berücksichtigte Faktoren und nächste Prüfungen
- In diese Berechnung floss der Review-Prozess nicht ein
- Mit wachsender Erfahrung müssen Entwickler oft mehr Reviews übernehmen, statt selbst direkt Code über die Tastatur zu schreiben
- Zusätzlich sollen unter anderem folgende Punkte geprüft werden
- ob die truck-factor-Berechnung
co-authored-byund Reviewer-Header aus Git reflektiert - falls nicht, ob sich das in die Berechnung einbeziehen lässt
- warum sich der Linux-Wert nach zehn Jahren so stark verändert hat
- ob es einen Unterschied macht, dass zum Zusammenführen von Entwickler-Aliasen – wie im Original-Paper – kein Levenshtein distance von 1 angewendet wurde
- ob dasselbe Code-Set noch immer 80 ergeben würde, wenn das Linux-kernel-Repository auf Mitte 2015 ausgecheckt wird
- ob sich wegen einer Algorithmus-Aktualisierung im Jahr 2016 spätere Werte erneut berechnen lassen
- ob die truck-factor-Berechnung
- Ein Blick auf die 156 Zitierungen des Original-Papers könnte zeigen, ob es bessere Berechnungsansätze gibt
- Neuere große Projekte wie Rust waren im Paper von 2015 noch nicht enthalten, daher ließen sich heutige populäre Projekte mit ihrer früheren Entwicklung vergleichen
- Man könnte auch ein Skript bauen, das für beliebige Git-Repositories die truck number pro Jahr ermittelt
Ein noch niedrigerer Bus Factor
- Die eigentliche Frage war, ob sich der truck factor mit der Zeit verbessert hat
- Das Ergebnis deutet eher darauf hin, dass er sich nicht verbessert, sondern verschlechtert hat
- Für den Linux kernel lagen die diesmal berechneten Werte deutlich unter denen des Original-Papers
- Je nachdem, ob Dokumentation und Third-Party-Libraries herausgefiltert wurden, sank das Ergebnis für den Linux kernel von 12 auf 8
- Weitere Visualisierungen und Details finden sich im Beitrag von mclare
1 Kommentare
Meinungen auf Hacker News
Eine der Funktionen von https://codescene.com/ ist genau das
Es findet Wissensinseln und verknüpft sie mit häufig geändertem Code, um riskante Hotspots zu identifizieren, bei denen es viele Änderungen, aber wenig Wissensverteilung gibt
Wenn jemand seine Kündigungsabsicht äußert, kann man leicht sehen, welchen Code nur diese Person kennt, und entsprechend einfach einen Übergabeplan erstellen
Ich habe nie darüber nachgedacht, dass das missbraucht werden könnte; ursprünglich ist es ein Tool für Sichtbarkeit. Ein Manager, der es so nutzt, ist ein schlechter Manager, und wenn er schon so jemand ist, wird dieses Tool daran nichts ändern
Wenn man auf eine Beförderung aus ist, könnte man bei der zuständigen Abteilung „8 Agentinnen mit Spezialtraining darin, sich mit Nerds anzufreunden“ anfordern und vorsorglich auch 8 Dosen Polonium für den Fall des Scheiterns
Das mag wie reine Fiktion klingen, aber ich kenne den CEO eines Unicorn-Startups, das Seed-Finanzierung suchte und tatsächlich etwas erlebt hat, das dem ersten Teil entspricht
Beim dritten Arbeitgeber erkannten die Entwickler diese Entwicklung schon von weitem und verweigerten die Nutzung des Tools bzw. die Bewertung selbst
Solche Tools sind absurd teuer, sodass die Seite, die sie genehmigt hat, irgendwie einen Return on Investment herausholen muss. Da es keine vernünftige Methode gibt, Produktivität, Output oder Wissenssilos zu messen, läuft es am Ende auf Dinge hinaus wie: „Jose hatte diese Woche wenige PRs“
Das Problem ist, dass Entwickler das ebenfalls sehen und versuchen könnten, in Zielprojekte oder Komponenten zu wechseln, um auf die Liste der unkündbaren Mitarbeiter zu kommen. Idealerweise könnten sich Beschäftigte gemeinsam bewegen und den Truck Factor auf 0 bringen, sodass es schwer wird, irgendjemanden zu entlassen
Natürlich wäre das fast vollständige Zeitverschwendung und würde den ursprünglichen Punkt der Kollegen des Bloggers belegen, dass man „sofort in Goodhart’s Law hineinläuft“
Bei Amazon kann man solche Zahlen in den Codesystemen leicht als Bericht sehen, den jeder Manager ausführen kann, und es gibt viele andere Möglichkeiten zu prüfen, was Teams tun und welche Risiken bestehen. Persönlich halte ich das für nützlich
Der Bus Factor ist nur eine Perspektive; aus anderen Blickwinkeln hilft er dabei, Silos, Entwickler, die nicht mit anderen zusammenarbeiten, und Bereiche zu finden und zu beheben, in die man Entwickler nur schwer versetzen kann
Manche Entwickler fürchten Ersetzbarkeit und glauben, ein System, das nur sie kennen, sei Jobsicherheit. Umgekehrt ist das aber ein technisches Risiko und kann ein Faktor sein, der gute Entwickler daran hindert, zu wichtigeren Projekten zu wechseln. Es ist auch ein Weg, etwas anderes machen zu können, wenn man ein ungeliebtes System satt hat
Allerdings erzeugt die Idee der Ersetzbarkeit viel Overhead und verhindert, dass talentierte Leute ihre maximale Leistung einbringen. Denn tatsächlich sind sie nicht ersetzbar
An manchen Orten ist das nötig, aber an anderen wird Prozess-Overhead zu einem viel größeren Risiko für den Projekterfolg als der Bus Factor
Das Ende war seine Kündigung innerhalb von drei Monaten
Einer der Gründe, warum ich auch im Backend viel TypeScript einsetze, ist, dass ein kleines Team dadurch nur eine Sprache kennen muss. So kann ein Frontend-Entwickler im Urlaub tatsächlich abschalten, und jemand anderes kann einspringen. Wenn jemand den Job wechselt, tut es weniger weh
Das war nie ein Problem, und ich sehe Ersetzbarkeit als Teil eines gesunden Systems. Nach ein paar Jahren im Management lernt man als Erstes: „Jeder ist ersetzbar, es ist nur eine Kostenfrage.“ Wenn das Wissensniveau zu hoch ist, kann es sich daher sogar nachteilig auswirken, weil das Management versuchen wird, dieses Risiko zu senken. Vor allem Entlassungen aus wirtschaftlichen Gründen sind zudem ziemlich zufällig
Trotzdem möchte ich nicht an einem Ort arbeiten, der solche lächerlichen Kennzahlen verwendet. Je mehr Bürokratie man darum legt, gute Arbeit zu leisten, desto geringer ist die Wahrscheinlichkeit, dass ich dort mitarbeiten möchte. Solche Dinge bringen Menschen leicht dazu, Kennzahlen zu gamen, statt gute Arbeit zu leisten, und schaffen eine Kultur, die Produktivität und Qualität schadet
gnu parallelführt wie angefordert 8git clone-Jobs gleichzeitig aus, und jedesgit clonestartet nach eigenem Ermessen vieleindex-pack-Threads.Hier hilft es,
pack.threadspergit configvorübergehend auf 1 zu setzen.Weil das quadratisch wächst, wird das Problem umso schlimmer, je mehr CPUs man hat. Bei 32 Kernen sind das 32² = 1024; tatsächlich waren bei Parallel hier 8 angegeben, also hätte es vermutlich bei höchstens etwa 256
index-pack-Prozessen geendet. Trotzdem braucht man viel Speicher, um das zu verkraften, und real bringt es keinen Vorteil.Die Lösung ist, nur eine der beiden Ebenen zu parallelisieren.
Zu
pack.threadssagtman git-config: Gibt die Anzahl der Threads an, die beim Suchen nach den besten Delta-Matches erzeugt werden sollen; dafür mussgit-pack-objects(1)mit pthreads kompiliert sein. Andernfalls wird die Option mit einer Warnung ignoriert. Sie dient dazu, die Pack-Zeit auf Mehrprozessormaschinen zu verkürzen, aber der für das Delta-Suchfenster benötigte Speicher wird mit der Anzahl der Threads multipliziert. Bei 0 erkennt Git die CPU-Anzahl automatisch und setzt die Thread-Zahl entsprechend.git configzu setzen, kann man einfachgit -c pack.threads=1 cloneverwenden: https://git-scm.com/docs/git#Documentation/git.txt--cltnameg...Diese Interpretation finde ich nicht besonders gut. Ich sehe den Artikel als Text für alle Engineering-Führungskräfte.
Der Bus-Faktor bedeutet, wie sehr ein Team leidet, wenn jemand im Team, oder man selbst, von einem Bus überfahren wird.
Der ideale Bus-Faktor für jedes Teammitglied ist 0. Zunächst klingt das vielleicht nach „Macht alle austauschbar“, aber tatsächlich ist es fast das Gegenteil, und genau darum geht es.
Ein Team sollte so gut sein, dass es a) autonom ist und b) keine Mysterien hat. Im Idealzustand versteht jeder, wie alles funktioniert. Neue Mitarbeiter sollten sofort anfangen können, Wert zu schaffen, und ausscheidende Mitarbeiter sollten beruhigt sein, weil keine unbekannten Bereiche zurückbleiben.
Ein ideales Team, in dem jeder einen BF von 0 hat, ist wünschenswert. Es bedeutet, dass Teammitglieder ersetzbar sind und dass jedes Teammitglied die Lücke füllen kann, wenn jemand krank wird, Urlaub nimmt, tatsächlich geht oder entfernt wird.
Noch wichtiger ist, dass ein BF von 0 ein Ausdruck von Einfachheit ist. Software, Build-, Test- und Deployment-Pipelines, Dokumentation und Support-Strukturen sollten kohärent und konsistent sein. Wissen in einzelnen Teammitgliedern zu siloieren ist schlecht, und jeder sollte bauen und deployen können.
Ein BF von 0 ist ein gesundes Signal, lässt sich aber niemals über die Zahl der E-Mails, Commits, PRs, Codezeilen, Antwortzeiten oder GitHub-Heatmaps messen. Solche Metriken zeigen gar nichts und sind vielmehr schädliche, furchtbare Kennzahlen.
Menschen anhand solcher Metriken zu bewerten, ist nicht besser als Affen vor Schreibmaschinen zu setzen. Mehr Startups sollten das hören.
Es scheint dasselbe Konzept zu sein, aber es überrascht mich, dass die Zahl nicht immer in dieselbe Richtung verwendet wird.
Bei Projekten, die die Grenzen des Möglichen verschieben, ist Einfachheit manchmal keine Option. Natürlich ist das nur ein kleiner Anteil aller Softwareprojekte, aber wenn man etwas noch nie Dagewesenes macht, ist „Wie zum Teufel schaffen wir das überhaupt?“ eine größere Sorge, als den Code so einfach wie möglich zu halten.
Das heißt nicht, dass schlechte Codequalität in Ordnung wäre. Aber wenn man schwierige Dinge tut, braucht man manchmal komplexen Code; erst ein paar Generationen später kristallisieren sich dann Design Patterns heraus, mit denen sich dieselbe schwierige Aufgabe mit weniger komplexem Code lösen lässt. Das kann auch erst zehn Jahre später der Fall sein.
Wenn das Komplexeste, was man bauen kann, ungefähr eine Todo-App ist, schafft man meiner Meinung nach nicht viel Wert für die Gesellschaft.
Ein hoher Bus-Faktor bedeutet, dass dein Arbeitgeber dich eher wegen deiner bisherigen Arbeit festhält als wegen deines zukünftigen Potenzials.
Die zentrale Aussage des ursprünglichen Papers ist dieser Teil:
„Unsere Schätzung beruht auf einer Coverage-Annahme. Wenn die aktuelle Menge der Autoren weniger als 50 % der aktuellen Dateimenge des Systems abdeckt, ist es wahrscheinlich, dass das System erhebliche Verzögerungen erleidet oder zum Stillstand kommt.“
Dabei ist der Autor einer Datei als Nutzer definiert, der nach einer vorab berechneten Gewichtung einen bedeutenden Beitrag zu dieser Datei geleistet hat.
Einerseits würde es mich eher überraschen, wenn diese Art von Dashboard-Metrik nicht schon in irgendeiner Enterprise-Software stecken würde. Die Geschäftsführung in meiner früheren Firma fragte tatsächlich einmal, ob man einen Tagesbericht erstellen könne, der zeigt, wer in der Abteilung die meisten E-Mails gesendet und empfangen hat.
Ich habe abgelehnt, weil mir nicht gefiel, wohin das führen würde, aber ein anderer Kollege hat es gebaut. Wie zu erwarten war, war die Person mit den meisten empfangenen und gesendeten E-Mails der Systemadministrator, weil sein Account als automatischer Absender für mehrere Server eingerichtet war. Er schickte sich selbst Hunderte von Benachrichtigungs-E-Mails pro Tag, zusätzlich zu abonnierten Newslettern und Zusammenfassungen.
Andererseits klingt es ziemlich fies, ein Hobbyprojekt trotzdem durchzuziehen, obwohl alle Kollegen darum gebeten haben, nichts zu tun, was ihre Jobs beeinträchtigen könnte.
Ich möchte nur sehen, ob die Open-Source-Software, die ich nutze, Wissen gut genug verteilt hat, um ihre Überlebensfähigkeit zu erhöhen.
Diese fiese Sache habe ich abgelehnt.
„Je weiter Entwickler die Karriereleiter hinaufsteigen, desto weniger sollten sie selbst an der Tastatur arbeiten und desto mehr Reviews machen“ halte ich für ein verbreitetes Missverständnis in Tech-Unternehmen.
Es geht nicht darum, großartige Entwickler in mittelmäßige Manager zu verwandeln.
Als Senior Developer wäre er viel besser aufgehoben als als Tech Lead. Man kann sich kaum vorstellen, wie sehr das Team leiden würde, wenn er Manager würde.
Die traurige Ironie daran ist, dass die Frage immer noch falsch gestellt ist.
Wenn ein Startup Entlassungen vornehmen muss, lautet die Frage nicht: „Wen können wir entlassen und trotzdem das bestehende Geschäft aufrechterhalten?“, sondern: „Welches Team kann schnell genug die nächste Version des Produkts bauen, damit wir nicht untergehen?“
Jede Weggabelung ist am Ende eine Weggabelung, und viele Unternehmen sind gestorben, weil sie sich nicht schnell genug für einen Weg entschieden haben.
CPAN verfolgt den Bus-Faktor schon seit Langem. Zum Beispiel zeigt https://metacpan.org/pod/Moose in der linken Info-Spalte einen Bus Factor von 5 an.
Wir nennen das lieber Lotterie-Faktor.
Gemeint ist: Kann das Projekt weiterlaufen, selbst wenn jemand im Lotto gewinnt und auf eine tropische Insel ohne Strom- und Kommunikationsnetz zieht?
So klingt es weniger unheimlich.
Jemand, der von einem Bus angefahren wird, ist sofort weg. Das ist nicht dasselbe.
Manche mögen Sportmetaphern nicht, aber ich finde sie zumindest besser als Militärmetaphern.
Da es ohnehin oft genug keine ordentliche Übergabe gibt, ist die Plötzlichkeit selbst vielleicht gar kein so entscheidender Faktor.