Mühendislik Felsefesi
Yapay Zekâyla Yazılmış Kod Tabanını Kurtarmak: Bir Kontrol Listesi
Yapay zekâ asistanlarıyla başlayan projelerde sık duyulan bir cümle var: "Bir yere kadar çok iyi gitti, sonra her şey birbirine girdi." Böyle bir projeyi sıfırdan yazmadan nasıl toparladığımı adım adım anlatıyorum.
Yapay zekâ asistanlarıyla başlayan projelerde sık duyulan bir cümle var: "Bir yere kadar çok iyi gitti, sonra her şey birbirine girdi." Bu projeleri suçlamıyorum. Asistanlar gerçekten hızlı ve çoğu zaman çalışan kod üretiyor. Sorun, her isteğin kendi içinde makul olması ama bütünün kimse tarafından tasarlanmamış olması. Birkaç hafta sonra aynı işi yapan üç fonksiyon, birbiriyle çelişen veri modelleri ve neden orada olduğunu kimsenin hatırlamadığı paketler birikiyor.
İyi haber şu: bu projelerin çoğunu çöpe atmak gerekmiyor. Benim izlediğim sıra kabaca şöyle.
Önce durmak, sonra ölçmek
İlk iş yeni özellik eklemeyi bırakmak. Kulağa basit geliyor ama en zor kısım genellikle bu, çünkü proje sahibinin aklı hâlâ bir sonraki özellikte. Sonra projenin gerçek durumunu çıkarıyorum: derleniyor mu, tip denetiminden geçiyor mu, linter kaç hata veriyor, testler (varsa) ne diyor? Bu sayılar hem başlangıç noktası hem de birkaç gün sonra "gerçekten ilerledik mi?" sorusunun cevabı oluyor.
pnpm install --frozen-lockfile
pnpm exec tsc --noEmit # tip hataları
pnpm lint # stil ve olası hatalar
pnpm build # gerçekten üretilebiliyor mu?Bağımlılıkları ve tekrarları azaltmak
Asistanlar bir sorunu çözmek için sık sık yeni bir paket önerir. Sonunda aynı işi yapan iki tarih kütüphanesi, üç farklı HTTP istemcisi ve hiç kullanılmayan onlarca paket birikir. Her bağımlılık için "bunu kim, nerede kullanıyor?" diye soruyorum; kullanılmayanları siliyor, aynı işi yapanları teke indiriyorum.
Ardından aynı bilginin birden fazla yerde yaşadığı noktaları topluyorum. Aynı kullanıcı tipinin üç dosyada üç farklı şekilde tanımlandığını ya da aynı API adresinin on yerde elle yazıldığını görmek şaşırtıcı derecede yaygın. Veri modellerini, yapılandırmayı ve sabitleri tek bir yere aldığınızda sonraki her düzeltme kolaylaşıyor.
Davranışı koruyarak toparlamak
Refactoring'in kuralı değişmiyor: yapıyı değiştir, davranışı değiştirme. Test yoksa en kritik akışlar için (giriş, ödeme, veri kaydı) birkaç uçtan uca kontrol yazıyorum; o da mümkün değilse elle doğrulanacak kısa bir liste çıkarıyorum. Sonra küçük adımlarla ilerliyorum ve her adımdan sonra derliyorum. Bu süreçte özellikle şunlara dikkat ediyorum:
- Hataları sessizce yutan boş
catchblokları - Tip sistemini susturan
anyveas unknown aszincirleri - Koda gömülmüş API anahtarları ve parolalar
- İsimleri birbirine benzeyen, aynı işi yapan fonksiyonlar
- Kimsenin açıklayamadığı, yorum satırına alınmış kod blokları
Kuralları yazıya dökmek
Proje toparlandıktan sonra asistanı kullanmaya devam edecekseniz, kuralları açıkça yazmak gerekiyor: hangi klasör neyi içerir, yeni bağımlılık nasıl eklenir, isimlendirme nasıldır, neler yapılmaz. Bu belgeye hem ekipteki insanlar hem de asistan uyuyor. CI'da tip denetimi, lint ve build'i zorunlu kılmak da aynı kuralları otomatik olarak koruyor.
Yapay zekâ kod yazmayı ucuzlattı; anlamayı ucuzlatmadı. Bir kod tabanını kurtarmak çoğu zaman yeniden yazmaktan daha hızlı. Yeter ki sırayı doğru kuralım: önce durmak, sonra ölçmek, sadeleştirmek ve ancak ondan sonra yeniden düzenlemek.