Diagram Sintaks

Jika kita mendalami dokumentasi suatu bahasa pemrograman, kamu pasti akan berjumpa dengan spesifikasi sintaks bahasa pemrograman tersebut yang biasanya dinyatakan dalam notasi EBNF (Extended Backus-Naur Form). Notasi EBNF ini tidak hanya mampu menjelaskan sintaks bahasa pemrograman tetapi juga serangkaian simbol yang mempunyai struktur tertentu, ambil contoh adalah format data JSON.

Tentunya membiasakan membaca notasi EBNF tidak gampang. Ambil contoh notasi EBNF untuk mendefinisikan tanggal yang memiliki pola YYYY-MM-DD. Kita bisa bermain-main dengan notasi EBNF di sini.

<date> ::= <year> "-" <month> "-" <day>
<month> ::= "1" [0-2] | "0" [1-9]
<day> ::= "0" [1-9] | [1-2] [0-9] | "3" [0-1]
<year> ::= [0-9] [0-9] [0-9] [0-9]

Ada cara yang lebih gampang bagi orang-orang yang lebih suka melihat gambar. Spesifikasi sintaks bisa dinyatakan menggunakan diagram sintaks. Beberapa orang menyebutnya sebagai diaram rel (railroad). Contoh yang ada berikut berasal dari spesifikasi JSON di sini.

Contoh sintaks diagram JSON

Dan sudah ada orang yang membuat library Python ini untuk memudahkan menggambarkan diagram sintaks ini secara terprogram. Betapa indahnya.

Kita telah repot-repot belajar soal diagram sintaks dan notasi EBNF. Buat apa? Setidaknya aku mempelajari teknik terstruktur yang digunakan untuk menjelaskan suatu sintaks. Aku pikir hal ini akan membantu dalam mengerjakan parser.

Masalah Tersulit

Masalah tersulit bagiku adalah membuat orang lain memahami apa yang aku pahami. Terkadang kita lupa bahwa apa yang dengan mudah kita pahami sekarang dulunya adalah sesuatu yang kita pelajari juga dengan susah payah. Kita menganggap sesuatu ini hal yang umum dipahami oleh orang lain. Kenyataannya tidak begitu dan ini bisa berujung ke rasa frustrasi dan beragam konflik.

Orang bijak menamakan polemik ini dengan sebutan "kutukan pengetahuan" Tentu bukan berarti apa yang kita pahami adalah sesuatu yang benar dan ketidaktahuan yang kita ajak bicara adalah sesuatu yang salah. Jarak seperti inilah yang membuat hidup ini menarik. Dan jika yang kita pahami adalah sesuatu yang baik buat bersama, tentunya harus diperjuangkan dengan gigih. Dan jika yang kita pahami adalah sesuatu yang buruk buat bersama, setidaknya kita mendapatkan pelajaran hidup yang berharga.

Mengenal Parser

Untuk membiasakan memprogram dengan Rust, aku ingin langsung terjun untuk membuat suatu program yang mempunyai tujuan konkrit. Umumnya bagi software engineer masa kini, program itu berupa service web. Contoh lainnya, banyak orang menggunakan Rust untuk implementasi ulang command line populer. Kalau seleraku, aku ingin membuat parser terutama untuk SQL karena itu sesuatu yang dekat dengan pekerjaanku sehari-hari dan aku belum terlalu paham soal parser. Ada satu library yang sepertinya cukup populer untuk membuat parser yaitu nom. Mungkin mengambil inspirasi dari ahli bahasa terkemuka Noam Chomsky.

Parser cukup penting perannya dalam software engineering. Parser mengubah rangkaian teks menjadi struktur yang dapat dimengerti oleh komputer. Untuk mengerti bahwa teks punya struktur tertentu, kita harus menulis sebuah aturan atau grammar. Ada context-free grammar, ada parsing expression grammar, dan masih banyak jenis grammar lainnya. Cara parsing bisa juga menggunakan regular expression. Langkah pertama untuk membuat parser biasanya adalah dengan menulis sebuah grammar yang utuh. Dari sebuah grammar ini kita mengubahnya dengan bantuan sebuah penerjemah menjadi kode. Kode inilah parser kita.

Ketika menggunakan nom, kita tidak langsung menulis sebuah grammar yang utuh. Kita menulis potongan-potongan grammar dan ini langsung kita tulis dalam kode Rust. Potongan grammar kita kombinasikan dengan teknik parser combinator untuk membentuk sebuah parser yang utuh.

