X · Geliştirme · Bölüm 36
Üretimde öğrenilenler
İki yıl boyunca yaşanan arızaların sınıflandırılmış hâli — belirti, kök neden ve bir daha aynı sınıfa düşmemek için değişen şey.
Bu bölüm kitabın omurgasıdır. İçindekiler uydurulmuş örnekler değil; geliştirme günlüğünde biriken iki yüzden fazla girdiden çıkarılmış, gerçekten yaşanmış arızaların sınıflandırılmış hâli.
Sınıflandırma önemli: tek tek hatalar öğretici değildir, hata sınıfları öğreticidir. Aynı sınıfa ikinci kez düşmemenin yolu, sınıfı tanımaktır.
Sınıf 1 — Alet yanlış yüzeyi ölçer
En sık ve en pahalı sınıf. Bir ölçüm yapılır, sonuç güven verir, ama ölçülen şey sorulan şey değildir.
Ölçüm doğruydu, soru yanlıştı
- Belirti
- "Tasarım ayarları çalışmıyor" şikâyeti. Ölçüm her denetimin doğru değeri yazdığını gösteriyordu.
- Kök neden
- Kusur bir adım önceydi: kullanıcı işaret ettiği öğeyi seçemiyordu. Ölçüm "denetim doğru yazıyor mu" sorusunu cevaplıyordu; şikâyet ise "işaret ettiğim şey seçiliyor mu" idi.
- Ders
- Ölçümü kurmadan önce, şikâyetin cümlesini ölçülebilir hâle getirin. Ölçüm o cümleyi ölçmüyorsa yanlış aleti kullanıyorsunuz.
Aynı sınıfın diğer görünümleri:
- Model düzeyinde sorulan bir soruyla kayıt düzeyinde cevap aranması (32. bölüm).
- Bir öğenin stilini ölçmek için onu bozan, dolayısıyla ölçtüğü şeyi değiştiren bir denetim (35. bölüm).
- Eski dil çerezi taşıyan bir test oturumunun, doğru kodu hatalı göstermesi (27. bölüm).
Kural: bir alet kendi ölçtüğü şeyi değiştiriyorsa, ölçtüğü şey artık gerçek değildir.
Sınıf 2 — Sessiz başarısızlık
Bir şey çalışmaz ama hata da vermez. En tehlikeli sınıf, çünkü herkes iyi olduğunu sanır.
- Yayımlanmış bir dosyanın aslında bir hata sayfası olması — sunucu 200 döner (27. bölüm).
- Hiç test toplamayan bir koşunun sıfır hatayla bitmesi (35. bölüm).
- Sürüm jetonu olmayan bir dosyanın güncellenmiş sanılması (2., 8. bölüm).
- Yanlış sahiplikle kopyalanan bir modülün sessizce atlanması (31. bölüm).
- Sayı beklerken sembolle başlayan bir değeri sessizce reddeden ayrıştırıcı (17. bölüm).
- Tanımlandığı hâlde hiçbir dizin üretmeyen bir kısıt (34. bölüm).
Kural: her bileşen reddettiğini saymalı. Sıfır sonuç, sonuç değildir; kaç girdinin neden reddedildiği bilgisi sonuçtur.
Sınıf 3 — Aynı soruya iki cevap
Bir bilgi iki yerde tutulur, ikisi bir süre aynı kalır, sonra ayrışır.
- Üç ayrı sepet: tarayıcıda, sunucuda, bayi talebinde (28. bölüm).
- Sürümlerin hem ayrı dosya kopyaları hem defter olarak tutulması (9. bölüm).
- Sayfa biçiminin hem şirket ayarında hem düzende tanımlanması (7. bölüm).
- Bir uygulamaya dönmenin hem sekme şeridi hem "en son ekran" ile çözülmesi (2. bölüm).
Kural: ikinci kopya üretmek yerine var olanı genişletin. İki mekanizmanın aynı soruya farklı cevap vermesi, tek mekanizmanın eksik olmasından kötüdür.
Sınıf 4 — Rica bir mekanizma değildir
Metinle istenen bir davranış, garanti edilmiş bir davranış değildir.
Uyarıyı metne yazmak, uymayı sağlamaz
- Belirti
- Yapay zekâya "önce aracı çağır" diye ısrarla söylendi; yine de araç çağırmadan cevap verilen turlar oldu.
- Kök neden
- İstek bir cümleydi. Cümle bir kısıt değildir.
- Ders
- Kısıt protokol düzeyinde kuruldu. Metinle rica etmek sekiz sağlayıcıda dört farklı sonuç verir; mekanizma hepsinde aynı sonucu verir.
Aynı sınıf, insan tarafında da geçerli: "dikkat edilsin" diye yazılmış bir kural, bir denetim testiyle desteklenmediği sürece ihlal edilir.
Sınıf 5 — Varsayılan güvenli değildir
- Belge kaydetme kısayolunun varsayılan olarak kapalı olması (8. bölüm).
- Yönetim ekranının varsayılan olarak açık olması (32. bölüm).
- Panoların veri yokken örnek veri çizmesi (7. bölüm).
- Kopyalanan bir veritabanının canlı posta sunucusunu miras alması (24., 35. bölüm).
Kural: varsayılanı okumadan kabul etmeyin. Kurulum sonrası denetim listesi, varsayılanları tek tek yoklamak içindir.
Sınıf 6 — Yerelin gerçeği ile canlının gerçeği
Kod doğru yazılmış olabilir ve canlıda çalışmıyor olabilir.
- Yükseltmenin arayüz paketlerini yeniden üretmemesi (31. bölüm).
- Dağıtımın commit edilmemiş çalışmayı taşımaması (35. bölüm).
- Üretimin ana daldan farklı bir dalda koşuyor olması (35. bölüm).
- Canlı yayın katmanının hiç ateşlenmemesi (12. bölüm).
Kural: yükseltme sonrası doğrulama, yayımlanmış dosyanın içine bakmakla biter. "Hatasız bitti" bir kanıt değildir.
Sınıf 7 — Kullanıcının gördüğü ile kodun bildiği
- Görünen ama tıklanamayan bir düğme (2. bölüm).
- Yazının okunmadığı, üstüne gelinince beliren gri üstüne gri bir şerit (27. bölüm).
- Metin taşıyan bir sütunun sıfır genişliğe inip taşması.
- Panelin, altında kalması gereken bir işaretçinin üstünde çizilmesi.
Kural: görsel doğrulama, işlevsel doğrulamanın yerini tutmaz ve tersi de doğru değildir. İkisi ayrı ölçümlerdir.
Sınıf 8 — Dürüstlük kapısı
Bilmediğini söylemek, bilmiyormuş gibi görünmemekten iyidir.
- "Fark yok" yerine "şu bileşen değişti ama anlamını çözemedim" (9. bölüm).
- Fiyatı bilinmeyen model için
0,00yerine "fiyatlandırılmamış" (12. bölüm). - Fiyatsız ürün için
0,00yerine "fiyatlandırılacak" (28. bölüm). - Çalışmayacak bir denetimi etkin göstermek yerine devre dışı bırakıp nedenini yazmak (10. bölüm).
- Kısmi kapsamı gizlemek yerine "12 modelin 8'inde" demek (27. bölüm).
Kural: bir arayüz, bilmediği bir şeyi bilir gibi göstermemeli. Kullanıcıya verilen en değerli şey, neyin kesin neyin belirsiz olduğudur.
Sınıf 9 — Geri alınabilirlik
- Geri yükleme, sonrasını silmek yerine deftere eklenir (9. bölüm).
- Siteden kaldırma, silme değil arşivleme (4., 27. bölüm).
- Yapay zekânın yaptığı değişikliklerin farkının saklanması (13. bölüm).
- Kullanılamaz bulunan bir dokümanın silinmeyip arşivlenmesi (27. bölüm).
- Temizlik işlemlerinin varsayılan olarak kuru koşum olması.
Kural: geri alınamaz bir işlem, ancak geri alınamaz olduğu açıkça söylendiğinde ve onaylandığında yapılır.
Sınıf 10 — Ölçüm olmadan karar yok
- Model kademelerinin yarıştırmayla belirlenmesi (12. bölüm).
- "Model aptallaştı" hissinin ölçülebilir bir olaya dönüşmesi (15. bölüm).
- "DeepSeek zayıfladı" sanılan durumun aslında boş bakiye çıkması (12. bölüm).
- Bir ekranın darlığından sorumlu olanın, en olası görünen ayar olmaması (16. bölüm).
Kural: bir hissi düzeltmeden önce ölçün. Ölçüm çoğu zaman şüphelendiğiniz yeri değil, komşusunu gösterir.