Kod Yazarken Tanrı mı Oluyoruz, Bürokrat mı?

Kod Yazarken Tanrı mı Oluyoruz, Bürokrat mı?

Programlama dili seçtiğimizi sanırız; çoğu zaman seçtiğimiz şey bir dünya görüşüdür. Bir dil bize yalnızca döngü, değişken, sınıf ya da fonksiyon vermez; gerçekliğin nasıl bölüneceğine, zamanın nasıl akacağına, kimlerin kimlere emir vereceğine dair sessiz bir anayasa sunar. Fonksiyonel programlama ile nesne yönelimli programlama arasındaki eski tartışma da bu yüzden sadece teknik değildir. Bir tarafta neredeyse statik, matematiksel, değişmez bir evren; diğer tarafta kimlikleri, rolleri, mirasları ve mesajları olan hiyerarşik bir toplum vardır.

Fonksiyonel evren: Zamanın üzerinde duran kristal

Fonksiyonel programlama, özellikle saf fonksiyonlar ve değişmez veri yapılarıyla çalıştığında, dünyayı Platoncu bir geometri gibi görür. Bir fonksiyon aynı girdiye daima aynı çıktıyı verir. Bugün de, yarın da, üretim ortamında saat üçte panik halinde çalışırken de. Bu, yazılımcıya garip bir huzur verir: Evrenin bir köşesi en azından deterministtir. Değişkenler değişmez, sadece yeni değerler doğar. Geçmiş silinmez; onun üzerine yeni katmanlar eklenir.

Bu yaklaşımda program, akan bir nehirden çok bir denklem sistemine benzer. Yan etkiler şüphelidir; dış dünya ile temas, steril laboratuvara çamurlu ayakkabıyla girmek gibidir. Elbette gerçek hayat veri tabanları, dosyalar, kullanıcılar ve ağ hatalarıyla doludur. Fonksiyonel düşünce bunları yok saymaz, ama onları sınır bölgelerine iter. Merkezde saf dönüşümler, kenarlarda kontrollü kaos vardır. Bu, yazılım mimarisi açısından müthiş bir taktiktir: Karmaşayı kalenin içine değil, surların dışına yerleştirirsiniz.

Fonksiyonel evrenin statikliği donukluk değildir; daha çok zamansızlık hissidir. Kodun parçaları, birbirine bağlanan küçük matematik makineleri gibidir. Map, reduce, filter gibi araçlar emir kipini azaltır; ne yapılacağını değil, neyin neye dönüşeceğini söyler. Bu yüzden fonksiyonel programlama çoğu zaman düşünceyi keskinleştirir. Hata ayıklama, suç mahallinde fail aramaktan çok denklemde bozuk terimi bulmaya dönüşür.

Nesne yönelimli toplum: Sınıflar, roller ve küçük krallıklar

Nesne yönelimli programlama ise dünyayı varlıklar üzerinden kurar. Her nesnenin bir kimliği, durumu ve davranışı vardır. Bir müşteri sipariş verir, bir hesap bakiye tutar, bir pencere olay dinler. Bu evrende gerçeklik, birbirine mesaj gönderen aktörlerle doludur. İlk bakışta hayatın kendisine daha yakındır: Masalar, arabalar, insanlar, faturalar. Nesne yönelimli modelleme, gündelik dünyanın dilini koda taşır.

Ama burada toplumsal bir metafizik de saklıdır. Sınıflar vardır, alt sınıflar vardır, kalıtım zincirleri vardır. Bazı davranışlar yukarıdan gelir, bazıları aşağıda ezilir ya da yeniden tanımlanır. Büyük mimarilerde sınıf hiyerarşileri küçük bir bürokrasiye dönüşebilir: BaseEntity konuşur, AbstractManager buyurur, CustomerService imza atar. Her şey yerli yerindedir, fakat bazen kimse neden orada olduğunu hatırlamaz. Nesne yönelimli programlama kötü kullanıldığında, kod değil kurum şeması üretirsiniz.

Yine de haksızlık etmeyelim. Nesne yönelimli düşünce, karmaşık alanları kapsülleme konusunda güçlüdür. Bir nesne kendi iç durumunu korur, dışarıya arayüz sunar. Bu, iyi tasarlandığında toplumsal nezaket gibidir: Herkes herkesin iç çekmecesini karıştırmaz. Polimorfizm ise medeni bir anlaşmadır; farklı varlıklar aynı mesaja farklı ama uyumlu cevaplar verebilir. Sorun paradigmanın kendisinde değil, kalıtımı aristokrasiye, sınıfları kasta, soyutlamayı sis perdesine çevirdiğimiz andadır.

Asıl soru: Hangi evrende hata daha görünür?

Teknik açıdan bakarsak, fonksiyonel yaklaşım değişmezlik ve saf fonksiyonlarla test edilebilirliği artırır. Paralel programlamada daha güvenlidir; çünkü paylaşılan değişebilir durum azaldıkça yarış koşulları da azalır. Nesne yönelimli yaklaşım ise alan modellemede, kullanıcı arayüzlerinde ve uzun ömürlü sistemlerde sezgisel organizasyon sağlayabilir. Fakat fazla durum, fazla gizli bağımlılık ve derin kalıtım ağaçları kodu labirente çevirebilir.

Belki de mesele birini seçip diğerini sürgüne göndermek değildir. Modern yazılım zaten melezdir. Nesnelerin içinde saf fonksiyonlar, fonksiyonel akışların kenarında durumlu servisler yaşar. Bilge yazılımcı, paradigmayı din gibi değil, mercek gibi kullanır. Fonksiyonel programlama bize evrenin değişmeyen yasalarını hatırlatır; nesne yönelimli programlama ise aktörlerin, rollerin ve sorumlulukların kaçınılmazlığını. Kod yazarken bazen tanrı gibi denklem kurarız, bazen şehir plancısı gibi kurum tasarlarız. Önemli olan, kurduğumuz dünyanın bizi yönetmeye başlamadan önce onun anayasasını okuyabilmektir.

Bir yanıt yazın

Ad ve E-posta zorunlu değildir.