Vibe Coding vs Developer-Driven AI: Production'da Fark
Son aylarda "vibe coding" kavrami cok populer oldu. Terim Andrej Karpathy'den geliyor: "AI'a prompt veriyorsun, cikan kodu kabul ediyorsun, calisiyor gibi gorunuyorsa devam ediyorsun." Kulaga guzel geliyor, ozellikle prototip asamasinda. Ama production'a ciktiginda is degisiyor.
Bu yazida iki yaklasimi karsilastiracagim: Vibe coding (AI ciktisini kor kabul etme) ve developer-driven AI (once mimar ol, sonra AI'i hizli pair programmer olarak kullan). Arada nasil bir ucurum oldugunu rakamlarla goreceksiniz.
Rakamlar Ne Diyor?
Arastirmalar rahatsiz edici sonuclar gosteriyor:
- AI tarafindan uretilen kodun %45'inde en az bir guvenlik acigi var (GitClear 2025 raporu)
- AI ile yazilan kod, insan koduna gore 2.74 kat daha fazla zafiyet iceriyor (Stanford/NYU arastirmasi)
- AI kullanan gelisriciler, guvenlik acigi iceren kodu daha guvende sandiklari tespit edildi (yani farkinda bile degiller)
- Churn rate (yazilip kisa surede silinen/degistirilen kod orani) AI ile %39 artti
Bu rakamlar "AI kotu" demiyor. "AI'i kor kullanmak tehlikeli" diyor.
Vibe Coding Nedir?
Vibe coding'in tanimini net koyalim:
- AI'a ne istedigini soyluyorsun (genellikle belirsiz bir prompt)
- AI kodu uretiyor
- Calisiyorsa kabul ediyorsun
- Hata varsa "bunu duzelt" diyorsun
- Kodu derinlemesine incelemiyorsun
- Mimari karar vermiyorsun, AI ne yapiyorsa o
Ornek vibe coding prompt'u:
Bana bir e-ticaret sitesi yap. Urun listeleme, sepet ve
odeme sayfasi olsun. Laravel kullan.
Bu prompt'la gelen kod calisabilir. Ama:
- SQL injection acigi olabilir
- N+1 query problemi olabilir (100 urun = 101 sorgu)
- Mass assignment korunmamis olabilir
- CSRF korumasiz formlar olabilir
- Hardcoded credentials olabilir
- Test olmaz (hic)
- Error handling minimal olur
Developer-Driven AI Nedir?
Developer-driven yaklasimda AI bir arac, siz mimarsiniz:
- Oncefikri siz belirlersiniz: Mimari, pattern'ler, teknoloji secimi
- Kurallari siz koyarsiniz: CLAUDE.md, .cursorrules, coding standards
- Kucuk parcalara bolersiniz: Tek seferde tum projeyi degil, tek bir feature'i
- Test yazarsiniz (veya AI'a yazdirirsiniz, ONCE)
- Review edersiniz: AI'in urettigi her satiri anlamaniz gerekir
- Iteratif ilerlersiniz: Yaz -> test et -> duzelt -> refactor
Ayni e-ticaret ornegini developer-driven yapalim:
# Adim 1: Mimari karar
"Product model olustur. SoftDeletes kullan.
Kolonlar: name, slug (unique), description (text),
price (decimal 10,2), stock_quantity (unsigned int),
category_id (foreign key), is_active (boolean, default true).
$fillable tanimla, $casts ekle. Factory yaz."
# Adim 2: Test once
"ProductController@index icin feature test yaz:
- Aktif urunleri listeledigini dogrula
- Inaktif urunleri listelemedigini dogrula
- Kategoriye gore filtrelemeyi test et
- Sayfalama calistigini test et"
# Adim 3: Implementasyon
"Testleri geciren ProductController@index yaz.
Eager loading kullan (category iliskisi).
ProductResource ile response don."
# Adim 4: Guvenlik
"ProductStoreRequest form request yaz.
Tum validasyonlari ekle. authorize() method'unda
Policy kontrolu yap."
Fark goruyorsunuz degil mi? Her adimda ne yapilacagi net, kontrol sizde, AI hiz katici.
Gercek Dunyadan Ornekler
Ornek 1: Authentication
Vibe coding yaklasimiyla:
"Login sistemi yap"
AI muhtemelen sunu uretir:
// TEHLIKELI KOD - BUNU YAPMAYIN
public function login(Request $request)
{
$user = User::where('email', $request->email)->first();
if ($user && Hash::check($request->password, $user->password)) {
$token = $user->createToken('api')->plainTextToken;
return response()->json(['token' => $token]);
}
return response()->json(['error' => 'Invalid credentials'], 401);
}
Sorunlar:
- Rate limiting yok (brute force'a acik)
- Login attempt logging yok
- Account lockout yok
- IP bazli koruma yok
$request->emailvalidate edilmemis
Developer-driven yaklasimiyla:
"Laravel Breeze'in auth mekanizmasini kullan.
RateLimiter ile dakikada 5 deneme siniri koy.
Basarisiz giris denemelerini logla.
5 basarisiz denemeden sonra hesabi 15 dk kilitle.
Login FormRequest ile email ve password validate et."
Sonuc cok farkli olur cunku spesifik guvenlik gereksinimleri belirttiniz.
Ornek 2: Dosya Yukleme
Vibe coding:
// AI'in saf urettigi kod
public function upload(Request $request)
{
$path = $request->file('image')->store('uploads');
return response()->json(['path' => $path]);
}
Sorunlar:
- Dosya tipi kontrolu yok (.php yuklenebilir!)
- Boyut siniri yok
- Dosya adi sanitize edilmemis
- Public path'e yuklenebilir
Developer-driven:
public function upload(UploadImageRequest $request)
{
// FormRequest'te validate edilmis:
// 'image' => ['required', 'image', 'mimes:jpg,png,webp', 'max:5120']
$path = $request->file('image')->store(
path: 'images/' . now()->format('Y/m'),
options: 'private' // public degil!
);
return ApiResponse::success(['path' => $path], status: 201);
}
CLAUDE.md ile Kurallari Belirleme
Developer-driven AI'in en guclu araci: kurallari ONCEDEN belirlemek.
# CLAUDE.md
## Guvenlik Kurallari (KIRMIZI CIZGI)
- Kullanici girdisi ASLA validate edilmeden kullanilmaz
- Raw SQL ASLA yazilmaz (Eloquent/Query Builder kullan)
- File upload'da MUTLAKA mime type ve boyut kontrolu
- .env degerleri ASLA hardcode edilmez
- CSRF korumasiz form OLMAZ
- Mass assignment: $guarded = [] YASAK, $fillable tanimla
- Password validation: min 8, letters, numbers, uncompromised
## Pattern Kurallari
- Controller'da is mantigi OLMAZ, Service katmanina tasi
- Validation Controller'da degil FormRequest'te
- Database query Controller'da degil Repository veya Service'te
- Her endpoint icin Feature test SART
Bu kurallar yazildiktan sonra Claude Code bu cizgileri asmaz. "Login sistemi yap" deseniz bile kurallara uygun kod uretir.
Test: Guvenilik Agi
TDD, AI ile calisirken en buyuk guvence:
// Testi ONCE yazin veya AI'a yazdirin
public function test_user_cannot_upload_php_file(): void
{
$file = UploadedFile::fake()->create('malicious.php', 100);
$response = $this->actingAs($this->user)
->postJson('/api/v1/upload', ['image' => $file]);
$response->assertStatus(422);
$response->assertJsonValidationErrors(['image']);
}
public function test_user_cannot_upload_oversized_file(): void
{
$file = UploadedFile::fake()->image('large.jpg')->size(10240); // 10MB
$response = $this->actingAs($this->user)
->postJson('/api/v1/upload', ['image' => $file]);
$response->assertStatus(422);
}
public function test_login_is_rate_limited(): void
{
for ($i = 0; $i < 6; $i++) {
$response = $this->postJson('/api/v1/login', [
'email' => '[email protected]',
'password' => 'wrong',
]);
}
$response->assertStatus(429); // 6. denemede rate limit
}
Bu testler yazildiktan sonra AI ne uretirse uretsin, testler gecmiyorsa kabul etmezsiniz.
Nerede Vibe Coding Sorun Degil?
Her sey siyah-beyaz degil. Vibe coding'in sorunsuz oldugu yerler var:
1. Kisisel Script'ler
"CSV dosyasini oku, email kolonunu cikart,
tekrarlayanlari sil, yeni CSV'ye yaz"
Bunu kimse hacklemeyecek. Calisiyorsa tamam.
2. Prototip / PoC
Bir fikri test etmek istiyorsaniz, vibe coding ile 1 saatte prototip cikarirsiniz. Ama production'a tasirken sifirdan, developer-driven yapin.
3. Ogrenme Amacli
Yeni bir teknoloji ogrenirken AI'a "su pattern'i goster" demek gayet mantikli. Ama ogrendiginizi anlamaniz lazim.
4. Tek Kullanimlik Araclar
Bir kerelik veri migrasyon script'i, temp dashboard, deploy script'i. Yasam suresi kisa, risk dusuk.
Laravel Avantaji
Laravel, AI ile calisirken buyuk avantaj sagliyor. Neden?
Convention over configuration. Laravel'in beklenen kaliplari var:
- Controller'lar
app/Http/Controllers/altinda - Model'ler
app/Models/altinda - Route'lar
routes/web.phpveroutes/api.php'da - Validation
FormRequestile
AI bu convention'lari biliyor. "Laravel'de Post model olustur" dediginizde dogru yere dogru kodu koyar. Cunku binlerce Laravel projesi gormis. Bu, framework'suz bir PHP projesine kiyasla cok daha tutarli sonuclar verir.
Eloquent ORM. AI'in SQL injection yapma riski duser cunku Eloquent zaten parameterized query kullaniyor. Ama raw query yazmasini isteseniz risk artar.
Artisan komutlari. php artisan make:model, make:controller, make:request gibi komutlar scaffold uretiyor. AI bunu biliyor ve bu scaffold uzerine insa ediyor. Sifirdan yazmiyor.
Kontrol Listesi
Her AI-uretilen kodu kabul etmeden once su listeyi gecin:
[ ] Input validation var mi?
[ ] SQL injection riski var mi? (raw query kullanilmis mi?)
[ ] Authentication/Authorization kontrolu var mi?
[ ] Rate limiting uygulanmis mi?
[ ] Dosya upload guvenli mi? (mime type, boyut, path)
[ ] Sensitive data (password, token) loglanmiyor degil mi?
[ ] Error handling var mi? (try-catch, fallback)
[ ] N+1 query problemi var mi?
[ ] Test yazilmis mi?
[ ] .env'den alinmasi gereken degerler hardcoded mi?
Bu listeyi CLAUDE.md'ye koyun, AI bile buna uyar.
Sonuc
Vibe coding eglenceli, hizli ve tatmin edici. Ama production kodu icin yeterli degil. Rakamlar bunu acikca gosteriyor: AI-uretilen kodda 2.74 kat daha fazla guvenlik acigi.
Developer-driven AI ise farkli bir deneyim. Siz dusunuyorsunuz, AI hizla implement ediyor. Siz test yaziyorsunuz, AI kodu testlere uyduruyor. Siz kurallari belirliyorsunuz, AI o kurallara uyuyor.
Sonuc olarak: AI kodlama hizinizi 3-5 kat artirabilir. Ama bunu "mimar sen ol, AI implement etsin" diyerek yaparsaniz. "AI her seyi yapsın, ben izleyeyim" derseniz, bugfix icin harcadiginiz zaman kazandiginizi yer.
ProjeMan'da biz ikinci yolu seciyoruz. CLAUDE.md ile kurallarimizi belirliyoruz, TDD ile guvenlik agimizi kuruyoruz ve AI'i "kıdemli gelistirici asistan" olarak kullaniyoruz. Tavsiyem: siz de oyle yapin.