- Evaluasi agen coding otonom selama ini terutama melihat tingkat keberhasilan tugas pada codebase tetap, tetapi studi ini mengukur secara terpisah apakah kebersihan kode itu sendiri mengubah biaya eksplorasi dan modifikasi
- Disusun 6 repositori pasangan minimal dan 33 tugas berbasis pengujian tersembunyi, dengan arsitektur, dependensi, dan perilaku eksternal yang sama, tetapi hanya berbeda pada pelanggaran aturan SonarQube dan kompleksitas kognitif
- Dengan Claude Code dan Claude Sonnet 4.6, tiap tugas dijalankan 10 kali di kedua sisi pasangan repositori, sehingga total dilakukan 660 eksperimen, dan agen tidak mengetahui sedang menangani sisi kode yang mana
- Kebersihan kode tidak mengubah tingkat kelulusan, tetapi pada kode yang lebih bersih, metrik setara token turun 7~8% dan kunjungan ulang file berkurang 34%
- Bukan hanya model atau prompt, kondisi codebase juga tetap menjadi variabel praktis yang menentukan biaya komputasi dan efisiensi eksplorasi agen
Pertanyaan riset dan perumusan masalah
- Agen coding otonom sedang menyebar dengan cepat
- Dalam survei terhadap 128.018 proyek GitHub pada 2026, jejak aktivitas agen ditemukan di 22~29% proyek bahkan sebelum genap satu tahun sejak peluncuran agen praktis pertama
- Biaya menjalankan agen juga tidak kecil
- Di SWE-bench Verified, satu tugas menggunakan rata-rata sekitar 4 juta token berdasarkan LLM frontier
- Dalam total penggunaan, token input menyumbang porsi terbesar
- Evaluasi sebelumnya pada benchmark seperti SWE-bench berfokus pada apakah tugas berhasil diselesaikan, dan studi yang lebih baru mulai mengukur penggunaan sumber daya bersama tingkat kelulusan
- Perbandingan umum selama ini dilakukan dengan menahan codebase tetap lalu mengganti agen atau scaffolding
- Studi ini melakukan kebalikannya: menahan agen dan tugas tetap, lalu hanya mengubah kebersihan codebase untuk dibandingkan
Kebersihan kode dan konstruksi pasangan minimal
- Kebersihan kode diperlakukan sebagai kumpulan sifat yang terkait dengan kode yang mudah dipelihara
- Mudah dibaca
- Kompleksitas kognitif rendah
- Helper terpisah dengan baik
- Penamaan yang jelas
- Sedikit dead code, logika duplikat, dan coupling yang tidak disengaja
- Studi ini tidak memakukan kebersihan kode pada definisi formal yang ketat, melainkan memakai jumlah pelanggaran aturan analisis statis SonarQube sebagai proksi longgar
- Alat yang digunakan adalah SonarQube Cloud Enterprise Edition
- Set aturan yang dipakai adalah “default quality gate”
- Repositori pasangan minimal disusun agar hanya kebersihan internalnya yang berbeda, sementara kondisi berikut disamakan
- Bahasa dan framework yang sama
- Dependensi yang sama
- Pengujian yang sama atau cakupan pengujian yang setara
- Perilaku eksternal yang sama
- Kesetaraan perilaku dipandang tercapai jika, untuk input yang sama, output yang dapat diamati dari luar dan transisi state juga sama
- Verifikasi aktual dilakukan dengan meluluskan test suite yang sama pada cakupan yang sama, atau pada pasangan pengujian yang mengoreksi perubahan yang tidak dapat diamati seperti refactoring
Pipeline pembuatan pasangan minimal: Slopify dan Vibeclean
- Pasangan minimal dibuat dua arah
- Slopify yang membuat repositori bersih menjadi lebih berantakan
- Vibeclean yang merapikan codebase berantakan
-
Slopify
- Mengubah codebase bersih menjadi versi yang seolah tumbuh tanpa code review atau linting
- Targetnya bukan kode yang sengaja dirusak, melainkan versi sejarah alternatif saat analisis statis tidak digunakan
- Tiga tahap dijalankan masing-masing oleh agen baru
- Build: membangun repositori dan memastikan pengujian lulus, lalu menetapkan perintah di
build instructions.md - Explore: menelusuri repositori dan menulis
summary.mduntuk tiap direktori yang akan dibersihkan - Transform: memasukkan pelanggaran aturan SonarQube ke direktori yang ditentukan, lalu menjalankan ulang pengujian setelah tiap pass dan menolak perubahan yang merusak
- Build: membangun repositori dan memastikan pengujian lulus, lalu menetapkan perintah di
- Kompleksitas kognitif ditingkatkan lewat inline helper, duplikasi logika per jalur, penambahan dead code, dan penggabungan beberapa modul ke satu file
-
Vibeclean
- Merapikan codebase yang secara alami memiliki banyak pelanggaran aturan sambil mempertahankan perilaku eksternal
- Daftar kerja agen adalah daftar isu yang terdeteksi analis, dan tiap isu terhubung ke cakupan kode
- Cakupan perbaikan dibatasi pada masalah yang ditandai analis, dan redesain menyeluruh bukan tujuannya
- Berjalan dalam dua tahap
- Build: memeriksa perintah build dan pengujian lalu menetapkannya di
build instructions.md - Clean: merapikan pelanggaran aturan analis secara mekanis per modul, lalu memverifikasi kesetaraan perilaku dengan pengujian setelah modul diproses
- Build: memeriksa perintah build dan pengujian lalu menetapkannya di
- Melakukan penghapusan duplikasi string literal, penghapusan kode yang dikomentari, penggantian idiom koleksi legacy, dan penghapusan branch mati
- Saat analis benar-benar menandai struktur besar, ia mengganti dispatch switch lebih dari 200 baris menjadi helper bernama, atau mengekstrak helper persistensi dari class 2.800 baris
- Namun ekstraksi ini kadang hanya mendistribusikan ulang kompleksitas ke lebih banyak method alih-alih menghilangkannya, dan beberapa struktur terbesar tetap dibiarkan sebagai
wontfix
Repositori benchmark dan desain tugas
- Benchmark dibangun di atas Harbor framework v0.4.0
- Total digunakan 6 repositori pasangan minimal
- 3 berfokus pada Java, 3 berfokus pada Python
- Beberapa repositori menyertakan sedikit kode dalam bahasa lain
- Terdiri dari 3 repositori open source publik dan 3 codebase privat SonarSource
- Pasangan privat berfungsi sebagai perlindungan terhadap hafalan jika LLM yang dievaluasi mungkin pernah belajar dari repositori publik
- Metrik utama sisi bersih dan sisi berantakan untuk tiap repositori adalah sebagai berikut
sonar-sca*: isu 94 / 2.825, kepadatan isu 0,73 / 20,66, kepadatan kompleksitas kognitif 30,6 / 56,5sonar-caas-poc*: isu 16 / 855, kepadatan isu 0,61 / 27,16, kepadatan kompleksitas kognitif 179,8 / 218,9sonarcloud-codedatalake*: isu 199 / 1.319, kepadatan isu 4,36 / 34,39, kepadatan kompleksitas kognitif 34,0 / 216,5commons-bcel: isu 694 / 2.711, kepadatan isu 12,60 / 49,46, kepadatan kompleksitas kognitif 102,8 / 108,3genie: isu 152 / 1.262, kepadatan isu 1,28 / 10,81, kepadatan kompleksitas kognitif 22,2 / 23,5ckan: isu 1.006 / 3.632, kepadatan isu 7,54 / 27,50, kepadatan kompleksitas kognitif 69,3 / 76,5
- Desain tugas mengikuti tiga aturan
- Melewati hotspot: tugas ditempatkan agar melintasi area kode dengan perbedaan besar dalam kepadatan isu dan kompleksitas kognitif di kedua sisi pasangan
- Deskripsi yang dapat diamati secara eksternal: hanya memberikan input·output dan skenario contoh, tanpa menyebut nama file, fungsi, atau struktur internal
- Pengujian permukaan publik: pengujian tersembunyi dijalankan melalui antarmuka yang diberikan aplikasi kepada pemanggil seperti CLI, route HTTP, dan library/API
- Pembuatan tugas dibagi antara agen dan manusia
- Agen membandingkan varian bersih dan varian berantakan lalu membuat peta perbedaan
- Agen lain menulis rancangan tugas dan kelayakan pengujian
- Manusia memilih, menyunting, dan mengkurasi rancangan yang tampak masuk akal dan menarik
- Agen ketiga membuat instruksi aktual, pengujian permukaan publik tersembunyi, dan implementasi referensi untuk penggunaan internal
- Implementasi referensi harus lulus pengujian tersembunyi di kedua repositori
- Repositori sebelum diperbaiki tidak boleh lulus pengujian tersembunyi
- Tugas yang masih tidak memenuhi syarat setelah dua iterasi ditulis ulang oleh manusia atau dihapus
- Jumlah tugas akhir adalah 33, dibagi menjadi tiga trek
- 13 tugas hotspot kognitif: melewati area kompleks berdensitas tinggi dalam satu method atau satu class
- 14 tugas multi-modul: memerlukan perubahan lintas dua modul atau lebih
- 6 tugas kalibrasi: kedua sisi melakukan tugas sederhana pada area yang sama untuk memeriksa apakah ada perubahan yang tidak terkait kebersihan
Pengaturan eksperimen dan metrik pengukuran
- Semua eksperimen dilakukan dengan Claude Code menggunakan set alat default
- Angka yang dilaporkan berasal dari eksekusi Claude Sonnet 4.6
- Claude Haiku 4.5 juga dicoba pada set tugas yang sama, tetapi tingkat kelulusannya terlalu rendah sehingga sulit membaca perbedaan footprint dengan jelas, sehingga dikeluarkan dari hasil utama
- Agen hanya membaca deskripsi tugas
- Tidak menerima priming tambahan tentang kebersihan kode
- Tidak mengetahui sedang bekerja pada sisi mana dari pasangan minimal
- Tiap tugas dijalankan 10 kali di kedua sisi pasangan
- Total eksperimen adalah 33 × 2 × 10 = 660
- Tiap eksekusi dilakukan dalam sandbox terkontainerisasi
- CPU, memori, penyimpanan, dan waktu dinding dibatasi
- Akses ke registry paket publik diizinkan
- Image dasar mencakup toolchain per repositori, cache build, dan layanan
- Di dalam pasangan, yang berbeda hanya source tree yang di-mount ke
/app
- Ada 10 metrik yang dicatat
- Tingkat kelulusan: proporsi eksekusi yang lulus pengujian tersembunyi pada status akhir
- Token input: jumlah token yang dibaca model di semua turn, dengan isi file dan pengiriman ulang percakapan sebelumnya sebagai porsi terbesar
- Token output: seluruh keluaran dari model dan subagen, termasuk prosa, kode, jejak penalaran, dan pemanggilan alat
- Jumlah karakter penalaran: karena API Anthropic tidak mengekspos token penalaran secara terpisah, yang dihitung adalah karakter teks biasa dalam blok konten penalaran
- Jumlah turn percakapan: total pertukaran agen-alat
- Turn sebelum edit pertama: jumlah turn hingga modifikasi file pertama
- Jumlah karakter sebelum edit pertama: jumlah karakter percakapan pada rentang yang sama
- Jumlah file dibaca: jumlah file unik yang dibuka selama eksekusi
- Kunjungan ulang file: jumlah pembacaan ulang file yang sebelumnya sudah dibaca dan diedit
- Jumlah baris diubah: jumlah baris source yang diubah oleh patch akhir
- Kunjungan ulang file muncul dalam alur seperti
baca → edit → kemungkinan kerja lain → baca lagi- Studi ini menafsirkannya sebagai sinyal ketidakpastian terhadap edit sebelumnya, bukan sekadar eksplorasi yang luas
- Karena metrik footprint agen bisa sangat bervariasi walau tugas yang sama diulang pada temperatur tetap, filter outlier diterapkan
- Dalam tiap kombinasi
(tugas, sisi), eksekusi yang menyimpang lebih dari 50% dari median 10 pengulangan dihapus sebelum dihitung rata-ratanya - Dalam praktiknya, 9,7% dari seluruh eksekusi dihapus
- Dalam tiap kombinasi
- Angka tingkat dataset di-micro-average untuk 33 tugas
- Untuk tiap metrik, rata-rata sisi bersih dan sisi berantakan per tugas dijumlahkan lalu dihitung perbedaan rasionya
- Tingkat kelulusan, sebagai pengecualian, dilaporkan sebagai selisih absolut dalam poin persentase antara sisi bersih dan sisi berantakan
Hasil: berdampak pada biaya eksplorasi, bukan tingkat keberhasilan
- Kebersihan kode tidak menghasilkan perubahan berarti pada tingkat kelulusan agen
- Pada kode yang lebih bersih, metrik setara token turun 7~8%
- Kunjungan ulang file turun 34%, menunjukkan bahwa kode yang lebih bersih dapat mengurangi biaya membaca ulang untuk tugas yang sama
- Karena itu, kebersihan kode dapat dipandang sebagai sumbu tersendiri yang memengaruhi biaya eksekusi agen, bersama pilihan model, harness, dan prompt
1 komentar
Opini Hacker News
Ini pertanyaan yang menarik untuk diteliti, tetapi saya sangat skeptis terhadap desain eksperimennya
Dalam eksperimen, mereka menggunakan Opus 4.6 untuk menyintesis codebase yang “diturunkan kualitasnya” atau “dirapikan”, lalu memakainya untuk perbandingan relatif
Yang lebih buruk, mereka tidak mengontrol apakah pengujian aplikasi menjadi rusak
“Tingkat kelulusan menilai status akhir agen berdasarkan kriteria pengujian tersembunyi yang kami tulis untuk setiap tugas. Kami tidak memeriksa apakah agen merusak pengujian yang tidak terkait yang sudah ada di repositori, dan meskipun solusi di sisi bersih maupun berantakan sama-sama lulus pengujian tersembunyi, keduanya bisa berbeda pada pengujian yang tidak dinilai”
Jika kualitas keluaran akhir tidak dikontrol, kesimpulan tentang konsumsi token hampir tidak bermakna
Agar perbandingannya adil, perlu ditulis satu kumpulan pengujian yang berjalan pada kedua proyek dalam tiap pasangan
Bukan berarti penelitiannya bagus, tetapi karena lulus pengujian tidak selalu berkorelasi dengan efektivitas agen, keputusan seperti itu bisa dipahami
Itu hanya menunjukkan situasi ketika secara fungsional tampak baik-baik saja, tetapi membutuhkan biaya token lebih besar untuk menyelesaikan pekerjaan
Kelelahan terhadap AI sudah lama membosankan, dan sekarang rasanya hanya menyakitkan
Dari pengalaman saya, perbedaan performa agen cukup besar antara codebase yang dipenuhi dead code, kode duplikat, jalur alternatif yang tidak terjangkau, abstraksi bocor, dan pola desain yang belum matang, dibandingkan codebase dengan alur data yang jelas serta enkapsulasi dan struktur yang bersih
Pada kode buruk, semua model frontier harus melewati beberapa putaran code review, pemeriksaan kualitas, dan perbaikan; pada kode bagus, saya melihat hasilnya sering langsung tepat pada percobaan pertama atau kedua
Kita bisa meminta LLM menjalankan skrip yang memeriksa hal-hal ini, lalu memberlakukan skrip yang sama sebagai hook pre-commit
Memasukkan konfigurasi semacam ini secara ketat ke semua codebase yang saya kerjakan adalah hal yang paling berdampak dalam coding berbasis agen
Tulisan yang merinci beberapa linter yang saya pakai ada di sini: https://www.balajeerc.info/Use-Deterministic-Guardrails-for-...
Menurut saya agen memang pasti bekerja lebih baik pada codebase yang bersih daripada pada codebase besar yang kacau
Sama seperti mereka bekerja lebih baik ketika punya spesifikasi yang tersusun baik dan akses ke dokumentasi
Pada titik tertentu, pola-pola buruk itu mulai menular ke saya juga
Di sini ada makalah yang berusaha menjawab pertanyaan tersebut, sementara kesaksian anekdotal hanya memberi bias kepada pembaca dan tidak menambah nilai untuk menarik kesimpulan objektif tentang masalahnya
Diskusi yang paling berguna adalah jika semua orang membaca makalahnya lalu mengkritik metodologi atau hasilnya
Namun orang yang mengeluh bahwa LLM tidak begitu bagus umumnya tampak seperti tipe yang memiliki codebase berantakan
Trik yang menurut saya berhasil adalah, untuk Python, memberi instruksi refactoring seperti berikut
“Refactor kode Python agar lebih Pythonic. Misalnya, kurangi class dan singleton, terutama jika itu meningkatkan kecepatan. Kode Python harus mengikuti standar organisasi kode yang diharapkan dari kode paket Python open-source populer tanpa regresi performa benchmark”
Untuk kode Rust, saya pernah memakai variasi ini
“Codebase Rust di
/srcsudah membengkak menjadi beberapa file yang masing-masing lebih dari 1.000 baris. Refactor codebase Rust agar sesuai dengan standar organisasi kode yang diharapkan dari kode Rust open-source populer tanpa regresi performa benchmark”Prompt seperti ini tampaknya meningkatkan performa agen karena a) kode ditata ulang secara logis dan b) nama file memberi petunjuk semantik tentang lokasi kode terkait
Dalam file gemuk berisi 5.000 baris, agen harus membaca banyak potongan untuk mencari kode terkait, sehingga tidak efisien
Performa benchmark juga biasanya membaik setelah refactoring; terutama pada Rust yang dikompilasi, mungkin itu kebetulan, tetapi tidak ada yang perlu dikeluhkan
Pada dasarnya, alat coding berbasis agen cenderung enggan menghapus kode. Bahkan ketika diminta menghapus, ia sering berusaha keras meninggalkan kode lama atau menambah kompleksitas agar kode itu tetap bisa dipanggil
Jika sekadar sedang membuat prototipe, ini sangat menyebalkan, karena akhirnya banyak dead code menumpuk dan menimbulkan kebingungan saat nanti ingin menambahkan fitur
Setelah menyadari ini, kita cukup memintanya menyingkirkan legacy
Menjaga codebase tetap bersih mendorong AI melakukan hal yang benar. Jika ada banyak pengujian, ia akan menambahkan lebih banyak saat membuat fitur baru; jika ada dokumentasi, ia akan memperbaruinya tanpa perlu diminta
Seiring membaiknya code harness, hal-hal seperti ini akan makin terintegrasi, dan orang yang kurang berpengalaman dalam prompting pun akan lebih mudah mendapatkan hasil yang layak
Biasanya saya minta ia meninjau dulu dan membuat daftar item tinjauan, lalu saya menelusuri tiap item bersamanya untuk memutuskan ya/tidak atau mengusulkan perbaikan tambahan
Terutama jika tidak ada pengujian end-to-end yang cermat untuk seluruh sistem
Lagi pula, aturan gaya kode sudah saya masukkan ke CLAUDE.md
Pendekatan berupa “pipeline agen yang merapikan repositori berantakan” terlihat buruk, dan itu saja sudah cukup untuk membantah keseluruhan riset ini
Sepertinya separuh dari pasangan minimal dalam pekerjaan ini dibuat dengan cara seperti itu
Saya sama sekali tidak akan memercayai kesimpulan yang harus berasumsi bahwa repositori yang “dirapikan” oleh AI benar-benar mewakili codebase yang baik
Di sini, “bersih” bukan berarti kami sekadar meminta agen menulis kode yang lebih baik
Kami memberikan daftar 50–100 pelanggaran aturan static analyzer beserta jumlah baris kode, lalu meminta pelanggaran itu dihapus
Setelah itu kami memeriksa apakah pelanggaran aturan tersebut sudah terselesaikan
Menulis ulang kode dengan LLM untuk menghapus pelanggaran semacam ini adalah praktik yang cukup diterima
Pendekatan one-shot berbasis LLM milik Sonar yang sudah ada [1] telah beroperasi lebih dari setahun, dan pendekatan agentic terbaru [2] juga melakukan tugas yang sama dengan cukup baik
[1] https://www.sonarsource.com/solutions/ai/ai-codefix/
[2] https://www.sonarsource.com/products/sonarqube/remediation-a...
Saya rasa tentu saja pasti berpengaruh
Tidak ada model yang bisa memuat seluruh codebase nyata ke dalam konteks, dan ia harus menelusuri kode seperti manusia
Caranya adalah mencari dan membaca file
Jika file berada di lokasi yang diperkirakan dan dinamai dengan nama yang kemungkinan pertama kali dicari oleh model atau manusia, maka ia akan ditemukan pada percobaan pertama; jika tidak, dibutuhkan pencarian lebih dalam dan beberapa kali percobaan
Cukup melihat semua path, mengabaikan area yang sudah ditangani, lalu berpindah ke path berikutnya
Ini cukup mirip dengan cara developer bekerja
Saya juga melihat hasil serupa dalam pekerjaan sejenis yang sedang berlangsung di NJIT. Kami menyebutnya penularan kualitas kontekstual
Bagian yang menarik di sini adalah situasi nyata yang umum di industri: codebase dengan kualitas campuran, codebase yang mencampur pola kode legacy dengan pola “baik” yang lebih baru sehingga agen bingung memahami konvensinya, dan semacamnya
Desain pasangan minimal sebenarnya merupakan salah satu kekuatannya, karena berusaha memisahkan faktor kebersihan dari faktor lain seperti struktur, dependensi, dan pengujian, dibanding sekadar membandingkan antar-repositori
Namun penggunaan kode “dibuat berantakan” oleh LLM agak patut dipertanyakan, karena bukan cara mekanis atau dipandu manusia
Kritik terbesar, seperti sudah ditunjukkan dengan tepat oleh orang lain, adalah pilihan untuk tidak memeriksa seluruh rangkaian pengujian. Klaim “kesetaraan perilaku” hanya sevalid pengujian dan cakupannya
Hipotesis ini meyakinkan karena dua hal. 1) LLM meniru apa yang dilihatnya di codebase, jadi masuk akal bahwa sampah masuk, sampah keluar 2) Ini cocok dengan intuisi yang dirasakan banyak engineer selama 1–2 tahun terakhir saat menggunakan model-model ini
Greenfield hampir selalu lebih mudah daripada bergabung ke codebase yang sibuk, dan kekacauan muncul dari integrasi kompleks serta pemeliharaan sistem dengan tujuan legacy
Sekalipun agen belajar menavigasi stub dan kode WET yang ditinggalkannya sendiri, apakah kita benar-benar menginginkan codebase yang tidak bisa diikuti manusia untuk memahami apa yang sebenarnya terjadi?
Karena itu, secara pribadi saya setidaknya ingin kode bercerita lewat kode tentang apa yang dilakukannya
Meski ada logika di dua fungsi kecil yang bisa diekstrak menjadi helper bersama, programmer manusia terkadang tidak melakukannya karena tahu abstraksi itu akan berantakan dan mudah rusak begitu salah satunya perlu sedikit diubah
Menarik melihat hal ini dikuantifikasi
Struktur yang bersih tampaknya menurunkan beban kognitif baik bagi manusia maupun agen, sehingga ini menjelaskan mengapa penamaan dan modularisasi lebih penting daripada yang mungkin kita kira
Sulit dikuantifikasi, tetapi itulah yang pada akhirnya coba ditangkap oleh semua metrik kualitas kode
Dilihat dari standar itu, selama metrik kualitas kode yang digunakan masuk akal, kesimpulannya tidak terlalu mengejutkan
Jika metrik kualitas itu baik dalam konteks agen coding, maka hasil yang diharapkan memang seperti ini
Banyak token dipakai untuk menjelajahi kode: mencari kode atau mengikuti titik pemanggilan, dalam proses membangun konteks yang cukup untuk menyelesaikan tugas
Jika agen diberi suatu bentuk akses LSP, dan untuk monorepo disediakan panduan hierarkis lewat file seperti AGENTS.md, penggunaan token untuk eksplorasi bisa sangat dikurangi
Namun codebase yang tersebar pada akhirnya tetap membutuhkan suatu bentuk eksplorasi untuk menyelesaikan setiap tugas
Dan eksplorasi ini bukan sekadar penggunaan token. Di setiap langkah, latensi LLM, prefill, decoding, output yang diparsing agen, pemanggilan tool, respons tool, lalu perjalanan pulang-pergi kembali ke LLM berulang terus
Sebagian bisa dilakukan paralel, tetapi dalam praktiknya kebanyakan bersifat sekuensial sehingga tugas menjadi cukup lambat
Untuk menggunakan agen secara efisien, lokalitas dan struktur adalah kuncinya. Context window selalu terbatas, dan perhatian di dalamnya juga tidak selalu konsisten
Dari pengalaman saya, semua hal yang memengaruhi engineer juga memengaruhi agen
Abstraksi yang baik, metode berukuran wajar, penamaan yang baik, struktur internal layanan dan antarlayanan yang berprinsip, unit test, semuanya termasuk
Hal-hal ini secara historis merupakan pekerjaan engineer, dan ditujukan agar orang lain lebih mudah berkontribusi pada kode
Sekarang, bukan hanya orang lain, tetapi agen lain juga menjadi lebih mudah berkontribusi pada kode