Bus Number – İş Arkadaşlarımın Yazmamamı İstediği GitHub Eklentisi
(scannedinavian.com)- Bir geliştirici, işten çıkarmalar sonucunda gelir getiren bir kodun tek katkıcısının ortadan kaybolmasını yaşadıktan sonra, GitHub Enterprise üzerinde “kaybedilmemesi gereken kişileri” bulacak bir truck factor eklentisi yapmak istedi
- İş arkadaşları, bu metriğin kısa sürede Goodhart Yasasına takılıp korunması gereken kişilerden çok “işten çıkarılabilecek kişileri” bulan bir yönetim aracına dönüşebileceğinden endişe etti
- Orijinal Truck-Factor deposu ve verileri hâlâ kullanılabiliyordu, ancak verilerin hangi tarihte toplandığı belirsizdi ve README’deki adımlar da olduğu gibi yeniden üretilemediği için elle düzeltme gerekti
- Yeniden hesaplama, birden çok GitHub deposunu
gnu parallelile klonlayıp ardından Java kodunu çalıştırma şeklinde yapıldı; Linux kernel için linguist filtresi olmadan truck factor 12, filtre uygulandıktan sonra 8 çıktı - Sonuçlar, makaledeki 2015 tarihli preprint’teki 90 ve resmi yayındaki 57 değerlerinden de düşük kaldı; bu da Linux kernel’in bus factor’ünün iyileştiğini söylemeyi zorlaştırıyor
Bus Factor ve riskli eklenti fikri
- Bus Factor ya da Truck Factor, bir projenin bilgili insan eksikliği nedeniyle durmadan önce aniden ortadan kaybolması gereken asgari ekip üyesi sayısını ifade eder
- Çıkış noktası, 2015 civarında şirketteki işten çıkarma sürecinde şirketin para kazandığı kod tabanlarından birinin tek katkıcısının işten çıkarılması oldu
- Truck Number fikri akla geldikten sonra, GitHub Enterprise eklentisi olarak “işten çıkarılmaması gereken kişileri” hesaplama fikri ortaya çıktı
- Perşembe öğleden sonra yapılan 5 dakikalık lightning talk’ta bu eklenti tanıtılınca, iş arkadaşları yöneticilerin bunu “işten çıkarılabilecek kişileri” bulmak için kullanabileceğini düşündü
- Bu tepkinin merkezinde Goodhart Yasası vardı
Mevcut Truck Factor araştırması ve yeniden üretme denemesi
- Orijinal araştırma, çeşitli popüler GitHub projelerinde projenin durması için kaç kişinin ortadan kaybolması gerektiğini hesaplıyordu
- Buna Linux kernel de dahildi
- Yazının başında ilk preprint’in Linux için sistemin durması adına 80 kişinin ayrılması gerektiğini söylediği belirtiliyor; ileride ise 2015 tarihli preprint için 90, tam yayın için 57 değeri veriliyor
- mclare ile birlikte, yaklaşık 10 yıl sonra truck factor’ün iyileşip iyileşmediğini görmek için sonuçlar yeniden üretilmeye çalışıldı
- Yazarların orijinal GitHub deposu hâlâ kullanılabiliyordu
Veri ve çalışma ortamının kısıtları
- Makalenin verileri JSON olarak sunuluyordu, orijinal görselleştirme ise scrape edilebilen CSV’ye dayanıyordu
- Ancak veri toplama tarihi bilinmiyordu
- README’deki yönergeler olduğu gibi çalışmadığı için GitHub issue’larına bakarak çalıştırma yöntemini düzeltmek gerekti
- Orijinal CSV’nin ilk sütunundan GitHub depo listesi çıkarılıp tüm depolar klonlandı
gnu parallelile birden çokgit clonekomutu aynı anda çalıştırıldı
gnu parallel, linguist ve NixOS’ta takılan noktalar
gnu paralleliçin-j 8verilmesine rağmen dizüstü bilgisayardaki 32 çekirdeğin tamamının kullanıldığı görüldü- Aynı anda görünen
git clonesüreçlerinin sayısı 8’di, ancak çok sayıdakigit index-packsüreci tüm çekirdekleri kullanıyordu - Muhtemel neden olarak,
git index-pack’in fork edilen alt süreç olması ve bu yüzdenparallel’in başkagit cloneişlemleri başlatması tahmin edildi - Truck Factor kodu, dokümantasyon dosyalarını dışlamak için GitHub’ın linguist aracını kullanıyor
- NixOS ortamında Ruby deneyimi olmadığı için Ruby Gems kurulumunu zamanında çözemedi; Nix flake içinde linguist eklentisinin nasıl kurulacağına dair bilgi ya da pull request istiyor
Gerçek yeniden hesaplama süreci
- Orijinal depo fork edilip yerelde klonlandıktan sonra README izlenerek çalıştırma yöntemi uyarlandı
- Java kaynak kodu
mvn packageile jar dosyasına derlendi - Önce numpy GitHub deposunda her adım test edildi, ardından tüm depolar için yeniden hesaplama yapıldı
- mclare, orijinal görselleştirmenin CSV’sini indirip ilk sütunu GitHub depo listesine dönüştürdü
- Çalışma akışı şu şekildeydi
parallel -j 8 git clone ::: $(cat ../meta/repo_list.txt)ile depolar klonlandı- awk hatasını önlemek için
gittruckfactor/scriptsdizinine geçildi commit_log_script.shile her depo için git commit bilgileri çıkarıldı- Çıkarılan commit verilerini işlemek için
gittruckfactor-1.0.jarçalıştırıldı
- Evdeki hızlı gigabit internet bağlantısında tüm depoları sıralı biçimde klonlamak 17,5 dakika sürdü
- Her deponun işlenmesi de kabaca 18 dakika sürmüş görünüyor
Linux kernel yeniden hesaplama sonuçları
- Linux kernel için örnek çıktı TF = 12, coverage = 49.98% oldu
- TF authors arasında Linus Torvalds, Mauro Carvalho Chehab, Rob Herring, Thomas Gleixner ve Krzysztof Kozlowski gibi isimler yer aldı
- Linus Torvalds için 5.712 dosya ve %6,59 değeri gösterildi
- Dokümantasyon ve üçüncü taraf kütüphaneleri filtreleyen linguist eklentisi olmadan elde edilen Linux kernel truck factor değeri 12 idi
- mclare, kendi sistemine linguist eklentisini kurduktan sonra Linux kernel için 8 truck factor sonucu aldı
Hesaplamada eksik kalan unsurlar ve sonraki inceleme başlıkları
- Bu hesaplama review sürecini yansıtmıyor
- Kıdem arttıkça geliştiricilerin doğrudan klavyede kod yazmaktan çok daha fazla review yapması gerekmesi ayrı bir sorun
- Ayrıca bakılabilecek başlıklar şunlar
- Truck factor hesabının git’teki
co-authored-byve reviewer başlıklarını dikkate alıp almadığı - Almıyorsa bunun hesaba katılıp katılamayacağı
- Linux değerlerinin 10 yıl sonra neden büyük ölçüde değiştiği
- Orijinal makalede geliştirici alias’larını birleştirmek için kullanılan Levenshtein distance 1 yaklaşımının bu sonuçları etkileyip etkilemediği
- Linux kernel deposu 2015 ortasındaki duruma checkout edilirse aynı kodun hâlâ 80 verip vermeyeceği
- Algoritma 2016’da güncellendiği için sonraki değerlerin yeniden üretilip üretilemeyeceği
- Truck factor hesabının git’teki
- Orijinal makalenin 156 atfına bakılarak daha iyi bir hesaplama yöntemi olup olmadığı görülebilir
- Rust gibi daha yeni büyük projeler 2015 tarihli makaleye dahil edilmediğinden, bugünün popüler projeleri geçmiş verilerle karşılaştırılabilir
- Rastgele bir git deposu için yıllara göre truck number bulan bir script de yazılabilir
Daha da düşen Bus Factor
- Yanıtı aranmak istenen soru, truck factor’ün zaman içinde iyileşip iyileşmediğiydi
- Sonuç, iyileşmediği ve hatta kötüleştiği yönüne daha yakın
- Linux kernel, orijinal makaledeki değerden çok daha düşük bir sonuç verdi
- Dokümantasyon ve üçüncü taraf kütüphane filtrelemesine bağlı olarak Linux kernel sonucu 12’den 8’e daha da düştü
- Daha fazla görselleştirme ve ayrıntı için mclare’in yazısına bakılabilir
1 yorum
Hacker News yorumları
https://codescene.com/ özelliklerinden biri tam olarak bu
bilgi adalarını bulup bunları sık değişen kodla ilişkilendirerek, değişimin fazla ama bilginin yayılımının düşük olduğu riskli hotspot'ları tespit ediyor
Biri ayrılacağını söylediğinde sadece onun bildiği kodu kolayca görebildiğiniz için devir planını çıkarmak da kolaylaşıyor
Bunun kötüye kullanılabileceğini hiç düşünmemiştim; aslında görünürlük için yapılmış bir araç. Bunu o şekilde kullanan yönetici kötü bir yöneticidir ve zaten öyle biriyse bu araç onu değiştirmez
Terfi hırsın varsa, devralma işlerinden sorumlu birime “ineklerle yakınlaşma özel eğitimi almış 8 kadın ajan” talep edebilir, başarısızlık ihtimaline karşı da yedekte 8 doz polonyum isteyebilirsin
Tam bir kurgu gibi gelebilir ama tohum yatırımı arayan bir unicorn startup CEO'sunun gerçekten bunun ilk kısmına denk gelen bir şey yaşadığını biliyorum
Üçüncü iş yerinde ise geliştiriciler bunun nereye gittiğini uzaktan fark edip aracı kullanmayı da değerlendirmeyi de reddetti
Bu tür araçlar o kadar pahalı ki onay veren taraf bir şekilde yatırım getirisini çıkarmak zorunda kalıyor. Verimliliği, çıktıyı ve bilgi silo'larını düzgün ölçmenin bir yolu olmayınca iş sonunda “bu hafta Jose'nin PR sayısı azmış” noktasına geliyor
Sorun şu ki geliştiriciler de buna bakıp işten çıkarılması imkânsız çalışanlar listesine girmek için hedef projelere ya da bileşenlere geçmeye çalışabilir. İdeal durumda çalışanlar birlikte hareket edip truck factor'u 0'a indirerek kimsenin kolay kolay işten çıkarılamayacağı bir ortam yaratabilir
Elbette bu durumda neredeyse tamamen zaman kaybına dönüşür ve blog yazarının iş arkadaşlarının söylediği “hemen Goodhart Yasası'na kurban gider” tespiti doğrulanmış olur
Amazon'da bu tür sayıları kod sistemlerinden herkesin çalıştırabildiği raporlarla kolayca görebiliyorsunuz; ayrıca ekibin ne yaptığına ve ne tür riskler olduğuna bakmanın başka yolları da var. Bana kişisel olarak faydalı geliyor
Bus factor sadece bir bakış açısı; başka bir açıdan bakınca silo'ları, başkalarıyla işbirliği yapmayan mühendisleri ve mühendislerin kolayca taşınamadığı alanları bulup düzeltmeyi sağlıyor
Bazı geliştiriciler yerlerinin doldurulmasından korkup sadece kendilerinin bildiği sistemlerin iş güvencesi olduğunu düşünüyor ama tersine bu teknik bir risk ve iyi mühendislerin daha önemli projelere geçmesini engelleyen bir unsur da olabilir. Nefret ettikleri bir sistemden bıktıklarında başka bir işe geçebilmenin yolu da budur
Ama yerine başkasının konulabilir olması fikri büyük bir ek yük yaratıyor ve yetenekli insanları tam kapasiteleriyle kullanmayı engelliyor. Çünkü onlar aslında gerçekten yerine kolayca başkası konulabilecek kişiler değil
Bazı yerlerde bu gerekli olabilir ama başka yerlerde süreçten doğan ek yük, bus factor'dan çok projenin başarısı için daha büyük bir risk haline geliyor
Sonuç, 3 ay içinde istifa etmesi oldu
Backend'de de bol bol TypeScript kullanmamızın nedenlerinden biri, küçük bir ekibin bilmesi gereken dil sayısını bire indirmesi. Böylece frontend geliştiricisi tatile çıktığında gerçekten bağlantıyı kesebiliyor ve başkası devralabiliyor. Biri iş değiştirirse de daha az sancılı oluyor
Bu hiçbir zaman sorun olmadı; ikame edilebilirliğin sağlıklı sistemlerin bir parçası olduğunu düşünüyorum. Birkaç yıl yönetim tarafında kalınca ilk öğrenilen şeylerden biri “herkesin yeri doldurulabilir, mesele sadece maliyet” oluyor. Bu yüzden bilgi seviyesi fazla yükselirse, yönetim bu riski azaltmaya çalışırken bu durum senin aleyhine bile işleyebilir. Özellikle ekonomik gerekçelerle yapılan toplu işten çıkarmalar oldukça rastgele de olabiliyor
Yine de bu kadar saçma metrikler kullanan bir yerde çalışmak istemem. İyi iş yapmanın etrafına ne kadar çok kırmızı bant çekilirse, orada birlikte çalışmak isteme olasılığım o kadar düşer. Böyle şeyler insanların iyi iş yapmasındansa metriklerle oynamasına yol açar ve verimlilikle kalite açısından kötü bir kültür üretmeye çok yatkındır
gnu parallel, istendiği gibi aynı anda 8git cloneişi çalıştırıyor ve hergit cloneda kendi kendine çok sayıdaindex-packthread’i başlatıyor.Burada
git configilepack.threadsdeğerini geçici olarak 1’e ayarlamak yardımcı olur.Kare şeklinde büyüdüğü için CPU arttıkça sorun daha da kötüleşiyor. 32 çekirdekte 32² = 1024 eder; gerçekte Parallel’e 8 verdiğiniz için muhtemelen en fazla 256 kadar
index-packsürecinde durmuş olurdu. Yine de bunu kaldırmak için çok bellek gerekir ve pratikte hiçbir fayda sağlamaz.Çözüm, iki katmandan yalnızca birini paralelleştirmektir.
pack.threadshakkındaman git-configaçıklaması şöyle: en iyi delta eşleşmelerini ararken oluşturulacak thread sayısını belirtir vegit-pack-objects(1)komutunun pthreads ile derlenmiş olması gerekir. Aksi halde bir uyarıyla yok sayılır. Çok işlemcili makinelerde paketleme süresini azaltmak için tasarlanmıştır, ancak delta arama penceresi için gereken bellek thread sayısıyla çarpılır. 0 verilirse Git CPU sayısını otomatik algılar ve buna göre uygun sayıda thread kullanır.git configile geçici ayar yapmak yerine doğrudangit -c pack.threads=1 clonekullanabilirsiniz: https://git-scm.com/docs/git#Documentation/git.txt--cltnameg...Bu yorum pek iyi değil. Bence bu yazı tüm mühendislik liderleri için yazılmış.
Otobüs faktörü, ekipten birinin ya da sizin otobüs çarpması sonucu devre dışı kalmanız halinde ekibin ne kadar acı çekeceğini ifade eder.
Her ekip üyesi için ideal otobüs faktörü 0’dır. İlk bakışta “herkesi sarf malzemesine çevirin” gibi gelebilir, ama aslında neredeyse tam tersidir ve mesele de budur.
Ekip, a) özerk ve b) gizem barındırmayacak kadar iyi olmalıdır. İdeal durumda herkes her şeyin nasıl çalıştığını anlar. Yeni çalışanlar hemen değer üretmeye başlayabilmeli, ayrılan çalışanlar da geride bilinmeyen alan bırakmadıkları için içleri rahat ayrılabilmelidir.
Herkesin BF’sinin 0 olduğu ideal ekip arzu edilendir. Bu, ekip üyelerinin birbirinin yerini alabileceği ve biri hastalansa, izne çıksa, gerçekten ayrılsa ya da çıkarılsa bile diğerlerinin boşluğu doldurabileceği anlamına gelir.
Daha da önemlisi, 0 BF’nin basitliğin bir yansıması olmasıdır. Yazılımın, build·test·deploy hattının, dokümantasyonun ve destek yapısının hepsi tutarlı ve bütünlüklü olmalıdır. Bilgiyi ekip üyelerinin içinde silo halinde tutmak kötüdür; herkes build alıp deploy yapabilmelidir.
0 BF sağlıklı bir göstergedir, ama asla e-posta sayısı, commit sayısı, PR sayısı, kod satırı sayısı, yanıt hızı ya da GitHub heatmap’i gibi şeylerle ölçülmez. Bu tür metrikler hiçbir şey göstermez; hatta zararlı ve korkunç metriklerdir.
İnsanları bu metriklerle değerlendirmek daktilo başındaki maymunlardan farksızdır. Daha fazla girişimin bunu duyması gerekiyor.
Aynı kavramdan söz ediyor gibi görünsek de, sayının her zaman aynı yönde kullanılmaması şaşırtıcı.
Olasılığın sınırlarını zorlayan projelerde basitlik bazen bir seçenek değildir. Elbette bu, tüm yazılım projeleri içinde küçük bir orandır, ama daha önce yapılmamış bir şeyi yaparken asıl kaygı çoğu zaman kodu olabildiğince basit tutmak değil, “bunu nasıl başaracağız?” olur.
Bu, kod kalitesinin düşük olabileceği anlamına gelmez. Sadece bazen zor işleri yapmak için karmaşık kod gerekir ve ancak birkaç nesil sonra tasarım kalıpları oturur da aynı zor işi daha az karmaşık kodla yapmak mümkün hale gelir. Bu, 10 yıl sonra bile olabilir.
Yapabileceğiniz en karmaşık şey bir yapılacaklar uygulamasıysa, bunun topluma çok fazla değer üretmediğini düşünürüm.
Otobüs faktörünüzün yüksek olması, işvereninizin sizi gelecekteki potansiyeliniz için değil, geçmişte yaptıklarınız nedeniyle elinde tuttuğu anlamına gelir.
Orijinal makalenin temel tezi şu bölümde yatıyor:
“Tahminimiz kapsama varsayımına dayanıyor. Mevcut yazar kümesi, sistemin mevcut dosya kümesinin %50’sinden daha azını kapsıyorsa, sistemin ciddi gecikmeler yaşaması veya durması olasılığı yüksektir.”
Burada bir dosyanın yazarı, önceden hesaplanmış ağırlıklara göre o dosyaya anlamlı katkı yapmış kullanıcı olarak tanımlanır.
Bir yandan, bu tür dashboard metrikleri bir tür kurumsal yazılımın içinde zaten yoksa buna daha çok şaşırırdım. Eski şirketimde yöneticiler gerçekten de bölümde en çok e-posta gönderip alan kişinin kim olduğunu gösteren bir günlük rapor üretip üretemeyeceğimizi sormuştu.
Bunun nereye varacağını sevmediğim için reddettim, ama başka bir iş arkadaşım yaptı. Tahmin edileceği gibi en çok e-posta alıp gönderen kişi sistem yöneticisiydi; çünkü çeşitli sunucuların otomatik e-posta göndericisi olarak onun hesabı ayarlanmıştı. Günde yüzlerce uyarı e-postasını kendisine gönderiyordu; üstüne bir de abone olduğu bültenler ve özet e-postaları vardı.
Öte yandan, iş arkadaşlarınız hep birlikte işlerini etkileyebilecek bir şey yapmamanızı istemesine rağmen bunu hobi projesi olarak zorlamak oldukça kötüce geliyor.
Sadece kullandığım açık kaynak yazılımın, yaşayabilirliğini artıracak kadar bilgiyi iyi dağıtıp dağıtmadığını görmek istiyorum.
O kötü davranışı yapmayı reddettim.
“Kariyer basamaklarında yükseldikçe geliştiricilerin doğrudan klavyede yazmayı azaltıp daha çok review yapması gerekir” fikrinin teknoloji şirketlerinde yaygın bir yanlış anlama olduğunu düşünüyorum.
Yapmak istediğiniz şey harika bir geliştiriciyi sıradan bir yöneticiye dönüştürmek değil.
Teknik lider olmaktansa kıdemli geliştirici olarak kalmaları çok daha iyi olur. Yönetici olurlarsa ekibin ne kadar zorlanacağını hayal etmek zor değil.
Bu işin hüzünlü ironisi, sorunun hâlâ yanlış olmasıdır
Bir startup’ın toplu işten çıkarma yapması gerektiğinde sorulacak soru, “Kimi işten çıkarırsak mevcut işi sürdürebiliriz?” değil, “Batmayacak kadar hızlı biçimde ürünün bir sonraki sürümünü geliştirecek ekip kim?” olmalıdır
Sonuçta her yol ayrımı bir yol ayrımıdır ve yeterince hızlı karar veremediği için ölen çok şirket vardır
CPAN uzun zamandır bus factor’ı takip ediyor. Örneğin https://metacpan.org/pod/Moose sol taraftaki bilgi sütununda Bus Factor 5 gösteriyor
Biz buna lotarya faktörü demeyi seviyoruz
Yani birisi lotaryayı kazanıp elektrik ya da telekom altyapısı bile olmayan tropik bir adaya gitse bile proje devam edebilir mi demek
Böyle söyleyince daha az ürkütücü oluyor
Otobüs çarpan kişi ise anında ortadan kaybolur. Aynı şey değil
Spor mecazlarından hoşlanmayanlar da var ama en azından askerî mecazlardan daha iyi olduğunu düşünüyorum
Zaten çoğu zaman düzgün bir devir teslim de olmuyor, bu yüzden ani oluşu başlı başına o kadar önemli bir unsur olmayabilir