Ajanik Kodlamada Geliştirici Yetkinliğinin Rolü
(martinfowler.com)- Ajan tabanlı kodlama asistanları daha yetkin hale geldikçe tepkiler de oldukça çeşitleniyor; bazıları "1 yıl içinde geliştiricilere artık ihtiyaç kalmayacak" iddiasında bulunuyor
- Diğerleri ise yapay zekanın ürettiği kodun kalitesi ve junior geliştiricilerin bu değişen ortama nasıl hazırlanacağı konusunda kaygılarını dile getiriyor
- Son birkaç ayda Cursor, Windsurf, Cline gibi ajan tabanlı kodlama yardımcıları kullanıldı ve bunların mevcut kod tabanında değişiklik yapmada çok etkili olduğu görüldü
- IDE entegrasyonu özellikle etkileyiciydi; test çalıştırma ve otomatik hata düzeltme, lint/derleme hatalarını tespit edip giderme, web araması ve tarayıcı önizleme özellikleri bile entegre durumda
- Geliştirici ile yapay zeka arasındaki iş birliği deneyimi oldukça etkileyici ve sorunların hızlı çözümüne, özelliklerin uygulanmasına katkı sağlıyor
- Ancak yine de geliştiricinin sürekli müdahalesi, düzeltmesi ve yön vermesi gerekiyordu
- Gerçek commit'e dönüşmeyen pek çok durum da oldu; yapay zeka, kendi başına önemsiz olmayan işler için kod yazma konusunda hâlâ yetersizdi
- Bu nedenle geliştiricinin becerisi ve deneyimi hâlâ önemini koruyor ve gelecekte de sürekli eğitilmesi gerekiyor
Geliştiricinin Doğrudan Müdahale Etmek Zorunda Kaldığı Anlar
- Yapay zeka araçları belirli alanlarda sürekli zayıf performans gösterdi ve bu durum tekrar tekrar doğrulandı
- Bazı sorunlar ek prompt'lar veya özel kurallarla kısmen hafifletilebilse de tam kontrol mümkün değil
- LLM'ler çoğu zaman prompt'taki talimatları tam olarak takip etmiyor
- Kodlama oturumu uzadıkça çıktıların tutarlılığı düşüyor
- Bu yüzden aşağıda verilen örnekler, prompt veya ayarlardan bağımsız olarak yeterince ortaya çıkabilecek sorunlar
- Yapay zeka hataları, etki alanına göre 3 kategoriye ayrılıyor
- a. Geliştirme hızının ve commit süresinin düşmesi
- Yapay zeka bazen hızı artırmak yerine yavaşlatıyor
- Yardımsız kodlamadan daha verimsiz olduğu durumlar var
- b. Takım iş akışında sürtünme yaratması
- Tek bir iteration içinde çakışmalar veya iş birliği sorunları doğabiliyor
- c. Uzun vadeli kod bakım yapılabilirliğinin bozulması
- Başta sorun yokmuş gibi görünse de gelecekte değişiklik veya genişletme sırasında problemler çıkıyor
- a. Geliştirme hızının ve commit süresinin düşmesi
- Etki alanı büyüdükçe, takımın bu sorunu fark edip düzeltmesine yönelik geri bildirim döngüsü uzuyor
Etki Alanı: Commit'e Kadar Geçen Sürenin Uzaması
- Bu kategori, yapay zekanın yardımcı olmak yerine engel olduğu örneklerden oluşuyor
- En açık başarısızlık biçimi olduğu için çok büyük bir sorun sayılmıyor
- Çoğu durumda geliştirici, sorunu commit öncesi aşamada fark edip engelleyebiliyor
-
Çalışmayan kod
- Yapay zekanın ürettiği kod temelde çalışmıyor
- Geliştiricinin bunu doğrudan düzeltmesi ya da AI oturumunu kapatıp elle sorunu çözmesi gerekiyor
- Deneyimli geliştiriciler, neyin yanlış gittiğini hızla teşhis edip müdahale edebiliyor
-
Sorunun yanlış teşhis edilmesi
- Yapay zeka sorunun nedenini yanlış değerlendirip tamamen alakasız bir yönde çözüm deniyor
- Geçmiş deneyime dayanarak geliştirici, yapay zekayı yanlış yoldan geri çekebildi
Örnek: Docker build hatasını mimari ayar sorunu sanıp konfigürasyonu değiştirmesi
Asıl neden, yanlış mimaride build edilmişnode_modulesklasörünün kopyalanmasıydı
Geçmişte sık karşılaşılan bir sorun olduğu için bu durum hızlıca fark edilip düzeltilebildi
Etki Alanı: Iteration İçindeki Takım İş Akışı
- Bu kategori, review veya geliştirici müdahalesinin yetersizliği nedeniyle iteration süresi boyunca takım içinde sürtünme oluşan durumları kapsıyor
- Yazar, geçmişte farklı takımlarda edindiği deneyim sayesinde bu sorunları commit'ten önce fark edip ayarlayabildi
- Yeni geliştiriciler de yapay zeka ile deneme-yanılma yaşayarak bu dersleri öğrenebilir
- Ancak yapay zeka nedeniyle kodlama hızı artarsa, takım bu sorunları taşımakta zorlanabilir
-
Aşırı erken çalışma
- Yapay zeka, kademeli uygulama yerine tüm özelliği tek seferde geniş kapsamlı biçimde ele alma eğiliminde
- Bu nedenle teknik seçimler uygunsuzsa ya da gereksinimler yanlış anlaşılmışsa, çok fazla iş boşa gidebilir
Örnek: Frontend stack migration sırasında tüm UI bileşenlerini tek seferde dönüştürmeye çalışması
Oysa backend ile entegre olan tek bir bileşenden başlayıp kademeli ilerlemek gerekiyordu
-
Kök nedeni analiz etmeden rastgele çözüm üretme
- Yapay zeka, sorunun temel nedenini analiz etmeden, sadece dışarıdan görünen hatayı çözmeye çalışıyor
- Sonrasında sorunu devralan başka bir ekip üyesi, bağlam olmadan sorunu yeniden analiz etmek zorunda kalıyor
Örnek: Docker build sırasında bellek hatası olduğunda, nedeni bulmak yerine yalnızca bellek ayarını artırması
-
Geliştirici iş akışını karmaşıklaştırma
- Yapay zekanın ürettiği build/çalıştırma biçimi geliştirici deneyimini kötüleştiriyor
- Bu kodlar hemen commit edilirse diğer ekip üyelerinin iş akışını da olumsuz etkiliyor
Örnek: Frontend ve backend'i ayrı ayrı çalıştırmak için farklı komutlar sunması
Örnek: hot reload özelliğinin eksik olması
Örnek: Karmaşık build ayarlarının hem geliştiriciyi hem de yapay zekayı şaşırtması
Örnek: Docker hatalarını önceden yakalayamayıp hatayı build'in sonlarına doğru ele almaya çalışması
-
Yanlış anlaşılmış veya eksik gereksinimler
- Özellik gereksinimleri net verilmezse yapay zeka yanlış anlayıp bambaşka bir yönde implementasyon yapabiliyor
- Başta müdahale edip düzeltmek ideal olsa da, ister otonom yapay zeka ister düşüncesiz geliştirici olsun, sonraki düzeltme maliyeti artıyor
- Bu tür yanlış implementasyonlar daha sonra story ilerlerken ortaya çıkıp çok sayıda düzeltme işi ve iletişim maliyeti doğuruyor
Etki Alanı: Uzun Vadeli Bakım Yapılabilirliğinin Bozulması
- Bu, en sinsi ve tehlikeli etki alanı
- Başlangıçta kod sorunsuz çalışıyor gibi görünse de daha sonra değiştirmek ve genişletmek zorlaşıyor
- Bu sorunlar çoğu zaman haftalar ya da aylar sonra fark ediliyor
- Özellikle bu alanda, yazarın 20 yılı aşkın geliştirme deneyimi en fazla etkili olmuş
-
Uzun ve tekrarlı test kodu
- Yapay zeka test üretmede iyi olsa da şu sorunlar sık görülüyor:
- Mevcut testlere entegre etmek yerine yeni test fonksiyonları oluşturması
- Zaten kapsanmış kısımlar için bile aşırı sayıda assertion eklemesi
- Yeni başlayan geliştiricilerin yanlış anlayabileceği nokta: Daha fazla test ≠ daha iyi test
- Tekrar arttıkça bakım zorlaşıyor ve kod değiştiğinde toplu test başarısızlıkları yaşanma olasılığı artıyor
- Özel komutlarla bunu hafifletmeye çalışılsa da sorun yine de sık yaşanıyor
- Yapay zeka test üretmede iyi olsa da şu sorunlar sık görülüyor:
-
Yeniden kullanılabilirliğin zayıf olması
- Yapay zekanın yazdığı kod çoğu zaman yeterince modüler olmadığı için yeniden kullanılamıyor
Örnek: Zaten var olan UI bileşenlerini fark etmeyip aynı şeyi yeniden implemente etmesi
Örnek: CSS class'ları kullanmak yerine aşırı inline style kullanması
- Yapay zekanın yazdığı kod çoğu zaman yeterince modüler olmadığı için yeniden kullanılamıyor
-
Gereğinden fazla karmaşık veya uzun kod
- Yapay zeka sık sık gereğinden fazla kod üretiyor ve gereksiz kısımların elle temizlenmesi gerekiyor
- Bu da bakım maliyetini yükseltiyor ve değişiklik sırasında hata olasılığını artırıyor
Örnek: CSS değişikliğinde çok sayıdaki yinelenen stili tek tek silmek zorunda kalınması
Örnek: JSON verisini göstermek için gereksiz derecede karmaşık bir web component oluşturulması
Örnek: Refactoring sırasında mevcut dependency injection zincirini fark etmeyip,
zaten enjekte edilmiş değeri bir kez daha başka bir parametre olarak geçirerek tasarımı karmaşıklaştırmasıvalue = service_a.get_value(); ServiceB(service_a, value=value)biçimi
Sonuç: Yapay zeka tüm kodu gerçekten yazabilir mi?
- Şimdiye kadarki deneyime bakıldığında, 1 yıl içinde yapay zekanın tüm kodun %90'ını otonom biçimde yazması gerçekçi görünmüyor
- Buna karşılık, kod yazımında yardımcı rol olarak bazı ekiplerde ve kod tabanlarında %90 düzeyinde destek sunma ihtimali var
- Nitekim yazar, 15K LOC büyüklüğünde orta karmaşıklıktaki bir projede yaklaşık %80 oranında yapay zeka desteği aldığını belirtiyor
Yapay zekanın hatalarını önlemek için yapılabilecekler
-
Bireysel geliştirici düzeyinde yapılabilecekler
- Yapay zekanın ürettiği kodu her zaman dikkatle gözden geçirin
- Düzeltilmesi gerekmeyen durum neredeyse hiç yok
- AI oturumu kafa karıştırıcı hale gelirse hemen durdurun
- Prompt'u değiştirin ya da tamamen elle çalışmaya geçin (bazen buna "el yapımı kodlama" da deniyor)
- Kısa sürede mucize gibi ortaya çıkan "makul görünen" çözümlere karşı dikkatli olun
- Uzun vadeli bakım maliyetleri gizli olabilir
- Pair programming uygulayın
- 4 göz, 2 beyin daha iyi kararlar verir
- Yapay zekanın ürettiği kodu her zaman dikkatle gözden geçirin
-
Takım ve organizasyon düzeyinde karşılık verme stratejileri
- Mevcut kod kalite izleme araçlarını aktif biçimde kullanın
- Örn. Sonarqube, Codescene
- AI araçları kullanılırken kod tekrarı, code smell vb. daha yakından izlenmeli
- Pre-commit hook'ları ve IDE entegre code review ayarları kurun
- Sorunları geliştirme sürecinin erken safhasında yakalamaya yönelik shift-left stratejisini güçlendirin
- İyi kod kalitesi alışkanlıklarını yeniden tesis edin
- Takım içinde yapay zeka kodu nedeniyle yaşanan sorun örneklerini ("Go-wrong log") haftalık retrospektifte paylaşın
- Özel kurallardan aktif biçimde yararlanın
- Çoğu yapay zeka aracı, prompt ile birlikte iletilen bir kural seti tanımlamaya izin verir
- Takım bu rule set'i birlikte geliştirerek yapay zekanın hatalarını azaltabilir
- Ancak oturum uzadıkça kuralları görmezden gelme olasılığı artar
- Güven ve iletişime dayalı bir takım kültürü oluşturun
- Yapay zeka adaptasyonu yeni bir değişimdir ve herkesin acemi olduğunu kabul etmek gerekir
- "Nasıl olsa AI var, daha hızlı yap" tarzı baskı kalite riskini artırır
- Psikolojik güvenliğin olduğu ekiplerde sorun paylaşımı ve öğrenme daha canlı olur
- Mevcut kod kalite izleme araçlarını aktif biçimde kullanın
4 yorum
Bu aracı kullananlar, yetkinlik düzeylerinden bağımsız olarak sonuçta yine geliştiriciler olacaktır.... Bundan sonra geliştiricilere gerek kalmayacakmış gibi reklam yapılması biraz garip görünüyor.
İleride nasıl olur bilmiyorum ama şimdilik ana akım olarak kullanmak için pek uygun değil gibi geliyor... Geçenlerde Cursor'u denedim, en temel dosya import path'lerini bile düzgün yakalayamıyordu. Yine de yapmak istediğim şeyi belli ölçüde önceden tahmin etmesi biraz şaşırtıcıydı.
Docker build sırasında bellek hatası oluştuğunda, en başta neden bu kadar çok bellek kullanıldığını sormak yerine bellek ayarını artırdım
-> Bu... zaten sayısız örnekte hep böyle yaptığımız için.
-> Şimdiki AI, geçmişteki biziz
Hacker News görüşü
Bu günlerde geliştirmelerin çoğunda Cursor kullanıyorum. Bu yazı benim deneyimime çok benziyor
Ben yapay zekayı şöyle kullanıyorum: IDE'deki bir yazma yardımcısı gibi; bana çok havalı ve gelişmiş bir kauçuk ördek gibi cevap veriyor
Hiç anlamıyorum
Örnek: Docker build sırasında bellek hatası aldığında, en başta neden bu kadar çok bellek kullanıldığını sormak yerine bellek ayarını artırdı
Geliştirici becerileri hâlâ vazgeçilmez — araba kullanamıyorsan direksiyonu da tutamazsın. Peki ya geliştirici enerjisi? Yapay zekadan önce günde yalnızca yaklaşık 2 saat kod yazabiliyordum (gerçek kod yazma süresi). Ama Claude Code kullanınca ara vermeden rahatça 5 saat kod yazabiliyorum. Bisiklet yerine elektrikli bisiklet sürmek gibi hissettiriyor. Yapay zeka, Steve Jobs'un zihin için bisiklet benzetmesi gibi geliyor — beni değiştirmiyor ama artık çok daha uzağa, çok daha hızlı gidebiliyorum
Bu diyagram inanılmaz derecede tanıdık geliyor — bizim ekip burada yazan her maddeyi işaretler. Daha yapay zeka kullanmıyor olmamıza rağmen! Bir de sonunda kullanmaya başladığımızı düşünün...
Bana açık olan şeyi göremiyorum: Etrafımda yapay zeka kullanıyorum
Yapay zekayı çok yönlendirmek gerekiyor, ama daha iyi prompt'ların daha iyi ajanlara yol açacağı konusunda iyimserim
Yapay zeka araçlarının listelediğim şeylerde her zaman kötü olduğunu söyleyerek bir giriş yapmak istiyorum
Martin Fowler artık web sitesinde alan mı kiralıyor?