Seperti itulah yang aku pahami soal parser ini. Aku akan mencoba menulis parser untuk SQL terutama sintaks SQL yang dipahami oleh BigQuery dan DBT. Sampai jumpa lagi.

Kubernetes Condition

Beberapa waktu lalu aku menemukan artikel yang menjelaskan tentang Kubernetes condition. Dari situ aku belajar bahwa sumber daya yang ada di Kubernetes seperti pod, cronjob atau yang lainnya tidak mempunyai state machine untuk menjukkan apa sumber daya itu sedang menyala atau mati. Sebagai gantinya adalah Kubernetes condition. Ambil contoh pod Kubernetes yang mempunyai salah satu Kubernetes condition yang bernama ContainersReady.

Yang menarik lagi adalah antar jenis sumber daya bisa memiliki Kubernetes condition yang sama atau berbeda. Namun, status semua Kubernetes condition sepertinya hanya bisa di antara tiga nilai: True, False, Unknown. Tentunya kita bisa membuat Kubernetes condition kita sendiri dan menempelkannya pada jenis sumber daya bawaan atau buatan sendiri. Salah satu penjelas rujukan yang dipakai artikel itu adalah konvensi API Kubernetes dan ada satu pernyataan yang sebaiknya tidak dilupakan:

Condition type names should describe the current observed state of the resource, rather than describing the current state transitions.

Pernyataan ini membuatku sedikit lebih paham kenapa Kubernetes bekerja seperti itu. Pertama, kita mendefinisikan seperti apa bentuk sumber daya. Kubernetes controller kemudian melakukan rekonsiliasi melalui proses sync loop sehingga suatu kondisi tercapai. Proses sumber daya untuk mencapai sesuai yang didefinisikan bisa gagal dan ada juga Kubernetes condition yang menggambarkan kegagalan itu.

Mengendarai Sepeda

"Hidup itu seperti mengendarai sepeda." ~Albert Einstein

Ingatkah ketika kamu pertama kali belajar mengendarai sepeda? Pasti kamu menggunakan roda bantu yang dipasang di samping roda belakang sepeda. Setiap hari kamu terus mengendarai sepeda sampai akhirnya kamu bisa mengendarai sepeda tanpa roda bantu. Meski begitu kamu masih belum terlalu piawai. Kadang-kadang kamu terjatuh.

Siapa yang mengajarimu mengendarai sepeda? Apakah dia ayah ibumu, kakek nenekmu, sepupu, kakakmu? Pernahkah kamu ingat mengajarimu teori yang rumit tentang mengendarai sepeda? Aku tebak pasti jawabannya tidak. Kamu langsung mempraktikkannya. Begitu terbiasa, kamu sudah tidak akan lupa lagi mengendarai sepeda.

Di titik ini aku terpikirkan kesamaan belajar mengendarai sepeda dengan belajar bahasa pemrograman komputer baru. Pada umumnya pemula akan memplajari dulu sintaks bahasa pemrograman komputer itu. Apakah itu pendekatan yang tepat? Pemahaman sintaks memang perlu tapi aku bisa membayangkan sebuah metode di mana pelajar langsung praktik membuat software rumit di bawah bimbingan seoarang pakar.

Halo Dunia

"Tidakkah cerita yang hebat itu mempunyai akhir?" ~J.R.R Tolkien

Dua kata yang hampir selalu ditulis oleh seorang pemula yang mempelajari bahasa pemrograman komputer adalah "Hello World" (Halo Dunia). Menurut legenda dua kata ini bermula dari sebuah program contoh yang ditulis oleh Brian Kernighan untuk memperkenalkan bahasa pemrograman C pada 1970 silam. Di sinilah aku memulai blog ini dengan "Halo Dunia."

Sejak 1970 komputer dan software berkembang dengan pesat. Kenyamnan yang kita nikmati bersama tidak bisa terlepas dari software yang semakin canggih dan rumit. Ada yang bilang kerumitan yang muncul itu sengaja dibuat-buat, istilahnya accidental complexity. Aku ingin mengerti, dengan bahasaku sendiri, apa betul kerumitan itu sengaja dibuat-buat. Selain itu, selama berkarir dan menjalani hidup, Aku senantiasa menjumpai hal-hal baru. Aku jarang berhenti dan meresapi apa yang baru aku temui itu. Sesungguhnya kebiasaan lama ini perlu diubah.

Terima kasih telah membaca. Mengutip percakapan Frodo dan Sam, "Sesungguhnya kisah yang hebat itu tidak berakhir. Hanya orang-orangnya saja yang datang dan pergi ketika bagian mereka sudah selesai." Selama bagianku masih ada, aku akan menuliskan sedikit cerita.