Azınlığın Sessiz Algoritması

Çağlar Demir:~$ cat posts/Abstraksiyonun Aşırı Yüklenmesi ve Gerçek Verimlilik Kaybı.md

Abstraksiyonun Aşırı Yüklenmesi ve Gerçek Verimlilik Kaybı

Geliştirdiğimiz her yapı, temelde bir karar dizisidir. Bir problemi çözmek için tasarladığımız soyutlama katmanları, nihayetinde o problemin kendisini temsil eder. Ancak bu katmanlar doğru konumlandırılmazsa, çözmek yerine sorunu taklit eden bir yapıya dönüşürler. Aşırı mühendislik bu noktada devreye girer; idealizmin, pratikle çatıştığı kritik kavşaktır.

Yazılım geliştirme sürecindeki çoğumuz, her bir modülün mükemmeliyetçi bir tasarıma ulaşmasını hedefleriz. Bu, doğal olarak DRY (Don't Repeat Yourself) prensibini yücelten bir yaklaşımdır. Ancak bu tutarlılık takıntısı, bazen gereksiz bir entegrasyon yükü yaratır. Bir sistemi ilk aşamada, ulaşılabilir en yüksek soyutlama seviyesinde tasarlamaya çalışmak, emergent complexity'i (ortaya çıkan karmaşıklık) başlangıçta mühendislik görevine dahil etmektir.

Aşırı Abstraksiyonun Maliyeti

Her katman, bir maliyet fonksiyonuna sahiptir. Bu maliyet sadece yazım süresi değildir; aynı zamanda okuma, test etme ve özellikle de değiştirme süresidir. Basit bir döngüsel işlem, üç farklı servise, aracı middleware'e ve ardından bu servisleri çağıran bir orkestrasyona sarıldığında, problemin kendisi gölgelenir. Gözle görülür olan kısım basit kalırken, arka plandaki bağımlılık ağı kendini bir labirente dönüştürür.

Bu durum, mimari tasarımın en büyük tuzaklarından biridir: Çözümü tasarlarken mükemmeliyete ulaşmaya çalışmak. Gerçek yazılım mühendisliği, büyük bir idealizmi değil; mevcut kısıtlamalar dahilinde en uygun kompromis setini bulma sanatıdır.

İyi bir tasarım, başlangıçta basitleştirilir. Sonra, gereksinimler ortaya çıktıkça ve bu göstergeci (emergent) ihtiyaçlar belirlendikçe, katmanlar eklenir. Bu, Waterfall modelinin düşmanı olan Agile'ın ruhunu temsil eder; önce çalışan bir parça, sonra bu parçayı destekleyen ince ayarlar. Ancak bu sıra genellikle ihlal edilir; herkes aynı anda mükemmel yapıyı inşa etmeye çalışır.

Pratikle Teknik Sözdizimini Birleştirmek

Birinci görev, kodun önce çalışmasıdır. Bu fonksiyonel minimalizm, sonraki aşamalardaki refactoring için bir zemin hazırlar. Dolgu kodu üretmek yerine, önce çalışan en sade prototipi (Minimum Viable Product) oluşturun. Bu prototip, fiziksel olarak en yalın halidir; gereksiz yorumlar, beklenmeyen uç durum kontrolleri ya da geleceğe yönelik soyutlama çatısı yoktur.

Sistem büyüdükçe, o yalın çekirdek üzerine katmanları ekleyebilirsiniz:

  • Katman 1 (Çekirdek): Temel iş mantığı. En az soyutlama, en yüksek hız.
  • Katman 2 (Adaptör): Veritabanı veya harici API bağlantısı. Bu, ilk seviye karmaşıklığı yönetir.
  • Katman 3 (Sunum/İletişim): Kullanıcı arayüzü veya ağ protokolleri. Bu, dünyanın bizi nasıl gördüğünü yönetir.

Eğer her katmanı ilk anda inşa etmeye kalkarsanız, tüm sistemin tek bir kırılgandır (single point of failure) gibi davranma ihtimali doğar. Bu, karmaşıklığın dağıtılmaması, aksine tek bir noktada yoğunlaşması demektir.

Teknoloji ancak araca dönüştüğünde değer kazanır. Eğer kodunuzun kendisi, sizin çözmeye çalıştığınız problemin bir temsili değil de, problemin yarattığı ek yükseklik ise; o zaman algoritmanın kendisi başarısız olmuştur. Sadeleşmek, bazen en karmaşık görünen altyapıyı bile sorgulama cesaretini gerektirir.