Ünite 4 / 12

Kod İnceleme, Yeniden Düzenleme ve Teknik Borç

Kazanimlar:

  • AI'ı kod incelemede (code review) okunabilirlik, mantık ve güvenlik açısından ikinci göz olarak kullanabilme
  • Karmaşık kodu davranışını bozmadan yeniden düzenleme (refactoring) adımlarını AI desteğiyle planlayabilme
  • AI'ın inceleme ve düzenleme önerilerini testlerle ve sürüm kontrolü karşılaştırmasıyla doğrulayabilme

Yazılım mühendisliğinde kod, yazıldığından çok daha fazla okunur. Bir satır kod bir kez yazılır, ama aylar boyunca onlarca kez okunur, değiştirilir ve üzerine inşa edilir. Bu yüzden kod incelemesi (code review; başkasının veya kendi kodunuzun mantık, okunabilirlik ve güvenlik açısından gözden geçirilmesi) ve yeniden düzenleme (refactoring; kodun davranışını değiştirmeden yapısını iyileştirme) mühendisliğin kalbindedir. AI bu iki işte güçlü bir "ikinci göz" olur: hızlıca okunabilirlik önerir, gözden kaçan mantık ve güvenlik sorunlarını işaret eder, ve büyük bir refactoring'i küçük güvenli adımlara böler. Ama kritik bir kural vardır: refactoring davranışı değiştirmemelidir ve bunu garanti eden tek şey testlerdir.

Bu ünitede AI'ı kod incelemede nasıl yapılandırılmış biçimde kullanacağınızı, karmaşık kodu davranışını bozmadan nasıl düzelteceğinizi ve teknik borcu (technical debt; hızlı ama sonradan pahalıya patlayacak kod kararları) nasıl yöneteceğinizi göreceğiz.

Kavramlar: Teknik borç: Bugün hızlı olsun diye alınan, gelecekte bakımı zorlaştıran kod kararları. Kod kokusu (code smell): Kendisi hata olmayan ama sorun habercisi olan kalıplar (çok uzun fonksiyon, tekrar eden kod). Regresyon: Bir değişikliğin, önceden çalışan bir şeyi bozması.

AI'ı Yapılandırılmış Kod İncelemede Kullanmak

Zaman kısıtlıyken en yüksek riskli konulara odaklanmak gerekir. Girinti ve boşluk gibi biçim sorunlarını otomatik biçimlendirici (formatter) halleder; insan dikkatini mantık, güvenlik ve kenar durum davranışına ayırmalısınız. AI'a inceleme yaptırırken önceliklendirilmiş bir liste isteyin, düz bir yorum yağmuru değil.

  1. Kapsamı verin. Hangi kod, ne yapmalı, hangi bağlamda çalışıyor.
  2. Öncelik ekseni belirtin. Önce doğruluk ve güvenlik, sonra okunabilirlik.
  3. Somut düzeltme isteyin. Her bulgu için "neden sorun" ve "önerilen düzeltme".
  4. Bulguları siz doğrulayın. AI yanlış pozitif de üretir; her bulguyu koda ve teste karşı teyit edin.

Yapılandırılmış inceleme promptu:"Aşağıdaki fonksiyonu bir kıdemli mühendis gibi incele. Bulguları önemsırasına göre ver ve şu etiketlerle işaretle: [KRİTİK] mantık/güvenlik,[ORTA] kenar durum/performans, [DÜŞÜK] okunabilirlik/isim.Her bulgu için: neden sorun, somut düzeltme önerisi. Biçim/girintisorunlarını ATLAMA konusu YAPMA, otomatik araç halleder. Kod: [kod]"

Güvenlik odaklı inceleme promptu:"Bu kodu yalnızca güvenlik açısından incele: girdi doğrulama eksikliği,enjeksiyon riski, yetkilendirme kontrolü eksikliği, gizli bilgi sızıntısı,güvensiz varsayılanlar. Her bulguya bir örnek saldırı senaryosu ekle.Güvenlik sorunu yoksa açıkça 'kritik güvenlik sorunu bulamadım' de. Kod: [kod]"

Dikkat: AI'ın "sorun yok" demesi, sorun olmadığının kanıtı değildir. AI yanlış negatif üretebilir; gerçek bir güvenlik sorununu atlayabilir. AI incelemesi, insan incelemesinin ve güvenlik testinin yerine geçmez, onları destekler. Güvenlik-kritik kodda son söz yetkin mühendisindir.

Testle Korunan Yeniden Düzenleme

Refactoring'in altın kuralı: önce test, sonra değişiklik. Kodu düzeltmeden önce, mevcut davranışı kilitleyen testler olmalı ki değişiklik bir şeyi bozarsa hemen anlayın. AI'a refactoring yaptırırken sırayı bozmayın.

  1. Mevcut davranışı test altına alın. Yoksa AI'a "karakterizasyon testi" (mevcut davranışı olduğu gibi yakalayan test) ürettirin.
  2. Küçük adımlarla düzeltin. Her adımda testler yeşil kalmalı.
  3. Her adımdan sonra çalıştırın. Regresyonu erken yakalayın.

Güvenli refactoring planı promptu:"Aşağıdaki 60 satırlık fonksiyon çok şey yapıyor ve okunması zor.Onu davranışını DEĞİŞTİRMEDEN yeniden düzenlemek istiyorum.Önce: mevcut davranışı kilitlemem için hangi test senaryolarına ihtiyacımolduğunu listele. Sonra: refactoring'i küçük, her biri testler yeşilkenuygulanabilir adımlara böl. Kodu henüz yazma, önce planı ver. Kod: [kod]"

