- Keynote Strange Loop dari Julia Evans membahas mengapa keterampilan yang tampak “dasar” seperti DNS, Bash, HTTP, dan SQL justru sulit dipelajari dan memakan waktu lama, serta cara menurunkan hambatan belajar
- Kesulitan Bash terletak pada banyaknya pengecualian kecil dan jebakan, seperti
set -eyang dinonaktifkan saat pemanggilan fungsi berada di dalam kondisi||, dan banyak orang hanya memakai Bash sesekali sehingga sulit mengingat detailnya dengan tepat - HTTP dan SQL menyembunyikan beban belajar besar di balik permukaan yang tampak sederhana, seperti implementasi browser sebesar 20 juta baris kode, banyak header dan flag, serta perbedaan antara urutan penulisan dan urutan eksekusi SQL
- Pada DNS, komunikasi antara library, cache, dan authoritative nameserver tidak mudah terlihat oleh pengguna, dan output
digjuga rumit, sehingga alat yang menampilkan perilaku tersembunyi serta demo menjadi penting - Dukungan belajar yang baik mencakup berbagi alat dan referensi, menyusutkan daftar besar menjadi daftar kecil yang benar-benar dipakai, menjelaskan apa yang dilakukan komputer secara kronologis, dan turut membagikan kisah kegagalan serta catatan bug
Mengapa teknologi yang tampak “dasar” butuh waktu lama untuk dipelajari
- Keynote Strange Loop Making Hard Things Easy membahas cara membuat teknologi yang sulit dipelajari menjadi lebih mudah
- Titik awalnya adalah DNS
- Mencari alamat IP dari nama domain tampak sederhana, tetapi pembicara mengatakan bahwa bahkan setelah 7 tahun belajar DNS, ia masih mengalami masalah saat mengatur situs web, dan secara keseluruhan butuh sekitar 10 tahun
- Teman-temannya juga terus mengalami masalah yang sama berulang kali, dan banyak orang menerimanya sebagai masalah pribadi seolah-olah mereka “seharusnya sudah paham”
- Untuk menjelaskan topik-topik seperti ini dengan lebih mudah, pembicara memulai penerbit kecil bernama Wizard Zines, dengan Bash, HTTP, SQL, dan DNS sebagai contoh
Bash: pengecualian yang sulit diingat sebaiknya ditangani alat
- Bash adalah bahasa pemrograman, tetapi termasuk salah satu bahasa yang menurut pembicara memiliki perilaku aneh paling banyak
- Dalam skrip contoh, meskipun
mv ./*.txt /tmmppgagal, Bash secara default tidak berhenti dan tetap menjalankanecho "success!"- Dengan
set -e, Bash bisa dibuat berhenti saat terjadi kegagalan - Namun jika fungsi dipanggil di dalam kondisi seperti
f || echo "failed!", makaset -edi dalam fungsi akan dinonaktifkan secara global dansuccesskembali tercetak - Perilaku ini bukan bug Bash, melainkan perilaku yang terdokumentasi
- Dengan
- Salah satu alasan Bash sulit adalah banyak orang hanya menulis skrip Bash sekali tiap 6 bulan lalu tidak melihatnya lagi
- Jika sistem yang jarang dipakai penuh dengan pengetahuan kecil dan jebakan, maka sulit menggunakannya dengan benar
- Reaksi seperti “tak seorang pun bisa memakai Bash” tidak sepenuhnya benar
- Banyak orang memakai Bash, dan meskipun tidak sempurna, mereka sering tetap berhasil menyelesaikan pekerjaan
- Tujuannya adalah membawa seseorang yang berdiri di depan tumpukan jebakan yang menakutkan ke kondisi “bisa memakainya dengan cukup benar”
- ShellCheck adalah alat yang mengingat jebakan Bash yang sulit dihafal manusia dan memberi peringatan
shellcheck -o all bad-again.shmenampilkan peringatanSC2310bahwaset -edinonaktifkan untuk fungsi yang dipanggil dalam kondisi||- Pemeriksaan ini hanya muncul jika dijalankan dengan
-o all - Alat seperti ini membuat komputer menangani pengetahuan kecil yang merepotkan sehingga beban kognitif berkurang
Kisah kegagalan lebih membantu penilaian daripada “best practices”
- Bahkan tanpa membuat alat sendiri, penting untuk memberi tahu teman atau rekan kerja tentang alat berguna yang sudah dipakai
- Pembicara juga baru mengetahui ShellCheck terlambat, dan mengatakan ia kesal karena selama itu ternyata ia tidak perlu mengingat semuanya di kepala
- Berbagi jebakan dan kisah kegagalan lebih mirip layanan komunitas
- Kasus
set -eyang dinonaktifkan di Bash dipelajari dari pengalaman yang diceritakan teman bernama Jesse beberapa minggu sebelumnya - Dengan mengetahui kegagalan orang lain, kita bisa menghindari masalah yang sama tanpa harus mengalaminya sendiri
- Kasus
- Daripada opini keras seperti “tidak ada yang boleh memakai Bash”, cerita tentang masalah nyata yang ditimbulkan Bash jauh lebih berguna
- Mendengar cerita yang sama, seseorang bisa memutuskan memakai ShellCheck dan tetap mempertahankan skrip Bash sederhana
- Orang lain bisa memutuskan tidak ingin memakai Bash sama sekali
- Tidak masalah jika reaksi terhadap contoh yang sama berbeda-beda
HTTP: harus dipahami dengan asumsi adanya browser 20 juta baris kode
- Respons HTTP mungkin tampak memiliki struktur sederhana berupa status code, header, dan body
- Namun pertanyaan seperti “mengapa header ini perlu disetel?” segera mengarah ke perilaku browser
- Firefox terdiri dari sekitar 20 juta baris kode
- Browser telah berevolusi sejak 1990-an, dan model keamanannya terus berubah mengikuti serangan dan perubahan di web
- Untuk memahami mengapa suatu topik sulit, kita perlu melihat apakah ada codebase yang sangat besar di belakangnya
- Bukan hanya HTTP, tetapi juga CSS, JS, dan lainnya, namun kompleksitas browser modern membantu menjelaskan hambatan belajar HTTP
- Daftar besar perlu diperkecil menjadi daftar kecil agar lebih mudah dipahami
- Daftar header permintaan HTTP berjumlah lebih dari 43, dan masih ada header tidak resmi
- Dalam komik header permintaan HTTP, pembicara membahas 15 header yang ia ketahui dan gunakan
- “Header paling penting” bukan daftar objektif, melainkan daftar subjektif berdasarkan yang ia pahami dan pakai
- Misalnya, sering kali cukup tahu bahwa jika
Accept-Encodingdisetel kegzip, maka kita bisa menerima respons terkompresi
- Alat command line juga bisa didekati dengan cara yang sama
- Man page
greppunya banyak flag, tetapi bahkan setelah 20 tahun memakaigrep, pembicara tidak mengetahui semuanya - Akan membantu bagi pemula jika orang berpengalaman berkata, “Saya hanya tahu 7 hal dalam sistem ini, dan inilah 7 hal itu”
- Orang berpengalaman lain mungkin mengenal 7 hal yang berbeda
- Man page
Referensi harus dengan jujur membagikan yang benar-benar dipakai
- Informasi yang tidak muat di kepala manusia membutuhkan referensi yang baik
- Pembicara mengatakan bahwa setelah 20 tahun belajar CSS secara berkala, ia baru mengetahui CSS-Tricks sekitar 2 tahun terakhir, dan andai tahu lebih awal itu akan sangat membantu
- CSS-Tricks tampaknya berhenti menerbitkan artikel baru sejak April setelah akuisisi, tetapi artikel yang sudah ada masih dianggap berguna
- Untuk HTTP, ia banyak memakai Mozilla Developer Network
- Sebagai referensi resmi HTTP, ada RFC 9110, 9111, 9112, 9113, dan 9114 yang ditulis pada 2022
- Di sana bisa dicari detail seperti perilaku tepat dari header
Connection - Referensi utama pembicara biasanya MDN, tetapi ia sangat menghargai bahwa RFC resmi tersebut tersusun rapi
- Di sana bisa dicari detail seperti perilaku tepat dari header
- Saat membagikan referensi, perlu dibedakan antara yang dibagikan karena terlihat keren dan yang benar-benar dipakai dalam pekerjaan nyata
- Dalam praktiknya, meskipun seseorang memakai referensi yang “kurang keren” seperti w3schools, yang penting adalah jujur tentang apakah itu benar-benar digunakan
SQL: jelaskan apa yang dilakukan komputer secara kronologis
- SQL bisa membingungkan bagi pemula karena urutan menulis query berbeda dari urutan eksekusi konseptual yang sebenarnya
- Model mental SQL yang dipakai pembicara adalah urutan berikut
FROMWHEREGROUP BYHAVINGSELECTORDER BYLIMIT
- Database nyata lebih kompleks karena ada optimisasi, tetapi model kronologis ini berguna untuk kebanyakan situasi
- Urutannya hampir sama dengan urutan yang tertulis di query, kecuali
SELECTberada di posisi kelima
- Urutannya hampir sama dengan urutan yang tertulis di query, kecuali
- Pendekatan dengan bertanya “apa yang sebenarnya dilakukan komputer lebih dulu?” bisa dipakai untuk topik lain juga
- Dalam CORS, semua komunikasi antara browser dan server bisa dituliskan secara kronologis agar lebih mudah dipahami
- Pembicara menyebut komik CORS sebagai contoh pendekatan ini
- Penjelasan kronologis tampak sederhana, tetapi sebenarnya sulit, dan itulah sebabnya berguna untuk kolaborasi
- Behind Hello World on Linux membahas apa yang terjadi saat menjalankan “hello world” di Linux
- Pembicara juga menulis artikel serupa 10 tahun sebelumnya, tetapi tulisan tahun 2023 itu sekitar 6 kali lebih panjang
- Bukan karena Linux menjadi lebih rumit, melainkan karena pada 2013 ia masih kurang memahami apa yang terjadi secara kronologis
- Dalam tim pun, ketika sebuah request masuk ke endpoint API, membuat timeline kronologis bersama tentang apa yang terjadi bisa membantu menyambungkan bagian-bagian yang diketahui masing-masing orang
DNS: perilaku tersembunyi harus ditampilkan agar intuisi terbentuk
- DNS adalah struktur di mana browser, fungsi library yang mengirim permintaan DNS, cache, dan authoritative nameserver bekerja bersama
- Masalahnya, banyak bagian di antaranya tersembunyi dari pengguna
- Tidak mudah mengetahui kode library mana yang mengirim permintaan DNS
- Data yang tersimpan di cache sulit diperiksa, dan pengguna tidak bisa mengendalikannya
- Komunikasi antara cache dan authoritative nameserver juga tidak terlihat
- Pembicara bersama temannya Marie membuat DNS server kecil bernama Mess With DNS
- Pengguna bisa membuat record DNS untuk domain
- Setiap kali ada permintaan dari resolver, layanan itu menampilkan pesan apa yang masuk
- Dalam demo Strange Loop, mereka membuat record CNAME bernama
strangeloopyang mengarah keorange.jvns.ca, dan melihat bahwa resolver DNS Kanada yang dipakai browser meminta record A dan AAAA
- Contoh lain yang menunjukkan hal tersembunyi adalah float.exposed
- Dengan mengubah significand dan exponent pada angka floating point 32-bit, kita bisa melihat angka floating point berikutnya dan perubahan jaraknya
- Alasan lain DNS sulit adalah karena ia merupakan sistem terdistribusi yang sangat besar
- Pembicara mengatakan kurang lebih “lebih dari 5 juta komputer bisa terlibat”, di mana sebagian besar tidak berada dalam kendali pengguna dan sebagian bisa berperilaku berbeda dari harapan
Ketika alat seperti output dig justru menjadi hambatan belajar
- Output dari alat DNS juga bisa menambah kebingungan
digmemiliki flag+norecurse- Kita bisa meminta resolver hanya mengembalikan hasil yang sudah ada di cache
dig +norecurse jvns.cabisa dipakai untuk memeriksa apakah resolver tersebut telah menyimpan domain itu di cache dalam 5 menit terakhir, misalnya
- Output
digbisa memberi kesan kepada pemula bahwa DNS itu sendiri jauh lebih rumit- Pembicara melihat ini lebih sebagai akibat dari format output yang cukup arbitrer yang ditetapkan pada 1990-an dan terus dipertahankan
- “eraser eyes” adalah cara mengabaikan bagian lain dari output yang rumit seolah-olah dihapus, dan hanya menyisakan bagian yang benar-benar dilihat
- Dalam contoh, fokusnya hanya pada response code
SERVFAIL - Menurut pemahaman pembicara, dalam konteks ini
SERVFAILkurang lebih berarti “tidak ada di cache”
- Dalam contoh, fokusnya hanya pada response code
- Saat mendemonstrasikan alat, akan membantu jika kita menjelaskan output atau UI mana yang dilihat dan bagian mana yang diabaikan
digmemang punya output yang kasar, tetapi kelebihannya adalah fiturnya banyak, mendukung+norecurse, tersedia di mana-mana, dan stabil karena sudah lama tidak berubah
Peran-peran untuk bersama-sama membuatnya lebih mudah
- Upaya membuat teknologi lebih mudah bisa dibagikan dengan orang sekitar bahkan tanpa memiliki blog
- Cara-cara yang dirangkum pembicara adalah sebagai berikut
- Berbagi alat yang berguna
- Berbagi referensi yang benar-benar dipakai
- Menjelaskan apa yang terjadi di komputer secara kronologis
- Meringkas daftar besar menjadi daftar kecil yang benar-benar kita gunakan
- Menunjukkan perilaku yang tersembunyi
- Mendemonstrasikan alat yang membingungkan sambil menunjukkan bagian mana yang perlu dilihat
- Jenis orang yang membantu pun beragam
- “Pengguna lama yang suka menggerutu” menceritakan apa yang dulu salah sehingga bisa mengurangi penderitaan orang lain
- “Pemula yang berisik” bertanya, “Bagaimana ini bekerja?” sehingga orang lain juga merasa lega
- Saat developer senior bertanya secara terbuka tentang hal yang tidak ia ketahui, orang yang khawatir dianggap bodoh karena tidak tahu bisa ikut belajar
- “Pencatat bug” merangkum apa yang terjadi agar bug yang sama tidak terulang
- “Pembuat alat” menulis kode untuk membuat masalah menjadi lebih mudah secara permanen alih-alih menjelaskan hal yang sama berulang kali
- “Pembagi hal yang dipelajari hari ini” membagikan alat baru, bug yang dialami, atau fitur library yang baru diketahui
- “Orang dengan 700 tab terbuka” kemungkinan besar sudah tahu harus mencari informasi di mana
- Kita juga membutuhkan “orang yang menjawab pertanyaan” dan “orang yang menuliskannya agar bisa dicari lagi nanti”
- Kesulitan memahami hal yang terlihat dasar bukanlah masalah pribadi semata
- Banyak orang mengalami kesulitan di titik yang sama karena alasan yang sama
- Jika kita memahami mengapa sesuatu terasa sulit, kita bisa memperbaikinya lebih baik, seperti memperbaiki bug pada program komputer
- Faktor-faktor yang membuatnya sulit mencakup pengetahuan kecil dan jebakan yang sangat banyak, kode berskala 20 juta baris, sistem tersembunyi, serta output alat yang membingungkan dan tidak diperbaiki
- Pembicara mengatakan ia masih belum benar-benar memahami mengapa Git begitu sulit, tetapi tetap ingin terus memikirkannya dan memahaminya
1 komentar
Komentar Hacker News
Bagian yang paling mengena bagi saya adalah nasihat untuk tampilkan hal-hal yang biasanya tersembunyi
Alat-alat seperti ini hampir seketika membuat situasi jadi lebih jelas. Coba pikirkan developer tools di browser web; pada “masa kegelapan” ketika belum ada alat seperti itu, kita harus menebak apa yang terjadi tanpa bisa melihatnya, dan itu mengerikan
Alat seperti Wireshark, yang menampilkan byte dari paket jaringan yang dapat diakses dan bahkan mem-parse strukturnya, sangat berguna bukan hanya untuk debugging jaringan, tetapi juga untuk mengajarkan konsep jaringan, karena tidak ada yang disembunyikan
Itu juga alasan saya menyukai software open source. Tidak ada yang tersembunyi karena kita bisa melihat source untuk memahami penyebab bug, mengisi celah pengetahuan yang ditinggalkan dokumentasi, atau mempelajari konsep pemrograman lebih jauh
Misalnya, ia tidak pernah menampilkan Ethernet preamble, hanya kadang-kadang menampilkan Ethernet frame checksum, dan juga tidak pernah menampilkan interframe gap, yang merupakan elemen wajib protokol Ethernet
Memang sudah sangat dekat, tetapi ini menunjukkan bahwa selalu ada detail lain yang tersembunyi di suatu tempat
Di kepala kita, kita sudah memvisualisasikannya, dan penjelasan apa pun tentang komputasi pada akhirnya diungkapkan sebagai diagram. Tetapi saat coding, tidak ada diagram sama sekali
Tinggal instrumentasikan semua kode secara dinamis lalu kirim pesan ke GUI
Para ahli yang punya pengetahuan itu dan bisa mengajarkannya pun kini berkumpul di perusahaan-perusahaan pembuat alat tersebut, bukan lagi di dalam organisasi
Jadi ketika beralih secara alami ke command line, kita langsung familier dan bisa menggunakannya sendiri
Julia tampaknya salah satu orang paling menyenangkan di industri teknologi
Setiap kali membaca tulisannya, saya kembali merasakan kegembiraan berdebar seperti saat kecil, ketika mulai menguak rahasia realitas lewat eksperimen-eksperimen kecil. Benar-benar menyenangkan
Untungnya belakangan ini saya mulai menemukan lebih banyak orang yang cocok dengan tipe seperti ini
Namun semua tulisan Julia membuat saya merasakan kegembiraan berdebar yang disebutkan tadi
Menurut saya, pernyataan “ketika junior bilang ‘ini sulit’, orang berpengalaman menjawab ‘benar, bash memang tidak bisa dipakai. Tidak ada yang benar-benar memahaminya’” tidak perlu dipahami secara harfiah
Maknanya lebih dekat ke “pemahaman kita atas kode bash yang kita tulis, atau keyakinan bahwa ia akan berjalan sesuai harapan dalam situasi yang belum diuji, tidaklah kuat”
Artinya, begitu ada sesuatu yang sedikit saja tidak biasa, kita agak mengantisipasi bahwa sesuatu akan gagal, lalu fakta baru yang kita pelajari tentang bash akan membuat kita bergidik atau memukul benda di sekitar cukup keras sampai rusak
Bash adalah bahasa yang kompleks, dan bagi kebanyakan programmer sangat berbeda dari bahasa lain yang biasa mereka pakai. Di kebanyakan perusahaan, biasanya ada sedikit bash di production di suatu tempat, tetapi sering kali tidak ada satu pun orang yang menggunakannya cukup banyak hingga benar-benar memahaminya
Menurut saya bukan kebetulan kalau build tools, CI tools, dan cloud orchestration tools berevolusi ke arah mengurangi kebutuhan shell scripting
Sebagai eksperimen pikiran, tidak bisakah kita menambahkan assignment statement yang lebih baik ke bash? Misalnya, jika dalam mode seperti
set --goodasskita bisa menulisa = string1 + '.' + string2, banyak kerumitan shell quoting bisa dipangkasAlat seperti
makejuga akan diuntungkan. Jika kita menghabiskan 6 bulan untuk membuatmakepunya variabel yang layak pakai, cara yang jelas untuk memanipulasi path dan nama file, serta target yang lebih berguna, itu bisa lebih baik daripada menghabiskan 6 bulan membuat Makefile yang kompleksKhususnya, perasaan bahwa “bagi kebanyakan programmer, bash berbeda dari bahasa apa pun yang biasa mereka pakai” bukan sesuatu yang pasti bisa disimpulkan pemula. Sebab dibutuhkan pengalaman yang cukup untuk memahami perbedaan antara “tidak umum” dan “sangat sulit dipahami”
Terkait itu, sebagian besar software dirancang berlebihan
Saya pikir ini juga karena sentralisasi industri. Semua orang didorong memakai alat-alat tersebut demi keuntungan segelintir pihak yang mengendalikan segelintir alat, dan akibatnya banyak alat menjadi “alat untuk segala hal” yang mencakup jauh lebih banyak daripada use case yang harus ditangani
Perusahaan ingin para developer semuanya memahami alat yang sama. Dengan begitu mereka mudah diganti antarproyek dan antarperusahaan, dan posisi tawar mereka di industri melemah
Karena itu, di software hanya tersisa satu arus utama, sementara pendekatan alternatif disingkirkan tanpa lapangan kerja. Industri ini secara alami ingin terdistribusi, tetapi tidak bisa menjadi seperti itu
Sisi positifnya, suatu hari nanti pendekatan-pendekatan non-mainstream yang jauh lebih unggul akan muncul dan menggerogoti pendekatan arus utama. Teknologi bukan matematika dan juga berbeda dari sains; ia cukup mampu menopang banyak cabang yang menyelesaikan masalah yang sama dengan berbagai cara
Saat itu perang browser membuat kita sibuk, tetapi sekarang browser pada umumnya kompatibel, namun kita justru menciptakan banyak kompleksitas front-end untuk web app yang biasanya tidak diperlukan
Hal-hal seperti DNS, IP, dan HTTPS adalah teknologi fundamental yang terikat kompatibilitas mundur dan faktor politik, jadi memang tidak bisa dihindari
Meski begitu, saya merasa mempelajari hal-hal tersebut dengan baik adalah investasi yang lebih baik daripada mempelajari framework. Kalau dibahas lebih jauh, mungkin akan sampai ke pembicaraan tentang innovation token
Untuk membuat hal-hal sulit menjadi mudah, kita perlu menemukan abstraksi yang tepat. Caranya adalah hanya menyimpan sebagian dari materi yang sulit dan detail yang sering dipakai di kepala, lalu mencari sisanya saat dibutuhkan
Masalahnya, orang tidak mau repot-repot membuat kompresi kognitif untuk topik besar sampai mereka benar-benar membutuhkannya. Karena mereka sudah memikul beban kognitif besar lainnya, mereka menolak menambahkan beban baru
Jika bisa bergantung pada orang lain yang memahami suatu topik X dengan baik, mereka akan begitu saja melakukannya, dan mungkin tidak berusaha cukup keras untuk memahami X. Cara terbaik bagi orang yang memahami X dengan baik untuk mengurangi permintaan bantuan adalah membantu orang lain memahami X pada tingkat minimal
set -eitu rusak, kebutuhan untuk mengapit semuanya dengan tanda kutip juga rusak, dan globbing seharusnya menjadi fitur yang harus diminta secara eksplisit. Di command line itu mungkin merepotkan, tetapi dalam skrip ceritanya berbeda; saat ini, jika globbing dimatikan secara global, sulit melakukan globbing di tempat yang diinginkanDefault yang buruk seperti ini tidak hanya ada di Bash, tetapi juga di seluruh shell garis keturunan Ksh dan Bourne shell
Banyak orang juga ingin mengubah urutan klausa SQL. Tidak ada alasan untuk tidak bisa, dan tampaknya itu perubahan yang relatif kecil agar parser SQL yang ada mengizinkan klausa dengan urutan berbeda
Namun secara pribadi saya tidak punya masalah kognitif ini, mungkin karena saya tahu harus melihat sumber tabel terlebih dahulu
set -erusak, semuanya harus diapit tanda kutip, dan globbing harus eksplisit, semuanya diperbaiki oleh OSH sambil tetap menjalankan skrip shell yang adaJika menambahkan
shopt --set ysh:upgradedi bagian paling atas skrip, tiga masalah itu hilangJika ingin membantu proyek ini, akan bagus jika mengunduh tarball, memverifikasi klaimnya, lalu menulis posting blog
Detailnya ada di https://www.oilshell.org/release/latest/doc/error-handling.h... dan https://www.oilshell.org/release/latest/doc/simple-word-eval...
Dokumentasinya komprehensif, tetapi kebanyakan orang tidak menginginkan detail sebanyak itu, jadi akan membantu jika ada yang menguji dan menuliskannya secara singkat
Alasan saya tidak terlalu aktif mendorong Oils selama beberapa waktu adalah karena ada dependensi Python, tetapi sekarang sudah murni C++ dan per minggu ini mengalahkan bash pada beberapa benchmark yang berfokus pada komputasi
Skrip yang berfokus pada input/output selalu memiliki kecepatan yang sama, seperti kebanyakan skrip shell. Di dokumentasi, Oil masih perlu diganti menjadi YSH, jadi mungkin akan ada kebingungan untuk sementara: https://www.oilshell.org/blog/2023/03/rename.html
set -e. Meski begitu, sekarang setidaknya ada mesin pencariprojectyang berperilaku sepertiselect, tetapi bisa ditempatkan di posisi yang benarKekuatan super saya adalah ingatan yang buruk sekali. Jadi untuk mengingat, saya harus benar-benar memahami; dengan kata lain, saya butuh kompresi kognitif. Saya tidak bisa sekadar belajar seperti orang biasa
Pelajaran hari ini: dalam daftar
&&atau||, shell tidak akan keluar meskipun ada perintah yang gagal, kecuali perintah setelah&&atau||terakhir di antara perintah-perintah yang dijalankanReferensi: https://www.gnu.org/software/bash/manual/bash.html#index-set
Yang dilakukan
/bin/falsehanyalah mengembalikan 1. Apakah itu kegagalan? Bukan. Ia memang dirancang untuk bekerja seperti itu dan secara harfiah merupakan alat dengan tujuan tersebutSaya sudah menulis ratusan skrip shell, dan banyak perintah di antaranya mengembalikan nilai bukan 0 dengan sangat normal untuk melakukan tugasnya, misalnya memeriksa apakah sebuah string memiliki pola tertentu
Program bisa mengembalikan kode keluar apa pun dalam situasi apa pun, dan secara konvensi sukses adalah 0, gagal adalah nilai bukan 0. Namun yang dipedulikan bahasa shell hanyalah bahwa 0 dievaluasi sebagai “true”, dan nilai bukan 0 sebagai “false”
Jika shell keluar setiap kali program apa pun mengembalikan nilai bukan 0, pernyataan
ifdan loop akan menjadi mustahil, sehingga sangat merepotkanJika sebuah skrip menganggap kode kembalian program tertentu penting, ia harus memeriksa dan menanganinya secara eksplisit. Seperti di tautan tadi, ada opsi yang membuat shell keluar jika perintah internal mengembalikan nilai bukan 0, dan banyak penulis skrip shell tingkat pemula-menengah secara dogmatis bersikeras bahwa opsi-opsi itu harus dipakai di semua skrip
Namun pada skrip yang kompleks, saya merasa ada banyak edge case yang agak hacky dan sulit ditangani. Kalau setiap kali membutuhkan opsi seperti itu, mungkin lebih baik memakai Makefile saja
&&dan||sering dipakai seperti kondisional[ -e README ] && cat READMEmenghindari error saat file README tidak ada, dan[ -e README ] || echo "You should write a README!"bekerja sebaliknyaMasalah yang lebih licik adalah, bahkan dengan asumsi
set -e, dalam pipeline shell tidak akan keluar jika perintah terakhir tidak gagalgrep foo README | sorttidak akan gagal meskipun README tidak ada, kecuali juga memakaiset -o pipefailBahkan jika
set -edisetel secara eksplisit di dalam fungsi, ini tetap ditimpaSaya pernah memberikan contoh sebelumnya: https://news.ycombinator.com/item?id=22213830
Ini tulisan yang menggambarkan dengan baik hal-hal yang tampak seharusnya tidak sulit, tetapi sebenarnya punya banyak kompleksitas
Namun bagian SQL tampaknya lebih mendorong kegagalan konseptual daripada menyingkap misterinya
Logika kueri bersifat deklaratif dan mendefinisikan output. Yang memiliki urutan eksekusi atau sifat prosedural adalah rencana kueri. Ini yang harus dipelajari lebih dulu
Setelah itu, barulah area abu-abu seperti subkueri dependen bisa dipelajari. Jika Anda bisa melihat bahwa
not existsdan anti join itu setara, Anda bisa memahami dan menalarnyaAnalogi yang menyuruh memahami kueri tertulis secara prosedural hanya menunda masalah, dan ketika tersandung pada hal yang lebih kompleks, tidak ada cara untuk membongkar kebohongan yang diniatkan baik itu
Presentasi yang bagus. Memang benar Bash penuh dengan “jebakan” dan trivia yang sulit dihafal semuanya, tetapi menurut saya sebagian trivia sebaiknya memang dihafal
Misalnya saya sering lupa urutan argumen perintah
find, sehingga saat berada di depan mesin yang tidak langsung punya koneksi internet, saya sering kehilangan waktu untuk mengingat sintaksnyaJadi saya memutuskan mempelajari dan menghafal beberapa alat baris perintah yang paling umum beserta sebagian jebakannya, memakai Anki dan beberapa mnemonik. Menurut saya imbal hasil dari investasinya sangat sepadan
Saya benar-benar membaca Networking for System Administrators karya Michael W. Lucas setelah melihat rekomendasi buku di jvns.ca, lalu mengekstrak pengetahuan teknis dan cukup banyak kebijaksanaan sysadmin menjadi kartu Anki
Sekarang saat men-debug masalah lapisan transport, saya langsung ingat cara memakai alat seperti netcat dan tcpdump, jadi itu mungkin salah satu buku dengan imbal hasil investasi tertinggi di antara buku yang pernah saya baca
Saya juga membuat shortcut untuk menambahkan perintah terakhir yang dijalankan ke file ini, dan shortcut untuk mencari di dalam file ini
Halaman man bash memang besar dan rumit, tetapi komprehensif. Jika sudah terbiasa dengan bagian-bagian utama dan bentuk visual teksnya, cukup berguna karena bisa cepat menelusurinya dan menemukan informasi tepat yang dibutuhkan
Cara ini sering kali lebih cepat daripada memakai mesin pencari internet
Misalnya mengubah halaman man lama ke format yang ramah editor teks, atau memakai alat yang lebih baik seperti tldr dan Dash. Karena bukan hanya
findyang seperti ituEntah kenapa saya sempat ingin tidak menyukai tulisan ini. Mungkin karena jvns terlalu sering muncul di HN, atau suasana hati saya sedang buruk
Namun ini benar-benar tulisan yang bagus, dan sebagai orang dengan pengalaman 20 tahun di bidang pengembangan, menurut saya ini cukup mendekati kebenaran di antara diskusi tingkat meta tentang pemrograman
Pembahasan tentang pandangan selektif benar-benar cocok untuk
digmaupun halamanman. Tak terhitung berapa kali saya membukamanlalu kewalahan melihat opsi konfigurasi dan flag command-line yang tak ada habisnyaTips yang saya pakai di
manadalah menggunakan fitur pencarian ala Vim, yaitu/. Misalnya, kalau ingin mencari cara agar grep mencetak nomor baris untuk tiap kecocokan tetapi tidak ingat caranya, bukaman grep, lalu ketik/linedan tekan Enter untuk mencari kemunculan “line” di dalam halaman man. Kecocokan berikutnya cukup dengan/Saya juga agak sedih mendengar Strange Loop sudah berakhir. Saya baru mengetahuinya sekitar tahun lalu, tetapi banyak presentasinya tampak berkualitas luar biasa
Sedih memang karena berakhir, tetapi presentasi itu cukup meyakinkan menunjukkan bahwa kadang-kadang berakhirnya sesuatu juga bisa baik. Kalau menonton presentasi lengkapnya, akan paham
Dan saya juga membuat https://github.com/kristopolous/mansnip
nSaya sangat tidak setuju dengan pandangan tentang bash. Solusi terbaik bukanlah menumpuk alat di atas bash atau menghafal keanehannya, melainkan tidak memakai bash
Itulah satu-satunya cara menghindari jebakannya
Alternatif yang paling umum adalah 1) memakai shell baru seperti Oil shell [0], atau 2) memakai bahasa pemrograman seperti Python, JavaScript, PHP
Masalah dengan shell baru adalah Anda harus memasang shell itu di setiap tempat tempat Anda ingin menjalankan skrip. Sementara bash ada di mana-mana. Jika itu bukan skrip yang hanya Anda pelihara sendiri, berarti Anda juga meminta orang lain mempelajari shell tersebut untuk memeliharanya
Masalah dengan bahasa pemrograman lain adalah bash punya usability yang jarang tertandingi untuk hal-hal yang memang dikuasainya: merangkai perintah, serta menangani input/output perintah dan file
Ketika dicoba dengan bahasa lain, tiba-tiba semuanya menjadi jauh lebih rumit, atau setidaknya lebih bertele-tele
Jadi saya masih memakai bash, tetapi mengakui bahwa kekuatannya ada pada menjalankan perintah lain dan menangani input/output. Jika logikanya kompleks dan tidak terkait dengan hal itu, saya serahkan ke bahasa lain. Kadang ini bukan sepenuhnya menghindari bash, melainkan sekadar memanggil skrip Python dari bash
Kalau ada pendekatan lain yang lebih cocok, saya akan senang jika dibagikan
[0] https://www.oilshell.org
Apalagi alat baru itu belum melewati puluhan tahun debugging seperti bash sendiri. Masalahnya ada pada bash itu sendiri
Kita cenderung meremehkan kemudahan penggunaan dan melebih-lebihkan “kecerdikan”
Contoh utamanya adalah Git. Alat yang sangat cerdik, tetapi kemudahan penggunaannya mengerikan. Namun karena dibuat oleh Linus dan Linus itu cerdik, seolah-olah masalahnya ada pada kita
Kita mendapatkan apa yang kita hargai. Kita perlu lebih menghargai kemudahan penggunaan
Solusi terbaik adalah menjauh saja. Sungguh, harus berhenti. Jangan mencoba bersikap macho
Seluruh model bahasanya pada dasarnya rusak. Tipe yang berpusat pada string, switch mode global, flag satu huruf untuk operator perbandingan dasar, perilaku yang secara default mengabaikan error di mana-mana, terutama bahkan fungsi
Satu saja keanehan seperti ini sudah cukup untuk menyingkirkan sebuah bahasa, tetapi bash punya semuanya, dan masih lebih banyak lagi
set -xbisa merusak perilaku yang diharapkan dari||dan&&Memang bahasa apa yang bentrok hanya karena sebuah fungsi mengembalikan false? Ada bahasa yang melempar exception, tetapi bukankah “false” adalah nilai valid yang boleh dikembalikan?
Hal yang sama terlihat di Makefile. Orang-orang tidak memahami apa yang mereka lakukan, dan belum pernah memikirkan build system secara mendalam, sehingga berharap ia berperilaku dengan cara tertentu
Misalnya, recursive assignment di Make membuat hampir semua orang tersandung
FLAGS=-b,COMPILE=compile $(FLAGS),$(info compile command=$(COMPILE)),FLAGS=-a,myfile:,echo $(COMPILE) $? -o $@akan menampilkancompile -bpada keluaran info pertama, tetapi eksekusi sebenarnya menjadicompile -a -o myfileMeski begitu, jika semua assignment dibuat dievaluasi segera demi menyesuaikan dengan bahasa pemrograman lain, kita justru akan kehilangan alat yang sangat berguna. Semakin memahami alat-alat seperti ini, semakin baik kita tahu di mana menggunakannya dan seberapa besar usaha yang layak dicurahkan
Namun secara umum saya setuju. Saya berusaha menyerahkan hal yang sedikit saja kompleks ke skrip yang ditulis dalam bahasa yang tidak terlalu aneh
Dalam situasi seperti itu, alat yang membantu menghindari kesalahan pada 5% terakhir yang tetap berada di bash sangatlah berguna