Her yazılımcının kariyerinde en az bir tane "O Bug" vardır. Sıradan bir hata değildir bu. Günlerce sizi kovalayan, çözüme yaklaştığınızı hissettiğiniz anda tekrar gölgelere karışan, sizi uyutmayan ve kişisel bir düşman haline gelen o tek bir bug.

Benimki bir Cuma gecesi başladı. Müşterinin canlı (production) sisteminde, rastgele zamanlarda ve rastgele kullanıcılarda ortaya çıkan bir hataydı. Kullanıcıların yaklaşık %2'si, belirli bir sayfaya girdiğinde beyaz ekran (white screen of death) görüyordu. Geri kalan %98 ise hiçbir sorun yaşamıyordu. Hata mesajı (error log) ise son derece belirsizdi: "Cannot read property of undefined." Bu mesaj, JavaScript dünyasının "Bir yerlerde bir şeyler yanlış ama nerede olduğunu söylemeyeceğim" şeklindeki klasik işkencesiydi.

İlk refleksim her zaman olduğu gibi hatayı yerel ortamda (localhost) tekrar üretmeye çalışmak oldu. Saatler harcadım. Aynı sayfayı yüzlerce kez yeniledim, farklı tarayıcılar denedim, farklı kullanıcı hesaplarıyla girdim. Hiçbir şey. Bende çalışıyordu. Dünyanın en sinir bozucu cümlesi: "Works on my machine" (Bende çalışıyor).

Cumartesi sabahı, bu işe dedektif gibi yaklaşmam gerektiğine karar verdim. Suç mahallini (production loglarını) incelemeye başladım. Hatanın oluştuğu anları zaman damgalarıyla (timestamp) listeledim. Bir örüntü (pattern) arıyordum. Saatlerce log satırlarını okuduktan sonra ilk ipucunu yakaladım: Hata sadece belirli bir saat aralığında (gece 02:00 ile 04:00 arası) yoğunlaşıyordu. Bu saatler, sistemin arka plan görevlerinin (cron jobs) çalıştığı saatlerdi.

Soruşturma daralmaya başladı. Cron job'ları inceledim ve birinin gece 02:00'de veritabanındaki bazı önbellek (cache) tablolarını temizlediğini buldum. Bu temizlik sırasında, eğer bir kullanıcı tam o anda o sayfadaydaysa, sayfa arka planda silinen bir veriyi çağırıyordu ve "undefined" hatası alıyordu.

Pazar gecesi, yaklaşık 72 saatlik bir iz sürme maratonunun sonunda suçluyu buldum: Tek bir satırlık eksik bir null kontrolü (null check). Bir veri parçası silinmeden önce "Bu veriyi şu anda kullanan biri var mı?" diye kontrol edilmiyordu. Düzeltme tam 8 karakter sürdü: ?. (optional chaining operatörü). Üç gün boyunca beni uykusuz bırakan, saçlarımı yolduran, monitöre yumruk attırdığı o devasa sorunun çözümü, 8 karakterlik bir eklentiydi.

O 72 saat bana çok şey öğretti. Debugging, kod yazmaktan çok daha zor ve çok daha önemli bir beceridir. İyi bir debugger olmak, iyi bir dedektif olmaktır. Sabır gerektirir, sistematik düşünce gerektirir ve en önemlisi varsayımlarınızı (assumptions) sürekli sorgulamayı gerektirir. "Bu kısımda sorun olamaz" dediğiniz anda, genellikle sorun tam oradadır. Suçluyu asla küçümsemeyin; bazen en büyük cinayetleri en küçük silahlar işler.