AI-Driven Development’a Dair Bazı Yorumlar
Bu yazının aslı https://x.com/Keleesssss/status/1876606275397841062 da bulunabilir.
Programlama, en temelde insanın bilgisayara istediğini yaptırabildiği bir aktivite. Bunun mümkün olması için, zihindeki düşüncelerin bilgisayara aktarılması gerekiyor.
Bu aktarım ile ilgili 2 temel problem var.
- Beyinlerimiz kompleks sistemleri tek seviyede kavrayacak şekilde gelişmemiş, tek seferde odaklanabildiğimiz detay miktarı limitli, dolayısıyla fikirlerimiz aslında bulutsu, detayların soyutlandığı şekillerde gelişiyor.
Ancak ve ancak bu fikirler üzerine detaylı düşünmemiz gerektiğinde(bu fikirleri başka bir insana, deftere ya da bilgisayara aktardığımızda) detayları belirlemeye başlıyoruz. Bu da bizi ilk tweet’teki fotoğrafta geri getiriyor, aynı bulutsu fikirden sonsuz adet ürün üretilebilir.
Verdiğimiz her karar, bizi bir sonraki detayı belirlemeye iter, ve günün sonunda ortaya detayları belirli bir ürün çıksa da, bu ürün bi sürecin sonucudur, en baştaki bulutsu fikrin kendisinin değil.
- Bilgisayara fikirlerimizi aktarmak için, onun dilini konuşmak gerekir.
Tarih boyunca fikirlerimizi bilgisayara daha kolay aktarmak için soyutlama tabakaları daha yüksek programlama dilleri tasarladık, donanımların da üssel hızlanması sayesinde programlarımız yavaşlamadan bu dilleri kullanma fırsatımız oldu, programlama için gereken uzmanlık azaldı.
Bugünkü iddia ise, yeni geliştirilen modeller ile birlikte bu uzmanlık gereksiniminin tamamen yok olduğu. Bunun yanlış olmasının 2 sebebi var, ilki tarihi olarak da görüldüğü üzere, oluşturduğumuz soyutlama katmanları her zaman kabul edilebilir değil, çünkü kaynaklar sonsuz değil
Soyutlama katmanları bizim için belli detayları çözerken belli bir miktar maliyet oluşturuyorlar. Bu maliyet taratıcı tabanlı bir uygulamanın yavaş çalışması olabilir, ya da sunucu tabanlı bir uygulamanın günlük 100 yerine 1000 lira fatura çıkarması olabilir, “vakit nakittir”.
Gerçek zamanlı bir oyunda ekrana çizilen her yeni resmin 16 milisaniyede, bir metin düzenleyicisinde her yeni karakterin 50 milisaniyede ekrana çizilmesi gerekir. Kod modellerinin de yeni bir soyutlama katmanı olarak hayatımıza girmesiyle, ortaya başka maliyetler de çıktı.
Normal şartlarda programlama yaparken soyutlama katmanları arasında belli “garantiler” mevcuttur. Bilgisayarlar arası haberleşme için HTTP protokolü kullanırken gönderdiğimiz mesajların 1 kez gideceğinin garantisini protokol bize verir, biz de bu garantiye güvenerek kod yazarız.
AI’ı yeni bir soyutlama katmanı olarak nitelendirdiğimize, ondan istediğimizde bize verdiği programların, bizim ondan istediğimiz gereksinimlere sahip olduğu garantisi yok. Bu garanti olmadığı için, modelleri bugün klasik soyutlama katmanları gibi kullanamıyoruz.
Ürettikleri ürünlere bakmamız, istediklerimizi yaptıklarından emin olmamız gerekiyor. Burada da işin içine “doğrulanabilirlik” giriyor. Bugün AI-odaklı geliştirmenin kullanıcı arayüzleri için çok popüler olmasının en büyük sebebi bu arayüzleri doğrulamanın kolay olması.
Yazdırdığımız programı açıp inceleyebiliyoruz, butonlara tıklayıp istediğimizi yapıp yapmadıklarına bakabiliyoruz. Bu kolaylık arayüzden arka planda bir sunucuyla iletişime geçerken de görece devam ediyor, butona tıkladığımızda sunucunun istediğimizi yapıp yapmadığını görüyoruz.
Ancak bunun dışında kalan fonksiyonel-olmayan gereksinimler dediğimiz güvenlik, performans gibi ihtiyaçların varlığını doğrulamak kolay olmuyor. Bu gereksinimleri doğrulamak için yeni programlar yazmamız, ortaya çıkabilecek problemleri bilmemiz, doğru testleri hazırlamamız gerek.
Burada yazılımın “uzmanlık” kısmı devreye girmeye başlıyor, çünkü artık bu yeni yazdığımız program ilk başta bahsettiğimiz ürün değil, amacı ve hedefi farklı(doğrulama) yeni bir ürün. Bu üründeki gereksinimleri yazmak için o alanlarda uzmanlığa ihtiyacımızı var.
Burada gelen klasik eleştiri, Agent-driven development bunu çözecek, güvenlik agent’ın olacak oluyor. Ancak geriye dönersek, AI bir soyutlama katmanı olarak garantilere sahip bir katman değil. Agent’lar bir şeyi ürettiğinde, o çıktının doğrulanmasının sorumluluğu hala kullanıcıda
Burada bir noktayı büyük harflerle vurgulamak istiyorum;
DOĞRULAYAMADIĞINIZ PROGRAMI KULLANAMAZSINIZ.
İhtiyaç duyduğunuz doğrulamanın derecesi alandan alana, programdan programa değişir. Ancak bu ihtiyacı karşılayamadığınız bir programı kullanma şansınız olmaz.
Bu doğrulama küçük ölçekte programlar için buton basıldığında gerçekten istediğim gibi davranıyor mu olabilirken, bir MRI cihazında hastaya onu öldürecek derecede radyasyon veriyor muyum, bir web sitesinde kullanıcıların bilgilerini sızdırıyor muyum…
bir oyunda RTX3050'de 60FPS alabiliyor muyum, bir aracın elektronik direksiyonunda dönüşleri doğru açıyla hesaplıyor muyum olabilir. Ürün büyüdükçe, ölçek arttıkça, alan daha teknik hale geldikçe doğrulama da zorlaşır, gereksinimler büyür, uzmanlık ihtiyacı yükselir.
Doğrulamayı bir kenara bırakıp en başa dönecek olursak, fark ettiyseniz işin tasarım kısmını hiç konuşmadık. Basit bir web sitesi için tasarım süreci karşılıklı birkaç diyaloga indirgenebilirken, kompleks makinelerin tasarımında yüzlerce mühendis çalışabilir.
İşin pozitif tarafına gelecek olursak, bence AI-driven development ile alan uzmanları, kendi alanlarında küçük bir takım ile yapılabilecek ürünleri geliştirme fırsatına sahipler artık. Bunu bugün micro-saas gibi alanlarda solopreneur’lerin küçük ürünler geliştirmesiyle görüyoruz.
Bu gelişmeler burada kalmak zorunda değil, yarın bir doktor kendi uzmanlığını bilgisayara aktarma bariyerinin düşmesinden faydalanarak medikal destek uygulaması geliştirebilir, öğretmenler sınıfları için o günkü konuyu daha iyi anlatacak grafikler, mini oyunlar oluşturabilir.
Ancak 5 öğretmen bir araya gelip kompleks bir uygulama geliştirmek isterlerse, bu sefer kendi uzmanlıkları yetmeyecektir, yazılım mühendisliğinin uzmanlığı olan yazılım mimarisi ve yazılım geliştirme süreçleri alanında eksik kalacaklardır.
Dolayısıyla son geldiğimiz noktada tekrardan programlamanın yazılımın aslında küçük bir kısmı olduğunu hatırlamak gerekir. Bugün şirketlerde bahsettiğim tüm bu süreçler onlarca kişilik takımlar tarafından bölünmüş bir şekilde yürütülüyor, yazılımcılar, proje yöneticileri…
ürün yöneticileri, testçiler, kalite kontrolcüler, analistler. Bu takımlar ürünün tasarımını, ve sonrasında bu tasarımın koda aktarılmasını, zaman içinde tasarımın kullanıcılardan gelen dönütlere göre güncellenmesini birlikte yönetiyorlar. Programlama çoğunlukla genç mühendis işi
Yazılım mühendisleri meslekte ilerledikçe programlama aktivitesinin kendisinden uzaklaşıyor, geliştirme süreçleri, mimari gibi yazılım mühendisliğinin uzmanlığı olarak gördüğümüz alanlara kayıyorlar. Bu süreçler uzun vadede değişebilir, programlama aktivitesi değiştikçe.
Neyse çok uzattım. Nitekim, konunun burada bahsedildiği gibi basit olmadığını düşündüğümü anlatmak istedim sadece.