2020 yılının o kasvetli pandemi günlerinde, acil servislerde ve ambulanslarda tıp dünyasını dehşete düşüren çok tuhaf, sinsi ve ürpertici bir klinik tabloyla karşılaştık. Tıp literatüründeki adı: "Silent Hypoxia" (Sessiz Hipoksi) veya bazılarının taktığı isimle "Happy Hypoxia".

Normal fizyolojide insan kanındaki oksijen doygunluğu (SpO2) %95'in altına indiğinde beden hemen alarm verir; %85'in altına indiğinde ise nefes darlığından boğuluyormuş gibi çırpınır, panikler ve soluk soluğa kalırsınız. Çünkü kandaki karbondioksit birikir ve beyin göğüs kaslarına çılgınca "Daha hızlı nefes al!" emri gönderir.

Ancak bu sessiz hipoksi vakalarında bambaşka bir kabus yaşanıyordu.
Ambulansla hastanın evine gidiyordunuz; hasta yatağında oturmuş, elinde telefonuyla sosyal medyada geziniyor, sizinle gayet sakin bir ses tonuyla sohbet ediyordu: "Biraz halsizliğim var o kadar, nefes darlığım yok."
Sonra parmağına nabız oksimetresini takıyordunuz. Cihazın ekranında beliren rakam kanınızı donduruyordu: %68.

Tıbben %68 oksijen seviyesi, bir insanın bilincini kaybedip komaya girmesi gereken bir ölüm eşiğidir. Ama hastanın beyni o alarmı çalmıyordu. Beden çığlık atmıyordu. Ve o sakin sakin konuşan hasta, 15 dakika sonra ambulansın içinde aniden solunum arrestine giriyor, morarıyor ve kalbi duruyordu.

Sessiz hipoksi tıbbın en tehlikeli katilidir; çünkü semptomsuz bir çöküştür.

Peki, yazılım sistemlerindeki bug'ları düşündüğünüzde; sizi en çok korkutması gereken şey nedir?

Kırmızı Hatalar Sizin Dostunuzdur

Geliştiricilerin çoğu, terminalde veya monitoring ekranlarında kırmızı renkli devasa hata logları gördüğünde strese girer:
Fatal Error: NullPointerException, HTTP 500 Internal Server Error, Database connection refused...

Oysa gerçek bir sistem mühendisi bilir ki, bağıran hata dürüst bir hatadır.

Kırmızı log fırlatan, sistemi anında durduran veya kullanıcıya açıkça "İşleminiz yapılamadı" diyen bir bug; göğsü sıkışan ve acıdan bağıran bir hasta gibidir. Sorunun nerede olduğunu anında bilirsiniz. Sentry alarmı çalar, Slack kanalına bildirim düşer, nöbetçi mühendis uyanır ve o hatayı yarım saat içinde düzeltir. Hasar anlıktır, görünürdür ve sınırlıdır.

Yazılım dünyasının asıl ölümcül kanseri ise "Silent Bug" (Sessiz Hatalar) dediğimiz, arkasında hiçbir kırmızı log bırakmayan o sinsi anomalilerdir.

Sessiz Katilin Anatomisi: Hata Yutma (Swallowed Errors)

Sessiz hataların en yaygın üreme alanı, acemi veya tembel geliştiricilerin yazdığı o meşhur kod bloklarıdır:

try {
  processPaymentAndInvoice(user, cart);
} catch (error) {
  // TODO: Burayı sonra loglayalım
  return { status: 200, success: true };
}

Bu kod parçası, yazılım mimarisine enjekte edilmiş saf bir sessiz hipoksidir.
Ödeme işlemi patlamıştır, veritabanına fatura yazılamamıştır, üçüncü parti API zaman aşımına uğramıştır. Ama sistem hiçbir hata fırlatmaz. HTTP cevabı olarak güleç bir yüzle 200 OK döner. Monitoring araçlarınız (Datadog, Grafana) masmavidir; CPU düşüktür, hata oranı sıfırdır, dashboard'unuz "Tüm Sistemler Mükemmel Çalışıyor" der.

