Algoritma Değildi. Kodlamaydı.
Birkaç gün boyunca sistemimde derin, gizemli bir hata olduğundan emindim. Loglarım çöp olarak çıkıyordu. Bir veri dönüştürme adımı, ince bir biçimde yanlış çıkan dosyalar üretiyordu. Bir alt süreç, beklediğim çıktının yerine saçmalık geri veriyordu. Mantığımda bir kusur aradım — sistemin o zekice kısmında, bir yerlerde.
Mantıkta bir kusur yoktu. Hata, bilgisayarımla benim, harfleri nasıl hecelediğimiz konusunda anlaşamamamızdı.
Kodda olmayan hata
Bunu çıldırtıcı kılan şey, her şeyin doğru görünmesiydi. Çöpü üreten kodu okuyabiliyor ve onda yanlış bir şey göremiyordum. Hatalar tuhaf ve tutarsızdı: bazı metinler düzgün geliyordu, bazıları karman çorman geliyordu, bazı dosyalar kusursuzca açılıyor, diğerleri ise ince bir biçimde bozuk oluyordu. Bu örüntüde, gidip düzeltebileceğim tek bir satıra işaret eden hiçbir şey yoktu.
Bu tutarsızlığın, sonradan öğreneceğim üzere, yaygın bir ipucu olduğu ortaya çıktı. Ama o sırada programım sadece lanetlenmiş gibi görünüyordu.
Asıl yanlış olan şey: iki program, iki alfabe
Altta yatan şey şu. Bilgisayarlar metni harf olarak saklamaz. Onu sayı olarak saklarlar ve o sayıları tekrar karakterlere dönüştürmek için, hangi sayının hangi karakter anlamına geldiğini söyleyen üzerinde anlaşılmış bir tabloya — bir kodlamaya — ihtiyaç duyarsınız. Bir sistemin iki kısmı farklı tablolar kullanırsa, aynı baytlar her biri için farklı şeyler ifade eder ve biri tarafından yazılan metin diğeri tarafından yanlış okunur.
Bütün hatam buydu. İşletim sistemim, daha eski, eskimiş bir kodlamayı varsayılan olarak kullanıyordu; oysa üzerinde çalıştığım araçlar ve dosyalar, modern, neredeyse evrensel olanı varsayıyordu. İki tablo tesadüfen uyuştuğu sürece her şey çalışıyordu — ki en sade karakterler için uyuşurlar — ve herhangi bir şey o örtüşmenin dışına çıktığı anda bozuluyordu. Metin asla kasıtlı olarak bozulmuyordu. Yalnızca, yazıldığı dilden farklı bir dilde okunuyordu.
Neden görmesi bu kadar zordu
Bir kodlama uyumsuzluğu özellikle sinsi bir hata sınıfıdır, çünkü çoğu zaman temiz bir şekilde başarısız olmaz. Soruna işaret eden bir istisna fırlatmak yerine, hoşgörülü bir dönüştürme, iki kodlamanın anlaşamadığı bir karakterle karşılaşana kadar neredeyse doğru olan bir çıktı üretebilir — ve sonra sessizce sadece o kısmı bozar ve devam eder.
Dolayısıyla hatalar aralıklıdır ve içeriğe bağlıdır, ki bu tam da sizi yanlış yerde aramaya gönderen profildir. Aralıklı, içeriğe bağlı hatalar, sanki mantığınızın içinde, gurur duyduğunuz o karmaşık kısımda yaşıyormuş gibi hissettirir. Bu hata ise tesisatın içinde, varlığından bile haberdar olmadan güvendiğim bir varsayılanın içinde yaşıyordu.
Bu tür işin gösterişsiz gerçeği
Bir öğrenen sistem inşa etmenin zor kısımlarının, ilginç kısımlar olacağını hayal etmiştim — modeller, matematik, strateji. Asıl zor kısımların gerçekten büyük bir oranının, bunun gibi şeyler olduğu ortaya çıktı. Metin kodlamaları. Satır sonları. Farklı makinelerde farklı şeyler ifade eden dosya yolları. Her şeyin altındaki sıkıcı altyapı; tek bir yanlış varsayılanın, üstteki zarif koda bakıp sorunun orada olması gerektiğine inanırken bir haftanızı sessizce yiyip bitirebileceği yer.
Bu, yararlı bir biçimde alçaltıcıdır. Beni en sık durduran şey nadiren matematikti. Tesisattı.
Çözüm: varsayılanlara güvenmeyi bırak, uzlaşmayı zorla
Onarım ince değildi. Sistemin her bir kısmının tesadüfen varsayılan olarak kullandığı kodlamaya güvenmeyi bıraktım ve her sınırda açıkça birini — modern, evrensel olanı — zorladım: her dosya okumasında, her dosya yazımında, her başlatılan alt süreçte. Her bileşen, aynı tablo üzerinde yazılı olarak anlaşmaya zorlandığında, çöp durdu.
Bu birincil çözümün yanı sıra, daha küçük, savunmacı bir alışkanlık ekledim: belirli sorunlu karakterleri en başından loglarımdan uzak tutmak — kodlamayı doğru yapmanın yerine geçecek bir şey olarak değil, bir emniyet ağı olarak. Loglar, her şey alev alev yanarken net bir şekilde okuyabilmeye en çok ihtiyaç duyduğunuz tek yerdir ve sorunları teşhis etmek için güvendiğim aracın, aynı hata sınıfına tekrar tekrar kurban gitmesini istemedim.
Ders: bir varsayılan, sizin vermediğiniz bir karardır
Daha derin ders, hatadan daha uzun yaşadı. Yığınınızdaki her “varsayılan” bir karardır — genellikle sizin özel durumunuzu bilmeyen biri tarafından, çoğu zaman yıllar önce, artık geçerli olmayabilecek nedenlerle verilmiştir. Çoğu zaman bu miras alınan kararlar sorunsuzdur ve onları hiç düşünmek zorunda kalmazsınız. Onları tehlikeli kılan şeyin bir kısmı budur. Bunlardan biri tesadüfen sizin durumunuz için sessizce yanlış olduğunda, neredeyse görünmezdir, çünkü onu bilinçli olarak hiç seçmediniz — ve hiç seçmediğiniz şey, bakmayı en son akıl ettiğiniz yerdir.
Vermiş olduğumu bilmediğim bir karara, bir haftamın iyi bir kısmını kaybettim. Şimdi, bir şey mantıksal olarak hiçbir anlam ifade etmeyen bir biçimde başarısız olduğunda, ilk sorularımdan biri artık yalnızca “hatam nerede?” değil. Aynı zamanda “aslında hiç karar vermediğim halde neyi varsayıyorum?”
— Sinyal yok, getiri yok, yatırım tavsiyesi değildir.