İçeriğe geç

AI Kodunu Gözden Geçirmek — Akıcı Görünmek Doğru Olmak Değil

Orta 8 dk Çok sık karşılaşılır

Önce şunu oku: Dil Modeli Nasıl Cevap Üretir — Neden Var Olmayan Bir Metot Uydurur?

30 saniyede özet

Yapay zekânın yazdığı kod düzgün ve kendinden emin görünür, ama bu onu doğru yapmaz. Uydurma bir metodu derleyici, sınır hatasını test, güvenlik açığını tarama aracı, gereksiz karmaşayı insan yakalar.

Asistan “son 30 günün siparişlerini sayfalı getir” isteğine on beş satırlık düzgün bir metot yazdı. Derlendi, yanında yazdığı test de geçti. Her şey yolunda görünüyordu.

  1. Bayt: Asistan metodu saniyeler içinde yazdı. Derlendi, testi de geçti!

  2. Sen: O zaman hemen yayına alalım.

  3. Bayt: Bir dakika. Testi de aynı asistan yazdı...

  4. Bayt: Testin hiç sormadığı bir soru var mı acaba?

Neden ayrıca kontrol edilir?

AI kodu okunaklı, tutarlı ve kendinden emindir. Akıcılık doğruluğun bir işareti değildir: yanlış bir satır da aynı özgüvenle yazılır.

Var olmayan bir metodu ya da ayarı kendinden emin bir dille üretmeye hallucinationBir dil modelinin var olmayan bir API'yi, parametreyi ya da kaynağı kendinden emin bir dille üretmesi. Çıktı akıcı olduğu için fark etmek zordur.Sözlükte gör → denir. Derleyici bir kısmını yakalar; yapılandırma dosyaları ve string sorgulardaki uydurmaları yakalamaz.

Kodu kim yazmış olursa olsun, commit eden sorumludur.

Kafam karıştı, daha basit anlat

AI yanlış bir satırı da doğru bir satır kadar kendinden emin yazar. Akıcı görünmesi doğru olduğu anlamına gelmez.

Hızlı kontrolBaşlangıç

AI'ın önerdiği bir kodu projeye alırken sorumluluk kimdedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

AI, `orderRepository.findAllByUserIdWithinDays(userId, 30)` diye bir metot çağırdı ama projede böyle bir metot yok. Bu hata türünün adı ve onu yakalayan en ucuz katman ne?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Hangi kontrol neyi görür?

AI'ın yazdığı kod derleniyor ve AI'ın yazdığı testler geçiyor. Kod güvenli mi? Cevabı göster

Bilinmez. Testler yalnızca sordukları soruya cevap verir. String birleştirmeyle kurulmuş bir SQL sorgusu bütün testleri geçip yine de açık bırakır.

Her elek başka bir taşı tutar.
Adım adım oku
  1. Derleyici var olmayan bir metodu hemen yakalar.
  2. Testler, sordukları soruda beklenenden sapan davranışı yakalar; bir günlük kayma gibi.
  3. Statik analiz, metne eklenmiş bir SQL parametresi gibi bilinen tehlikeli kalıpları yakalar.
  4. İnsan incelemesi niyeti ve maliyeti görür: her kayıt için ayrı sorgu ya da gereksiz bir kütüphane.
KatmanGördüğüGöremediği
DerlemeUydurma metot, yanlış tipMantık, güvenlik
TestlerBeklenen davranıştan sapmaSorulmayan sorular
SASTStatic Application Security Testing: kodu çalıştırmadan güvenlik açığı kalıplarını (SQL injection, sabit şifre) arayan analiz. Semgrep, SpotBugs FindSecBugs, CodeQL örnek.Sözlükte gör → / statik analizBilinen tehlikeli kalıplarNiyet, bağlam
İnsan incelemesiNiyet, maliyet, takasYorgunluk, büyük diff
Kafam karıştı, daha basit anlat

Her kontrol aracı farklı bir şeyi görür. Testler yalnızca sordukları soruya cevap verir, güvenlik açığı gibi sormadıkları şeyleri göremezler.

Hızlı kontrolOrta

AI'ın yazdığı kod derleniyor ve AI'ın yazdığı testler geçiyor. Bu neyi kanıtlar?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Her sorunu, onu en güvenilir biçimde yakalayan katmanla eşleştir.

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Sınıflandırılmamış

Derleme

