Ekranda Aynı, İçeride Devrim: Kod Refaktörünün Gizli Estetiği

Kod refaktörü, yazılım dünyasının en tuhaf sanatlarından biridir: Seyirci salona girer, perde açılır, sahne aynı görünür. Düğmeler aynı yerde, ekran aynı renkte, kullanıcı yine aynı işlemi yapar. Fakat kulisin arkasında dekor sökülmüş, kablolar etiketlenmiş, oyuncuların giriş çıkışları yeniden düzenlenmiş, yangın çıkışları açılmıştır. Dışarıdan hiçbir şey değişmemiştir; içeride ise küçük bir uygarlık kurulmuştur.

Bu yüzden refaktör, sadece teknik bir işlem değil, bir ahlak biçimidir. Çünkü hızlıca çalışan ama içten içe çürüyen kod ile karşılaşan geliştirici, iki yoldan birini seçer: Ya halının altına bir hata daha süpürür ya da diz çöküp zemindeki çatlağı onarır. Refaktör yapan kişi, gelecekteki bilinmeyen bir meslektaşına, hatta çoğu zaman kendisinin üç ay sonraki hâline not bırakır: Burada seni bekleyen bir mayın yok, rahat yürü.

Davranış aynı kalır, anlam değişir

Refaktörün temel ilkesi basittir: Dış davranışı değiştirmeden iç yapıyı iyileştirmek. Bu cümle kuru görünür ama yazılım mühendisliğinin Zen bahçesidir. Bir fonksiyon hâlâ aynı sonucu döndürür; fakat artık adının ne yaptığı anlaşılır. Bir sınıf hâlâ aynı sorumluluğu taşır; fakat sırtındaki beş gereksiz çuval indirilmiştir. Bir koşul hâlâ aynı kararı verir; fakat artık ormanda kaybolmuş bir if-else labirenti değildir.

Burada güzellik, kullanıcı arayüzünde değil, niyette ve düzendedir. İyi refaktör edilmiş kod, sessizce nefes alır. Değişiklik talebi geldiğinde panikle camdan atlamaz; sandalyeyi çeker, çayını koyar ve şöyle der: Buyur, nereye evrileceğiz? Kötü kod ise aynı isteği duyunca mağara ayısı gibi hırlar. Çünkü bağımlılıklar birbirine düğümlenmiş, isimler sisli, testler yok, mantık her yere sızmıştır.

Temizlik takıntısı değil, risk yönetimi

Refaktör bazen yanlış anlaşılır. Sanki geliştiricinin estetik kaprisiymiş gibi görülür: Aa, arkadaşımız kodun simetrisini beğenmemiş, biraz süsleyecek. Hayır. Refaktör, süsleme değildir; karmaşıklık borcunun faizini düşürmektir. Teknik borç, kredi kartı gibidir: Bugün hızlı geçersin, yarın faiz seni toplantı odasında yakalar. Bir noktadan sonra yeni özellik eklemek, bataklıkta piyano taşımaya benzer.

Bu nedenle iyi refaktör, ölçülü ve amaçlıdır. Her şeyi yeniden yazma sarhoşluğu refaktör değil, mimari yangındır. Gerçek refaktör küçük adımlarla ilerler: Bir metodu böl, bir adı netleştir, tekrarı kaldır, yan etkiyi izole et, testi ekle, bağımlılığı tersine çevir. Her adımda sistem çalışmaya devam eder. Cerrahın hastayı güzelleştirmek için değil, yaşatmak için kesmesi gibi.

İsim vermek, dünyayı kurmaktır

Programlamada isimlendirme, küçümsenen bir felsefe problemidir. Bir değişkene temp demek, onu sisin içine atmaktır. calculate demek de çoğu zaman yetmez; neyi hesaplıyor, kimin için, hangi bağlamda? İyi isim, zihinsel yükü azaltır. Kod okuyan kişi artık dedektiflik yapmaz; metni izler. Refaktör bu anlamda dilin arkeolojisidir: Koddaki bulanık kavramları kazar, ortaya gerçek niyeti çıkarır.

Bir başka estetik nokta da sınır çizmektir. Her şeyi bilen nesneler, yazılımın küçük diktatörleridir. Her yere erişen yardımcı sınıflar, imparatorluğun casus ağıdır. Refaktör, bu güç yoğunlaşmasını dağıtır. Sorumluluklar ayrılır, modüller kendi mahremiyetini kazanır, veri akışı izlenebilir hâle gelir. İyi mimari, her parçanın hem yalnız kalabildiği hem de doğru anda konuşabildiği bir şehir planıdır.

