- Kod ile doğal dilde açıklamaları tek bir anlatıda birleştiren Edebî Programlama (Literate Programming), kod ve açıklamayı birlikte güncel tutma yükü yüzünden yaygınlaşamadı; ancak AI kodlama ajanları bu temel emeği ortadan kaldırabilir
- Emacs Org Mode içindeki
org-babel ile çok dilli edebî programlama mümkün, ancak büyük ölçekli projelerde kaynak kod çıkarma (tangling) sürecinin zahmeti bir sınır oluşturuyor
- Ajana Org dosyası tabanlı bir runbook yazmasını söyleyince, niyetin açıklamalarla anlatıldığı, kod bloklarının etkileşimli biçimde çalıştırıldığı ve sonuçların belgeye kaydedildiği bir iş akışı mümkün oluyor
- Ajan, açıklama ile kod arasındaki senkronizasyonu ve tangling işlemini otomatik yürüttüğü için, kod değiştiğinde açıklamayı yeniden yazma zahmeti ortadan kalkıyor; böylece LLM'lerin en iyi yaptığı çeviri ve özetleme becerilerinden yararlanılıyor
- Mühendis rolünün kod yazmaktan kod okumaya odaklanmaya kaydığı bir akışta, ajanların sürdürdüğü anlatı biçimindeki kod tabanlarının pratikliği temel soru haline geliyor
Edebî Programlama kavramı ve sınırları
- Edebî Programlama (Literate Programming), kod ile doğal dil açıklamalarını harmanlayarak, ön bilgiye sahip olmayan bir okurun bile kod tabanını tek bir anlatı gibi okuyup nasıl çalıştığını anlayabilmesini amaçlayan bir fikir
- Çekici bir kavram olsa da pratikte kodun kendisi ile açıklamalar olmak üzere iki paralel anlatıyı birlikte sürdürme yükü doğuyor; benimsenmesini sınırlayan temel neden de bu
- Pratikte en yaygın biçimi, açıklama, hesaplama ve sonuçların web tarayıcısında birlikte gösterildiği veri bilimi topluluğundaki Jupyter notebook'ları
Emacs Org Mode ve Edebî Programlama
- Emacs Org Mode,
org-babel paketi aracılığıyla çok dilli edebî programlamayı destekliyor; istenen herhangi bir dili çalıştırıp sonuçları belge içine alabiliyor
- Yine de bu yaklaşım, yalnızca az sayıda hevesli kullanıcının benimsediği niş bir kalıp olarak kalmış durumda
- Büyük yazılım projelerinde Org dosyalarını kaynağın asıl gerçeği (source of truth) olarak kullanırsanız, kaynak kod fiilen derlenmiş bir çıktı haline geliyor ve her düzenlemeden sonra kodu çıkarıp ("tangle") hedefe yerleştirmeniz gerekiyor
- Bu otomatikleştirilebilir, ancak kullanıcı ya da ajan gerçek kaynak kodu doğrudan düzenledikten sonra bir sonraki tangle işleminde üzerine yazılma sorunu kolayca ortaya çıkabiliyor
Ajanlardan önceki kullanım kalıpları
- Kişisel yapılandırma yönetiminde (bookkeeping personal configuration) edebî programlama kullanımı yeterince verimli olduğu için, LLM'ler ortaya çıkmadan önce de bu fikirden vazgeçilmemişti
- Org Mode'u elle test ve not tutma için kullanma kalıbı: komut satırı yerine editörde komut yazıp çalıştırmak, her adımı doğru olana kadar düzenlemek ve sonucu bulunduğu yere kaydetmek
- "Not tutma ile test çalıştırmayı birleştirirseniz, test bittiğinde notlar da bedavaya oluşur"
Ajanlarla birlikte yeni iş akışı
- Claude, Kimi gibi kodlama ajanları Org Mode sözdizimini iyi anlıyor ve Org, LLM'lerin çok iyi işlediği esnek bir işaretleme dili
- Org Mode'un geniş sözdizimi insanlar için dezavantaj olabilir, ama dil modelleri için sorun değil
- Özellik testi sırasında ajandan Org runbook yazmasını isterseniz:
- Açıklamalar, her adımın niyetine dair modelin düşünümünü içeriyor
- Kod blokları gözden geçirildikten sonra tek tek ya da bir script gibi topluca etkileşimli olarak çalıştırılabiliyor
- Sonuçlar, Jupyter notebook'ta olduğu gibi kodun altına kaydediliyor
- Açıklamaları düzenleyip modelden kodu güncellemesini isteyebilir, kodu düzenleyip modelin bunun anlamını açıklamalara işlemesini sağlayabilir ya da ajan iki tarafı da aynı anda değiştirebilir
- Böylece paralel anlatıları birlikte sürdürme sorunu ortadan kalkıyor
Ajanın ortadan kaldırdığı temel emek
- Tangling işini ajana bırakırsanız, kod çıkarma sorunu da çözülüyor
AGENTS.md dosyasıyla ajana Org Mode dosyalarını kaynağın asıl gerçeği olarak görmesini, her zaman açıklama yazmasını ve çalıştırmadan önce tangle yapmasını söyleyebilirsiniz
- Ajan bütün bu işlerde yetkin ve kodu değiştirdikten sonra açıklamaları yeniden yazmaktan asla yorulmuyor
- Edebî programlamanın yaygınlaşmasını engelleyen temel ek emeği ajan ortadan kaldırıyor; bu da LLM'lerin en iyi yaptığı çeviri ve özetleme becerilerinden yararlanmak anlamına geliyor
Beklenen faydalar
- Kod tabanı farklı biçimlere aktarılabilir (export) ve rahat okunabilir hale getirilebilir
- Mühendislerin temel rolü yazmaktan okumaya kayıyorsa bu özellikle önemli
- Verilerle desteklenmese de, her kod bloğunun niyetini açıklayan anlatı kodla birlikte bağlamda yer aldığı için üretilen kodun kalitesinin de artabileceği tahmin ediliyor
- Şimdiye kadar büyük ve gerçek anlamda kapsamlı kod tabanlarında denenmedi; şu anda test ve elle yürütülen süreçlerin belgelenmesi iş akışlarında kullanılıyor
Org Mode'un sınırları ve alternatifler
- Org biçimi, Emacs ile sıkı biçimde bütünleştiği için bir sınırlayıcı unsur; Org'un Emacs dışına çıkması gerektiği yönünde eski bir inanç var
- Alternatif olarak Markdown önerilmek istense de, Markdown'da metadata ekleme yeteneği yetersiz
- Org Mode'daki Properties kavramı, belgeyi Emacs Lisp ile programatik olarak işlemenizi sağlıyor; artık LLM'ler de o belgeye özel özelleştirmeleri file variables bölümüne Emacs Lisp olarak yazabiliyor
- Markdown'da, Org Mode'daki header arguments gibi kod bloklarının nasıl çalıştırılacağını (nerede çalışacağı, uzak makine olup olmadığı vb.) belirleyen bir özellik yok
- Heyecan verici olan şey Emacs'in belirli uygulaması değil, fikrin kendisi
Temel soru
- "Ajanlar sayesinde, anlatı gibi okunabilen büyük ölçekli bir kod tabanına sahip olmak ve kod değişiklikleriyle açıklamaların senkronize kalmasını yorulmak bilmeyen bir makinenin sürdürmesi pratik hale gelebilir mi?"
2 yorum
Hacker News görüşleri
En basit yaklaşımın, LLM’in kendi yorumlarını kendisinin yazmasını sağlamak olduğunu düşünüyorum
Böylece LLM daha sonra kodu yeniden okuduğunda kendi yorumlarına başvurur ve bu, bir tür tam zamanında uzun süreli bellek (just-in-time memory) işlevi görür
<summary>içine özeti,<remarks>içine gerekçeleri ve bağlamı,<params>içine kısıtları yazdırıp satır içi yorumları minimumda tutuyorumBu sayede PR incelemesinde LLM’in düşünce sürecini doğrudan
<remarks>içinde görebiliyor, niyetten farklı anladığı yerleri kolayca tespit edebiliyorsunuzSonuçta kendi bağlamını gereksiz bilgilerle kirletiyor ve anlama becerisi daha da düşüyor
Hâlâ insan seviyesinde okuryazarlık (literacy) düzeyinden uzak
Ama LLM aynı kodu tekrar okuduğunda takıldığı noktalar tam da bu yorumlar olduğundan, aslında değerli bilgi olabilirler
Bu yüzden böyle yorumlar o belleği koruma işlevi görür
Programlama dillerinin, doğal dildeki belirsizlik yüzünden ortaya çıktığını düşünüyorum
Bu yüzden kod yorumları da sonuçta belirsizleşir ve çalıştırılmadıkları için hızla eskir
LLM’ler kod çevirisinde güçlü ama doğal dil istemlerini koda dönüştürmekte hâlâ zorlanıyor gibi geliyor
İyi kod niyeti açıkça ifade etmelidir; çok yorum olması bazen kod kalitesinin düşük olduğunun işareti olabilir
Ama iyi yazılım, iyi dokümantasyonu da içermelidir
Literate programming, uygulama ayrıntılarından çok açıklama odaklı bir yazım biçimidir
Kod “nasıl”ı dar biçimde tanımlar ama doğal dil “ne”yi merkeze alarak ifade edebilir; bu da LLM’e daha iyi yöntemler önermesi için alan bırakır
Hataları tespit edip düzeltmek için yinelenen bilgiye ihtiyaç vardır
Sadece yorum serbestisini daraltan kurallar koyarlar
Bazen metafor ya da belirsizlik daha uygun bir ifade olabilir
Örnek kod ve belgeleri şablon olarak verirseniz halüsinasyon azalıyor
Literate programming tarzı yorumların insanların kodu anlamasına yardımcı olduğunu gösteren araştırmalar var
Google araştırmacıları, LLM’lerin bu yorumları güncelleyip güncelleyemeyeceğini ve bunun insan kavrayışına yardımcı olup olmadığını test etti
Sonuç, niyeti açıklayan blok düzeyindeki yorumların en etkili olduğu yönünde
(Bkz.: 2024 arXiv makalesi "Natural Language Outlines for Code")
Son dönemde ilginç olan şu: Eskiden insanlar insanlara yardımcı olsun diye README ya da mimari belgeleri yazmaya üşenirdi
Ama artık LLM için yazıyoruz denince çok daha istekli davranıyorlar
Ama LLM her görevde belgelere başvurduğu için, dokümantasyon motivasyonu çok daha güçlü hâle geliyor
Commit mesajları ve ADR gibi kayıtları insanlar okumasa da LLM hepsini okuyor
Sonuçta bu alışkanlıklar insan yeni başlayanlar için de faydalı oluyor
Bilgisayarlarla konuşmayı öğrenirken insanlarla konuşmayı öğrenemeyenlerin mezuniyet sonrası daha çok geride kaldığı söylenirdi
Çünkü kodun çalışması için belgelerin doğru olması gerekmez
Bu yüzden çoğu zaman belgeye bakmaktansa doğrudan koda bakmak daha iyi geliyor
Ben hafif bir literate programming yaklaşımının, gelenek ağırlıklı dillerle birlikte ajan çağında iyi çalıştığını düşünüyorum
Go gibi hızlı derlenen ve net stil kılavuzları olan diller iyi oluyor
Ajanların kod yazarken Google Go Style Guide belgesine başvurmasını sağlarsanız oldukça iyi sonuçlar çıkıyor
(Bkz.: Rob Pike ile ilgili anekdot)
LLM bir dil modeli olduğu için açık ve net yazıya yatırım yapmak değerli
Mutlaka literate programming düzeyine çıkmak gerekmese de, iyi isimler, docstring’ler, tip imzaları ve “neden”i açıklayan yorumlar önemli
Sonuçta mesele, hem insanlar hem de LLM’ler için iletişim kalıpları oluşturmak
Dosya, dizin ve proje düzeyindeki üst yapıyı açıklayan belgeler özellikle önemli
Ama bu kavramlar birden çok dosyaya yayıldığı için, bunların nereye yazılacağı ve belge-kod senkronizasyonu her zaman sorun oluyor
Son 10 yıldır neredeyse bütün kodlarımı literate programming tarzında yazıyorum
nbdev’i oluşturarak notebook tabanlı biçimde kodu, belgeleri ve testleri birlikte yönettim
Son dönemde LLM entegreli Solveit adlı bir araç yaptım ve bunu şirket genelinde kullanıyoruz
(Solveit bağlantısı)
Literate programming, programlama dışındaki işler için de faydalı
Kısa bir demo ya da ekran görüntüleri eklemek iyi olabilir
LLM ile yorumlar ve kod arasındaki uyumsuzluğu otomatik tespit etme fikri ilginç
Belgeler zamanla kaçınılmaz olarak koddan sapıyor; bunu otomatik algılayabilmek büyük değer yaratır
Bunun üzerine bir startup bile kurulabilir gibi duruyor
Değişiklikler belge PR’ıyla başlar, geliştirici bunu koda yansıtır
İnceleme sırasında belge ve kod yan yana gösterilerek doğrulama yapılır
Belgeler arasındaki bağlantılarla bağlam keşfi de mümkün olacak şekilde tasarlanır
Örn: GitHub gh-aw, Continue.dev
Test kodu ile prodüksiyon kodunun eşli yapısı, muhasebedeki çift taraflı kayıt gibi faydalı
Testler kodun niyetini açıklar, kod da testlerin anlamını tamamlar
İnceleme sırasında bir taraf kafa karıştırıyorsa öbür tarafa bakabilirsiniz
Dezavantajı kod miktarını artırması ama okunabilirlikteki artış buna değiyor
Ben de yakın zamanda niyet odaklı kodlama üzerine yazdım; bu tartışmayla örtüşüyor
(blog bağlantısı)
Önemli olan, kod tabanını farklı biçimlere dönüştürüp okuması kolay hâle getirebilmek
İleride teknik olmayan kişiler de koda daha çok yaklaşacak ve doğal dilin dahil edilmesi onların üretkenliği ile öğrenmesine büyük katkı sağlayacak
Wikipedia - Literate programming
> Edebi programlama (literate programming), programlama metodolojilerinden biridir; programlama yaparken bilgisayar tarafından derlenebilen kod üretmekten çok, insanların anlamasını kolaylaştıran kod üretmeye odaklanan bir yaklaşımdır. Başka bir deyişle, insanların okuyup anlayabileceği şekilde, sanki bir belge yazar gibi programlama yapmayı amaçlar. Hedef, "tıpkı bir edebiyat eserini okur gibi programı okuyabilmeyi sağlamak" olduğu için buna "edebi programlama" adı verilmiştir.