Ünite 5 / 12

Hata Ayıklama ve Sorun Giderme

Kazanimlar:

  • Bir hatayı AI'a hata mesajı, yığın izi ve en küçük yeniden üretim örneğiyle etkili biçimde tarif edebilme
  • AI ile hipotez kurup adım adım daraltarak kök nedeni bulan sistematik bir hata ayıklama akışı yürütebilme
  • AI'ın önerdiği düzeltmeyi yeniden üreterek ve regresyon testiyle gerçekten sorunu çözdüğünü doğrulayabilme

Hata ayıklama (debugging), bir programın neden beklenenden farklı davrandığını bulup düzeltme işidir ve çoğu mühendisin zamanının büyük kısmını yer. İyi bir hata ayıklama, tahmin oyununa değil sistematik bir daraltmaya dayanır: belirtiyi netleştir, hipotez kur, hipotezi test et, kök nedene in. AI bu döngüde çok güçlü bir ortaktır; ama yalnızca ona doğru bilgiyi verirseniz. "Kod çalışmıyor, düzelt" demek, AI'ı tahmine ve genel geçer önerilere iter. Ona tam hata mesajını, yığın izini ve en küçük yeniden üretim örneğini verirseniz kök nedeni birlikte bulursunuz.

Bu ünitede bir hatayı AI'a etkili biçimde tarif etmeyi, hipotezleri adım adım daraltmayı ve önerilen düzeltmenin gerçekten sorunu çözdüğünü regresyon testiyle doğrulamayı göreceğiz. Unutmayın: bir hatayı "düzeltmek" ile "hatanın belirtisini bastırmak" farklı şeylerdir; kök nedeni bulmadan yapılan düzeltme, hatayı başka bir yere taşır.

Kavramlar: Yığın izi (stack trace): Hata anında hangi fonksiyonların hangi sırayla çağrıldığını gösteren döküm. Minimal repro (en küçük yeniden üretim): Hatayı tetikleyen en sade, en kısa kod/girdi. Kök neden (root cause): Belirtinin değil, sorunun asıl kaynağı. Regresyon testi: Aynı hatanın tekrar etmediğini garantileyen test.

Bir Hatayı AI'a Doğru Tarif Etmek

AI'ın kök nedeni bulma olasılığı, verdiğiniz bilginin kalitesiyle doğru orantılıdır. İyi bir hata tarifi şunları içerir: ne yapmaya çalıştınız, ne bekliyordunuz, ne oldu, tam hata metni ve yığın izi, ilgili kod, ortam (dil/sürüm/işletim sistemi), ve hatayı üreten en küçük örnek.

  1. Belirtiyi netleştirin. "Beklenen X, gerçekleşen Y" biçiminde.
  2. Tam hata metnini ve yığın izini yapıştırın. Kısaltmayın, sansürleyin ama yapıyı bozmayın.
  3. En küçük yeniden üretimi verin. Hatayı tetikleyen minimum girdi ve kod.
  4. Ortamı belirtin. Dil sürümü, kütüphane sürümü, çalışma ortamı.

Etkili hata tarifi promptu:"Bir hata ayıklıyorum. Bilgiler:- Yapmaya çalıştığım: [X]- Beklenen davranış: [Y]- Gerçekleşen davranış: [Z]- Tam hata mesajı ve yığın izi: [yapıştır]- Ortam: [dil/sürüm, kütüphane/sürüm]- İlgili en küçük kod: [kod]Bana doğrudan düzeltme verme. Önce en olası 3 kök nedeni olasılık sırasıylalistele ve her biri için hangi kontrolü yaparak doğrulayacağımı söyle."

Hipotezle Daraltma Akışı

Sistematik hata ayıklama, olasılıkları teker teker eleme sanatıdır. AI'ı hipotez üretmek ve her hipotezi test edecek deneyi tasarlamak için kullanın; sonra deneyi siz çalıştırıp sonucu geri verin. Bu döngü, "shotgun debugging" denen rastgele değişiklik yapıp durma alışkanlığından çok daha hızlıdır.

İkili arama (bisection) yardımcı promptu:"Bu hata dün yoktu, bugün var. Son 20 değişiklikten hangisinin hatayıgetirdiğini ikili arama (bisect) ile bulmak istiyorum. Bana adım adım birplan ver: hangi noktayı test edeyim, sonuca göre hangi yarıya gideyim.Ayrıca her adımda tam olarak neyi kontrol edeceğimi söyle."

Log ekleme stratejisi promptu:"Bu fonksiyonda ara değerleri göremediğim için hatayı bulamıyorum.Hangi noktalara, hangi değişkenleri yazdıran log satırları eklememgerektiğini söyle. Her log için 'bu logdan ne öğreneceğim' açıklaması ekle.Gizli veriyi loglamamı önleyecek uyarıları da belirt."

İpucu: Bir hatayı çözemiyorsanız, çoğu zaman sorun sizin yanlış varsaydığınız bir yerdedir. AI'a "benim hangi varsayımım yanlış olabilir?" diye sormak, körlüğünüzü kırar. En zor hatalar, "buranın doğru çalıştığından eminim" dediğiniz yerde saklanır.

Zayıf Prompt / Güçlü Prompt