Zayıf Prompt / Güçlü Prompt

ZAYIF:"Bu kodu daha iyi yap."(Sonuç: neyin iyileştirileceği belirsiz; AI keyfi değişiklikler yapar,davranışı sessizce değiştirebilir.)GÜÇLÜ:"Bu ödeme hesaplama fonksiyonunu okunabilirlik için yeniden düzenle.KISIT: davranış birebir aynı kalmalı, dönüş değerleri değişmemeli.Uzun fonksiyonu anlamlı yardımcı fonksiyonlara böl, sihirli sayılarıadlandırılmış sabitlere çıkar. Değişiklik listesini madde madde ver veher maddenin davranışı NEDEN değiştirmediğini açıkla. Kod: [kod]"

Güçlü prompt "davranış birebir aynı kalmalı" kısıtını ve neyin iyileştirileceğini net verir. Bu kısıt olmadan AI, "iyileştirme" adına mantığı değiştirebilir ve sessiz bir regresyon üretebilir.

Teknik Borcu Yönetmek

Yaklaşım

Kısa vadede

Uzun vadede

Borcu görmezden gelmek

Hızlı ilerleme

Bakım felci, yavaşlayan ekip

Her şeyi baştan yazmak

Duran özellik geliştirme

Belirsiz kazanç, yüksek risk

Ölçülü, testle korunan refactoring

Küçük yavaşlama

Sürdürülebilir hız

En sağlıklı yol üçüncüsüdür: borcu görünür kılın (bir listede izleyin), en çok acı veren yerden başlayın ve her düzeltmeyi testle koruyun. AI, borç kalemlerini tespit edip önceliklendirmede iyi bir yardımcıdır ama hangi borcun ödeneceği bir iş kararıdır.

Mini Vakalar

Vaka 1 — Sessiz regresyon. Bir geliştirici, AI'a "bu fonksiyonu sadeleştir" der; AI bir koşulu yanlış çevirir ve iade hesaplaması bozulur. Test olmadığı için hata 3 hafta sonra müşteri şikâyetiyle çıkar. Aynı işi önce karakterizasyon testi yazarak yapan ekip, hatayı ilk çalıştırmada kırmızı testle yakalar.

Vaka 2 — Faydalı ikinci göz. AI, bir kod incelemesinde, kullanıcı yetkisinin yalnızca arayüzde kontrol edilip sunucuda kontrol edilmediğini fark eder. Bu, yetkisiz erişim açığıdır. Mühendis sunucu tarafı yetki kontrolünü ekler; AI incelemesi, gerçek bir güvenlik olayını önler.

Vaka 3 — Yanlış pozitif. AI, "bu değişken hiç kullanılmıyor, sil" der; oysa değişken bir yansıma (reflection) mekanizmasıyla dolaylı kullanılmaktadır. Mühendis öneriyi teste karşı doğrulamasa silecek ve çalışma zamanı hatası doğacaktı. Her AI bulgusu, uygulanmadan önce teyit edilmelidir.

Sık yapılan hatalar

  • Test olmadan refactoring yapmak. Davranışın korunduğunu garanti edecek hiçbir şey kalmaz.
  • AI bulgularını doğrulamadan uygulamak. Yanlış pozitif ve yanlış negatif ikisi de olur.
  • Biçim sorunlarına insan zamanı harcamak. Otomatik araçla çözülecek işlere odaklanmak asıl riskleri gölgeler.
  • "Sorun yok" cevabını garanti sanmak. AI güvenlik açığını atlayabilir; insan incelemesi şart.
  • Tüm borcu bir seferde ödemeye çalışmak. Büyük yeniden yazımlar risklidir; ölçülü ve testle korunan adımlar tercih edilir.

Özetle

Kod incelemesi ve refactoring, kodun uzun ömrünü belirler. AI güçlü bir ikinci göz ve plan üreticisidir: önceliklendirilmiş bulgular, güvenlik senaryoları ve küçük adımlı refactoring planları sunar. Ama refactoring davranışı değiştirmemelidir ve bunu yalnızca testler garanti eder. Her AI bulgusunu koda ve teste karşı doğrulayın; "sorun yok" cevabını kanıt sanmayın. Teknik borcu görünür kılıp ölçülü, testle korunan adımlarla ödeyin.

Uygulama görevi

Elinizdeki (veya AI'a ürettirdiğiniz) 40-70 satırlık, biraz karmaşık bir fonksiyonu alın. Önce yapılandırılmış inceleme promptunu uygulayın ve çıkan bulguları [KRİTİK]/[ORTA]/[DÜŞÜK] olarak sıralayın; en az bir bulguyu koda karşı elle doğrulayın. Sonra güvenli refactoring planı promptuyla önce karakterizasyon testlerini ürettirip çalıştırın, ardından refactoring'i küçük adımlarla uygulayıp her adımda testlerin yeşil kaldığını doğrulayın.

Kontrol listesi

  • [ ] İncelemeyi öncelik etiketleriyle (kritik/orta/düşük) yapılandırdım.
  • [ ] En az bir AI bulgusunu koda/teste karşı doğruladım.
  • [ ] Refactoring'ten önce mevcut davranışı test altına aldım.
  • [ ] Değişiklikleri küçük adımlarla yaptım ve her adımda test çalıştırdım.
  • [ ] "Davranış aynı kalmalı" kısıtını promptta belirttim.
  • [ ] Güvenlik bulgularının insan onayı gerektirdiğini teyit ettim.