Kusursuz İnsan Bekleyen Yazılım Neden Kusursuz Biçimde Çöker?

Kusursuz İnsan Bekleyen Yazılım Neden Kusursuz Biçimde Çöker?

Bir sistem tasarlarken yapılabilecek en tehlikeli hata, kullanıcıların talimatları okuyacağını, geliştiricilerin hiçbir ayrıntıyı atlamayacağını ve sunucuların daima sözünde duracağını varsaymaktır. Bunların üçü de teknik gereksinim değil, iyimserlik biçimidir. İnsan yanlış düğmeye basar, parolasını unutur, aynı işlemi iki kez gönderir; makine ise diski bozar, paketi düşürür, zaman aşımına uğrar. Hata toleransı, bu kusurları yok etmeye çalışmak yerine onları sistemin doğal iklimi kabul etme sanatıdır.

Hata istisna değil, girdidir

Acemi tasarımcı mutlu yolu çizer: Kullanıcı formu doldurur, ödeme gerçekleşir, sipariş kaydedilir. Deneyimli tasarımcıysa karanlık sokaklara bakar: Ödeme alınır ama yanıt gelmezse ne olur? Kullanıcı sabırsızlanıp düğmeye tekrar basarsa iki sipariş mi oluşur? Veritabanı yazma sırasında çökerse hangi kayıt gerçektir? Sağlam yazılım, yalnızca doğru adımların sonunda doğru sonuç üretmez; yanlış, eksik veya yinelenmiş adımlar karşısında da anlaşılır bir duruma döner.

Buradaki temel ilke savunmacı programlamadır. Girdi doğrulama, sınır kontrolleri, açık hata mesajları ve güvenli varsayılanlar bunun ilk katmanıdır. Bir yaş alanına eksi üç yazıldığında sistemin varoluş krizine girmemesi gerekir. Ancak her şeyi kullanıcıya yasaklamak da çözüm değildir. İyi arayüz hata yaptıktan sonra azarlamaz; hata oluşmadan önce seçenekleri sınırlar, sonuçları görünür kılar ve geri dönüş yolu sunar. Geri al düğmesi, insan doğasına yazılmış küçük ama güçlü bir saygı duruşudur.

Çöküşü önlemek değil, sınırlamak

Dağıtık sistemlerde soru “Bir bileşen bozulacak mı?” değil, “Bozulduğunda hasar nereye kadar yayılacak?” olmalıdır. Zaman aşımı mekanizmaları sonsuza dek beklemeyi engeller. Yeniden denemeler geçici sorunları aşar; fakat kontrolsüz tekrarlar arızalı servisi daha da boğabilir. Bu nedenle üstel geri çekilme, rastgele gecikme ve devre kesici gibi desenler kullanılır. Bir geminin su alan bölmesini kapatması gibi, sistem de arızayı yalıtarak geri kalan işlevlerini korur.

Tekrar denemenin güvenli olması için işlemler mümkünse idempotent tasarlanmalıdır. Aynı ödeme isteği üç kez gelse bile sonuç tek ödeme olmalıdır. Benzersiz işlem anahtarları, yinelenen mesaj denetimleri ve atomik kayıtlar burada hayat kurtarır. Yedeklilik de önemlidir; fakat iki sunucuya sahip olmak, ikisi aynı elektrik hattına bağlıysa yalnızca pahalı bir yanılsamadır. Gerçek dayanıklılık, ortak arıza noktalarını keşfetmeyi ve bağımsız kurtarma yolları kurmayı gerektirir.

İnsanı sistemden çıkaramazsınız

Operasyon ekipleri de hata yapar. Yanlış komut çalıştırabilir, kritik alarmı kaçırabilir veya uykusuzken kötü karar verebilirler. Bu yüzden geri döndürülebilir dağıtımlar, kademeli yayınlar, yetki sınırları, otomatik yedekler ve doğrulanmış kurtarma planları gerekir. “Dikkatli ol” bir güvenlik mekanizması değildir. Kontrol listeleri ve çift onay süreçleri, pilotların aptal olduğu için değil, zihinlerinin yoğunluk altında öngörülebilir biçimde şaşabildiği için vardır.

Hata toleransının kültürel yüzü de tekniktir. Suçlu arayan ekipler hataları saklar; neden arayan ekipler sistemleri geliştirir. Suçsuz olay incelemeleri, “Kim bozdu?” yerine “Bu tek hata nasıl felakete dönüşebildi?” diye sorar. Kayıtlar, ölçümler, izler ve alarmlar görünmeyeni görünür kılar. Kaos testleri ise arızayı kontrollü biçimde çağırıp sistemin gerçekten dayanıklı olup olmadığını sınar.

Sonuçta kusursuz yazılım, hiç hata üretmeyen yazılım değildir; hata geldiğinde paniğe kapılmayan, hasarı sınırlayan ve iyileşebilen yazılımdır. İnsan kusurunu küçümsemek kolaydır, onunla birlikte çalışan bir mimari kurmak ise mühendisliktir. En güvenilir sistemler kullanıcıya “Yanlış yapma” demez. Sessizce şunu söyler: “Yanlış yapacağını biliyorum; yine de ikimizi de buradan sağ çıkaracağım.”

Bir yanıt yazın

Ad ve E-posta zorunlu değildir.