Testler: İç düzenin aynası

Refaktörün cesareti testlerden gelir. Test yoksa geliştirici karanlıkta mobilya taşıyordur; her an vazoya çarpabilir. Test varsa ışık yanar. Dış davranışın değişmediğini doğrulamak, refaktörün güvenlik kemeridir. Bu yüzden testler sadece hata yakalama aracı değil, tasarımın nabız ölçeridir. Test edilmesi zor kod genellikle fazla bağlı, fazla gizli anlaşmalar yapan, fazla dramatik koddur.

Sonunda refaktörün estetiği şurada belirir: Kimse alkışlamaz. Kullanıcı fark etmez. Ürün yöneticisi bazen ne yaptığını bile anlamaz. Fakat bir gün kritik bir değişiklik gelir ve ekip şaşırtıcı bir sakinlikle ilerler. İşte o an, geçmişte yapılan görünmez temizlik konuşur. Refaktör, geleceğin paniklerini bugünden susturma sanatıdır. Dışarıda aynı bina durur; içeride taşıyıcı kolonlar hizalanmış, merdivenler aydınlatılmış, kapılar artık duvara açılmamaktadır. Yazılımda gerçek güzellik bazen tam da budur: Hiçbir şey olmamış gibi görünür, çünkü içeride her şey olması gerektiği gibidir.

Ölü Kod Mezarlığı: Sistemi Yavaşlatan Hayalet İnançlar

Her yazılım sisteminin bodrum katında bir mezarlık vardır. Orada artık çalışmayan fonksiyonlar, yıllar önce terk edilmiş koşullar, kimsenin çağırmadığı sınıflar ve üstüne not düşülmüş kadim büyüler uyur: sakın silme, bir gün lazım olabilir. Ölü kod tam olarak budur; programın yaşayan akışına katkısı olmayan ama depoda yer kaplayan, zihni meşgul eden, bakım maliyetini artıran eski parçalar. İlginç olan şu: Ölü kod teknik bir mesele gibi görünür, ama çoğu zaman psikolojik bir arızanın izidir. Kod çalışmaz; korku çalışır.

Bir ekip düşünün. Beş yıl önce yazılmış bir ödeme modülünün içinde devasa bir if bloğu duruyor. Artık hiçbir müşteri o yolu kullanmıyor, dokümantasyon onu anmıyor, testler ona uğramıyor. Ama biri silmeyi önerdiğinde odada sessizlik oluşuyor. Çünkü kodun kendisinden çok, onun etrafındaki efsane yaşıyor: Eski CTO bunu yazmıştı. Büyük bir müşteride sorun çıkarmıştı. Bir ara kampanya döneminde hayat kurtarmıştı. İşte yazılımda ölü kod, çoğu zaman eski bir savaşın madalyasıdır; paslanmıştır ama kimse duvardan indirmeye cesaret edemez.

Ölü kod neden tehlikelidir?

Çünkü yazılım yalnızca işlemciye verilen talimatlardan oluşmaz; aynı zamanda geliştiricinin zihninde kurduğu modeldir. Sistemde gereksiz kod ne kadar artarsa, bu model o kadar bulanıklaşır. Yeni gelen geliştirici şunu sorar: Bu fonksiyon hâlâ kullanılıyor mu? Bu parametre niye var? Bu hata yakalama bloğu hangi senaryo için? Cevap yoksa, kod artık bilgi değil gürültüdür. Gürültü de karar vermeyi yavaşlatır. Yavaş karar veren ekip, hızlı bozulan sistem üretir.

Ölü kodun maliyeti yalnızca satır sayısı değildir. Derleme süresini uzatabilir, statik analizleri kirletebilir, güvenlik taramalarında yanlış alarm üretebilir, test kapsamını sahte şekilde yükseltebilir. Daha kötüsü, yeni bir özellik geliştirirken yanlış referans noktası sunar. Geliştirici, yaşayan mimariyi değil, fosilleşmiş bir çözümü taklit eder. Böylece ölü kod çoğalır; mezarlık, şehir planına dönüşür.

