Yapay Zeka - AI

Cursor ve Claude ile Gerçek Bir .NET Projesinde Ne Hızlandı, Ne Çuvalladı

Ürfet Demirtaş 4 dk okuma

Cursor ve Claude, boş bir controller'ı ve test iskeletini ciddi biçimde kısaltıyor. Ödeme callback'i, yetki kontrolü ve eski domain kuralında ise aynı hız, hatayı da kısaltıyor.

Bu yazı bir araç tanıtımı değil. .NET tarafında, ödeme ve kurumsal backend işinde bu iki aracı yan yana kullanınca neyin kısaldığını, nerede geri aldığımı yazıyorum. Model adı değişir. Ayrım aynı kalır: kodun şekli hızlanır, işin kuralı hızlanmaz.

Ne hızlandı

İlk hali belli olan işler. DTO eşlemesi, tekrar eden controller iskeleti, bir metodun birim testi, regex, "şu exception'ı şu mesajla sar" gibi dar talepler. Eski bir WebForms sayfasını okuyup ne yaptığını düz Türkçe özetletmek de bu gruba girer. Sayfayı yeniden yazdırmak değil. Okutmak.

İkinci kazanç, yabancı bir dosyada gezinmek. Büyük çözümde model, bin ve obj klasörünü, üretilmiş istemciyi ve migration snapshot'ını da bağlama alırsa hem yavaşlar hem yanlış dosyayı "asıl kod" sanır. Bunu .cursorignore ile kesmek, hem maliyeti hem saçma öneriyi düşürür. İndeks dışı kalması gereken yer, zaten Git'in de izlememesi gereken yerdir.

Üçüncü kazanç, ilk taslak. Bir SQL'in iskeleti, bir HttpClient çağrısının iskeleti, bir commit mesajı. Taslağı alıp kendi şemanıza göre düzeltmek, boş sayfadan yazmaktan kısa sürer. Taslağı olduğu gibi birleştirmek ise, şema sizde değil modelin ezberindeyse, pahalıya gelir.

Ne çuvalladı

Boş bir kâğıtta kırmızı kalem ve soru işareti, arkada bulanık bir monitör

Ödeme callback'i en net örnek. Model mutlu yolu yazar: imza doğruysa kaydı ekle, durumu başarılı yap, 200 dön. Gerçekte aynı bildirim ikinci kez gelir. Banka zaman aşımında tekrarlar. İlk kayıt varsa ikinci insert, çift tahsilat izi üretir. Bunu kod derlendiği için göremezsiniz. Idempotent olmayı, işin kuralı olarak siz söylemezseniz model eklemez. Eklese bile, hangi alanın tekillik anahtarı olduğunu sizden doğru bilmesi gerekirdi.

Eski domain de aynı. Yıllanmış bir serviste kural kodun içinde dağınık durur: şu kanalda KDV dahil fiyat, şu kanalda hariç, şu statüde iade yok. "Bu servisi sadeleştir" dendiğinde model, dağınık kuralı tekrar diye görür ve siler. Derleme geçer. Cuma günü sipariş bozulur. Dağınık kod her zaman tekrar değildir. Bazen orada durmasının sebebi, iki müşterinin iki ayrı sözleşmesidir.

Test de tuzak. Model, yazdığı metodu çağıran ve dönüşünü olduğu gibi doğrulayan test üretir. Test, davranışı değil, az önce üretilen kodu kilitler. Hata da yeşil kalır. İşe yarayan test, önce başarısız olan senaryodur: ikinci callback yeni satır açmamalı, yetkisiz kullanıcı 403 almalı, boş sözleşme numarasında model uydurmamalı.

Türkçe iş kuralında özgüven ayrıca yüksektir. e-Fatura senaryosu, tevkifat, IBAN kontrol basamağı, fesih süresi. Model eksik bırakmaktansa düzgün görünen bir sayı koyar. Sayı, sizin belgenizde yoksa, kod review'da "mantıklı duruyor" diye geçer. Mantıklı durmak, doğru olmak değildir.

Nasıl kullanınca bozulmuyor

Dar tutun. Bir metod, bir test, bir dosya. "Bu modülü baştan yaz" cümlesi, review'u imkânsız bir diff üretir. Küçük diff'i, junior'dan gelen pull request gibi okuyun. Kırmızı kalem burada mecaz değil. Özellikle şu üç yere bakın: yetki kontrolü duruyor mu, para hareketi ikinci kez gelince ne oluyor, hata olunca ne loglanıyor.

Kuralı sohbete değil, teste yazın. Cursor sohbeti uzadıkça baştaki kısıtı unutur. Test unutmaz. Önce düşen testi koyun, sonra modeli o testi geçecek kadar değiştirsin. Geçmesi yetmez. Diff'te testin kendisini gevşetip gevşetmediğine bakın. Modeller bunu yapar. Assert'i silerek yeşil almak, düzeltmek değildir.

Tasarım konuşmasını editörün içine gömmeyin. "Callback idempotent olmalı, anahtar banka referansı, ikinci geliş 200 dönsün ama satır açmasın" cümlesini netleştirmek ayrı iş. O cümle netleşmeden ajanın dosyayı düzenlemesine izin vermeyin. Claude bu konuşmada işe yarar. Cursor, cümle netleştikten sonra dosyayı değiştirmekte işe yarar. Sırayı tersine çevirince, yanlış tasarım temiz kod gibi görünür.

Şu dosyalara ajana yazma yetkisi vermeyin, diff'i satır satır siz okuyun: ödeme bildirimi, yetkilendirme, migration'ın geri alma adımı, production connection string. Buralarda hız, kazanç değildir.

Müşteri kodu ve sır, sohbet değildir

Genel bir modele yapıştırılan sözleşme, müşteri dump'ı ve appsettings dışarı çıkmış veridir. "Sadece bu bug'ı görsün" diye production bağlantı cümlesini yapıştırmak, bug'ı çözmez, sırrı dağıtır. Aynı şey, müşteri evrakını "özetlesin" diye sohbete atmakta da geçerlidir. Evrak şirkette kalacaksa model de şirkette kalır. Onun kurulumu local LLM ve Türkçe RAG yazısında.

Üretilen kodun güvenlik tarafı ayrı bir review ister. Model, SQL'i string birleştirerek, kart numarasını loglayarak, yetki kontrolünü "sonra ekleriz" diye atlayarak derlenen kod yazar. Buna yapay zekâ ile kod yazarken açıklardan korunma yazısında girmiştim. Kişisel verinin loga ve üçüncü partiye gitmemesi ise KVKK kontrol listesinin konusu.

Kısa kural

Model, sizin tarif ettiğiniz işi hızlı yazar. Tarif etmediğiniz iş kuralını, en yakın eğitim örneğinden tamamlar. Ödeme, yetki ve kişisel veride o tamamlama kabul edilemez. Geri kalanında, küçük diff ve düşen test ile kullanın. Hız orada gerçekten var.

Tüm yazılar →