Chesterton’ın orta parmağı
(arp242.net)- Chesterton’s fence, nedenini bilmediğiniz kodu gelişigüzel değiştirmemenizi öğütler; ancak nedenini bırakmadan yazılmış kod ve commit geçmişi aynı yükü sonraki geliştiriciye devreder
- Bu deponun son 13 yıldaki commit gövdeleri komut satırı ölçümüne göre yalnızca 295 satır; dependabot, revert ve typo ile ilgili gövdeler çıkarıldığında sayı 167 satıra düşüyor
- Commit başlıkları büyük değişikliklerde bile “fix page A” gibi bağlam sunmuyor; ayrı dokümantasyon ve kod yorumları da neredeyse olmadığından değişikliklerin nedenini izlemek zorlaşıyor
- Kodda yarım kalmış refaktörler, kaldırılmış özelliklerin kalıntıları, eklenmiş ama bağlanmamış ya da kullanılmayan özellikler ve görünüşe göre kimsenin kullanmadığı özellikler duruyor
- Commit mesajları ve dokümantasyon en azından “neyin değiştiğini, neden değiştiğini, bunun neden iyi bir çözüm olduğunu” bırakmalı; hiçbir şey bırakmamak, sonradan gelen geliştiricilerin maliyetini büyütür
Nedensiz kodun bıraktığı yük
- Chesterton’s fence, bir şeyin neden öyle yapıldığını anlamadıysanız onu gelişigüzel değiştirmemeniz gerektiğini anlatan bir benzetmedir
- Programlamada da tuhaf görünen bir kodu “düzeltip” daha sonra o tuhaflığın aslında bir nedeni olduğunu fark ettiğiniz durumlar olabilir
- Bu vakada ise bunun karşı tarafındaki sorun ortaya çıkıyor
- Tuhaf kod ve karar çok, ama neden öyle olduğuna dair hiçbir kayıt yok
- Önceki geliştiricilerin hepsi ayrılmış; soracak kimse de kalmamış
- Deponun commit geçmişi pratikte neredeyse hiç bağlam sağlamıyor
- Son 13 yıldaki commit gövdeleri toplam 295 satır
- dependabot, “revert commit” ve “fix typo” commit gövdeleri elle çıkarılınca 167 satır kalıyor
- Bu da kabaca ayda bir satır seviyesine denk geliyor
- Commit başlıkları da çoğunlukla “fix page A” gibi, büyük değişiklikleri açıklamak için yetersiz
- Ayrı bir dokümantasyon yok ve kod yorumları da neredeyse hiç yok
- Bu durum, “çok sayıda tuhaf şey yaptık ama neden yaptığımızı söylemeyeceğiz” diyen bir Chesterton’ın orta parmağına daha çok benziyor
Geliştiricinin bırakması gereken asgari kayıt
- Kod tabanında çeşitli türlerde yarım kalmış ya da artakalmış kodlar bulunuyor
- Bitmemiş refaktörler
- Kaldırılmış özelliklerin kalıntıları
- Eklenmiş ama bağlanmamış ya da kullanılmayan özellikler
- Görünüşe göre kimsenin kullanmadığı özellikler
- Genel olarak Chesterton’s gap sorunu da ciddi görünüyor
- “Henüz çit yok, o halde bir tane yapalım” yaklaşımı; gerçekten bir çite ihtiyaç olup olmadığını sormayan bir duruma benziyor
- İyi yazmak zordur, ama kabaca yeterli bir açıklama bırakmak zor değildir
- Değişiklik kaydı temelde üç soruya yanıt vermelidir
- Ne değişiyor
- Neden değişiyor
- Bu çözüm neden iyi
- Bazen yalnızca “Implement new feature X” yeterli olabilir; ama çoğu durumda, özelliğin neden veya nasıl bu şekilde eklendiğine dair yazılacak şeyler vardır
- Hata düzeltmeleri, refaktörler ve anlamlı değişikliklerde genelde en az bir-iki paragrafla neyin değiştiği ve neden değiştiği bırakılabilir
- Bu tür kayıtlar isteğe bağlı değil, yazılım geliştiricisinin işinin bir parçasıdır
- Süslü olmasına gerek yok
- Kusursuz İngilizce olmasına gerek yok
- Gösterişli bir deneme olmasına gerek yok
- Eksik kalan şeyler olsa bile, bu yine de hiçbir şey olmamasından çok daha iyidir
- Hiçbir şey bırakmamak, sorunu sonradan gelen herkesin üzerine yıkmak demektir
1 yorum
Lobste.rs görüşleri
Sonradan neyin önemli hale geleceği o anda her zaman net olmayabilir. Commite kadar uzanan tüm sürecin açık biçimde kayda geçirilmiş olması büyük fayda sağlar, ancak ilgili herkes zaten çok fazla bağlama sahip olduğundan “fazlasıyla bariz” sayılıp atlanan şeyler de olur
Tartışma kayda geçirilmezse, karar alma sürecini dijital arkeoloji gibi kazıp çıkarmak çok daha zorlaşır. Sonunda neden o çitin orada olduğunu bilmediğiniz bir durumla uğraşmanız gerekebilir; böyle zamanlarda bunu mevcut bağlam ve bugünkü insanların sistem bilgisi temelinde değerlendirmek gerekir
Projede uzun süre kalıp tüm sisteme dair anlayış ve sezgi edinmiş birinin varlığı büyük yardımcı olur. Geliştiricileri birbiriyle değiştirilebilir dişliler gibi gören organizasyonlarda kimse yeterince uzun kalmaz; böylece aynı hatalar tekrarlanır ve tekerlek yeniden icat edilir
Sonraki kişinin koda baktığında bunun neden böyle olduğunu anlama ihtimali artık sıfır olmaz
Commit mesajına sadece “fix” ya da “WIP commit” gibi şeyler yazan geliştiricileri hiç anlayamadım. Muhtemelen hiç ciddi bir kod arkeolojisi yapmamışlardır ya da böyle bir şeyin yapılabileceğini akıllarına bile getirmemişlerdir
Ben hep fazla bilgi verme yönünde hata yapmaya çalışıyorum. Böylece gelecekteki ben, benden sonra gelecek kişi ya da bir arıza çıktığında nöbete çağrılan talihsiz kişi, bir şey bozulduğunda en azından nedenini bulma şansına sahip olur
Böyle durumlarda her kontrol noktasından sonra neyin değiştiğini zihinde takip etmek ya da anlamlı bir açıklama eklemek zordur; commit’i iyi tanımlanmış iş birimlerine ayırmanın bir aracı olarak değil, video oyununun “save” düğmesi gibi kullanmaya daha yakındır
Tersine, büyük bir API refactor sonucu büyük bir commit oluşturuyorsanız, tasarım belgesine yakın bir açıklama bile yetersiz kalabilir; bunu yapmayacaksanız uzun bir mesajın anlamı da belirsizleşir. Ama bazı insanlar bunu bir rozet gibi görüp release notlarına “hata düzeltmeleri ve işlev iyileştirmeleri” gibi ifadeler yazmaya başlıyor; bu ise açıkça yanlış bir sonuç
Bir değişikliğin arka planını okuyup anlaması gereken “başka kişi”nin gelecekteki kendileri olabileceğini birçok geliştirici sık sık unutuyor. Bir kod bloğuna bakıp kafanızı kaşıdıktan sonra
git blameçalıştırıp karşınızda kendi adınızı bulma durumu herkese tanıdık geliyordurİyi commit mesajları, neden sorusunun peşine düşmek için issue’ları, e-postaları ve sohbet kayıtlarını didikleyerek harcanacak saatleri, bazen günleri, sayısız kez kısalttı. Hatta normalde cevabı hemen bilmem gereken durumlarda bile
Gelecekteki kendinize karşı nazik olun. Bildiğiniz, düşündüğünüz ve tartışılmış olan her şeyi git log’a dökmek daha iyidir. 5 yıl sonra neyin hâlâ apaçık olacağı asla belli değildir
git blameiçinde kendi adımı görüp afalladığım durumlar, en azından arkasında gerçekten bir neden olan şeylerde çok sık yaşanmıyor. Başkasının garip davranışı gibi rastgele durumlarda, onların sürecini göremiyorsanız faydalı bir açıklama sunmak zordur; ama bir zamanlar bana mantıklı gelen bir şeyse, tekrar okuyunca genelde yeniden anlam kazanırSanırım benim öğrenme biçimim lav katmanları gibi birikerek oluşan bir yapıya daha yakın. Liseden beri kökten değişmektense, bildiklerimin ve onları kullanma yollarımın üzerine sürekli yenilerini ekledim
Kısa süre önce biri commit mesajı bir cümleyi aşıyorsa bunun genelde zaman kaybı olduğunu savundu; buna güçlü biçimde karşı çıkmak istedim ama tersini kanıtlamakta düşündüğümden daha beceriksiz kaldım
Sorulardan biri, hangi bilginin commit mesajına girmesi gerektiği ve hangi bilginin satır içi yorumlara, ADR'lere ya da diğer uzun biçimli belgelere gitmesi gerektiği
Hâlâ iyi commit mesajları yazmaya çalışıyorum ama iş yerinde artık umudu kestim, kişisel oyuncak projelerimde de tutarlı olamıyorum
Ama nihai kod, commit mesajı okunmadan da anlaşılabilir olmalıdır. Yeni kodun içinde gerekçe gerektiren bir şey varsa bu yoruma girmelidir
Başka bir deyişle commit mesajı bu değişikliği neden şimdi yaptığımızı açıklar, yorumlar ise değişiklik tamamlandıktan sonraki kodun neden o durumda olduğunu açıklar
Daha büyük değişiklikler, özellikle de yeni özellikler için, bir yerde mutlaka bir tasarım belgesi olmalıdır. İnceleme gerektiriyorsa depodaki gerçek bir belge olabilir ya da issue takip sisteminde bulunabilir
Commit mesajı bu belgeye işaret etmeli ve tasarımın koda inerken ortaya çıkan ayrıntıları da açıklaması gerekebilir. Mümkünse tasarım belgesinin kısa bir özetini de eklemek iyidir. Birden fazla potansiyel reviewer olduğunda, en çok kimin ilgilenmesi gerektiğine dair sinyal verir ve özellikle tasarım aşamasında geri bildirim vermesi gerekirken dışarıda kalmış kişileri yakalamak açısından önemlidir
git logya dajj logile değil, neredeyse her zaman satır açıklaması görünümü üzerinden görüyorumBaşlık satırı, daha derine inmeye gerek olup olmadığına karar vermek için genel olarak çok faydalı. Gövdede değişikliğin neden yapıldığına dair bilgi olması, gerekçenin sezgisel olmadığı durumlarda yardımcı oluyor
Örneğin epey kod eklenmiş olsa bile çoğu zaman sadece “admin: add impersonation” yeterli olabiliyor. Ama “auth: shorten JWT timeouts” ise, neden zaman aşımı sürelerinin kısaltılması gerektiğine dair bir iki cümle görmek isterim
Gerçekten uzun biçimli commit mesajlarının pratikte pek de yararlı olmadığını düşünüyorum. Yazıda işaret edilen nedenlerle de büyük ölçüde aynı. Bu tarz, commit mesajının fiilen PR açıklaması olduğu iş akışlarından, örneğin e-posta tabanlı akışlardan ya da Gerrit'ten çıkmış gibi görünüyor. Böyle durumlarda zararlı değil ama mutlaka değer kattığını söylemek de zor
Ben de benzer durumdayım. İş yerindeki daha geniş grupta ayrıntılı commit mesajları yazan sadece ben ve bir başka kişi var
Çitin neden yapıldığını bilseniz bile, neden şu anda orada durduğunu bilmiyor olabilirsiniz. Hatta Chesterton’ın çitini yapan kişi olsanız bile onu yıkıp yıkamayacağınızı bilemeyebilirsiniz
Sistem kurulduğunda amaçlanan bağımlılık ağacı, herhangi bir andaki gerçek bağımlılık ağacının yalnızca bir alt kümesidir. Bu yüzden kusursuz bir geliştirici size çitin neden yapıldığını tamamen anlatsa bile bunun faydası sınırlıdır
Onların bildiği şey neden yapıldığıdır; “bu çiti kaldırırsam ne bozulur?” sorusunun cevabı değildir. https://xkcd.com/1172/ buna bakmak yeterli. Komik kullanım örneklerinden önemsiz sayılabilecekler olabilir, ama asıl geliştiricinin kendisinin bile bilemeyeceği meşru kullanımlar her zaman vardır
Asıl geliştiricinin ne düşündüğünü ya da ne içtiğini bilmek güzeldir, ama bu bilgi eksiklik ile alakasızlık arasında bir yerde durur
Uydurma bir örnek olarak, Chesterton’ın çitinin başlangıçta iki yanında çiftlikler varken çocukları su birikintisinden uzak tutmak için dikildiğini varsayalım. Şimdi bir otoyol yapılmış olabilir ve o çit tesadüfen geyiklerle arabaların çarpışmasından kaynaklanan kitlesel hayvan ve insan ölümlerini önleyen tek şey haline gelmiş olabilir
Bunu kimse bilmiyor. Otoyol + çitsiz kombinasyonu yalnızca test edilmemiş değil, hiç var olmamıştır da; otoyolu yapanlar ile doğal kaynaklar dairesi o yolda neden az hayvan çarpması olduğunu bilmiyordur. Birkaç yıl sonra bütün çiftlikler konuta dönüşüp orası artık büyük bir hayvan geçiş koridoru olmaktan çıkınca çit işe yaramaz hale gelebilir de, gelmeyebilir de
Bu size zorlama ya da kendinizle ilgisiz geliyorsa sizi kıskanırım. Benim deneyimime göre belli bir ölçeği olan ve çok yeni olmayan şirketler dışında işler genelde böyle yürür
Gerçek şu ki yaptığımız her şey bir ekosistemin parçasıdır; açıkça etkileşime girmeyi hiç kararlaştırmadığımız şeylere dayanır ve onlar tarafından da kullanılır. API yüzeyini küçültebilir ve tüm uygulama ayrıntılarının komşunun işi haline gelmesini engelleyebilirsiniz, ama istenmeyen bağlanma artan entropi kadar kaçınılmaz bir evren yasasına yakındır
Bazı insanlara bu nihilist ve yenilgiyi kabullenmiş gibi gelir. Entropiyle savaşmamız gerekmez mi diye sorabilirler. Ama bana göre zamanı en iyi kullanma ve yatırımın karşılığı, bunun temelde savaşılacak değil yönetilecek bir şey olduğunu kabul etmekten gelir
Dünyanın durumunu her zaman bilebileceğinizi varsaymak, başarısızlığı ve kendini suçlamayı peşinen kabul etmektir. Tıpkı %100 uptime diye bir şey olmaması ve çoğu hedef için bunun yanlış bir hedef olması gibi
Sürecin belli bir Heisenberg tarzı belirsizlik taşıdığını kabul ederseniz, bir günde elinizdeki sınırlı zamanı daha iyi sonuç üretmek için nasıl kullanacağınızı seçebilirsiniz. Özellikle de proaktif ve reaktif yaklaşım arasında akıllıca bir denge kurabilirsiniz; reaktif çalışmayı sıfıra indirmenin mümkün olmadığını ve bazen bir günlük reaktif işi önlemek için bir yıllık proaktif iş yapmanın anlamsız olduğunu da anlarsınız
Peki commit’e ne kadar dokümantasyon yazılmalı? Kaç tane tasarım dokümanı ya da test planı olmalı? Ben de bilmiyorum. Ama bir seçenek ortaya atayım: bütün dokümantasyon bir okur için yazılır
Kod tabanını değiştiriyorsanız mevcut ekip üyeleri ve sonradan katılanlar dahil herkes araştırma yaparak değişikliğin ne yaptığını ve neden yapıldığını anlayabilmeli; ayrıca tehlikeli basamak taşları ya da yük taşıyan bug’larla ilgili birkaç uyarı da bulunmalı
Bu, uzun bir düzyazı değil; sahneyi kuran ek bağlama işaret eden göstergeler biçiminde olmalıdır. Örneğin: “Bu adımda kimlik doğrulama istememizin nedeni, tüm değişikliklerde çok taraflı onay gerekmesi politikamızın bir parçası olmasıdır. see: go/multiparty” gibi
İnsanlarla uğraşırken mükemmelliği hedefleyen sistemler gerçekten rahatsız edicidir. DRM, trusted computing, remote attestation, Faro Plague, smart contracts gibi şeyler
Servis modunda yeniden başlatılıp düzeltilebilen sistemler çok daha iyidir. Çünkü yazılımın gelecekte insanlara gerçekten yardımcı olmak için hangi yönde evrilmesi gerektiğini öngöremeyiz. %100 sert biçimde kilitlemektense düzeltmesi kolay hale getirmek daha iyidir
Biz neredeyse hiç commit gövdesi yazmıyoruz ama başlıkları oldukça iyi yazıyoruz. Ölçüt buysa, neyi ölçen bir ölçüt olduğundan pek emin değilim
Büyük kod tabanlarında açık kod ve yeterli test coverage çoğu zaman dokümantasyondan çok daha faydalı olur
Tamamen makul bir değişiklik yapılmış ve testler de buna göre güncellenmiş olabilir, ama sonradan bakınca o değişikliğin neden gerekli olduğu hiç net olmayabilir. Özellikle değişen satırlar üretim ortamında beklenmedik ya da ek davranışlar doğuruyorsa daha da böyledir
Basit bir geri alma istenmeyebilir ve bu noktada değişikliğin neden yapıldığına dair tam geçmiş gerçekten yardımcı olur
Fikrin doğru olup beklenmedik sonuçların çıktığı pek çok durum gördüm. Niyeti bilirseniz hem yeni sorunu düzeltip hem de ilk değişiklik nedenini koruyan gerçekten doğru değişikliği çıkarabilirsiniz
Tek satırlık commit’te ısrar ediyorsanız, en azından bilet numarasını ekleyin ki geçmiş oradan okunabilsin
Böyle kod tabanlarını kurtarmak için 5 yıl boyunca egzotik bölgeleri dolaşıp epey iyi para kazandım. @arp242, her zaman ücretleri artırın ve https://archive.org/details/working-effectively-with-legacy-code kitabını yastığınızın altında tutup uyuyun
Neyse ki AI zımbırtı üreticileri devasa commit mesajları yazıyor. Bazen gerçek değişiklikle bir miktar ilgili de oluyorlar; yani en azından o kısım çözülmüş sayılır