Bir kaza mahallinde veya patlama bölgesinde, bir insanın bacağındaki atardamar (femoral arter) yırtıldığında fışkıran o parlak kırmızı kanı durdurmak için tıp kitaplarındaki nazik pansumanlar işe yaramaz. O an yapılacak tek bir şey vardır: Çantadan siyah askeri turnikeyi (CAT Tourniquet) çıkarır, yaranın birkaç parmak üzerine sarar ve çubuğunu kanama tamamen durana kadar acımasızca sıkarsınız.

Turnike, acil tıbbın en mucizevi hayat kurtarıcılarından biridir. Hastanın dakikalar içinde kan kaybından ölmesini saniyeler içinde engeller.

Ama turnikeyi sıktığınız an, kıdemli bir paramedik cebinden beyaz bir bant veya kalıcı bir asetat kalemi çıkarır. Turnikenin üzerine ya da doğrudan hastanın alnına devasa harflerle bir şey yazar: T: 14:35 (Uygulama Saati).

Neden mi?

Çünkü turnike bir tedavi değildir. Turnike, hastayı ameliyathaneye yetiştirene kadar zaman kazandıran radikal bir geçici kısıtlamadır. O uzva giden tüm kan akışını durdurmuşsunuzdur. Eğer o turnike hastanın bacağında 2 saatten fazla kalırsa; oksijensiz kalan kas dokusu ölmeye başlar (iskemi), toksinler birikir ve sonunda o bacağı ameliyat masasında kesip ampute etmek zorunda kalırsınız. Hatta turnikeyi kontrolsüzce aniden gevşetirseniz, biriken o zehirli asitli kan kalbe hücum eder ve hastayı saniyeler içinde öldürür (turnike şoku).

Turnike hayat kurtarır; ama bir insanı sonsuza kadar turnikeyle yaşatamazsınız.

Peki yazılım dünyasında, özellikle kriz anlarında nasıl "mühendislik" yapıyoruz?

Sunucuyu Her Gece Yeniden Başlatan Cron Job

Yazılım sektöründe adına "Hotfix" veya "Geçici Çözüm" (Band-Aid Fix) dediğimiz şey, sahada attığımız o acil turnikeden farksızdır.

Canlı ortamda (production) bir bellek sızıntısı (memory leak) başlar. Node.js veya Java servisi her 12 saatte bir RAM'i sonuna kadar tüketip kilitleniyordur. Gece saat 03:00'te uyanan mühendis panikle problemi çözmeye çalışır. Kök nedeni bulacak vakit yoktur; çünkü müşteriler kapıdadır.

Hemen bir geçici çözüm bulunur:
Sunucuya bir cron job eklenir: 0 4 * * * systemctl restart api-service
(Her gece saat 04:00'te servisi yeniden başlat.)

Hizmet yeniden ayağa kalkar, bellek temizlenir, Slack'teki kriz kanalı rahat bir nefes alır: "Tamam, sorunu çözdük."

Hayır, sorunu çözmediniz. Siz sadece kanayan damara turnike sıktınız.

Ve asıl felaket tam bu noktada başlar: O cron job, sistemin içinde unutulur. Jira tahtasında açılan o "Memory leak kök nedenini araştır" bileti, bir sonraki sprint'e, oradan diğer sprint'e ertelenir. Çünkü ürün yöneticisi der ki: "Nasılsa sistem çalışıyor, geceleri restart atıyoruz, şimdi önceliğimiz müşteriye yeni raporlama sayfasını yetiştirmek."

Ve o bacak, üzerinde turnikeyle aylarca, hatta yıllarca yürütülmeye çalışılır.

Turnike Çöplüğüne Dönen Mimariler

Zamanla şirketlerin kod tabanları adeta birer savaş gazisi hastanesine döner. Her köşe başında geçici bir bant, her fonksiyonda acil atılmış bir turnike görürsünüz:

  • Veritabanı sorgusu kilitlendiği için sorgu süresi limitini (query timeout) 5 saniyeden 60 saniyeye çekip sorunu halının altına süpürenler,
  • Patlayan bir API endpoint'ini bulup düzeltmek yerine, önüne bir try/catch koyup kullanıcıya sessizce boş dizi [] dönenler,
  • İki servis arasındaki senkronizasyon hatasını çözmek yerine, kuyruğa mesajı 5 kez tekrar gönderen (retry loop) agresif döngüler kurup veritabanını boğanlar...

Bu çözümlerin hepsi kriz anında kabul edilebilir turnikelerdir. O gece için hayat kurtarmışlardır.

Ama onları kalıcı tedavi zannettiğiniz gün, mühendislik namusunuzu kaybetmişsiniz demektir. Bir sistemin her yerine turnike sıktığınızda; bir süre sonra dokular oksijensiz kalır. Yeni bir özellik eklemek imkânsız hale gelir; çünkü her köşe başındaki geçici yama, diğer geçici yamayla çatışmaya başlar.

Ve sonunda, basit bir bellek sızıntısını zamanında ameliyat etmediğiniz için, tüm mimariyi çöpe atıp sıfırdan yazmak zorunda kalırsınız. Tıpkı zamanında açılmayan turnike yüzünden bacağın ampute edilmesi gibi.

Turnikenin Üzerine Saat Yazmak

Gerçek bir profesyonel, kriz anında geçici yama yapmaktan utanmaz. Pragmatizm bunu gerektirir; yangın anında önce alevi söndürürsünüz, binanın yalıtımını sonra tartışırsınız.

Ancak gerçek bir mühendis ile günü kurtaran bir teknisyen arasındaki fark şudur:
Gerçek mühendis, attığı her hotfix'in üzerine o saati yazar.

Eğer bir gece yarısı acil bir yama (turnike) attıysanız;

  1. Ertesi sabah o yamanın üzerine kırmızı bir uyarı koyarsınız: // TEMPORARY HOTFIX: Ticket #4821 - Kök neden çözülene kadar geçici bypass.
  2. İlk sprint planlamasında masaya vurur ve o teknik borcun kalıcı ameliyatını planlatırsınız.
  3. Kanamayı durduran geçici yamayı, sistemin kalıcı bir organı gibi benimsemezsiniz.

Turnikeyle koşamazsınız. Turnikeyle maraton tamamlayamazsınız.

Kanamayı durdurduktan sonra hastayı ameliyathaneye alacak cesaretiniz ve disiplininiz yoksa; yaptığınız şey mühendislik değil, sadece yavaşlatılmış bir intihardır.