- Literate Programming yang merangkai kode dan penjelasan bahasa alami dalam satu narasi tidak banyak dipakai luas karena beban menjaga dua hal sekaligus—kode dan penjelasan—namun agen coding AI dapat menghilangkan pekerjaan inti ini
- Melalui
org-babel di Org Mode Emacs, literate programming multibahasa dimungkinkan, tetapi pada proyek besar proses ekstraksi kode sumber (tangling) yang merepotkan menjadi batasan
- Jika agen diminta menulis runbook berbasis file Org, dimungkinkan alur kerja untuk menguraikan niat lewat penjelasan, menjalankan blok kode secara interaktif, dan menyimpan hasilnya ke dokumen
- Karena agen menangani sinkronisasi antara penjelasan dan kode serta tangling secara otomatis, upaya menulis ulang penjelasan saat kode berubah hilang, sambil memanfaatkan kemampuan terjemahan dan peringkasan yang paling dikuasai LLM
- Di tengah pergeseran peran engineer dari menulis kode menjadi berfokus pada membaca kode, kepraktisan codebase bernarasi yang dipelihara agen muncul sebagai pertanyaan kunci
Konsep dan keterbatasan literate programming
- Literate Programming adalah gagasan mencampur kode dan penjelasan bahasa alami agar pembaca tanpa pengetahuan awal pun bisa membaca codebase sebagai satu narasi dan memahami cara kerjanya
- Ini konsep yang menarik, tetapi dalam praktik muncul beban mempertahankan dua narasi paralel: kode itu sendiri dan penjelasannya, yang menjadi alasan mendasar adopsinya terbatas
- Bentuk yang paling umum di praktik adalah Jupyter Notebook di komunitas data science, tempat penjelasan, komputasi, dan hasil ditampilkan bersama di browser web
Emacs Org Mode dan literate programming
- Org Mode di Emacs mendukung literate programming multibahasa melalui paket
org-babel, sehingga bahasa apa pun bisa dijalankan dan hasilnya ditangkap ke dokumen
- Namun pendekatan ini tetap menjadi pola niche yang bertahan di kalangan sedikit pengguna fanatik
- Jika file Org dipakai sebagai source of truth dalam proyek perangkat lunak skala besar, maka kode sumber pada dasarnya menjadi keluaran hasil kompilasi, dan setelah setiap edit kode harus diekstrak ("tangle") lalu ditempatkan ke tujuan
- Ini bisa diotomatisasi, tetapi mudah menimbulkan masalah ketika pengguna atau agen mengedit source aktual lalu perubahan itu tertindih pada proses tangle berikutnya
Pola pemakaian sebelum era agen
- Ada hasil yang cukup baik dari memakai literate programming untuk mengelola konfigurasi pribadi, sehingga gagasan ini tidak ditinggalkan bahkan sebelum hadirnya LLM
- Pola memakai Org Mode untuk pengujian manual dan pencatatan: alih-alih command line, perintah ditulis dan dijalankan di editor, lalu diedit sampai tiap langkah benar, dan hasilnya disimpan langsung di tempatnya
- "Jika pencatatan dan eksekusi tes digabungkan, maka saat tes selesai catatannya tercipta gratis"
Alur kerja baru bersama agen
- Agen coding seperti Claude dan Kimi memahami sintaks Org Mode dengan baik, dan Org adalah bahasa markup yang longgar sehingga sangat mudah ditangani LLM
- Sintaks Org Mode yang sangat luas adalah kekurangan bagi manusia, tetapi bukan masalah bagi model bahasa
- Saat melakukan uji fitur, jika agen diminta membuat runbook Org maka:
- Penjelasan memuat refleksi model tentang maksud tiap langkah
- Blok kode, setelah ditinjau, dapat dijalankan satu per satu atau seluruhnya secara interaktif seperti skrip
- Hasilnya disimpan di bawah kode seperti pada Jupyter Notebook
- Kita bisa mengedit penjelasan lalu meminta model memperbarui kode, atau mengedit kode lalu model merefleksikan maknanya ke penjelasan, atau agen mengubah keduanya sekaligus
- Masalah menjaga dua narasi paralel pun hilang
Pekerjaan inti yang dihapus agen
- Jika proses tangling diserahkan ke agen, maka masalah ekstraksi kode juga teratasi
- Melalui file
AGENTS.md, agen dapat diarahkan untuk memperlakukan file Org sebagai source of truth, selalu menulis penjelasan, dan melakukan tangle sebelum eksekusi
- Agen mahir melakukan semua ini, dan tidak pernah lelah menulis ulang penjelasan setelah kode diubah
- Agen menghapus kerja tambahan mendasar yang membuat literate programming tidak dipakai luas, sambil memanfaatkan kemampuan terjemahan dan peringkasan yang paling dikuasai LLM
Manfaat yang diharapkan
- Codebase bisa diekspor (export) ke berbagai format agar lebih nyaman dibaca
- Ini особенно penting jika peran utama engineer memang sedang bergeser dari menulis ke membaca
- Memang belum didukung data, tetapi diperkirakan kualitas kode yang dihasilkan juga bisa meningkat karena narasi yang menjelaskan maksud tiap blok kode muncul bersama kode dalam konteks
- Hingga kini pendekatan ini belum dicoba pada codebase besar dan serius, dan saat ini dipakai pada alur kerja pengujian serta dokumentasi proses manual
Keterbatasan Org Mode dan alternatif
- Format Org terintegrasi erat dengan Emacs sehingga menjadi faktor pembatas, dan sudah lama ada keyakinan bahwa Org perlu keluar dari Emacs
- Ingin merekomendasikan Markdown sebagai alternatif, tetapi Markdown kurang memiliki kemampuan menyertakan metadata
- Konsep Properties di Org Mode memungkinkan dokumen dimanipulasi secara terprogram dengan Emacs Lisp, dan kini LLM bahkan bisa menulis fitur kustom khusus dokumen itu dalam Emacs Lisp di bagian file variables
- Markdown juga tidak punya fitur seperti header arguments di Org Mode untuk menentukan detail eksekusi blok kode, seperti lokasi menjalankan atau mesin jarak jauh
- Yang benar-benar menggugah bukan implementasi spesifik Emacs, melainkan idenya sendiri
Pertanyaan kunci
- "Dengan agen, mungkinkah menjadi praktis untuk memiliki codebase skala besar yang bisa dibaca seperti narasi, sementara sebuah mesin yang tak kenal lelah menjaga sinkronisasi antara perubahan kode dan penjelasannya?"
2 komentar
Opini Hacker News
Saya rasa cara paling sederhana adalah membiarkan LLM menulis komentarnya sendiri
Dengan begitu, saat LLM membaca ulang kode tersebut nanti, ia bisa merujuk ke komentarnya sendiri, sehingga berfungsi seperti memori jangka panjang just-in-time
Di
<summary>tulis ringkasannya, di<remarks>alasan dan konteksnya, di<params>batasannya, lalu minimalkan komentar inlineDengan cara ini, saat review PR kita bisa langsung memeriksa proses berpikir LLM di
<remarks>, sehingga lebih mudah menemukan bagian yang dipahami tidak sesuai niat aslinyaPada akhirnya ia malah mengotori konteksnya sendiri dengan informasi yang tidak perlu dan membuat pemahamannya menurun
Masih jauh dari literasi setara manusia
Tapi justru komentar seperti inilah yang membuat LLM terbantu saat membaca ulang kode yang sama, jadi bisa jadi itu informasi yang berharga
Karena itu komentar seperti ini berfungsi untuk mempertahankan ingatan tersebut
Saya rasa bahasa pemrograman muncul karena ambiguitas dalam bahasa alami
Karena itu komentar kode pada akhirnya juga menjadi ambigu, dan karena tidak dieksekusi, cepat usang
LLM kuat dalam menerjemahkan kode, tetapi masih terasa sulit untuk mengubah prompt bahasa alami menjadi kode
Kode yang baik harus mengekspresikan niat dengan jelas, dan banyaknya komentar bisa jadi sinyal bahwa kualitas kodenya rendah
Namun perangkat lunak yang baik juga harus mencakup dokumentasi yang baik
Literate programming adalah penulisan yang berpusat pada penjelasan, bukan detail implementasi
Dengan kode kita mendefinisikan “bagaimana” secara sempit, tetapi bahasa alami bisa mengekspresikan “apa”, sehingga memberi ruang bagi LLM untuk menyarankan cara yang lebih baik
Harus ada informasi yang saling tumpang tindih agar kesalahan bisa dideteksi dan diperbaiki
Hanya saja ia memberi aturan untuk mempersempit kebebasan interpretasi
Kadang metafora atau ambiguitas justru menjadi bentuk ekspresi yang lebih tepat
Jika diberi template berupa contoh kode dan dokumentasi, halusinasi berkurang
Ada riset yang menunjukkan bahwa komentar bergaya literate programming membantu manusia memahami kode
Peneliti Google menguji apakah LLM bisa memperbarui komentar semacam ini, dan apakah itu membantu pemahaman manusia
Kesimpulannya, komentar tingkat blok yang menjelaskan niat adalah yang paling efektif
(Referensi: paper arXiv 2024 "Natural Language Outlines for Code")
Fenomena menarik belakangan ini adalah, dulu orang malas menulis README atau dokumen arsitektur untuk manusia
tetapi sekarang jika dibilang itu ditulis untuk LLM, orang jadi jauh lebih antusias
Namun LLM merujuk dokumentasi di setiap tugas, sehingga motivasi untuk mendokumentasikan jadi jauh lebih kuat
Commit message, catatan seperti ADR, mungkin tidak dibaca manusia, tetapi semuanya dibaca LLM
Pada akhirnya kebiasaan ini juga membantu engineer junior manusia
Orang-orang yang belajar berbicara dengan komputer sampai lupa cara berbicara dengan manusia justru tertinggal setelah lulus
Karena agar kode berjalan, akurasi dokumentasi tidak diperlukan
Jadi sering kali terasa lebih baik melihat kode langsung daripada dokumentasinya
Saya melihat kombinasi literate programming ringan dan bahasa yang berpusat pada konvensi sangat cocok untuk era agen
Bahasa seperti Go, yang punya kompilasi cepat dan style guide yang jelas, terasa bagus
Jika agen dirujukkan ke Google Go Style Guide saat menulis kode, hasilnya cukup baik
(Referensi: anekdot terkait Rob Pike)
Karena LLM adalah model bahasa, maka berinvestasi pada penulisan yang jelas sangat bernilai
Tidak harus sampai literate programming, tetapi nama yang baik, docstring, type signature, komentar yang menjelaskan “mengapa” itu penting
Pada akhirnya inti persoalannya adalah membangun pola komunikasi untuk manusia dan LLM sekaligus
Dokumentasi yang menjelaskan struktur tingkat atas pada level file, direktori, dan proyek sangat penting
Namun konsep seperti ini melintasi banyak file, jadi selalu muncul masalah soal harus ditulis di mana dan sinkronisasi dokumentasi-kode
Selama 10 tahun terakhir saya menulis hampir semua kode dengan gaya literate programming
Saya membuat nbdev untuk mengelola kode, dokumentasi, dan test bersama-sama berbasis notebook
Belakangan saya juga membuat tool bernama Solveit yang mengintegrasikan LLM dan sedang digunakan di seluruh perusahaan
(tautan Solveit)
Literate programming juga berguna untuk pekerjaan di luar pemrograman
Akan lebih baik jika ditambahkan demo singkat atau screenshot
Gagasan menggunakan LLM untuk secara otomatis mendeteksi ketidaksesuaian antara komentar dan kode terasa menarik
Dokumentasi pada akhirnya pasti menyimpang dari kode seiring waktu, dan jika ini bisa dideteksi otomatis, nilainya besar
Rasanya bahkan bisa dibuat startup dari hal seperti ini
Perubahan dimulai dari PR dokumentasi, lalu developer merefleksikannya ke kode
Saat review, dokumentasi dan kode ditampilkan berdampingan untuk diverifikasi
Juga dirancang agar penelusuran konteks dimungkinkan melalui tautan antar dokumen
Contoh: GitHub gh-aw, Continue.dev
Struktur berpasangan antara test code dan production code berguna seperti pembukuan berpasangan dalam akuntansi
Test menjelaskan niat kode, dan kode melengkapi makna test
Saat review, jika satu sisi membingungkan, kita bisa melihat sisi lainnya
Kekurangannya adalah jumlah kode bertambah, tetapi peningkatan keterbacaan sebanding dengan biayanya
Saya juga baru-baru ini menulis tentang intent-based coding, dan itu terhubung dengan diskusi ini
(tautan blog)
Yang penting adalah bahwa codebase bisa diubah ke berbagai format agar mudah dibaca
Ke depan, orang non-teknis juga akan semakin dekat dengan kode, dan penyertaan bahasa alami akan sangat membantu produktivitas dan pembelajaran mereka
Wikipedia - Literate programming
> Pemrograman literer (literate programming) adalah salah satu metodologi pemrograman yang menekankan pembuatan kode yang mudah dipahami manusia, alih-alih sekadar membuat kode yang dapat dikompilasi oleh komputer. Dengan kata lain, tujuannya adalah melakukan pemrograman seolah-olah menulis dokumen agar orang dapat membaca dan memahaminya. Karena sasarannya adalah 'membuat pemrograman dapat dibaca seperti membaca karya sastra', maka metode ini dinamai 'pemrograman literer'.