Burada en kritik ayrım şudur: Eski kod ölü kod demek değildir. Legacy kod, hâlâ değer üretiyorsa yaşlı ama canlıdır. Ölü kod ise artık sistem davranışının parçası olmayan koddur. Onu kutsal yapan yaşlılığı değil, belirsizliğidir. Belirsizlik arttıkça insanlar silmek yerine dokunmamayı seçer. Dokunmamak güvenli görünür, ama uzun vadede en pahalı stratejilerden biridir.

Silmek bir vandalizm değil, bakım disiplinidir

Ölü kodla mücadele romantik cesaretle değil, yöntemle yapılır. Önce kullanım izleri aranır: çağrı grafikleri, loglar, feature flag kayıtları, telemetri, testler, sürüm geçmişi. Kod gerçekten çalışmıyorsa, onu yorum satırına almak çözüm değildir; bu sadece cesedi salona taşımaktır. Versiyon kontrol sistemi zaten hafızadır. Git varsa, mezar taşı olarak yorum satırı bırakmaya gerek yoktur.

İyi bir temizlik süreci küçük ve geri döndürülebilir adımlarla ilerler. Önce şüpheli alan işaretlenir, ardından gözlem süresi tanımlanır. Kullanım yoksa testler güncellenir, bağımlılıklar kaldırılır, kod silinir. Pull request açıklamasında neden silindiği net yazılır. Böylece silme eylemi kişisel bir saldırı değil, izlenebilir bir mühendislik kararı olur. Ölü kodu silmek, geçmişteki geliştiriciyi küçümsemek değildir; onun bir zamanlar çözdüğü problemin artık var olmadığını kabul etmektir.

Bu konu yazılımın dışına da sızar. Kurumların süreçlerinde, ekiplerin alışkanlıklarında, bireylerin düşüncelerinde de ölü kod vardır. Bir zamanlar işe yarayan ama artık sadece refleks olarak sürdürülen kurallar. Kimsenin okumadığı raporlar. Her toplantıda tekrarlanan ama karar üretmeyen cümleler. Eski bir başarının gölgesinde yaşayan inançlar. Yazılım bize acımasız bir ayna tutar: Çalışmayan şeyi sistemde tutarsan, sistem sonunda ona benzemeye başlar.

En sağlıklı kod tabanları, en çok kod yazılanlar değil, gereksiz kodun düzenli olarak eksiltildiği yerlerdir. Çünkü iyi mühendislik eklemek kadar çıkarmayı da bilmektir. Bir satırı silmek bazen yüz satır yazmaktan daha yüksek zekâ ister. Ölü kodun fısıltısı hep aynıdır: Ya lazım olursam? Usta geliştiricinin cevabı ise sakindir: Lazım olursan geçmişten geri çağırırım; bugün yaşamıyorsan, üretimde yerin yok.

Gezegenler Gerilerken

Ey esrara vakıf olan irfan sahibi, sükut et; çünkü susmakta dil kaymasından kurtuluş vardır. Lamiyet Al-Acem

Seyit bey, 12 yıl önce taaa moortip günlerinde hediye etmiş bu kitapçığı bana. Şimdi beş gezegen birden gerileyince eskiler ortaya dökülüyor. sekiz senedir ellemediğim merdiven altındaki dolaptan çıktı. Dağıtılan 4 bin küsür kitaptan bakiye kalmış iki-üçyüz kitap,  ikiyüzü aşkın seçilmiş film cd’leri ve ıvır zıvırlar -saklı olduğundan değil de göz yorgunluğu olmasın diye- bu özetleme kabininden çıktılar. Şöyle bir havalandırıp bir çok şeyi dağıtılacaklar kartonlarına havale ettim. 8 senedir ellenmeyen daha başka dolap ve çekmeceler de var, bendeki bu gayrete bakılırsa onları da iki gün içinde temize havale ederim. Ugh. Galaksiler aşkına! On kaplan gücü ver bana…

Hayatımda ilk defa temizlik işini iş görmedim yaw! İlginç … Sanki bitter çikolata eşliğinde kahve yudumlarken 118.ci kez inception filmini izliyorum!

*

Günler geçiyor, ben dolap ve çekmece boşaltma işine devam ediyorum, ne hummalı bir çabaymış bu! 🙂 At at bitmiyor. Belki bu sayede tıkalı burnum da açılır diye umuyorum 🙂

Meşe ormanının aslanları beni hile ile tuzağa düşürseler bile
Benimle tatlı tatlı konuşan ceylanları bırakamam.
Lamiyet Al-Acem

*

Devamını oku “Gezegenler Gerilerken” →