İşlevsel programlama on yıllarca akademik bir zevk olarak anıldı: monad'lar, özyinelemeli veri türleri, kategori teorisi dili. Oysa bugün hiçbir işlevsel dil kurmayan milyonlarca geliştirici, her gün işlevsel kod yazıyor. Dilin tamamı değil ama disiplini kazandı: saf fonksiyonlar, değişmez veri, ifade olarak kod. Bu uygarlık, sessizce ve kazanarak yayıldı.

Saf Fonksiyon: En İyi Birim Test Bildirimi

Saf fonksiyon, yalnızca parametrelerine bağlı dönen ve dış dünyaya dokunmayan fonksiyondur. Bu tanımın pratik değeri, teorisinden büyüktür. Saf bir fonksiyonun testini yazmak için sahte nesneler kurmaya gerek yoktur; girdiyi verirsiniz, çıktıyı alırsınız. Aynı girdi her seferinde aynı sonucu verdiği için testler birbirinden bağımsızdır ve sıralama sorunları yok olur.

function iskonto(tutar: number, seviye: "bronz" | "gumus" | "altin") {
  const oran = { bronz: 0.05, gumus: 0.1, altin: 0.15 }[seviye];
  return Math.round(tutar * (1 - oran) * 100) / 100;
}

Bu fonksiyon; saati sormaz, ağa bağlanmaz, globali değiştirmez. Üç satırının davranışı, çağrıldığı yerden bağımsız olarak sonsuza kadar aynıdır. Kod tabanınızdaki her fonksiyon bu hâle yaklaştıkça, sistemin anlaşılması daha kolay bir hâle gelir: davranış, çağrı zincirlerinde saklı kalmaz, imzalarda görünür. Saflığın ölçüsü de pratiktir: bir fonksiyonu test etmek için kaç sahte nesne kurduğunuzu hatırlıyorsanız, o sayı saflıktan uzaklığınızın kabaca derecesidir.

Değişmezlik: Yan Etkiyi Küçültmenin Yolu

Gündelik dillerde değişmezlik, uzun zamandır teknik bir tercihten fazlası. Arayüz çerçeveleri durumun doğrudan değiştirilmediğinde daha öngörülebilir olduğunu öğretti; dağıtık sistemler paylaşılan değişkenliğin en pahalı hata kaynağı olduğunu gösterdi. Bugün yaygın pratik, veriyi kopyalayarak ilerlemek:

const guncel = { ...eski, durum: "onaylandi", log: [...eski.log, zaman] };

İki satırlık bir kopyalama, kaydın geçmişini kaybetmemek için yapılan bütün saklamaların yerini tutar. Geri alma, denetim ve zaman yolculuğu gibi kavramlar, değişmez verinin bedava verdikleridir. Buna karşılık her şeyin değişmez olduğu bir dünya da pratik değildir; girdi çıkartılmış, zamanla değişen bir dünyada program yazarız. Uygarlığın kuralı, saflığın sınırda yaşamasıdır: mantığı saf tutun, yan etkileri kenara toplayın.

Sınırda: Etki Katmanı

İşlevsel disiplinin gündelik kazası, etkiyi sınırlamaktır. Veritabanına yazan, ağa bağlanan, saati okuyan kod, iş mantığının merkezinden çıkarılıp kenara alınıyor. İş mantığı saf kalır; etkiler, onu saran ince bir kabukta toplanır. Bu mimari, hangi dilde olursa olsun aynı avantajı verir: çekirdek, test edilmesi kolay bir matematik bölümü hâline gelir.

Değişmezliğin gündelik kazancı, iş birliğinde de görünür. İki geliştiricinin aynı kaydı değiştirdiği bir modülde kopyalayarak ilerlemek, birbirini silen değişiklikleri büyük ölçüde önlüyor; kod incelemesinde okuyucu, bir değerin ileride değişmediğinden emin oluyor. Bu, okunabilirliği yazarın disiplinine bırakmayan bir yapı avantajıdır. Arayüz durumunda aynı ilke, geri alma gibi özellikleri bedava kılar; geçmiş durumu saklamak, tek bir atamanın yerini alan bir satırdır.

Gündelik işlevsel programlamanın vaadi, monad bilmeniz değil, kodunuzu matematik gibi okuyabilmenizdir. Saf fonksiyon uygarlığı kazandı çünkü daha az sürpriz üretiyor; yazılım endüstrisinin en pahalı maliyetinin sürpriz olduğu bir çağda, bu küçük bir zafer değil.