Bir yazılım ekibine eski bir kod tabanı gösterin; odada üç duygu belirir: korku, küçümseme ve hafif bir kaçma isteği. Oysa Japon estetiğinin wabi-sabi bakışıyla yaklaşınca, o yamalı sınıflar, unutulmuş yorum satırları, kimsenin dokunmaya cesaret edemediği fonksiyonlar yalnızca kusur değil; zamanın, emeğin ve hayatta kalma mücadelesinin izleridir. Wabi-sabi, kusurlu, geçici ve eksik olanın içindeki değeri görür. Legacy code ise tam olarak budur: kusurlu, geçici sanılmış ama inatla kalıcı olmuş bir dijital çömlek.
Elbette bu, kötü kodu romantikleştirelim demek değildir. Çürüyen bir mimariyi şiirsel bulup üretim ortamında yangın çıkarmasına izin vermek, estetik değil ihmaldir. Fakat modern yazılım kültürü bazen steril bir mükemmellik fantezisine kapılır. Her şey temiz mimari, kusursuz test kapsamı, parlak isimlendirme ve kutsal SOLID ilkeleriyle doğmalıymış gibi davranırız. Gerçek dünyada ise yazılım, genellikle cuma akşamı yetişmesi gereken bir kampanya, beklenmedik bir regülasyon, ayrılan bir kıdemli geliştirici ve müşteri tarafında hâlâ Internet Explorer kullanan biri tarafından şekillendirilir.
Kusur, sistemin biyografisidir
Legacy kodu okurken yalnızca teknik kararları değil, organizasyonun geçmişini de okuruz. Bir yerde aşırı uzun bir metot varsa, belki de orada aceleyle alınmış bir pazar fırsatı vardır. Üç farklı doğrulama mekanizması yan yana yaşıyorsa, muhtemelen üç farklı ekip, üç farklı dönemde aynı problemi çözmeye çalışmıştır. Veritabanında adı anlamsız bir kolon duruyorsa, belki de bir zamanlar sistemin kalbinde atan ama sonra unutulan bir iş kuralının fosilidir. Bu açıdan legacy code, arkeolojik bir katmandır; kazma yerine debugger kullanırsınız.
Wabi-sabi bize şunu hatırlatır: Bir sistemin değeri yalnızca şimdiki zarafetinde değil, geçirdiği dönüşümlerde de saklıdır. Eskiyen yazılım mimarileri, yaşayan organizmalar gibidir. Yama alır, kabuk bağlar, bazen yanlış iyileşir, bazen şaşırtıcı biçimde dayanıklı hale gelir. Mükemmel tasarlanmış ama hiç kullanılmamış bir sistem, vitrindeki kılıç gibidir; parıldar ama savaş görmemiştir. Legacy sistem ise çizik içindedir, fakat ayakta kalmıştır.
Estetik, hatayı sevmek değil, hatayla doğru ilişki kurmaktır
Programlama açısından sağlıklı yaklaşım nettir: Önce sistemi anlamak, sonra riskleri sınıflandırmak, en son değiştirmek. Wabi-sabi burada duygusal bir mercek değil, mühendislik disiplinini yumuşatan bir bilgeliktir. Eski kodu gördüğümüzde hemen büyük temizlik operasyonuna girişmek caziptir. Fakat her refaktör bir cerrahi müdahaledir; hastanın anatomisini bilmeden yapılan operasyon kahramanlık değil sabotajdır.
Bu nedenle legacy sistemlerde estetik değer aramak, onları dokunulmaz ilan etmek anlamına gelmez. Tam tersine, daha dikkatli dokunmayı gerektirir. Önce karakterizasyon testleriyle mevcut davranışı kayıt altına alırız. Sonra bağımlılıkları görünür kılarız. Ardından küçük, geri alınabilir değişikliklerle sistemi nefes alır hale getiririz. Bir kırık seramiği altınla onaran kintsugi sanatında olduğu gibi, onarım izlerini tamamen saklamak zorunda değiliz. Bazen iyi yazılmış bir adaptör katmanı, geçmişle gelecek arasında altın bir damar gibi parlar.
Burada önemli soru şudur: Kodun kusuru gerçekten zararlı mı, yoksa yalnızca zevkimize mi aykırı? Her çirkinlik hata değildir. Bazen garip görünen bir karar, üretim ortamında on yıl boyunca öğrenilmiş acı bir dersin sonucudur. Deneyimli geliştirici, estetik öfkesini dizginleyip sisteme sorar: Seni böyle yapan neydi? Bu soru, hem teknik hem felsefi bir sorudur.
Wabi-sabi ile bakılan legacy code, bize faniliği de öğretir. Bugün hayranlıkla kurduğumuz mikroservis mimarisi, yarının nostaljik enkazı olabilir. Şu an pırıl pırıl duran framework, birkaç sürüm sonra terk edilmiş bir tapınağa dönebilir. Yazılımda kalıcılık, kusursuzluktan değil uyarlanabilirlikten doğar. En iyi mimari, hiç bozulmayan değil; bozulduğunda anlaşılabilir, onarılabilir ve evrimleşebilir olandır.
Sonunda mesele şuna gelir: Kod yalnızca makineye verilen talimat değil, insan kararlarının tortusudur. Hatalı, eksik, yaşlanmış kod tabanlarında estetik bir değer bulmak, disiplinsizliği kutsamak değil; gerçekliğe daha dürüst bakmaktır. Çünkü yazılım da insanlar gibi yara izleri taşır. Bazı izler tedavi edilmelidir, bazıları ise bize nereden geldiğimizi hatırlatır. Ve bazen en bilge geliştirici, kusursuz bir sistem yazan değil, kusurlu bir sistemi incelikle yaşatmayı bilendir.