Farmakoloji ve tıp araştırmalarında araştırmacıların çok iyi bildiği acı bir aforizma vardır: "Petri kabındaki (in vitro) bir hücreyi öldürmek dünyanın en kolay işidir; üzerine çamaşır suyu dökerseniz de ölür, tabancayla ateş ederseniz de!"
Genç bir biyokimyacı laboratuvarda izole bir petri kabına kanser hücrelerini koyar, üzerine yüksek dozda bir kimyasal damlatır ve mikroskopta hücrelerin yok olduğunu görünce heyecanla bağırır: "Kansere kesin çareyi buldum!" Fakat aynı kimyasalı alıp gerçek bir insanın (in vivo) damarına verdiğiniz anda hasta 30 saniye içinde toksik şoktan ve böbrek iflasından hayatını kaybeder. Çünkü insan bedeni steril bir cam kap değildir; karaciğer metabolizması, bağışıklık sistemi, kan pH dengesi ve hücresel bariyerler o kimyasalın tüm hayallerini yerle bir eder.
Yazılım geliştirme dünyasında da yazılımcıların sistem yöneticilerine karşı savurduğu en meşhur, en bayat ve en sorumsuz savunma tam olarak bu petri kabı kibridir: "Ama benim bilgisayarımda (Localhost'ta) tıkır tıkır çalışıyordu!"
Olay Günü: Canlıya Çıkış Faciası
Pazar gecesi saat 23:00. Şirketin dışarıdan anlaştığı hevesli yazılımcı veya şirketin yeni mezun geliştiricisi üç aydır üzerinde çalıştığı projeyi canlı sunucuya atmaya karar verir. Kendi Windows laptopunda XAMPP veya WampServer üzerinde aylardır kodlamış, butonlara tıklamış, testlerini yapmış ve projenin "kusursuz" olduğuna kanaat getirmiştir.
Dosyalar FTP üzerinden Linux Ubuntu/CloudLinux sunucunun public_html dizinine yüklenir. Veritabanı .sql dökümü phpMyAdmin'den içeri aktarılır.
Ve geliştirici tarayıcıdan siteye girer: sirketadi.com.
Karşılaştığı manzara bir yazılım enkāzıdır:
- Sayfanın yarısı beyaz ekran vermiştir.
- Ürün fotoğraflarının ve CSS ikonlarının %80'i kırık resim simgesi (404 Not Found) olarak görünmektedir.
- Kullanıcı giriş butonuna basıldığında ekrana 20 satırlık kırmızı SQL sözdizimi hatası fırlamaktadır.
Geliştiricinin beyni donar. Kendi bilgisayarındaki Chrome sekmesine bakar: Her şey pırıl pırıl, capcanlı. Sunucudaki sekmeye bakar: Chernobyl reaktörü!
Ve o kutsal replik derhal hosting firmasının bilet sistemine yazılır:
"Sizin sunucunuzda kesinlikle bir problem var! Yazılımımda tek bir hata bile yok, projem kendi localhost'umda kusursuz çalışıyor! Modülleriniz eksik, sunucu dosyaları engelliyor, hemen sunucuyu düzeltin!"
Localhost Cenneti ile Linux Cehennemi Arasındaki Uçurum
Sistem mühendisi log kayıtlarını açar açmaz tebessüm eder. Çünkü "Localhost" ile gerçek "Production" ortamı arasındaki fark, bir çocuk parkı ile cephe savaşı arasındaki fark gibidir.
Geliştiricinin kendi bilgisayarında çalışan şeyin canlıda patlamasının üç temel sebebi vardır:
1. Büyük / Küçük Harf Duyarlılığı (Case-Sensitivity)
Windows'un dosya sistemi olan NTFS, dosya isimlerinde büyük ve küçük harf ayrımı yapmaz (case-insensitive). Yani Windows için Resim.JPG, resim.jpg ve RESIM.jpg tamamen aynı dosyadır.
Geliştirici kodun içine <img src="resim.jpg"> yazmış, klasöre ise fotoğrafçının gönderdiği Resim.JPG dosyasını atmıştır. Windows bunu sessizce görmezden gelir ve resmi açar.
Fakat dosyaları Linux ext4 dosya sistemine attığınız an kıyamet kopar. Linux için Resim.JPG ile resim.jpg iki tamamen farklı varlıktır! Web sunucusu resim.jpg dosyasını bulamaz ve ekrana buz gibi 404 Not Found basar.
Aynı felaket PHP include ve require satırlarında yaşanır. Dosya adı UserClass.php iken koda require_once('userclass.php'); yazan geliştirici, Linux'ta doğrudan Fatal Error: Failed opening required file duvarına toslar.
2. SQL Mode Katılığı (ONLY_FULL_GROUP_BY)
Geliştiricinin yereldeki MySQL sunucusu varsayılan olarak gevşek ayarlarla kurulmuştur. SQL standartlarını hiçe sayan spagetti bir GROUP BY sorgusu yazar:
SELECT id, urun_adi, kategori_id, fiyat FROM urunler GROUP BY kategori_id;Yereldeki MySQL bu hatalı sorguyu affeder ve rastgele bir satırı getirir. Ancak gerçek sunucudaki kurumsal MySQL/MariaDB motorunda SQL_MODE=STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY kuralı aktiftir. Sunucu bu sorguyu gördüğü an reddeder:
ERROR 1055 (42000): 'urunler.urun_adi' isn't in GROUP BY clause
and contains nonaggregated column...Ve sistem orada donar.
3. Root Yetkisi ve İzin İllüzyonu
Geliştirici kendi laptopunda her zaman "Administrator" veya "root" yetkisiyle çalışır. Yazılımın geçici klasörlere yazması, oturum açması, dosya yüklemesi hiçbir izin engeline takılmaz.
Oysa Linux sunucuda güvenlik gereği dosyalar izole edilmiş kullanıcı haklarıyla (chmod 0644, dizinler chmod 0755) çalışır. Yazılım rastgele bir sistem dizinine veya yetkisi olmayan bir klasöre yazmaya kalktığında işletim sistemi tokat gibi bir Permission Denied hatası indirir.
"Benim Bilgisayarımda Çalışıyordu" Bahanesinin Sonu
Modern yazılım mühendisliği, geliştirme ortamı ile üretim ortamı arasındaki bu asimetriyi ortadan kaldırmak için devrim niteliğinde araçlar geliştirdi. Artık 2000'li yılların XAMPP refleksiyle kod yazıp canlı sunucuya laf atmak bir mazeret değil, mesleki yetersizliktir:
- Docker ile Konteynerizasyon: Projenizi yerel Windows işletim sisteminizin insafına bırakmayın. Geliştirme ortamınızı canlı sunucuyla birebir aynı Linux sürümünü, aynı PHP sürümünü ve aynı kütüphaneleri içeren bir
Dockerfileile ayağa kaldırın. Konteyner içinde çalışan kod, sunucuda da %100 aynı şekilde çalışır. - Katı Hata Raporlama (E_ALL): Yerelde kod yazarken
error_reporting(E_ALL);vedisplay_errors = On;ayarlarını açın. En ufak birNoticeveyaWarninguyarısını görmezden gelmeyin; canlıya çıkmadan kodunuzu sterilize edin. - CI/CD ve Statik Kod Analizi: Kod canlıya gitmeden önce GitHub Actions veya GitLab CI üzerinde bir Linux runner'da otomatik testlerden ve lint taramalarından geçsin.
- Altyapıya Saygı: Canlı ortam bir laboratuvar değil, gerçek dünyanın fırtınalı denizidir. Kodunuzu Windows'un şımarık toleransına göre değil, Linux'un tavizsiz disiplinine göre inşa etmek zorundasınız.
Petri kabında mikrop öldürüp kendini hekim sananlar gibi, XAMPP'ta iki sayfa açıp kendini yazılımcı sananlar da gerçek sunucunun ekstresine tosladığında gerçeği anlar. "Localhost'ta çalışıyordu" demek, "Araba garajda çok güzel duruyordu ama yola çıkınca motoru patladı" demekten farksızdır. Mühendislik garajda değil, yolda belli olur.