Programlama dillerinin temelinde bir söz vardır: Mantık. Boolean değerler ya doğrudur ya yanlış, koşullar ya sağlanır ya sağlanmaz, döngüler ya döner ya durur. Bilgisayar biliminin tamamı, bu mutlak dürüstlük üzerine inşa edilmiştir. Makine yalan söylemez; söyleyemez.

Ama makinenin arkasında oturan biz insanlar? Biz her gün, her satırda, her commit'te yalan söyleriz.

İsimlendirmenin Büyük Yalanı

Bir değişkene isReady adını verdiğinizde, o değişkenin gerçekten bir şeyin "hazır" olup olmadığını temsil ettiğini iddia ediyorsunuz. Ama gerçekte o boolean, üç farklı asenkron işlemin tamamlanıp tamamlanmadığını, bir API çağrısının başarılı olup olmadığını ve kullanıcının bir formu doldurup doldurmadığını aynı anda kontrol eden karmaşık bir mantığın ucuna iliştirdiğiniz basit bir bayrak (flag). "Hazır" kelimesi, bu karmaşıklığı gizlemek için kullandığımız güzel bir örtüdür.

Ya da bir fonksiyona calculateTotal diyorsunuz. "Toplam hesapla" — ne kadar masum, ne kadar temiz. Ama o fonksiyonun içini açtığınızda, toplamı hesaplamanın yanı sıra vergi oranını çektiğini, indirim kuponlarını uyguladığını, kargo ücretini eklediğini, veritabanına bir kayıt yazdığını ve analitik servise bir event gönderdiğini keşfediyorsunuz. Bu fonksiyon toplam hesaplamıyor; 14 farklı yan etki (side effect) tetikleyen ve adından tamamen bağımsız bir hayat süren küçük bir canavar.

Biz buna "kötü isimlendirme" diyoruz. Ama aslında bu, organize bir yalandır. Fonksiyonun adı, gelecekteki okuyucuya verdiğimiz bir sözdür ve biz o sözü tutmuyoruz.

Yorum Satırlarının Sahte Günlüğü

Kod yorumları (comments), teoride kodun "neden" böyle yazıldığını açıklar. Pratikte ise yazılım dünyasının en güvenilmez belgeleridir.

// Kullanıcı listesini güncelle
deleteAllUsers();

Bu yorum satırını yazan kişi yalan söylüyor. Ama bu yalan muhtemelen kasıtlı değil. Büyük ihtimalle bir zamanlar o fonksiyon gerçekten kullanıcı listesini güncelliyordu. Sonra gereksinimler değişti, fonksiyon silme işlemine dönüştürüldü ama yorumu güncellemeyi kimse akıl etmedi. Yorum orada kaldı, fosil gibi. Artık kodun ne yaptığını değil, bir zamanlar ne yapmak istediğimizi anlatıyor.

Her eski projede bu fosil yorumlardan yüzlercesini bulabilirsiniz. Bunlar, ekibin geçmişteki niyetlerinin ve bugünkü gerçekliğin arasındaki uçurumun sessiz tanıklarıdır.

"Geçici Çözüm" Efsanesi

Yazılım dünyasında söylenen en büyük yalan, muhtemelen şu iki kelimedir: "Geçici çözüm." (Temporary fix.)

Bir bug patlıyor, teslim tarihi yarın. "Şimdilik şöyle bir workaround koyalım, sonra düzgünce çözeriz" diyorsunuz. O "sonra" asla gelmez. O geçici çözüm, beş yıl sonra hâlâ production'da çalışıyordur. Üstüne yeni geçici çözümler eklenmiştir. Ve artık o kod parçası, kimsenin dokunmaya cesaret edemediği kutsal bir tapınağa dönüşmüştür. "Dokunma, çalışıyor" felsefesi, yazılımcıların en büyük kolektif yalanıdır.

Bir hastaya "Bu sargı geçici, yarın düzgün bir tedavi yapacağız" deyip o sargıyı beş yıl boyunca üstünde bırakmak tıpta malpraktistir (tıbbi hata). Yazılımda ise "pragmatizm" olarak ödüllendirilir.

Dürüst Kod Mümkün mü?

Belki de sorun, programlama dillerinin bizi dürüst olmaya zorlamak yerine yalan söylemeyi kolaylaştırmasıdır. Bir fonksiyona istediğiniz adı verebilirsiniz; derleyici (compiler) o adın doğruluğunu kontrol etmez. Tip sistemleri (type systems) verilerin şeklini kontrol eder ama anlamını kontrol edemez.

Tamamen dürüst bir kod tabanı muhtemelen imkânsızdır. Çünkü kod, insan düşüncesinin bir yansımasıdır ve insan düşüncesi doğası gereği eksik, önyargılı ve çelişkilidir. Ama en azından yalanlarımızın farkında olabiliriz. Her isReady yazdığımızda "Gerçekten neye hazır?" diye sorabilir, her calculateTotal yazdığımızda fonksiyonun gerçekten sadece toplam hesaplayıp hesaplamadığını kontrol edebiliriz.

Sonuçta, en tehlikeli yalan başkalarına söylediğimiz değil, kendimize söylediğimizdir. Ve bir kod tabanında kendimize söylediğimiz en büyük yalan şudur: "Bu kod, tam olarak isminin söylediği şeyi yapıyor."