ZAYIF:"Kodum hata veriyor, düzelt: [200 satır kod]"(Sonuç: AI ne hatası olduğunu, ne beklendiğini bilmez; tahmine dayalıgenel öneriler verir, çoğu işe yaramaz.)GÜÇLÜ:"NullPointerException alıyorum. Beklenen: kullanıcı listesi dönmeli.Gerçekleşen: getUsers() çağrısında patlıyor. Yığın izi: [yapıştır].Ortam: Java 17. En küçük tekrar: users listesi boşken çağırınca oluyor,doluyken olmuyor. İlgili 15 satır: [kod]. Kök nedeni ve neden boş listedetetiklendiğini açıkla, sonra düzeltme öner."

Güçlü prompt hatayı bir bağlama oturtur: hangi durumda oluyor (boş liste), hangi durumda olmuyor (dolu liste). Bu tek ipucu ("boşken oluyor"), kök nedeni neredeyse doğrudan gösterir. Zayıf promptta bu bilgi olmadığı için AI kör tahmin yapar.

Düzeltmeyi Doğrulama

Bir düzeltme, ancak üç şeyi sağlarsa gerçek düzeltmedir:

Kontrol

Soru

Nasıl doğrulanır

Hata gitti mi?

Aynı girdi artık çalışıyor mu?

Minimal repro'yu tekrar çalıştır

Yeni hata gelmedi mi?

Başka bir şey bozuldu mu?

Tüm test paketini çalıştır

Tekrar etmez mi?

Aynı hata bir daha çıkar mı?

Bu senaryo için regresyon testi ekle

Kök nedeni bulmadan yapılan düzeltmeler genellikle belirtiyi bastırır. Örneğin bir null hatasını "null ise atla" ile geçiştirmek, asıl neden olan "veri neden null geliyor" sorusunu görünmez kılar ve hata başka bir yerde yeniden doğar.

Mini Vakalar

Vaka 1 — Belirti bastırma tuzağı. Bir ekip, ara ara gelen bir null hatasını try-catch ile susturur; hata kaybolur ama 2 hafta sonra veriler eksik görünür. Asıl neden, bir servisin zaman aşımında boş dönmesidir. AI'a "neden null geliyor" diye sorulunca kök neden çıkar; gerçek düzeltme 1 saat sürer ama kalıcıdır.

Vaka 2 — Minimal repro gücü. Bir geliştirici "arada bir çöküyor" diyen bir hatayı çözemiyordur. AI'ın önerisiyle hatayı en küçük girdiye indirger: sorun yalnızca Türkçe karakter içeren dosya adlarında oluyordur (kodlama/encoding hatası). 300 satırlık belirsizlik, 5 satırlık kesin repro'ya inince çözüm bariz hale gelir.

Vaka 3 — Regresyonu önleyen test. AI, bir tarih hesaplama hatasını düzeltir. Mühendis bununla yetinmez; hatalı senaryo (ay sonu, 31 Ocak + 1 ay) için bir regresyon testi ekler. 4 ay sonra başka bir değişiklik aynı bölgeye dokununca test kırmızıya döner ve hata üretime ulaşmadan yakalanır.

Sık yapılan hatalar

  • "Çalışmıyor, düzelt" demek. Hata metni, beklenti ve repro olmadan AI tahmin eder.
  • Yığın izini vermemek. Yığın izi çoğu zaman kök nedeni doğrudan gösterir.
  • Rastgele değişiklik yapıp durmak. Hipotez kurmadan yapılan denemeler zaman kaybettirir.
  • Belirtiyi bastırıp kök nedeni atlamak. Hata başka yerde yeniden doğar.
  • Düzeltmeyi regresyon testiyle korumaya almamak. Aynı hata ileride sessizce geri gelir.

Özetle

Etkili hata ayıklama, tahmin değil sistematik daraltmadır. AI'a tam hata metni, yığın izi, en küçük yeniden üretim ve ortam bilgisini vermek, kök nedeni bulma şansını kat kat artırır. AI'ı hipotez üretmek ve her hipotezi test edecek deneyi tasarlamak için kullanın; deneyi siz çalıştırın. Bir düzeltmeyi ancak hata gittiğini, yeni hata gelmediğini ve regresyon testiyle korunduğunu görünce "tamam" sayın.

Uygulama görevi

Gerçek veya yapay bir hatayı ele alın. Önce hatayı en küçük yeniden üretime indirgeyin (hangi girdide oluyor, hangisinde olmuyor). Etkili hata tarifi promptunu kullanarak AI'dan 3 kök neden hipotezi ve her biri için bir doğrulama adımı isteyin. Hipotezleri teker teker test ederek kök nedeni bulun, düzeltin, sonra bu senaryo için bir regresyon testi yazıp çalıştırarak hem hatanın gittiğini hem de testin koruma sağladığını gösterin.

Kontrol listesi

  • [ ] Belirtiyi "beklenen vs gerçekleşen" biçiminde netleştirdim.
  • [ ] Tam hata metnini ve yığın izini AI'a verdim.
  • [ ] Hatayı en küçük yeniden üretime indirgedim.
  • [ ] Hipotezleri teker teker test ederek kök nedeni buldum.
  • [ ] Belirtiyi bastırmak yerine kök nedeni düzelttim.
  • [ ] Aynı hata için regresyon testi ekleyip çalıştırdım.