Kodun İçindeki Kör Nokta: Usta Programcılar Neden Kendi Hatalarını Göremez?

Bir programcının en tehlikeli cümlesi çoğu zaman şudur: “Bu kodun çalışması lazım.” Bu cümle, teknik bir tahminden çok zihinsel bir sözleşmedir. Yazılımcı, çözümü tasarlarken belli varsayımları görünmez biçimde doğru kabul eder; sonra da hata ayıklarken dünyayı bu varsayımları doğrulayacak şekilde okumaya eğilim gösterir. Loglar, test sonuçları ve kullanıcı raporları önündedir ama zihin çoktan bir hikâye yazmıştır: sorun veritabanındadır, ağ gecikmesindedir, kullanıcı yanlış girdi yapmıştır. Oysa hata, çoğu kez o hikâyenin ilk cümlesindedir.

Metakognisyon: Düşünceyi İzleyen Düşünce

Metakognisyon, en yalın hâliyle, ne düşündüğümüzü değil nasıl düşündüğümüzü fark edebilme becerisidir. Bir algoritmanın karmaşıklığını hesaplamak başka, “Neden bu algoritmayı seçmeye bu kadar istekliyim?” diye sormak başkadır. İlk iş teknik yetkinliktir; ikincisi zihinsel denetimdir. Deneyimli programcılar ilkinde genellikle çok iyidir. Fakat uzmanlık arttıkça ikinci beceri otomatik olarak güçlenmez. Hatta paradoksal biçimde, uzmanlık zihinsel kör noktaları daha iyi gizleyebilir.

Bunun bir nedeni, ustalığın büyük ölçüde otomasyon üretmesidir. Tecrübeli geliştirici, binlerce örüntüyü saniyeler içinde tanır: yarış koşulu, null referansı, sınır değeri, yanlış önbellekleme, kötü soyutlama. Bu hız değerlidir; ancak zihin örüntü tanırken bazen araştırmayı erken bitirir. Tanıdık görünen bir hata, gerçekten tanıdık olmayabilir. Eski bir çözüm, yeni bağlamda zarif değil tehlikeli olabilir. Kısacası sezgi, güçlü bir derleyicidir ama zaman zaman yanlış kaynaktan derlenmiş sonuçlar üretir.

Programcı Yanılgısının Yakıtı: Sahiplik ve Onaylama

Programcı kendi yazdığı koda yalnızca satırlar bütünü olarak bakmaz; o kod, harcanmış zamanın, çözülmüş gecelerin ve zekâ yatırımının izidir. Bu nedenle kod eleştirildiğinde teknik bir öneri bile kişisel bir tehdit gibi algılanabilir. Sahiplik etkisi burada devreye girer: İnsan, ürettiği şeyin değerini sistematik olarak olduğundan yüksek görme eğilimindedir. “Bu modül karmaşık ama gerekli” cümlesi bazen mimari bir gerçek değil, emeği savunma refleksidir.

Onaylama yanlılığı da bu refleksi besler. Geliştirici, hipotezini doğrulayan log satırlarını öne çıkarır; onu çürüten belirtileri ise istisna, gürültü veya geçici anomali sayar. Bir testin geçmesi, tasarımın doğru olduğunu kanıtlamaz; yalnızca testin sorduğu soruya kabul edilebilir bir cevap verildiğini gösterir. Üstelik testleri de insan yazar. Yanlış soruyu mükemmel test etmek, yanlış güveni otomatikleştirmektir.

Deneyim Neden Bazen Engeldir?

Acemi programcı “Bilmiyorum” demeye daha yakındır; uzman ise çoğu zaman neyi bildiğini çok iyi bilir. Sorun, bilinenlerin yeni bir olasılığı görünmez kılmasıdır. Deneyim, karar maliyetini düşürür fakat keşif alanını da daraltabilir. Bir kıdemli geliştirici geçmişte mikroservislerin işe yaradığı on projeyi hatırlayıp on birinci projede monolitin daha doğru seçenek olabileceğini geç fark edebilir. Çünkü zihnin arama motoru, en sık tıklanan sonuçları üst sıraya taşır.

Bu yüzden iyi ekipler sadece kod incelemesi yapmaz; düşünce incelemesi de yapar. “Bu karar hangi varsayıma dayanıyor?”, “Bizi haksız çıkaracak kanıt ne olur?”, “Bu çözümü neden seviyoruz?” soruları birer nezaket ritüeli değildir. Bunlar, zihinsel hata ayıklama araçlarıdır. Kırmızı takım değerlendirmeleri, karar günlükleri, önceden başarısızlık analizi ve farklı kıdem düzeylerinden eleştiriler bu nedenle değerlidir.

En olgun programcı, en az hata yapan kişi değildir. Hatalarının hangi koşullarda görünmezleştiğini bilen kişidir. Kodun derlenmesi yetmez; varsayımların da derlenmesi gerekir. Çünkü yazılımda en inatçı bug bazen bir fonksiyonda değil, o fonksiyonu yazan zihnin “Ben bunu zaten anladım” satırında saklanır.