Özet
- Yapay zeka kod yazımının önemli bir bölümünü otomatikleştirirken, geliştiricinin temel rolü doğrudan uygulamadan tasarım, doğrulama ve kontrole kayıyor.
- Programcılığın özü çok kod yazmak değil, belirsiz gereksinimlerin ayrıntılarını doldurup bunları yeniden kullanılabilir biçimde soyutlamaktır.
- Yapay zekaya ayrıntılı uygulama yöntemleri dikte etmektense hedefi ve bağlamı sunup kararı ona devretmek daha etkilidir.
- Yapay zeka işleri tek seferde yürütmek yerine çıktıları belirtim, test, uygulama, refactoring ve doğrulama olarak ayırmak kaliteyi artırır.
- Yapay zekanın çıktısı deterministik olmadığından testler, derleyici, linter ve doğrulama kapıları gibi deterministik bir harness gerekir.
- Geleceğin geliştiricisinin, basit bir kod yazarı değil, yapay zeka ajanlarıyla doğrulama sistemlerini bağlayan bir sistem tasarımcısı ve harness mühendisine daha yakın olacağı öngörülüyor.
Giriş
Yapay zekanın sarstığı geliştirici kimliği
-
Yapay zeka yalnızca doğal dil talimatlarıyla yüzlerce satır kod üretirken, mevcut geliştirme yetkinliklerine dair ölçütler değişiyor.
-
Geçmişte boş bir editörde hızlı kod yazabilme yeteneği, geliştiricinin başlıca rekabet gücü olarak görülüyordu.
-
Bugün bilgi ve uygulama yöntemlerini yapay zeka sağlarken şu sorular ortaya çıkıyor.
- Kodu doğrudan yazmadan da buna geliştirme denebilir mi?
- Yapay zeka uygulamanın ayrıntılarını ele alırsa geliştiriciye hangi rol kalır?
- Geleneksel bilgisayar bilimi bilgisi ve programlama tarihi bugün hâlâ gerekli mi?
-
Yazı bu meseleyi ayrıntı, soyutlama, nedensizlik ve harness kavramları etrafında açıklıyor.
Programlama tarihinin anlamı
- Geçmişteki programlama bilgisi, basit bir teknikler listesi değil; dönemin geliştiricilerinin sorun çözüp yeni soyutlama katmanları oluşturma süreciydi.
- Makine dili, assembly, structured programming, nesne yönelimli yaklaşım ve framework'ler, alt katmanların karmaşıklığını gizlemek için ortaya çıktı.
- Eski teknolojileri doğrudan kullanmıyor olsak da, bu tarihi anlamak geliştirici rolünün zaman içinde nasıl tekrar tekrar değiştiğini görmeyi sağlar.
Ana bölüm
1. Geliştirici, ayrıntıları somutlaştıran kişidir
-
Ürün planlaması genelde ürünün amacıyla genel yönünü verir, ancak gerçek uygulama için gereken tüm koşulları belirtmez.
-
Örneğin “nickname düzenleme” gibi basit bir özellikte bile şu ayrıntılar vardır.
- Boş string'e izin verilip verilmeyeceği
- Özel karakterler ve emoji'lerin nasıl ele alınacağı
- Ağ hataları ve geciken yanıtların nasıl işleneceği
- Düzenleme sırasında ekrandan çıkıldığında ne olacağı
- Hata mesajının yeri ve ifade biçimi
-
Geliştiricinin işi, bu boşlukları mantıksal kurallar ve istisna işleme ile somutlaştırma sürecidir.
-
Bu nedenle geliştiricinin uzmanlığı basit özellik uygulamaktan çok belirsiz gereksinimleri tamamlanmış sistem davranışına dönüştürebilme yeteneğinde yatar.
2. Soyutlama, çözülmüş ayrıntıları gizleme sürecidir
-
Geliştiriciler tekrar eden işleri azaltmak için bir kez çözdükleri sorunları function, module, library ve framework gibi yapılara paketler.
-
Soyutlamanın özü şudur.
- Tekrarlayan iç davranışları gizlemek
- Dışarıya yalnızca gerekli işlevleri açmak
- Değişebilir kısımlarla sabit kalacak kısımlar arasındaki sınırı belirlemek
-
Sağlam soyutlamalar biriktikçe yeni katmanlar oluşur ve üst katmandaki geliştiriciler alt düzey uygulamanın tamamını bilmeden de çalışabilir.
-
Bugünkü geliştirme ortamı, önceki kuşak geliştiricilerin kurduğu soyutlama katmanları üzerinde çalışıyor.
3. Geliştiricinin ihtiyaç duyduğu derinlik, bulunduğu konuma göre değişir
-
Tüm soyutlamalar tamamlanmış değildir.
-
İç uygulamayı istikrarlı biçimde gizleyebilen katmanlar “tamamlanmış soyutlama” sayılabilir.
-
İç ayrıntıların performans sorunu ya da hata olarak sürekli dışarı sızdığı katmanlar ise “sürmekte olan soyutlama”ya karşılık gelir.
-
Aynı teknoloji bile geliştiricinin rolüne göre farklı durumda olabilir.
- Genel web geliştiricisi için tarayıcı görece tamamlanmış bir katmandır.
- Tarayıcı motoru geliştiricisi için rendering süreci doğrudan ele alınması gereken ayrıntılı bir sorundur.
-
Geliştiricinin ihtiyaç duyduğu derinlik, her teknolojiyi bilmek değil; sorumlu olduğu katmandaki sızıntı ve sınırları anlayabilecek düzeyde olmaktır.
4. Yapay zeka yeni bir soyutlama katmanı olarak ortaya çıktı
- Yapay zeka, geliştiricinin eskiden doğrudan yaptığı kod yazımı ve tekrarlı uygulama işlerini hızla yerine getiriyor.
- Böylece yapay zeka, basit bir verimlilik aracını aşarak geliştirme sürecinin kendisini soyutlayan yeni bir katman gibi işlemeye başladı.
- Ancak yapay zekanın kod üretmesi, gereksinim yorumlama, yapı tasarımı, kalite doğrulama ve operasyon sorumluluğunu otomatik olarak çözmez.
- Hatta uygulama maliyeti düştükçe üretilen kodu birleştirme ve doğrulama maliyetinin önemi artar.
5. Ayrıntılı talimatlar yapay zekanın performansını sınırlayabilir
-
Yazar, erişilebilirlik odaklı bir UI yan projesinde kodu doğrudan yazmadan yalnızca yapay zekayla geliştirmeyi denedi.
-
Başta yapay zekaya somut uygulama yöntemleri verdi, ancak yapay zeka verilen yönteme saplanıp kalıyor ve istisna işlemeyi tekrar tekrar ekliyordu.
-
Sonuçta kod karmaşıklaştı, çeşitli yan etkiler ortaya çıktı ve daha uygun standart yöntemler ancak sonradan uygulanabildi.
-
Bu örnek, kullanıcının sunduğu ilk yöntemin yapay zekanın muhakemesini sınırlayan bir anchor işlevi görebileceğini gösteriyor.
-
Çözüm yöntemini ve kod yapısını fazla dikte etmektense şunları vermek daha etkilidir.
- Problemin arka planı ve amacı
- Mevcut sistemin bağlamı
- Mutlaka karşılanması gereken sonuç
- Değiştirilmemesi gereken kısıtlar
6. Talimatlardan çok hedef ve bağlam devredilmelidir
-
Yapay zekanın performansı arttıkça ayrıntılı prosedürleri doğrudan belirtmektense hedef merkezli devir daha etkili olabilir.
-
Bu devir modelinde geliştirici, “nasıl uygulanacağını” tamamen belirlemek yerine “neden gerekli olduğunu” ve “neyin başarılması gerektiğini” açıkça iletir.
-
Ancak tam özerklik verilirse yapay zeka kullanıcının niyetinden çok kodu değiştirme işine odaklanabilir.
-
Bu yüzden yapay zekanın önce şu adımları yapmasını sağlayacak şekilde iş akışını sınırlamak gerekir.
- Talebin niyetini analiz etme
- Eksik bilgiler için soru sorma
- Çözüm planı sunma
- Kullanıcı onayından sonra uygulama
-
Esas nokta, basit yasak komutlarından çok o aşamada izin verilen çıktıları açıkça tanımlamaktır.
7. Her seferde yalnızca tek bir çıktı tanımlanmalıdır
-
LLM'lerin tek bir yanıtta üretebileceği çıktı miktarı ve muhakeme kapsamı sınırlıdır.
-
Test yazımı ile uygulamayı aynı anda isterseniz, kaynaklar son hedef olan kodun tamamlanmasına yoğunlaşır ve test kalitesi düşebilir.
-
Yazar TDD işini şu şekilde ayırıyor.
/red: yalnızca başarısız olan testleri yaz/green: testleri geçecek en küçük uygulamayı yaz/refactor: testleri koruyarak kod yapısını iyileştir
-
Her aşamanın çıktısını teke indirmek, yapay zekanın ara adımları atlaması ya da biçimsel olarak geçiştirmesi sorununu azaltabilir.
-
Bu da prompt tasarımının özünün davranışı uzun uzun açıklamak değil, tek bir görevde üretilmesi gereken çıktıyı tanımlamak olduğunu gösterir.
8. Markdown belgeleri ve skill'ler yeni kod haline geliyor
-
Belirtim, test, uygulama, doğrulama ve commit işlerini ayrı ayrı skill'lere bölerseniz şu tür bir pipeline kurulabilir.
- Belirtim yazımı
- Başarısız test üretimi
- Özelliğin uygulanması
- Refactoring
- Doğrulama
- Commit
-
Her skill, girdi, çıktı ve kısıtlar taşıdığı için function benzeri çalışır.
-
Skill'leri ve kuralları kaydeden Markdown belgeleri, basit bir açıklama dokümanı değil; yapay zekanın davranışını belirleyen yürütme kuralları olarak işlev görür.
-
Bu süreçte mevcut yazılım tasarım ilkeleri de uygulanabilir.
- Tek bir skill'e tek sorumluluk vermeyi öngören single responsibility principle
- Bilgi ve kuralları ayrı dosyalara ayıran modülerlik
- Çekirdek skill'leri değiştirmeden harici bilgi dosyalarıyla genişlemeyi sağlayan open-closed principle
-
Platform yalnızca IDE'den Markdown belgelerine kaymıştır; işi parçalara ayırıp birbirine bağlama eylemi hâlâ programlamadır.
9. Yapay zeka ile kodlamadaki temel risk nedensizliktir
-
Geleneksel programlar aynı girdiye karşı büyük ölçüde aynı çıktıyı üretir.
-
Yapay zeka ise aynı isteğe karşı farklı kodlar ve kararlar üretebilir.
-
Yapay zeka büyük çaplı refactoring yaptığında işlev çalışsa bile şu sorunlar kalır.
- Değişen kodun doğruluğunu gözden geçirme
- Silinen kodun gerçekten gereksiz olup olmadığına karar verme
- Yeni yan etki olasılıkları
- Bakım ve dağıtım sorumluluğu
-
Yapay zeka kod üretim hızını artırır, ancak sonucun kararlılığını ve sorumluluğunu otomatik olarak sağlamaz.
-
Production ortamında önemli olan, üretim yeteneğinden çok değişiklik kapsamını kontrol etme ve sonucu doğrulama becerisidir.
10. Yapay zeka tavanı düşük problemlerde güçlüdür
-
Yapay zekanın kolayca ele aldığı problemler genelde gereksinimleri ve çözüm yolları yeterince bilinen, yani “iyi tanımlanmış problemler”dir.
-
Bu tür sorunlar, mevcut library, framework ve pattern gibi tamamlanmış soyutlama unsurlarını birleştirerek çözülebilir.
-
Yapay zeka, insanlığın biriktirdiği kodu ve problem çözme kalıplarını olasılıksal olarak birleştirmede güçlüdür.
-
Buna karşılık şu tür yüksek zorluktaki problemlerde ek insan muhakemesi gerekir.
- Gereksinimleri eksik olan problemler
- Karmaşık domain kuralları
- Büyük ölçekli sistem etkileşimleri
- Operasyon ortamındaki istisnai durumlar
- Güvenlik, performans, regülasyon ve sorumluluğun birleştiği problemler
-
Basit uygulamanın değeri tamamen ortadan kalkmasa da, uygulamanın kendisi giderek genel kullanıcıların da yapabileceği bir alana kayabilir.
11. Geliştiricinin ayrıntı işi yapay zeka kontrolüne kayıyor
-
Geçmişte geliştirici, deterministik kod yazarak öngörülmesi zor kullanıcı girdilerine ve operasyon ortamlarına karşı savunma kuruyordu.
-
Yapay zeka çağında ise deterministik bir ürünü, deterministik olmayan yapay zekayla üretmek gerekiyor.
-
Geliştiricinin ele alması gereken ayrıntılar şu alanlara kayıyor.
- Yapay zekanın yanlış hedefe saplanmaması için görev kapsamını belirleme
- Aşama bazında giriş ve çıkış biçimlerini tanımlama
- Bağlam ve bilgi dokümanlarını yönetme
- Büyük çaplı değişikliklerin kapsamını sınırlama
- Hata durumunda kurtarma prosedürleri tasarlama
- Sonuçların kalite ve güvenliğini doğrulama
-
Basit uygulama işleri otomatikleştikçe geliştirme işinin ağırlığı istisna işleme ve kontrol sorunlarına kayabilir.
12. Yapay zeka çıktıları deterministik araçlarla doğrulanmalıdır
-
Yapay zekanın ürettiği sonucu yalnızca başka bir yapay zekayla doğrulatmak, yeterli güvenilirlik sağlamaya yetmeyebilir.
-
Sistem çıktısının doğru olup olmadığını değerlendirmek için açık bir doğru cevap ölçütü, yani bir oracle gerekir.
-
Deterministik olmayan yapay zeka doğrulama ölçütünü de keyfî biçimde üretirse, doğru sonucu yanlış değiştirme ya da doğrulama ölçütünü bozma riski doğar.
-
Bu nedenle doğrulama ölçütü mümkün olduğunca deterministik araçlardan oluşmalıdır.
- Compiler ve type checker'lar
- Otomatik testler
- Linter ve statik analiz
- Schema denetimi
- Performans ve güvenlik ölçütleri
- Onay süreçleri ve değişiklik kapsamı sınırlamaları
-
Yapay zekanın muhakemesi yardımcı araç olarak kullanılabilir, ancak nihai geçiş kararı yeniden üretilebilir ölçütlere bağlanmalıdır.
13. Harness, yapay zeka geliştirmesinin temel altyapısı haline geliyor
-
Harness, yapay zekanın iş sürecinde hataları biriktirmesini ya da kapsam dışına çıkmasını önlemek için aşama aşama yerleştirilen doğrulama düzenidir.
-
Başlıca bileşenler şunlardır.
- İş adımlarını ayıran pipeline
- Aşama bazlı giriş/çıkış biçimleri
- Otomatik testler ve statik analiz
- Hata durumunda durduran doğrulama kapıları
- Değiştirilebilecek dosya ve kapsam sınırları
- İnsan onayı ve review süreçleri
-
Harness, tek bir aşamadaki küçük bir hatanın sonraki aşamada büyümesini engeller.
-
Yapay zekadan yararlanma becerisi, yalnızca iyi prompt yazma becerisiyle değil; öngörülemez çıktıları kararlı bir sistem içinde tutabilme becerisiyle değerlendirilebilir.
Sonuç
Geliştirici yok olmuyor, rolü yer değiştiriyor
-
Yapay zeka basit kod yazımı ve tekrarlı uygulama işlerini hızla otomatikleştiriyor.
-
Ancak ürün düzeyinde bir sonuç üretmek için hâlâ şu rollere ihtiyaç var.
- Problemi ve hedefi tanımlama
- Sistem yapısını tasarlama
- İş adımları ve çıktıları ayırma
- Yapay zeka ajanları arasındaki akışı koordine etme
- Doğrulama ölçütleri ve harness kurma
- Operasyon sonuçlarına ilişkin nihai sorumluluğu üstlenme
-
Geliştiricinin işi, doğrudan kod yazma oranının azalması ve yapay zekanın ürettiği kodu bir sistem halinde örgütleyip kontrol etme yönünde değişebilir.
Prompt yazımı programlamanın yeni bir biçimidir
- Tekrarlı kullanılan talimatları skill ve kurallara dönüştürüp bunları bir pipeline ile bağlama süreci, function ve module tasarlamaya benzer.
- Markdown belgeleri, yapay zekanın bağlamını, davranışını ve çıktı biçimini tanımlayan yeni bir kod katmanı olarak işlev görebilir.
- Geliştirici, kendi deneyimini ve örtük muhakeme ölçütlerini dokümante ederek yapay zekanın yeniden kullanabileceği biçimde soyutlamalıdır.
- Bu, yalnızca mevcut sistemleri soyutlamak değil, geliştiricinin kendi çalışma biçimini ve karar sürecini de soyutlamak anlamına gelir.
Geleceğin geliştiricisinin temel yetkinlikleri
- Problemi doğru tanımlama becerisi
- Hedef ve bağlam odaklı iş devri yapabilme becerisi
- Karmaşık işleri küçük çıktılara ayırma becerisi
- Skill ve ajanları bir pipeline içinde kurma becerisi
- Deterministik doğrulama ölçütleri tasarlama becerisi
- Deterministik olmayan sonuçların riskini kontrol eden harness kurma becerisi
- Yapay zekanın ürettiği sonuçları anlayıp nihai sorumluluğu üstlenebilecek teknik derinlik
Genel değerlendirme
- Yapay zeka, geliştirmenin özünü ortadan kaldırmaktan çok, geliştiricinin ele aldığı soyutlama katmanını değiştiriyor.
- Önceki kuşak geliştiriciler kodun ve sistemin ayrıntılarını ele alıyorduysa, geleceğin geliştiricileri de yapay zekanın davranışı ve çıktılarından doğan ayrıntıları ele almak zorunda kalacak.
- Kod üretme maliyeti düşerken doğrulama, birleştirme, operasyon ve kontrolün önemi daha da artabilir.
- Programcının özü yazı yazmak değil, ayrıntıları keşfetme, bunları soyutlama ve güvenilir sistemler halinde düzenleme becerisidir.
Henüz yorum yok.