Perintah Unix tree
yang populer baru-baru ini memperkenalkan fitur untuk menghasilkan data JSON terstruktur, namun pilihan implementasinya telah memicu perdebatan sengit di komunitas developer. Yang dimulai sebagai upaya untuk memodernisasi alat command-line telah berubah menjadi kisah peringatan tentang melanggar konvensi yang telah mapan.
Kekacauan File Descriptor
Tree versi 2.0.0 memperkenalkan output JSON otomatis pada file descriptor 3, yang oleh para developer dijuluki stddata. Idenya tampak sederhana: jika file descriptor 3 ada, output data JSON secara otomatis di sana. Namun, asumsi ini dengan cepat terbukti bermasalah ketika script yang sudah ada mulai rusak secara tak terduga.
Masalah muncul karena banyak shell script dan proses sistem secara rutin mengirimkan berbagai file descriptor ke program tanpa mengharapkan descriptor tersebut memicu perilaku khusus. Script yang telah bekerja dengan andal selama bertahun-tahun tiba-tiba mulai menghasilkan output JSON yang tidak diinginkan, menyebabkan masalah kompatibilitas yang meluas.
File descriptor adalah saluran bernomor yang digunakan program untuk membaca dan menulis data, dengan 0, 1, dan 2 secara tradisional dicadangkan untuk standard input, output, dan error.
Kronologi Versi Perintah Tree:
- Versi 2.0.0: Memperkenalkan output JSON otomatis pada file descriptor 3 ("stddata")
- Versi 2.0.2: Berubah menjadi memerlukan variabel environment STDDATA_FD karena masalah kompatibilitas
Detail Teknis:
- Fitur: Output JSON pada file descriptor 3
- Variabel Environment: STDDATA_FD (diperlukan pada v2.0.2+)
- Contoh Penggunaan:
STDDATA_FD=1 tree | from json
- Platform: Saat ini hanya Linux
- Pertimbangan Masa Depan: Kemungkinan beralih ke format BSON
Reaksi Balik Komunitas dan Kritik Desain
Respons komunitas developer cepat dan kritis. Banyak yang menunjukkan bahwa pendekatan tersebut melanggar konvensi Unix yang telah lama ada tentang bagaimana program seharusnya berperilaku. Kritik utama berpusat pada membuat asumsi tentang lingkungan daripada memerlukan maksud eksplisit dari pengguna.
Pada versi 2.0.2, para developer mengakui masalah tersebut dan mengubah implementasi untuk memerlukan variabel lingkungan bernama STDDATA_FD
untuk mengaktifkan fitur tersebut. Namun, perbaikan ini tidak memuaskan para kritikus yang berargumen bahwa variabel lingkungan menciptakan serangkaian masalah mereka sendiri, termasuk potensi konflik dengan script yang sudah ada yang mungkin menggunakan nama variabel yang sama untuk tujuan berbeda.
Variabel lingkungan adalah pengaturan sistem yang dapat dibaca program untuk memodifikasi perilaku mereka.
Perdebatan Filosofi Desain yang Lebih Luas
Kontroversi ini telah menyoroti diskusi yang lebih besar tentang praktik pengembangan perangkat lunak modern. Beberapa anggota komunitas menyatakan kekhawatiran tentang developer muda yang mengabaikan konvensi yang telah mapan tanpa memahami pentingnya secara historis. Kritik meluas melampaui kasus spesifik ini ke kekhawatiran yang lebih luas tentang mempertahankan stabilitas sistem saat developer baru memasuki bidang ini.
Ini adalah kekhawatiran yang lebih besar yang mulai saya lihat pada kelas tertentu dari developer muda di mana konvensi yang ada hanya diabaikan tanpa upaya memahami mengapa konvensi tersebut ada.
Beberapa pendekatan alternatif disarankan, termasuk flag command-line tradisional atau file output terpisah. Solusi ini akan menghindari masalah kompatibilitas sepenuhnya sambil tetap menyediakan fungsi JSON yang diinginkan.
Konteks Teknis dan Alternatif
Motivasi di balik fitur ini berkaitan dengan lingkungan shell modern seperti Nushell dan PowerShell , yang dapat bekerja dengan data terstruktur lebih efektif daripada output berbasis teks tradisional. Namun, alat yang sudah ada telah menyediakan output JSON melalui opsi command-line konvensional, membuat kebutuhan untuk pendekatan khusus ini dipertanyakan.
Beberapa developer mencatat bahwa proyek lain, seperti library libxo FreeBSD , telah berhasil menambahkan output terstruktur ke alat sistem menggunakan parameter command-line standar tanpa menyebabkan masalah kompatibilitas.
Format data terstruktur seperti JSON memungkinkan program untuk bertukar informasi dengan cara yang lebih mudah diproses secara otomatis oleh program lain.
Pendekatan Alternatif yang Disarankan oleh Komunitas:
- Flag command-line tradisional (--json-output=filename)
- Nama program terpisah
- Mengikuti model libxo FreeBSD dengan opsi --libxo
- Menggunakan standard output (stdout) untuk data JSON
Teknologi Terkait:
- Nushell: Shell modern dengan dukungan data terstruktur
- PowerShell: Shell berorientasi objek dari Microsoft
- libxo: Pustaka output terstruktur FreeBSD
- BSON: Format JSON biner yang dipertimbangkan untuk versi mendatang
Pelajaran untuk Pengembangan Masa Depan
Insiden ini berfungsi sebagai pengingat bahwa kompatibilitas mundur dan ekspektasi pengguna harus diprioritaskan daripada fitur inovatif. Filosofi Unix untuk melakukan satu hal dengan baik meluas ke menghormati antarmuka dan konvensi yang telah mapan, bahkan ketika mencoba menambahkan kemampuan modern ke alat warisan.
Pengalaman perintah tree menunjukkan bahwa bahkan fitur yang bermaksud baik dapat menyebabkan masalah signifikan ketika mereka melanggar asumsi yang ada tentang bagaimana perangkat lunak berperilaku. Saat komunitas pengembangan terus memodernisasi alat tradisional, studi kasus ini memberikan wawasan berharga tentang menyeimbangkan inovasi dengan stabilitas.
Referensi: Tree release notes, version 2.0.0