Loading…
Doğru olan kod, yeşil olan testler ve başkasında çalışmayan bir ürün. Bu, kimsenin öğretmediği sorun kategorisi: sırayla okunmak için değil, başın sıkıştığında bakmak için.
Buradaki her vaka bu ürünün kendi tarihinden gerçek bir kusur: belirti, yanlış ilk tahmin ve çözüm, gerçekten yaşananlar. Hiçbiri uydurma değil: hiç yaşanmamış bir savaş hikâyesi, asla karşılaşmayacağın bir arıza biçimini öğretir.
Hiçbir şey yanlış görünmüyordu. İlerleme kaydediliyor, XP artıyor, seviyeler ilerliyordu. Sonra gövdesinde `{"xp": 999999}` olan tek bir `curl` komutu keyfî bir seviye verdi; ikinci açık ise daha sessiz olduğu için daha kötüydü: örnek çözümü okumanın cezası, tarayıcının gönül rızasıyla gönderdiği bir bayraktı, yani dürüst istemci onu ödüyor, değiştirilmiş olan hiç göndermiyordu.
"Bu uca yalnızca kendi arayüzümüz istek atıyor." Biri ağ sekmesini açana kadar doğru; ve bu bir güvenlik özelliği değil, dünkü trafiğin bir tarifi.
API, istemciden **olayı** değil **sonucu** kabul ediyordu. Tarayıcı "bu dersi bitirdim, N puan ediyordu ve bu arada çözümü kullanmadım" diyordu: üç iddia, üçü de güvenilmiş. İkisi, istemcinin kendi performansını raporlamasıydı; bu, bir sunucunun asla kabul edemeyeceği ifade kategorisidir.
İstemcinin kendi performansı hakkında söylediği her şey bir istektir, bir olgu değil. Sunucu ne olduğunu kabul etmeli, ne ettiğine kendisi karar vermelidir.
Hiç belirti yok. Bilinçli bir çalışma, quiz cevaplarını ve örnek çözümleri sayfa yükünden çıkarmıştı ve bir test, yükte hiçbir cevap anahtarı bulunamadığını iddia ediyordu. Test geçiyordu. Takım haftalarca yeşildi.
Bulunacak bir şey yok: testler kapsıyor. Tuzak tam da bu: yeşil bir takım, **yazdığın** kural hakkında kanıttır; **kastettiğin** kural hakkında hiçbir şey söylemez.
Bir alan bilerek yükte bırakılmıştı ve gerekçesi de yazılıydı: ipucu "kodu vermez, fikri işaret eder" ve gidiş-dönüş maliyeti insanların ipucu almayı bırakmasına yol açar. Muhakeme sağlamdı ve öncül hiç kontrol edilmedi. Sonradan ölçüldüğünde: 118 ipucunun 88'i kod içeriyordu ve **15'i referans çözümün yazılı hâliydi.** Uğruna savunulan istisna, cevabı yayınlıyordu.
Yeşil bir test yazdığın kuralı kanıtlar, kastettiğin kuralı değil. Tehlikeli kusurlar, uğruna gerekçe ürettiğin istisnaların içinde yaşar.
Türkiye'de akşam geç saatte çalışan öğrenciler günlük serilerini kaybediyor ya da serinin ilerlemediğini görüyordu. UTC'de olan kimse tekrar üretemedi ve seri kodunun testi geçiyordu.
Seri aritmetiğinde bir kayma: mantığın çetrefilli göründüğü yer orası olduğu için herkes önce oraya bakıyor. Aritmetik doğruydu. Onu bir kez daha, daha dikkatli okumak bir öğleden sonra daha yerdi.
`todayStr()` bugünün tarihini UTC'ye göre hesaplıyordu. Türkiye UTC+3, yani yerel saatle 00:00-03:00 arasında sunucu hâlâ dünü yaşıyordu. 00:30'da bir dersi bitiren öğrenci bir önceki güne yazılıyordu: seri ya ilerlemiyor ya da ilerlememesi gereken bir günü sayıyordu.
Sunucunun günü kullanıcının günü değildir; ve yalnızca tek bir ülkede üç saat boyunca var olan bir hata, kod okunarak bulunmaz.
Bir öğrenci çıkışı olmayan bir döngü yazdı ve tarayıcı sekmesi dondu: kalıcı olarak. Hata yok, yığın izi yok, durdurmanın bir yolu yok. Tek çare sekmeyi zorla kapatmaktı, o da yazdığı her şeyi götürüyordu.
Bir performans sorunu: yorumlayıcı yavaş, makine eski, biraz bekle. Asla bitmiyor çünkü beklenecek bir şey yok, ama "biraz daha bekle" inanmaya devam etmesi çok kolay bir şey.
Python çalışma ortamı tarayıcının ana iş parçacığında çalışıyordu: sayfayı çizen ve tıklamaları işleyen iş parçacığının aynısı. Oradaki sonsuz bir döngü sayfayı yavaşlatmaz; sayfanın var olmasını durdurur. Zaman aşımı yoktu ve kesmenin bir yolu yoktu, çünkü meşgul bir ana iş parçacığı, kendisini kesecek kodu çalıştıramaz.
Durduramadığın kod, yayına alamayacağın koddur. Güvenilmeyen işin ne yaptığına karar vermeden önce nerede çalışacağına karar ver.
`tsc`, kimsenin yazmadığı dosyalarda, üretilmiş bir dizinin içinde `Duplicate identifier` hatalarıyla kırılmaya başladı. Dizini silmek düzeltti. Günler sonra geri geldi. Başka bir sefer dev sunucu tamamen çöktü: sayfa döngüye girip yeniden yüklenirken `Next.js package not found` diye yüz yirmi kez panikledi.
Bozuk bir derleme önbelleği ya da hatalı bir bağımlılık kurulumu. İkisi de makul, ikisi de olağan cevap; üstelik önbelleği silmek işe yarıyor **gibi** göründü: gerçek deseni görmenin üç tekrar sürmesinin sebebi tam olarak buydu.
Proje, bir bulut sürücünün senkronize ettiği bir klasörün altındaydı. Senkronizasyon bir değişikliği çözemediğinde, orijinalin yanına `dosya 2.ts` adında ikinci bir kopya bırakıyordu. Üretilmiş tip dizininin içinde bu kopyalar her üretilmiş tanımı ikizliyordu, yani derleyici her tanımlayıcıyı iki kez görüyordu. Aynı mekanizma SQLite yazma-öncesi günlüğünün de kopyalarını üretti, ve bir keresinde bir kaynak dosyanın çakışma kopyası **git'e commit'lendi**: yeniden yazılmadan önceki bir modülün bayat ikizi.
Dosya sistemi derlemenin bir katılımcısıdır; proje dizinine yazma izni olan her şey, sen öyle seçmiş olmasan da araç zincirinin parçasıdır.
Bir tablo yeniden adlandırıldı. Şema güncellemesini yerelde çalıştırmak bir yığın izi bastı ve durdu. Hiçbir şey uygulanmadı, hiçbir şey bozulmadı ve aynı komut bir hatta zaman aşımına uğrayana kadar takılı kalırdı.
Migration aracı bozuk ya da şema geçersiz. İkisi de doğru değildi: araç tam da tasarlandığı gibi çalışıyordu ve şema sorunsuzdu.
Yeniden adlandırma, bir şema karşılaştırıcısı için belirsizdir: "bu tablo yeniden adlandırıldı" ile "bu tablo silindi ve başka bir tane oluşturuldu" arasını ayırt edemez. O yüzden hangisi olduğunu sordu: bir hatta var olmayan bir terminali bekleyen, etkileşimli bir soru.
Soru soran bir aracın hatta cevabı yoktur. Soru sorabilecek her şey ya bir insanın olduğu yerde çalışmalı ya da hiç çalışmamalı.
Bir tazelik kontrolü, Türkçe içerikteki 295 linkin tarih damgasının eksik olduğunu, İngilizce linklerin ise tamam olduğunu bildirdi. Aynı süreçle, aynı anda, iki dilde yazılmış bir içerikte tek bir dil boyunca temiz bir ayrım.
Türkçe içerik daha özensiz yazılmış. Bariz okuma bu, hafifçe makul ve buna göre davranmak, hiç yanlış olmamış 295 satırı düzenlemek demek.
Kontrol hatalıydı. İngilizce tarihleri `(added 2026-08)`, Türkçe ise `(eklenme: 2026-08)` biçiminde yazıyordu: iki nokta üst üste ile. Aranan kalıp iki noktayı kabul etmiyordu, dolayısıyla Türkçede hiçbir şeyle, İngilizcede her şeyle eşleşti. Aynı çalıştırma ayrıca iki dosyayı "uyarısız fiyat veriyor" diye işaretledi; biri fiyatların "milyon token başına" olduğunu söylüyor ve hiçbir rakam vermiyor, diğeri ise bir token **sayısından** bahsediyordu.
295 şeyi düzeltmeden önce, sayan şeyi doğrula. Bir kontrol de koddur ve test edilmemiş kod, nerede yaşarsa yaşasın test edilmemiş koddur.