Arahan Unix tree
yang popular baru-baru ini memperkenalkan ciri untuk mengeluarkan data JSON berstruktur, tetapi pilihan pelaksanaan tersebut telah mencetuskan perdebatan hangat dalam komuniti pembangun. Apa yang bermula sebagai percubaan untuk memodernkan alat baris arahan telah bertukar menjadi kisah amaran tentang memecahkan konvensyen yang telah ditetapkan.
Masalah File Descriptor
Tree versi 2.0.0 memperkenalkan output JSON automatik pada file descriptor 3, yang digelar oleh pembangun sebagai stddata. Idea tersebut kelihatan mudah: jika file descriptor 3 wujud, keluarkan data JSON di sana secara automatik. Walau bagaimanapun, andaian ini dengan cepat terbukti bermasalah apabila skrip sedia ada mula rosak tanpa dijangka.
Isu ini timbul kerana banyak skrip shell dan proses sistem secara rutin menghantar pelbagai file descriptor kepada program tanpa menjangkakan descriptor tersebut mencetuskan tingkah laku khas. Skrip yang telah berfungsi dengan baik selama bertahun-tahun tiba-tiba mula menghasilkan output JSON yang tidak diingini, menyebabkan isu keserasian yang meluas.
File descriptor adalah saluran bernombor yang digunakan oleh program untuk membaca dan menulis data, dengan 0, 1, dan 2 secara tradisinya dikhaskan untuk input standard, output, dan ralat masing-masing.
Garis Masa Versi Arahan Tree:
- Versi 2.0.0: Memperkenalkan output JSON automatik pada deskriptor fail 3 ("stddata")
- Versi 2.0.2: Berubah kepada memerlukan pembolehubah persekitaran STDDATA_FD disebabkan isu keserasian
Butiran Teknikal:
- Ciri: Output JSON pada deskriptor fail 3
- Pembolehubah Persekitaran: STDDATA_FD (diperlukan dalam v2.0.2+)
- Contoh Penggunaan:
STDDATA_FD=1 tree | from json
- Platform: Pada masa ini hanya Linux sahaja
- Pertimbangan Masa Depan: Kemungkinan beralih kepada format BSON
Reaksi Keras Komuniti dan Kritikan Reka Bentuk
Respons komuniti pembangun adalah pantas dan kritikal. Ramai yang menunjukkan bahawa pendekatan tersebut melanggar konvensyen Unix yang telah lama wujud tentang bagaimana program sepatutnya berkelakuan. Kritikan teras tertumpu pada membuat andaian tentang persekitaran berbanding memerlukan niat pengguna yang jelas.
Menjelang versi 2.0.2, pembangun mengakui masalah tersebut dan mengubah pelaksanaan untuk memerlukan pembolehubah persekitaran yang dipanggil STDDATA_FD
untuk membolehkan ciri tersebut. Walau bagaimanapun, pembetulan ini tidak memuaskan pengkritik yang berhujah bahawa pembolehubah persekitaran mewujudkan set masalah mereka sendiri, termasuk potensi konflik dengan skrip sedia ada yang mungkin menggunakan nama pembolehubah yang sama untuk tujuan berbeza.
Pembolehubah persekitaran adalah tetapan seluruh sistem yang boleh dibaca oleh program untuk mengubah suai tingkah laku mereka.
Perdebatan Falsafah Reka Bentuk yang Lebih Luas
Kontroversi ini telah menonjolkan perbincangan yang lebih besar tentang amalan pembangunan perisian moden. Sesetengah ahli komuniti menyatakan kebimbangan tentang pembangun muda yang mengabaikan konvensyen yang telah ditetapkan tanpa memahami kepentingan sejarah mereka. Kritikan ini meluas melampaui kes khusus ini kepada kebimbangan yang lebih luas tentang mengekalkan kestabilan sistem apabila pembangun baru memasuki bidang ini.
Ini adalah kebimbangan yang lebih besar yang saya mula lihat dalam kelas tertentu pembangun muda di mana konvensyen sedia ada hanya diabaikan tanpa percubaan untuk memahami mengapa ia wujud.
Beberapa pendekatan alternatif telah dicadangkan, termasuk flag baris arahan tradisional atau fail output berasingan. Penyelesaian ini akan mengelakkan isu keserasian sepenuhnya sambil tetap menyediakan fungsi JSON yang diingini.
Konteks Teknikal dan Alternatif
Motivasi di sebalik ciri tersebut berkaitan dengan persekitaran shell moden seperti Nushell dan PowerShell, yang boleh bekerja dengan data berstruktur dengan lebih berkesan daripada output berasaskan teks tradisional. Walau bagaimanapun, alat sedia ada sudah menyediakan output JSON melalui pilihan baris arahan konvensional, menjadikan keperluan untuk pendekatan khusus ini boleh dipersoalkan.
Sesetengah pembangun menyatakan bahawa projek lain, seperti perpustakaan libxo FreeBSD, telah berjaya menambah output berstruktur kepada alat sistem menggunakan parameter baris arahan standard tanpa menyebabkan isu keserasian.
Format data berstruktur seperti JSON membolehkan program menukar maklumat dengan cara yang lebih mudah untuk program lain memproses secara automatik.
Pendekatan Alternatif yang Dicadangkan oleh Komuniti:
- Flag baris arahan tradisional (--json-output=filename)
- Nama program yang berasingan
- Mengikuti model libxo FreeBSD dengan pilihan --libxo
- Menggunakan output standard (stdout) untuk data JSON
Teknologi Berkaitan:
- Nushell: Shell moden dengan sokongan data berstruktur
- PowerShell: Shell berorientasikan objek Microsoft
- libxo: Perpustakaan output berstruktur FreeBSD
- BSON: Format JSON binari yang dipertimbangkan untuk versi akan datang
Pengajaran untuk Pembangunan Masa Depan
Insiden ini berfungsi sebagai peringatan bahawa keserasian ke belakang dan jangkaan pengguna harus mengambil keutamaan berbanding ciri inovatif. Falsafah Unix untuk melakukan satu perkara dengan baik meluas kepada menghormati antara muka dan konvensyen yang telah ditetapkan, walaupun ketika cuba menambah keupayaan moden kepada alat warisan.
Pengalaman arahan tree menunjukkan bahawa walaupun ciri yang berniat baik boleh menyebabkan masalah besar apabila ia memecahkan andaian sedia ada tentang bagaimana perisian berkelakuan. Ketika komuniti pembangunan terus memodernkan alat tradisional, kajian kes ini memberikan wawasan berharga tentang mengimbangi inovasi dengan kestabilan.
Rujukan: Nota keluaran Tree, versi 2.0.0