Programlama dünyasında iki tür felaket vardır: biri daha sahne açılmadan kapıda yakalanır, diğeri ise tam seyirci alkış beklerken dekoru başınıza yıkar. Birincisine derleme zamanı hatası deriz; ikincisine çalışma zamanı hatası. İlki öğretmen gibi kırmızı kalemle gelir: Burada noktalı virgül eksik, bu değişken tanımsız, bu tür bu türe uymaz. İkincisi ise hayatın kendisi gibidir: Her şey düzgün görünür, uygulama açılır, kullanıcı gülümser, sonra bir veri boş gelir ve sistem içsel bir çığlık atarak çöker.
Derleme zamanı, yazılımın prova odasıdır. Kod henüz gerçek dünyaya çıkmamıştır. Derleyici, katı ama faydalı bir kapı görevlisi gibi davranır. Üzerinizde kravat yoksa içeri almaz. Değişkeni tanımlamadıysanız, fonksiyona yanlış tip gönderdiyseniz, sözdizimini bozduysanız sizi durdurur. Bu bazen sinir bozucudur; çünkü insan yaratıcı akışın ortasında bir makinenin kendisine dil bilgisi dersi vermesinden hoşlanmaz. Ama derleyicinin kabalığında şefkat vardır. Size şunu söyler: Bu hata şimdi canını sıksın ki daha sonra müşterinin, hastanın, uçağın ya da banka hesabının canı yanmasın.
Çalışma zamanı ise artık işin laboratuvardan sokağa çıktığı andır. Kodunuz gerçek verilerle, tuhaf kullanıcılarla, kesilen internet bağlantılarıyla, beklenmedik dosya biçimleriyle ve evrenin genel muzipliğiyle karşılaşır. Derleyici size bir değişkenin var olup olmadığını söyleyebilir; ama kullanıcının doğum tarihi alanına neden ‘geçen cuma’ yazdığını bilemez. Tip sistemi bir fonksiyonun sayı beklediğini kontrol eder; fakat o sayının sıfır olup bölme işlemini mahvedeceğini ancak program çalışırken anlarsınız.
Öngörülebilen Hata ile Yaşanan Kriz
Derleme zamanı hataları, planlama hatalarıdır. Harita çizilirken yapılan yanlışlardır. Köprünün projesinde vida ölçüsünü yanlış yazmak gibidir. Çalışma zamanı hataları ise köprüden ilk kamyon geçerken ortaya çıkan titreşimdir. Biri teoride yakalanır, diğeri gerçekliğin ağırlığı altında belirir. Bu yüzden iyi yazılımcı sadece kod yazan kişi değildir; olasılıkları düşünen, başarısızlık biçimlerini hayal eden, sistemin nerede kırılabileceğini önceden koklayan kişidir.
Modern yazılım geliştirme, bu iki hata türü arasında disiplinli bir barış kurma sanatıdır. Statik tip kontrolü, linter, testler, derleyici uyarıları ve sürekli entegrasyon araçları derleme zamanının güvenlik ağını genişletir. Ama en sıkı ağ bile tüm balıkları tutamaz. Bu yüzden çalışma zamanında da savunma gerekir: hata yakalama mekanizmaları, anlamlı loglar, izleme sistemleri, geri dönüş planları, kullanıcıya insanca açıklamalar ve elbette panik anında kahveye fazla güvenmeyen bir ekip.
Burada güzel bir felsefi ders de var: Bazı sorunlar düşünerek çözülür, bazıları yaşanarak anlaşılır. Derleme zamanı, aklın ülkesidir; kurallar, biçimler, tanımlar ve sınırlar vardır. Runtime ise olayların ülkesidir; bağlam, rastlantı, eksik bilgi ve canlı kaos hüküm sürer. Hayatta da böyledir. Bazı krizleri önceden tahmin edebilirsiniz: parasız kalmamak için bütçe yapar, sağlığınız için uyur, projeyi yetiştirmek için takvim çıkarırsınız. Bunlar derleme zamanı kontrolleridir. Fakat bir telefon gelir, piyasa değişir, ekipten biri ayrılır, beklenmedik bir duygu sizi içeriden böler. İşte runtime.
İyi sistemler hiç hata yapmayan sistemler değildir; hata yaptığında çökmek yerine anlamlı tepki veren sistemlerdir. Bir programda bu, istisnayı yakalamak ve kullanıcıya düzgün mesaj vermektir. Bir insanda ise nefes almak, durumu adlandırmak, suçu dağıtmak yerine gerçeği görmek ve yeniden yön bulmaktır. Robust, yani dayanıklı olmak, sert olmak demek değildir; kırılma ihtimalini kabul edip kırılınca dağılmayacak şekilde tasarlanmaktır.
Bu nedenle derleme zamanı ve çalışma zamanı ayrımı yalnızca teknik bir kavram değildir; düşünme biçimidir. Önce mümkün olanı erkenden yakala. Sonra yakalayamadıkların için zarifçe başarısız olmayı öğren. Kodda da hayatta da bilgelik biraz budur: Her hatayı önleyemezsin, ama her hatadan sonra sistemin biraz daha akıllı uyanmasını sağlayabilirsin.