Ama arka planda, sessizce kangren büyüyordur.
Kullanıcıdan para çekilmiştir ama sipariş oluşmamıştır. Ya da daha kötüsü, sipariş kargoya verilmiştir ama müşterinin kartından para tahsil edilememiştir.

Ve bu sessiz sızıntı; bir saat, bir gün değil; aylarca devam eder. Ta ki mali yıl sonunda muhasebeciler hesapları kapattığında ve şirketin kasasında 5 milyon liralık bir kara delik açıldığı fark edilene kadar. O gün geldiğinde ne bir log kaydı bulabilirsiniz, ne de o hatanın ne zaman başladığını tespit edebilirsiniz. Sistem ayakta dururken içten içe iflas etmiştir.

Kayan Nokta (Floating Point) ve Sessiz Veri Zehirlenmesi

Sessiz bug'ların bir diğer kabusu, veri bozulmasıdır (data corruption).

Bir e-ticaret veya fintech uygulamasında para birimlerini hesaplarken yanlış veri tipi kullandığınızı düşünün. Decimal veya BigInt yerine standart Float tipi kullanılmıştır. Her işlemde kuruşun binde biri kadar bir yuvarlama sapması oluşuyordur: 0.0001 TL.

Hiçbir sunucu çökmez. Hiçbir kullanıcı şikayet etmez. Hiçbir exception fırlatılmaz. Ama sistem her saniye on binlerce işlem yaptıkça, o binde birler birikir, birikir ve veritabanındaki finansal mutabakat tablolarını zehirler. Bir yıl sonra o veritabanındaki rakamların hiçbiri birbirini tutmaz hale gelir.

Bu, vücutta yavaş yavaş biriken ağır metal zehirlenmesine benzer. Hasta yürümeye devam eder, yemek yer, güler; ama karaciğeri ve böbrekleri hücre hücre ölüyordur.

Sessiz Hipoksiyi Nasıl Teşhis Ederiz?

Sessiz hipoksiden korunmanın tek yolu, hastanın dış görünüşüne güvenmemek ve parmağına o oksimetre probunu takıp kanın gerçek kimyasına (vital verilere) bakmaktır.

Yazılımda da sessiz bug'lardan korunmanın yolu; sadece HTTP 500 hatalarını sayan yüzeysel monitoring araçlarına güvenmeyi bırakmaktır:

  1. İş Mantığı Anomalilerini İzleyin (Business Metric Observability): Sadece sunucu sağlığına değil, iş metriklerine bakın. Eğer bir e-ticaret sitesinde saatte ortalama 500 sipariş alınıyorsa ve bu rakam aniden saatte 20'ye düşmüşse; ama sunucularda tek bir hata bile yoksa, ortada sessiz bir hipoksi vardır.
  2. Hataları Asla Yutmayın: Bir hata yakalandığında (catch) onu sessizce örtbas etmek, bir cinayete ortak olmaktır. Hata ya güvenli bir şekilde yukarı fırlatılmalı (re-throw) ya da görünür şekilde loglanmalıdır.
  3. Veri Bütünlüğü Doğrulamaları (Reconciliation Jobs): Her gece çalışan ve sistemdeki girdiler ile çıktıları matematiksel olarak karşılaştıran sessiz dedektifler (cron job'lar) kurun. Kasadaki para ile veritabanındaki sipariş toplamı tutuyor mu?

Ses çıkaran hata sizi uykunuzdan uyandırır; ona kızmayın, teşekkür edin.
Ama hiçbir ses çıkarmayan, monitörleri yeşil gösterip sistemi içten içe kemiren o sessiz anomalilerden korkun.

Çünkü bir sistemin sessizce ölmesi; bağıra çağıra çökmesinden her zaman bin kat daha maliyetlidir.