Dostlar, bugün size yazılımcı olmanın en temel, en acı derslerinden birini anlatacağım: Typos (Yazım Yanlışları). Özellikle de sabahın köründe, 3. fincan kahveden sonra yapılanlarını. Bir oyun için quest (görev) ilerleme kayıt sistemi yazıyordum. Oyuncu bir görevi tamamladıkça, `player_quests` tablosundaki `progress` sütununu güncelleyecek ve `completed` durumunu `TRUE` yapacak basit bir mantık.
Testçilerden raporlar yağıyor: "Aynı quest'i her girişimde sıfırdan başlıyorum!" İlk başta save/load mekanizmasını, veritabanı bağlantısını, transaction'ları suçladım. Saatlerce log karıştırdım. `UPDATE` sorguları çalışıyor gibi görünüyordu ama veri hiç kalıcı olmuyordu. StackOverflow'da bile "my sql update doesn't persist" diye aratıp durdum. Şaka gibi.
Sonunda, umutsuzca kodu satır satır incelerken, quest ID'sini alan fonksiyona baktım. Bir de ne göreyim?
Python:
def save_quest_progress(player_id, quest_id, progress):
# Quest bilgilerini veritabanından çek
db_quest_id = get_quest_id_from_name("Goblin Temizliği") # ID: 101
# ... update işlemi
Sorun burada değildi. Asıl bombayı, bu fonksiyonu çağırdığım yerde buldum:
Python:
# Ana oyun döngüsü içinde bir yerlerde...
if quest_completed:
save_quest_progress(current_player.id, 110, 100) # 110 yazmışım! 101 değil!
Evet. `101` yerine `110` yazmışım. Veritabanında `110` ID'li bir quest YOK. Sorgu çalışıyor, 0 satır etkileniyor (ve ben bunu loglamamıştım), ve sessizce fail oluyor. Oyuncunun gerçek quest'i (`101`) asla güncellenmiyor. Her seferinde de yeni bir kayıt oluşturmaya çalışan sistemim de yok, sadece var olanı güncelliyor. Sonuç: Sonsuz bir sıfırlanma döngüsü.
1. Sihirli Sayılar (Magic Numbers) Kullanma! Direkt `101` yazmak yerine, bir `QUEST_GOBLIN_CLEANING = 101` sabiti tanımlamalıydım. Bu hatayı derleme/çalışma anında yakalardık.
2. Log Her Şeydir: UPDATE sorgusunun kaç satırı etkilediğini (`rowcount`) mutlaka logla. "0 satır etkilendi" bir HATA logudur, info değil!
3. Database Constraint'ler Güçlüdür: Eğer `quest_id` bir foreign key olsaydı ve `110` diye bir kayıt olmasaydı, database bize güzel bir hata fırlatırdı. Bazen DB'yi biraz sıkılaştırmak iyidir.
Neyse ki, tek bir rakamı düzeltmekle her şey çözüldü. Ama o kaybolan 5 saatlik debug seansı ve testçilerin sinirini bozma hissi... paha biçilemez.
Siz de böyle tek bir karakter yüzünden saatlerinizi heba ettiğiniz oldu mu? "Sihirli sayı" belasına karşı favori taktiğiniz nedir? Yorumlara yazın, dertleşelim!