lx: Tamamen geliştiricinin kontrolü altındaki bir vibe coding aracı
(github.com/chebread)Giriş
Merhaba. Bilgisayar mühendisliğine ilgi duyan bir öğrenciyim. Bu kez lx adlı bir program geliştirdiğim için, şimdiye kadar sadece yazılarını okuduğum GeekNews'e ilk kez gönderi paylaşmak istedim.
Son dönemde, yapay zekaya doğal dille komut verince kodu kendi başına yazan vibe coding akımı revaçta.
Ben bu tür vibe coding'den korkuyorum.
Bu korku basitçe işsiz kalma endişesi değil; daha çok "kod yazmanın keyfinin (Wrangling code) (kaynak: Kent Beck - Augmented Coding: Beyond the Vibes)" ve "geliştiricinin kontrol hakkının" elimizden alınmasının yarattığı programlama kaybı hissi.
Bazıları bu değişimi, delikli kartlardan makine diline, assembly'e ve C diline uzanan programlamanın doğal evrimi olarak görüyor. Ama bence bu benzetme yanlış.
Geçmişteki soyutlamalar, geliştiricinin eline 'daha iyi bir çekiç' vermek anlamına geliyordu.
Araçlar sürekli gelişti ama o çekici sallayan özne hâlâ insandı ve sonuç tamamen geliştiricinin kontrolü altındaydı.
Ama bugünün AI coding yaklaşımı farklı.
Artık çekici robot sallıyor; geliştirici ise sadece izleyen ya da en fazla robotu biraz ikna etmeye çalışan biri hâline geldi.
Eğer çekici biz sallayamıyorsak, bunun artık programlama olarak adlandırılamayacağını düşünüyorum.
Çünkü o zaman her şey tamamen bizim kontrolümüz altında olmuyor.
Bu yüzden lx'i yaptım.
lx, çekici robottan alıp yeniden geliştiricinin eline veren bir araç.
lx, yapay zekayı baştan sona sıkı biçimde kontrol edilebilen bir araç olarak kullanmanızı sağlar.
Ana bölüm
lx, "arayüz insana, mantık AI'a" felsefesine sahiptir.
Geliştirici, fonksiyonun giriş-çıkışlarını ve ne yaptığını tanımlayarak bir 'sözleşme' kurar; AI ise yalnızca o fonksiyonun iç implementasyonundan sorumludur.
Bu yaklaşım, geliştirme sürekliliğini garanti eder.
Fonksiyonun giriş-çıkışını yazdığınız anda ilgili mantık zaten tamamlanmış kabul edilir.
Programcı, ayrıntılı implementasyona saplanmadan hemen üst seviye mantığı yazabilir ve geliştirme akışını kesintisiz sürdürebilir.
Ayrıca lx basit bir metin değiştirme aracı değildir. github.com/tree-sitter/go-tree-sitter paketini kullanarak kaynak kodu AST (soyut sözdizimi ağacı) tabanlı olarak parse eder. Bu sayede dosya içindeki diğer kodları, yorumları ve girintileri kirletmez; yalnızca belirtilen scope içindeki mantığı güvenli şekilde değiştirir.
Temel kullanım
lx kullanmanın temel biçimi şöyledir.
package main
import (
"fmt"
lx "github.com/chebread/lxgo"
)
func main() {
var year string = "2025-01-02"
// Geliştirici, fonksiyon çağrı noktasını ve akışı kontrol eder.
result1 := LX_GetYear(year)
var age = 30
result2 := LX_GetAge(age)
fmt.Println(result1, result2)
}
func LX_GetYear(year string) (result string) {
// AI'ya iletilecek prompt
lx.Generate("yyyy-dd-mm biçimini Kore tarzı tarihe dönüştür")
return
}
func LX_GetAge(year int) (result string) {
// Programlama diline göre lx kütüphanesini ayrıca kurmakla uğraşmak istemeyenler için aşağıdaki gibi lx() yorum işaretçisi biçimi de desteklenir.
// lx("Kore yaşını uluslararası yaşa dönüştür")
return
}
Yukarıdaki kodda LX_GetYear fonksiyonu, geliştiricinin tanımladığı sözleşmedir.
lx aracı çalıştırıldığında lx.Generate(...) veya // lx(...) işaretçisini algılar, prompt'u LLM'e gönderir ve ilgili fonksiyonun gövdesini gerçekten çalışan kodla üzerine yazar.
Bu sırada token optimizasyonu uygulanır. Tüm dosya gönderilmez; yalnızca ilgili fonksiyonun signature'ı ve prompt LLM'e gönderilir. Böylece maliyet düşer ve güvenlik artar.
2. Geliştiricinin kontrolü
lx fonksiyonunun içindeki mantığı AI yazsa da, o fonksiyonu kullanan taraf geliştirici olmalıdır.
Ancak lx fonksiyonunun içine kullanıcı tanımlı mantık karıştırılırsa bu yok sayılır; bu yüzden aşağıdaki gibi bir wrapper fonksiyon aracılığıyla kontrol sağlanabilir.
package test
import (
"fmt"
lx "github.com/chebread/lxgo"
)
func main() {
var year string = "2025-01-02"
result1 := ParseYear(year) // wrapper fonksiyon çağrısı
fmt.Println(result1)
}
// Geliştiricinin kontrol ettiği iş mantığı
func ParseYear(year string) string {
// AI tarafından üretilen mantığı bir bileşen gibi kullan
res := LX_GetYear(year)
// Sonuç üzerinde ek işlem yapmak geliştiricinin işidir
foo := fmt.Sprintf("Bugün %v!", res)
return foo
}
func LX_GetYear(year string) (result string) {
lx.Generate("yyyy-dd-mm biçimini Kore tarzı tarihe dönüştür")
return
}
3. Güvenli bağımlılık yönetimi ve şeffaflık
lx, tek sorumluluk ilkesini (SRP) hedefler.
Yalnızca kod üretir; programı derlemez veya çalıştırmaz.
Ayrıca AI tarafından üretilen kod dış kütüphaneler gerektiriyorsa lx rastgele paket kurmaz.
-
Code: Üretilen kodun üst kısmında
// lx-dep: ...yorumunu belirtir -
Output: Kurulması gerekenlerin listesini CLI standart çıktısında raporlar
Bunun yerine geliştiriciye bu iki yöntemle bilgi verir.
Geliştirici bunu kontrol edip bağımlılıkları doğrudan kurup kurmamaya kendisi karar verir.
4. Yapılandırma
lx kullanmak için LLM yapılandırması gerekir. Ana dizinde (~/) veya proje kökünde (./) lx-config.yaml oluşturmanız yeterlidir. Eğer iki konumda da dosya varsa, yerel yapılandırma dosyası öncelikli uygulanır; böylece her proje için farklı lx ayarları yönetilebilir.
# lx-config.yaml
provider: "gemini"
api_key: "foo"
model: "bar"
5. Kurulum ve çalıştırma
Mac kullanıcıları Homebrew üzerinden kurulum yapabilir; diğer işletim sistemlerinde ise lx'in GitHub Releases sayfasından binary indirerek kurabilirsiniz.
brew tap chebread/lx
brew install lx
Kurulumdan sonra proje yolunda lx komutunu çalıştırırsanız gerçek kod üretilir.
lx'te akıllı üretim özelliği bulunduğundan, kodu daha önce üretilmiş fonksiyonlar için LLM yeniden çağrılmaz; bu yüzden lx komutunu gönül rahatlığıyla tekrar tekrar çalıştırabilirsiniz.
Not: lx, üretilen kodun biçimlendirilmesi için her dilin kendi aracını kullanır (Go: goimports, Python: ruff, JS: prettier). Bu araçların önceden kurulmuş olması gerekir.
6. Lisans
lx, AGPL-3.0 License altında dağıtılır.
Amaç, lx'in açık kaynak ekosistemine katkı sunarken bu aracın kapalı biçimde özelleştirilmesini engellemektir.
Sonuç
Yazılım, insanın durmaksızın verdiği emeğin dokunmuş bir kristalidir. Yapay zeka çağında da programcı kodun sahibi olmaya devam etmelidir.
lx, uğraştırıcı regex veya veri parse etme gibi "sıkıcı implementasyonları" AI'ya bırakırken, programın yapısı ve akışının tamamen insanın elinde kalmasını sağlar.
Kod yazmanın keyfini (Wrangling code) ve kontrolünü kaybetmek istemeyen geliştiricilere bu aracı tavsiye ederim!
12 yorum
İşletme politikasına göre uygunsuz yorum silindi ve ilgili hesabın kullanımı kısıtlandı.
Artık kodlama da aslında insan merkezli bir ölçüte göre yapılıyor.
Gelecekte bunun verimsiz, insan merkezli diller yerine başka biçimlerde geliştirileceğini düşünüyorum.
Şimdilik insan merkezli framework'lerin tadını bol bol çıkaralım.
Bugünlerde işi düzgün yapmak için koda hiç bakmamak gerekiyormuş gibi bir hava varken, buna tamamen ters bir yerden yaklaşması çok ilginç.
Tercihe göre, bunu AI'ın dokunduğu alanı net biçimde belirleyen bir araç gibi kullanmak da mümkün olabilir.
Bunu kodlama ajanlarının yetenekleriyle denemek de fena olmayabilir, değil mi?
Bunu aktif olarak değerlendireceğim. İlgileniyorsanız, lütfen bol bol PR gönderin!
Eğlenceli bir proje gibi görünüyor!
Görünüşe göre Ix spesifikasyonu yazılıyor -> Ix Tool ile lx fonksiyonları gerçek fonksiyonlarla değiştiriliyor -> sonra Go derleniyor.
Projede
lxkullanan bir katman oluştuğu içinLLM ile yazılmış katmanı ayırmak mümkün olabilir; böylece ileride bakım yaparken de daha rahat olunabilir gibi görünüyor.
LLM kullanan ilginç bir deneme gibi duruyor!
Teşekkürler. lx, Go dili dışındaki dilleri de destekliyor; bu yüzden bol bol kullanmanızı ve geri bildirimlerinizi rica ediyoruz!
Hedef ilginç ama metnin genelinde yapay zekaya özgü üslup çok güçlü hissedildiği için
güvenmek zor geliyor.
Haklı bir noktaya değinmişsiniz. Ben lise öğrencisi olduğum için pek fazla zamanım yok; bu yüzden yazı yazarken yapay zekadan yararlanırken metinlerin güvenilirliği oldukça düşen yazılara dönüşmüş. Biraz rahatsız edici olsa da anlayış göstermenizi rica ederim.
Vay canına, bir lise öğrencisinin böyle bir şeyi tasarlamış olması gerçekten çok etkileyici.
Deneyimi arttıkça daha da etkileyici şeyler yapacak gibi görünüyor.
lx.Generateçağıran kodun, komut satırından komut verildiğinde LLM’in yazdığı kodla değişmesi şeklinde çalıştığını varsayıyorum, değil mi?Çağıran kısmın bir tür tip kısıtı görevi görebilmesi bence iyi bir fikir gibi görünüyor. Editör vb. ortamlarda
lxkomutunun otomatik çalıştırılıp implementasyon kodunu bununla değiştirmesi gibi bir yaklaşımı da düşünüp düşünmediğinizi merak ediyorum. (Ayrıca üretilen kod beğenilmediğinde yeniden üretmenin bir yolu olması da güzel olabilir.)Projeye keyifle baktım.
Komut satırından komut verildiğinde
lx.Generateçağıran kodun, LLM’in yazdığı kodla değişmesi şeklinde çalışıyor, doğru mu? -> Evet, doğru!Çağıran kısmın bir tür tip kısıtı işlevi görebilmesi güzel bir fikir gibi görünüyor. Editör vb. ortamlarda
lxkomutunun otomatik olarak çalışıp uygulama kodunu onunla değiştirmesi gibi bir yöntemi de düşünüp düşünmediğinizi merak ediyorum. -> Gerçekten çok iyi bir fikir gibi görünüyor. Bunu ciddi şekilde değerlendireceğiz.Ayrıca, üretilen kod beğenilmediğinde yeniden üretmenin bir yolu olması da iyi olabilir. -> Projenin felsefesi geliştiricinin kontrolü altındaki yapay zeka olduğundan, yeniden üretim gerekirse tekrar
lxişaretleyicisi oluşturulacak şekilde tasarladık.Bunu liseli küçük birinin yaptığını görüp de hırsla buraya sürünerek gelip bıraktığınız yorumun seviyesi, zeka seviyenizi ele veriyor.
Aynaya bakıp biraz tedavi olun.
killdong | 9 ay önce | parent | on: Sunucumu korumak için ZIP bombası kullanıyorum (idiallo.com)
İnternette de dışkısını bırakan bunun sorumluluğunu taşımıyorsa internet kullanması yasaklanmalı diye düşünüyorum. Etrafa saçtığınızı biraz toparlayın.