Şimdiye kadar “Hello World” dışında çok da bir kodlama tecrübem yok. Yine de geçen ay gerçek bir uygulamayı yayına alabildim: gerçek hesaplar, gerçek finansal veriler ve GDPR’ın da KVKK’nın da karşısında ayakta kalması gereken bir gizlilik politikası. Uygulamanın her satırını Claude Code yazdı.
Yaptığım proje bir AI ile kod yazma çalışması gibi görünse de aslında tam bir ürün işiydi; klavyede kimin, neyin oturduğuyla hiç ilgisi olmayan bir taraf.
Uçtan uca çalışan bir ürünü canlıya alıyorum
Exptract bir gider takip uygulaması. Fişin fotoğrafını çekiyorsunuz; Gemini 3.1 Flash-Lite modeli tutarı, tarihi, satıcıyı ve kategoriyi okuyor; siz özete bir göz atıp onaylıyorsunuz, harcama deftere işleniyor. Uygulama gibi kuruluyor ama tarayıcıda çalışıyor (PWA - Progressive Web App), hem Türkçe hem İngilizce ve şu anda canlıda.
Uygulamayı tek başıma, Claude Code ile yaptım. Kodu o yazdı; kapsam, tasarım, güvenlik, uyumluluk, bütün kararlar bendeydi. Zaten sınamak istediğim tam da bu iş bölümüydü: Yapay zekâ, oyuncak bir projede değil de gerçekten yayına çıkacak bir üründe düzgün bir geliştirme ortağı olabilir mi? Bütün mesele de “yayına çıkacak” kısmındaydı. Düzgün bir kimlik doğrulaması, gelir-gider verilerinin satır düzeyinde güvenlikle (RLS) saklanması gibi konular gerçek bir uygulama söz konusu olunca kritik hâle geliyor.
Gerçek bir üründe model, işin zor kısmı olmaktan çıkıyor.
Az kalsın çöküyordu
Geliştirme sırasında birçok zorlukla karşılaştım. Fiş okuyucu bozulmuştu. Bu, uygulamanın bütün var oluş sebebi olan tek özellikti ve tek bir yanıltıcı hatanın arkasında kilitlenip kalmıştı.
Tarayıcı “CORS hatası” diyordu, ama aslında durum farklıydı. Asıl sorun beş kat
derindeydi ve her kat bir sonrakini örtüyordu. Önce eksik bir veritabanı izni
vardı. Onu geçince, sunucuya hiç ulaşmayan bir kimlik doğrulama token’ı çıktı.
Onun da altında, gerçeği anlatacak başlıkları döndüremeden çöküp ölen bir
fonksiyon duruyordu; tarayıcının suçu CORS’a atmasının sebebi de tam olarak
buydu. Derken, ancak yeniden deploy alınca devreye giren bir yapılandırma
sırrı. Ve hepsinin en dibinde, yapay zekâ sağlayıcısının asıl cevabı: limit: 0. Meğer seçtiğim modelin ücretsiz kotası sıfırmış. Tek bir ayarı
değiştirdim, çalıştı. İşin ilginci ise yapay zekanın token yakmasına rağmen bulamadığı hatayı adım adım inceleyerek benim bulmamdı.
Bozulan kodu yapay zekâ yazmıştı, doğru. Ama “CORS hatası”nın bir yem olduğunu, çözümün de bir sonraki kata dokunmadan önce her katı asıl derdini söyleyecek hâle getirmek olduğunu bana hiçbir yapay zekâ söylemedi. O, hata ayıklama sezgisiydi; sürece adım adım hakim olmasaydım her adımı detaylı inceleyemez ve hatayı tespit edemezdim. Aklımda kalan ders şu: önce hatayı okunur hâle getirmeli, sonra ayıklamalı. Bu bir prompt değil, işi yaparken öğrenilen bir ders.
Aynı tuzağa, Supabase’teki o eksik veritabanı iznine, nihayet oturup bir kural olarak yazana kadar tam üç kez düştüm. Yapay zekâ bunu benim yerime öğrenmedi; öğrenmesi gereken bendim.
Akışına bırakmadan, bilinçli karar vermek
Uygulamayı en çok şekillendiren kararlar, akışına bırakmayıp bilinçli verdiklerim oldu.
En net örnek hesap silme. “Kullanıcı verisini silebilsin” cümlesi kulağa basit bir onay kutusu gibi geliyor, ama değil. Kalıcı silme mi olsun, yumuşak silme mi? Bu, arkasında gerçek bir “unutulma hakkı” duran bir soru. Ben kalıcıyı seçtim; bu da veritabanı silme zincirinin sessizce atladığı, depodaki fiş görsellerini tek tek bulup temizlemek demekti. Kullanıcı onayı da benzer bir durumdu: birinin onay verdiğini kanıtlamak için, sonradan kimsenin değiştiremeyeceği bir kayıt gerekiyordu. Üstelik bu kaydı, ortada yazacak bir kullanıcı oturumu bile yokken, üye olma anında sistemin kendisi yazmalıydı.
Bunların hiçbirini bana yapay zekâ hatırlatmadı. Her adımda durup “en doğrusu ne olurdu” diye kendime sorduğum, sonra da bilerek seçtiğim için ortaya çıktılar. Örneğin zaten kayıtlı bir e-postayla üye olmaya çalışınca ekran öylece takılıp kalıyordu. Çözüm, dürüst bir hata mesajı uğruna azıcık güvenlikten feragat etti; bunu bile bile, göze alarak yaptım.
Bu disiplin yayına çıkınca da bitmedi. Bir ay sonra Supabase, bir hafta hareketsiz kalırsa ücretsiz projeyi askıya alacağını hatırlattı. Ölçülü cevap, zaten çalışan bir arka ucu panikle baştan yazmak değil, onu uyanık tutan küçük, zamanlanmış bir ping oldu.
Asıl işi yapan neydi
Bütün geliştirme boyunca iki gerçek bug, hiçbir kod incelemesine takılmadan sıyrıldı. İkisini de uygulamayı sıradan bir kullanıcı gibi kullanırken fark ettim: doğrulama mesajlarının uygulamanın değil tarayıcının dilinde çıkması ve az önce anlattığım o üye olma takılması. Uygulamada beş dakika gezinmek, her fazda kod incelemesinden daha çok işe yaradı.
Aslında bütün mesele bu. Yapay zekâ, benim gibileri yıllardır durduran engeli kaldırdı: artık kodu benim yazmam gerekmiyor. Ama işi ortadan kaldırmadı. Kapsam, muhakeme, uygulamayı şüpheci bir kullanıcı gibi test etmek, akışına bırakmadan bilerek karar vermek… İş hâlâ bu ve yayına verdiğiniz şeyin gerçek olup olmadığını belirleyen kısım da tam olarak burası.
Kod, artık işin kolay kısmı.