Bir kod parçasına bakıp daha çalıştırmadan onun güzel ya da çirkin olduğunu düşündüğünüz oldu mu? Girintiler, parantezler, anahtar kelimeler ve semboller; programın davranışını değiştirmese bile algımızı etkiler. Kod estetiği yalnızca kişisel zevk değildir: Okunabilirlik, aşinalık, görsel yoğunluk ve dilin sakladığı ayrıntılar birlikte çalışarak zihnimizde bir düzen hissi oluşturur. ``
Söz dizimi yalnızca gramer değildir
Bir programlama dilinin söz dizimi, hangi karakter dizilerinin geçerli programlar oluşturduğunu belirleyen kurallar bütünüdür. Örneğin aynı koşul farklı dillerde şöyle yazılabilir:
if temperature > 30:
start_fan()
if (temperature > 30) {
startFan();
}
İki örnek de aynı fikri anlatır: Sıcaklık 30’dan büyükse fanı çalıştır. Python girintiyle blok oluştururken JavaScript parantez ve süslü ayraç kullanır. Python daha hafif, JavaScript ise sınırları daha açık görünebilir. Hangisinin güzel olduğu, okuyucunun belirsizliğe mi yoksa sembol kalabalığına mı daha duyarlı olduğuna bağlıdır.
Bu algıyı basitleştirilmiş bir modelle ifade edebiliriz:
\[E = \alpha O + \beta T + \gamma A - \delta Y\]Burada $E$ estetik algıyı, $O$ okunabilirliği, $T$ tutarlılığı, $A$ aşinalığı ve $Y$ görsel yükü temsil eder. Katsayılar kişiden kişiye değişir. Yeni başlayan biri açıklığı ödüllendirirken deneyimli biri kısa ve yoğun ifadeleri tercih edebilir.
Aynı fikir, farklı görsel karakter
| Tercih | Avantajı | Estetik riski |
|---|---|---|
| Girintiye dayalı bloklar | Az sembol, temiz görünüm | Görünmez boşluklara bağımlılık |
| Süslü parantezler | Blok sınırları belirgindir | Görsel kalabalık oluşturabilir |
| Noktalı virgül | İfade sonunu açıkça gösterir | Gereksiz gürültü gibi algılanabilir |
| Tür çıkarımı | Kodu kısaltır | Bilgiyi okuyucudan saklayabilir |
| Açık tür bildirimi | Niyeti belgeler | Uzun ve törensel kod üretebilir |
Örneğin Rust, türleri ve hata ihtimallerini görünür kılmayı sever:
fn divide(a: f64, b: f64) -> Result<f64, &'static str> {
if b == 0.0 {
return Err("Sıfıra bölme yapılamaz");
}
Ok(a / b)
}
Bu fonksiyon yalnızca bölme yapmaz; başarısızlık olasılığını Result türüyle sözleşmeye dönüştürür. İlk bakışta Python’daki kısa bir fonksiyondan daha ağırdır. Buna karşılık hata davranışının açık olması, bazı geliştiricilere mimari bir güzellik hissi verir. Demek ki kısalık her zaman zarafet değildir.
Beyin neden düzen arar?
İnsan zihni örüntüleri hızlı tanır. Benzer işlemlerin benzer biçimde yazılması bilişsel yükü azaltır. Bir dosyada fonksiyon çağrıları tutarlı, diğerinde zincirleme, iç içe ve rastgele biçimlendirilmişse dil değişmese bile estetik algı bozulur.
Şu zincir kısa olsa da yoğun olabilir:
const names = users.filter(u => u.active).map(u => u.name).sort();
Aynı işlem adımlara ayrıldığında veri akışı daha görünür hâle gelir:
const activeUsers = users.filter(user => user.active);
const names = activeUsers.map(user => user.name);
names.sort();
İlk sürüm akıcı ve kompakt, ikinci sürüm ise açıklayıcıdır. Estetik karar bağlama bağlıdır: Basit bir dönüşümde zincir zarifken karmaşık hata ayıklama sürecinde ara değişkenler daha güzel gelebilir.
Aşinalık, güzellik kılığına girebilir
Bir dili uzun süre kullandığımızda onun alışkanlıklarını doğal kabul ederiz. C geliştiricisi süslü parantezleri güven verici bulabilir; Python geliştiricisi aynı sembolleri gürültü sayabilir. Lisp’in çok sayıdaki parantezi yabancı bir göze çirkin görünürken deneyimli bir Lisp kullanıcısı, kod ile veri arasındaki simetriyi estetik bulur.
Bu nedenle söz dizimi estetiği tamamen nesnel değildir; fakat tamamen keyfî de değildir. Tutarlılık, düşük bilişsel yük, niyetin görünürlüğü ve araç desteği ölçülebilir faydalar sağlar. Biçimlendiriciler de tartışmayı azaltır: Black, Prettier veya rustfmt, kişisel tercihleri ortak bir görsel ritme dönüştürür.
Sonuçta güzel kod, en az karakterle yazılan değil; okuyucunun zihninde en az sürtünmeyle anlam kazanan koddur. İyi söz dizimi programcıya kendini sürekli hatırlatmaz. Geri çekilir, fikri öne çıkarır ve kodu noktalama işaretleriyle yapılan bir mücadeleden okunabilir bir anlatıya dönüştürür.
Yorumlar