Tip ve sembol hataları

    Testler

    Beklenen davranışla karşılaştırma

      Statik analiz / SAST

      Bilinen tehlikeli kalıplar

        İnsan incelemesi

        Niyet, bağlam ve takas kararları

          Kendin gör

          AI kodunu gözden geçirmek — hangi katman neyi yakalar?

          Tohum 682206
          OrderQueries.java (AI önerisi)
          1import org.apache.commons.lang3.StringUtils; // yeni bağımlılık
          2public List<OrderDto> recentOrders(long userId, String status, int page) {
          3 var since = LocalDate.now().minusDays(30).atStartOfDay().plusDays(1);
          4 var ids = orderRepository.findAllByUserIdWithinDays(userId, 30);
          5 try {
          6 var sql = "select * from orders where user_id = ? "
          7 + "and created_at >= ? "
          8 + "and status = '" + status + "'";
          9 var orders = jdbc.query(sql, orderMapper, userId, since);
          10 return orders.stream()
          11 .map(o -> toDto(o, o.getItems())) // her sipariş için bir sorgu
          12 .skip(page * 20L).limit(20)
          13 .toList();
          14 } catch (Exception e) { return List.of(); }
          15}
          Java 21UTF-8LF
          • Derlemebekliyor
          • Testler (sınır durumlarıyla)bekliyor
          • Statik analiz / SASTbekliyor
          • İnsan incelemesi (kontrol listesiyle)bekliyor
          Hız
          Adım 0

          Şu an ne oldu?

          "Kullanıcının son 30 gündeki siparişlerini sayfalı getir"

          AI'ın önerdiği metot okunaklı ve kendinden emin görünüyor. İçinde altı farklı türde sorun var.

          Görevler0/3

          • Derlenen kodla beş sorunu yayına çıkaraçık

            İpucu

            Yalnızca derleyiciye güven.

          • Testler geçsin ama SQL injection yine de yayına çıksınaçık

            İpucu

            Testlerin sormadığı bir soruyu hangi katmanlar sorar?

          • Altı sorunun hiçbiri yayına çıkmasınaçık

            İpucu

            Her sorunu en az bir katmanın görmesi gerekiyor.

          Olay günlüğü (0)

          Henüz olay yok. Oynat veya adımla.

          1. Varsayılanla oynat. Yalnızca derleme: bir sorun yakalandı, beşi yayında.
          2. Testleri aç. Sınır hatası yakalandı; güvenlik açığı hâlâ geçiyor.
          3. Statik analizi aç. SQL injection ve yutulan hata yakalandı.
          4. İnsan incelemesini aç. N+1 ve gereksiz bağımlılık da yakalandı.
          Hızlı kontrolOrta

          AI'ın önerdiği bu sorgu derleniyor ve testlerde çalışıyor. Hangi satır bir güvenlik açığı?

          Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

          Hatalı satıra dokun, sonra kontrol et.

          OrderQueries.java
          Java 21UTF-8LF

          Satır satır: bir öneriyi okumak

          Okunaklı, kendinden emin — ve altı sorunlu

          OrderQueries.java
          şu an çalışan satırimport org.apache.commons.lang3.StringUtils;
          2public List<OrderDto> recentOrders(long userId, String status, int page) {
          3 var since = LocalDate.now().minusDays(30).atStartOfDay().plusDays(1);
          4 try {
          5 var sql = "select * from orders where user_id = ? and created_at >= ? "
          6 + "and status = '" + status + "'";
          7 return jdbc.query(sql, orderMapper, userId, since).stream()
          8 .map(o -> toDto(o, o.getItems()))
          9 .skip(page * 20L).limit(20)
          10 .toList();
          11 } catch (Exception e) { return List.of(); }
          12}

          Debug

          Adım 1/5

          inceleme Yeni bir kütüphane. Tek bir yardımcı metot için mi? Bakımı, lisansı, adı doğru mu?

          Java 21UTF-8LF1:1

          Sol/sağ ok tuşlarıyla da gezebilirsin.

          Her satırı açıklayabildiğinde kabul et. Açıklayamıyorsan, AI’dan açıklamasını iste ve doğrula.

          Aynı okumayı bir bankada deneyelim. Asistan EFT ücretini hesaplayan küçük bir metot önerdi; öneriyi, inceleme notlarını ve son hâlini yan yana görebilirsin.

          Derinleş · EFT ücreti: öneriden birleştirilen koda 4 dosya · ~60 satır · ilk okumada atlayabilirsin
          Proje dosyaları

          pr-1482/ EftFeeCalculator.diff Asistanın önerisi: derlenir ve düzgün görünür.

          pr-1482/EftFeeCalculator.diff
          import org.apache.commons.math3.util.Precision;
          // EFT fee: 0.1% of the amount, at least 5 TRY, at most 50 TRY.
          public double eftFee(double amount, String currency) {
          try {
          double fee = Precision.round(amount * 0.001, 2);
          return Math.min(50, Math.max(5, fee));
          } catch (Exception e) {
          return 0;
          }
          }

          pr-1482/ review.md İnceleme notları: her not bir satıra ve bir soruya bağlı.

          pr-1482/review.md
          **Review notes, PR 1482**
          - Line 1: a new library for one rounding call. `BigDecimal.setScale` already does it.
          - Line 4: `currency` is never read. A USD transfer would get the TRY limits.
          - Line 6: money as `double`. 0.001 has no exact binary form; the tariff is in kuruş.
          - Lines 8-9: any error becomes a fee of 0, and nobody hears about it.
          - Tests: none at exactly 5,000 or 50,000 TRY, where the limits take over.

          src/main/java/com/bank/fee/ EftFeeCalculator.java Son hâli: para BigDecimal, para birimi kontrol ediliyor, hata sessizce yutulmuyor.

          src/main/java/com/bank/fee/EftFeeCalculator.java
          // EFT fee: 0.1% of the amount, at least 5.00 TRY, at most 50.00 TRY.
          final class EftFeeCalculator {
          private static final Currency TRY = Currency.getInstance("TRY");
          private static final BigDecimal RATE = new BigDecimal("0.001");
          private static final BigDecimal MIN_FEE = new BigDecimal("5.00");
          private static final BigDecimal MAX_FEE = new BigDecimal("50.00");
          Money fee(Money amount) {
          if (!amount.currency().equals(TRY)) {
          // EFT only moves TRY; anything else is a caller bug and should be loud.
          throw new IllegalArgumentException("EFT fee is defined for TRY, got " + amount.currency());
          }
          BigDecimal fee = amount.value().multiply(RATE).setScale(2, RoundingMode.HALF_UP);
          return new Money(fee.max(MIN_FEE).min(MAX_FEE), TRY);
          }
          }

          src/test/java/com/bank/fee/ EftFeeCalculatorTest.java Beklenen değerler ücret tarifesinden; en az ve en çok sınırları ayrıca soruluyor.

          src/test/java/com/bank/fee/EftFeeCalculatorTest.java
          class EftFeeCalculatorTest {
          private static final Currency TRY = Currency.getInstance("TRY");
          private final EftFeeCalculator calculator = new EftFeeCalculator();
          // Expected values come from the published fee tariff, not from running the code.
          @ParameterizedTest
          @CsvSource({
          "100.00, 5.00", // below the minimum
          "5000.00, 5.00", // exactly where the minimum stops
          "12345.00, 12.35", // 12.345 rounds half up
          "50000.00, 50.00", // exactly where the maximum starts
          "80000.00, 50.00", // above the maximum
          })
          void feeFollowsTheTariff(String amount, String expectedFee) {
          assertThat(calculator.fee(new Money(new BigDecimal(amount), TRY)))
          .isEqualTo(new Money(new BigDecimal(expectedFee), TRY));
          }
          @Test
          void refusesOtherCurrencies() {
          var usd = new Money(new BigDecimal("1000.00"), Currency.getInstance("USD"));
          assertThatThrownBy(() -> calculator.fee(usd)).isInstanceOf(IllegalArgumentException.class);
          }
          }
          Kafam karıştı, daha basit anlat

          Bir satırı kendi cümlenle açıklayabiliyorsan kabul et. Açıklayamıyorsan, açıklamasını iste ve söyleneni kendin doğrula.

          Hızlı kontrolOrta

          AI'ın önerdiği değişiklik 600 satır ve 14 dosyaya dokunuyor. En iyi yaklaşım hangisi?

          Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

          Tuzaklar

          Büyük diff’i onaylamak. 600 satırı kimse gerçekten okumaz; parçalara böldür.

          AI’a kendi kodunu onaylatmak. Aynı kaynak aynı körlüğü paylaşabilir.

          Testi yeşile çeviren “düzeltme”. Beklenen değer değiştiyse hata düzelmedi, kanıtı silindi.

          Fark edilmeyen bağımlılık. Her yeni kütüphane bir supply chain riskProjeye eklenen her bağımlılığın getirdiği risk: bakımsız kütüphane, lisans uyumsuzluğu, ele geçirilmiş paket. AI önerileri bağımlılık eklemeyi çok kolaylaştırır.Sözlükte gör →’tir; ayrı bir karar olmalı.

          Hızlı kontrolOrta

          AI bir yardımcı metot için projeye yeni bir kütüphane ekledi. İncelemede neye bakarsın?

          Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

          Kendini sına

          Şimşek turu1/5

          Akıcı ve kendinden emin yazılmış kod büyük ihtimalle doğrudur.

          Soru 1/2İleri

          Bir test kırmızıya döndü; AI'dan düzeltmesini istedin ve AI testin beklenen değerini değiştirerek testi yeşile çevirdi. Ne yaparsın?

          Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

          Aklında kalacak üç şey

          1. 1 Kodu kimin yazdığı sorumluluğu değiştirmez. Açıklayamadığın bir satırı commit etme.
          2. 2 Derlenmek ve testleri geçmek, yalnızca testlerin sorduğu sorulara cevap vermektir. Güvenlik ve maliyet sorunları çoğu zaman o soruların dışındadır.
          3. 3 Her kontrol katmanı farklı bir hata türünü görür. Yapay zekânın kodu da aynı katmanlardan, en az aynı dikkatle geçmelidir.
          Sonraki kapı Asistana aynı isteği iki farklı şekilde yazdın, biri harika sonuç verdi, öbürü berbat. Fark neydi? Bağlam ve Görev Tarifi — Yazmadığın Her Karar Bir Tahmindir · 7 dk

          5 kart sonraki derste seni bekliyor

          0/5 kart bu dersten toplandı