2 poin oleh GN⁺ 2024-11-29 | 1 komentar | Bagikan ke WhatsApp
  • Janet for Mortals adalah buku online gratis tentang bahasa pemrograman Janet, tetapi fokus retrospektif ini lebih pada proses pembuatan buku teknis yang juga mencakup REPL web dan proyek contoh, bukan pada bukunya sendiri
  • Keseluruhan pekerjaan memakan waktu 20 minggu, melampaui estimasi 12 minggu untuk penulisan murni karena adanya pekerjaan tambahan seperti situs web, binding C++, demo browser, parser CLI, dan alat pengujian
  • Situs web buku ini menyediakan REPL bawaan yang menggunakan CodeMirror dan tata bahasa Lezer; autocomplete menanyakan lingkungan Janet melalui WebAssembly, dan (report) menyimpan umpan balik ke SQLite
  • cmd, judge, to do, dan Toodle.Studio digunakan sebagai contoh dasar yang menunjukkan bahwa Janet dapat dipakai untuk scripting, alat CLI, pengujian, eksekusi di browser, dan interoperabilitas JavaScript
  • Tepat setelah peluncuran, hanya dengan pengajuan ke Hacker News dan Lobsters, ada 30.025 pengunjung unik pada Jumat, 9.568 pada Sabtu, dan 3.777 pada Minggu, tetapi IP unik yang membaca 5 bab atau lebih diperkirakan hanya 387

Cakupan buku dan volume kerja sebenarnya

  • Janet for Mortals adalah buku online gratis tentang bahasa pemrograman Janet
  • Total masa produksi adalah 20 minggu berdasarkan waktu luang
    • Estimasi awal adalah 12 minggu, dan jika hanya melihat waktu penulisan teks bahasa Inggris, perkiraan itu tidak terlalu meleset
    • Jadwal aktual banyak mencakup proyek coding di sekitar buku
  • Panjang akhir adalah 44.000 kata prosa bahasa Inggris, tidak termasuk potongan kode
    • Sebagai pembanding, The Great Gatsby memiliki 47.000 kata
    • Panjangnya kurang dari setengah seri tulisan sebelumnya tentang Nix
  • Selama 5 bulan, pekerjaan berikut juga dilakukan bersama buku ini
    • Situs web buku
    • jimmy: binding untuk pustaka struktur data persisten C++
    • Toodle.Studio: playground turtle graphics interaktif
    • cmd: pustaka parsing argumen command-line
    • judge: framework pengujian snapshot inline
    • to do: pengelola daftar tugas command-line

Situs web dan REPL bawaan

  • Perangkat inti situs web Janet for Mortals adalah REPL bawaan
    • Pengguna dapat membuka REPL kapan saja dengan tombol Escape
    • REPL dipasang tetap di bagian bawah halaman sehingga tidak banyak menutupi teks
  • Editornya menggunakan CodeMirror
    • CodeMirror secara default tidak mendukung Janet
    • Dukungan bahasa Janet yang dibuat saat pekerjaan Bauble sebelumnya dijadikan dasar
    • Sintaks Janet seperti string multi`backtick`quoted, yang tidak penting dalam DSL Bauble, juga diperlukan dalam buku ini
  • Saat memperkuat tata bahasa Lezer yang digunakan CodeMirror, tata bahasa yang sama juga digunakan ulang untuk syntax highlighting potongan kode di buku
    • Tidak ditemukan static site generator yang dikenal mendukung highlighting kode Janet
    • Awalnya buku ini hitam putih, tetapi warna ditambahkan agar sintaks Janet yang asing terasa lebih ramah
  • Static site generator ditulis sendiri menggunakan redo
    • Inti generator ditulis dalam JavaScript sehingga tata bahasa Lezer dapat ditempelkan
    • Keseluruhan susunannya berupa struktur rapuh yang dihubungkan dengan shell
  • Remark digunakan baik untuk parsing naskah buku maupun REPL sisi klien
    • Ekstensi sederhana ditambahkan untuk memberi label pada blok kode
    • Docstring pustaka standar Janet ditulis dalam Markdown, sehingga dirender menjadi HTML secara langsung di autocomplete REPL

Autocomplete dan umpan balik satu arah

  • Autocomplete REPL dianggap penting untuk pembaca yang baru pertama kali mengenal Janet
    • Saat REPL dimulai, lingkungan Janet ditanyakan secara dinamis melalui WebAssembly
    • Meski pengguna mendefinisikan simbol baru yang memiliki docstring, simbol itu tidak muncul dalam hasil autocomplete
    • Autocomplete bisa dibuat ulang setiap kali setelah perintah dijalankan, tetapi dinilai tidak sepadan
  • Fungsi (report) menerima string lalu melakukan POST ke server web sederhana, dan server menyimpannya ke database SQLite
    • Mirip kotak komentar, tetapi cirinya adalah dikirim langsung dari REPL
    • Dengan fitur ini, umpan balik dibaca dan berbagai kesalahan diperbaiki
    • Cara untuk membalas tidak diimplementasikan
  • Backend report bukan Janet, melainkan aplikasi Haskell kecil
    • Tugasnya hanya menerima permintaan POST dan memasukkannya ke database SQLite
  • Server web tidak dibuat dengan Janet
    • Keamanan dianggap sebagai faktor terpenting dalam server web
    • Janet dan pustaka HTTP Janet tidak dianggap cukup teruji untuk terhubung langsung ke internet

jimmy: eksperimen interoperabilitas C++

  • jimmy adalah binding Janet untuk immer
    • immer adalah pustaka struktur data persisten
  • Binding ini belum selesai, dan kemungkinan besar tidak akan diselesaikan sampai ada kebutuhan untuk menggunakannya
  • Meski begitu, sebagai contoh yang menunjukkan cara berinteroperasi dengan kode C++ dari Janet, ini dianggap berhasil

Toodle.Studio dan Janet di dalam browser

  • Bauble adalah playground seni kecil yang dibuat sebelumnya, dan merupakan pengalaman pertama menanamkan Janet di browser
    • Saat itu belum banyak materi tentang embedding Janet
    • Tingkat kesulitannya tinggi karena harus memakai WebAssembly, Emscripten, dan TypeScript bersama-sama di browser
  • Hasil akhir Bauble adalah situs web yang logika aplikasinya ditulis dalam Janet
    • JavaScript banyak digunakan untuk UI, tetapi logika inti ditangani oleh Janet
  • Salah satu alasan penting menulis buku ini adalah motivasi untuk membuat teknik memakai Janet di browser lebih mudah diakses
  • Di buku, Toodle.Studio dibuat sebagai contoh, bukan Bauble
    • Bauble tidak memiliki state dan hampir seperti fungsi murni yang mengubah string menjadi string, sehingga sederhana dari sudut pandang interoperabilitas
    • Toodle.Studio jelas merupakan fork dari Bauble, tetapi interoperabilitas antara JavaScript dan Janet lebih kompleks
  • Toodle.Studio memiliki elemen teknis yang lebih cocok sebagai contoh dalam buku
    • Program Janet yang berjalan lama harus dieksekusi secara asinkron seiring waktu
    • Karena kode JavaScript menyimpan nilai Janet yang sama melalui beberapa referensi, manajemen memori harus dipertimbangkan
    • Struktur data bersarang yang kompleks harus dikirim bolak-balik dengan Janet melalui C++
  • Logo Toodle.Studio adalah kura-kura animasi yang dibuat dengan Bauble
    • Ditambahkan setelah menerima umpan balik bahwa demo turtle graphics tidak punya kura-kura
    • Matanya dibuat mengikuti mouse

cmd: parser argumen CLI untuk Janet

  • cmd adalah pustaka parsing argumen command-line
    • Dalam buku hanya muncul sekitar tiga paragraf, tetapi dibutuhkan untuk menunjukkan dengan jelas bahwa Janet adalah bahasa scripting yang baik
  • cmd sangat dipengaruhi oleh Core.Command dari OCaml
    • Core.Command dianggap sebagai pustaka parsing argumen command-line terbaik yang pernah digunakan
    • Pengalaman itu dicoba untuk direplikasi di Janet
  • cmd tidak sebagus Core.Command
    • Adanya tipe dinilai akan membuat semuanya jauh lebih mudah
    • Namun, cmd memiliki 95% fitur yang dianggap penting, dan berkat notasi yang ringkas, dinilai lebih nyaman dipakai dalam skrip ad-hoc
  • Fitur pembuatan fungsi autocomplete Bash masih belum ada
    • Core.Command membuatnya secara otomatis
    • API cmd dirancang agar fitur ini bisa ditambahkan nanti

judge: framework pengujian snapshot inline

  • judge adalah salah satu hal pertama yang dibuat dengan Janet pada 2021
  • Setelah lebih memahami Janet, proyek ini ditulis ulang dari awal
    • API menjadi lebih nyaman digunakan
    • Implementasinya juga jauh lebih sederhana dan lebih mudah diubah
  • Perbedaan utama Judge v1 dan v2 adalah lokasi pengujian dan helper
    • Pengujian dapat ditempatkan bukan hanya di direktori test/, tetapi juga di dalam file sumber biasa
    • Helper test-macro dan test-stdout ditambahkan
  • Pendekatan padanan OCaml untuk test-stdout disebut sebagai hampir satu-satunya cara yang digunakan saat menulis pengujian secara profesional
    • OCaml tidak punya cara yang memadai untuk menyematkan data arbitrer ke dalam kode sumber, sehingga pendekatannya adalah mengubah semuanya menjadi string
  • Setelah buku terbit, mode --interactive ditambahkan ke Judge

to do: alat tugas yang dibuat dengan Janet alih-alih Bash

  • to do dipilih sebagai contoh untuk bab scripting
    • Ini adalah alat nontrivial yang sebelumnya dibuat dengan Bash, dan implementasi Bash-nya menyakitkan
  • Bagian yang sangat sulit di Bash adalah parsing teks dan pemrosesan tanggal
    • Mem-parsing teks multi-baris dengan Sed tidak menyenangkan
    • Manipulasi date yang berperilaku sama di macOS dan Linux dianggap praktis mustahil
  • Di Janet, dengan memanfaatkan PEG, sh, dan cmd, lebih banyak fitur dapat dibuat lebih cepat daripada daftar tugas Bash aslinya
    • Misalnya, fitur multi-seleksi fzf ditambahkan
    • Menyusun string null-terminated di Bash dianggap sulit
  • Buku hanya membahas versi yang disederhanakan
    • Tidak ada fitur penjadwalan tugas untuk masa depan
    • Tidak ada konsep “melewati” tugas
    • Fitur intinya adalah menambahkan item ke daftar dan menandainya selesai
  • Jika digunakan bersama zsh-autoquoter, ini dianggap sebagai aplikasi yang cukup berguna di luar dugaan

Pekerjaan kode dan pemeliharaan selama penulisan

  • Dari 20 minggu pengerjaan buku, penulisan kode mengambil hampir setengahnya
    • 8 minggu adalah pekerjaan kode, dan pada beberapa periode penulisan dan coding dilakukan bersamaan
  • Awalnya yang diperkirakan hanya peningkatan Judge dan pembuatan parser argumen
    • Implementasi parser argumen jauh lebih sulit dari perkiraan
    • Karena Bauble terlalu sederhana, tidak diduga bahwa playground seni baru akan dibuat lagi
  • Penulisan sebenarnya dilakukan dalam Markdown menggunakan Sublime Text
    • Sublime Text adalah editor yang disukai untuk menulis prosa panjang
  • Selama penulisan, 2 versi baru Janet dirilis
    • Bab debugging dan modul native harus diperbarui agar sesuai dengan perubahan bahasa
    • Buku ini direncanakan untuk dipelihara agar sesuai dengan rilis Janet terbaru

Respons peluncuran dan sejauh mana dibaca

  • Promosi buku hanya berupa pengajuan ke Hacker News, pengajuan ke Lobsters, dan twit
    • Di Hacker News, buku ini berada di halaman depan sepanjang hari dan sempat menduduki posisi nomor 1
  • Berdasarkan log akses Nginx, pengunjung unik adalah sebagai berikut
    • Jumat: 30.025 orang
    • Sabtu: 9.568 orang
    • Minggu: 3.777 orang
  • Angka ini lebih dekat ke jumlah orang yang mengklik tautan, dan jumlah orang yang benar-benar membaca buku dianggap jauh lebih kecil
  • Situs ini tidak memiliki analitik pelacakan perilaku sisi klien
    • Hanya log akses yang digunakan untuk perkiraan kasar
  • Alur kunjungan bab tampak menunjukkan retensi yang kurang baik
    • Bab 1: 22% dari pengunjung halaman beranda
    • Bab 2: 20% dari pengunjung Bab 1
    • Bab 3: 69% dari pengunjung Bab 2
    • Bab 4 “Pegular Expressions” dan Bab 9 “Xenofunctions” memiliki lebih banyak pengunjung daripada Bab 3
  • Pada akhir pekan peluncuran, estimasi terbaik untuk jumlah pembaca sebenarnya adalah 387 orang
    • Dasarnya adalah jumlah IP unik yang memuat 5 bab berbeda atau lebih

Asal nama dan batasan yang terlihat dari umpan balik

  • Nama bahasa Janet berasal dari Janet, makhluk abadi dalam The Good Place
    • Makhluk ini membantu mortals yang berpindah melalui alam setelah kematian, sehingga juga terhubung dengan judul buku
  • Bab yang paling sedikit dikunjungi adalah “Testing and Debugging”
    • Bab ini adalah bab ketiga dari akhir buku
    • Tiga bab terakhir dianggap sebagai bagian paling menarik dalam buku
    • Cara pengujian dalam bab itu dianggap sebagai salah satu peningkatan produktivitas terbesar dalam karier engineering pribadi
  • Melalui fitur report pada REPL bawaan, diterima 494 umpan balik
    • Banyak di antaranya berupa “buku yang bagus” atau pesan uji coba
    • Puluhan lainnya adalah laporan typo, permintaan penjelasan, dan komentar yang berguna
  • Sebagian pengguna mengirim pertanyaan tanpa informasi kontak, dan karena tidak ada fitur balasan, pertanyaan itu tidak dapat dijawab
    • Fitur report diimplementasikan sebagai fitur umpan balik satu arah yang sangat primitif

1 komentar

 
GN⁺ 2024-11-29
Opini Hacker News
  • https://bauble.studio/ dari penulis yang sama juga tidak boleh dilewatkan
    Di browser komputer lamaku itu tidak berjalan, tetapi saat belajar di perpustakaan dan ingin beristirahat, aku sering bermain-main dengan bauble sekitar 30 menit di komputer perpustakaan
    Grafik yang bisa dibuat hanya dengan mengubah-ubah angka saja luar biasa, dan aku berharap Janet bertahan lama

    • Di MacBook Pro M1 Max keluaran 2021, MacOS 15.1.1, ini berjalan di Chrome tetapi di Firefox muncul error kompilasi unknown symbol twist
      error: script:16:1: compile error: unknown symbol twist
      in evaluate [lib/evaluator.janet] on line 81, column 7
      in bauble-evaluator/evaluate [lib/init.janet] on line 8, column 12
  • Menarik membandingkan Janet dengan GNU Guile
    Kelebihan awal Guile adalah sebagai bahasa yang dibuat agar mudah dipakai berdampingan dengan C, tetapi karena bahasanya sudah lama, tampaknya belum mengadopsi sensibilitas modern seperti menyertakan package manager secara bawaan dalam toolchain bahasa
    Hal yang kusukai dari Guile adalah besarnya upaya untuk menjelaskan kompatibilitasnya dengan standar RNRS
    Aku penasaran seberapa mirip Scheme sebenarnya Janet itu

    • Janet sama sekali tidak mirip Scheme
      Lebih seperti seseorang membuat Clojure di atas Lua
  • Bukunya ada di https://janet.guide/, dan bahasanya ada di https://janet-lang.org/

  • Aku menyukai pendekatan praktis buku ini, dan itu menjadi alasan besar aku sekarang belajar dengan menyelesaikan Everybody Codes memakai Janet
    https://everybody.codes

  • Ungkapan “kura-kura adalah metafora” terasa disayangkan
    Kura-kura itu bukan metafora, melainkan benar-benar ada: http://classicacorn.computinghistory.org.uk/8bit_focus/logo/...
    Memang sesuai dengan definisi metafora sebagai “sesuatu yang merepresentasikan hal lain, simbol”, tetapi terdengar seperti lelucon tentang orang yang mengira ikon simpan bergambar disket sebagai kulkas
    Rasanya konteks bahwa dulu benar-benar ada kura-kura hardware yang lucu dan menyenangkan jadi hilang

    • Sepertinya sulit menyebut yang terlihat di halaman itu sebagai kura-kura “sungguhan”
  • Dari judulnya saja aku mengira ini asisten AI lain yang terinspirasi dari Janet di The Good Place, jadi aku senang terkejut ketika ternyata ini bahasa pemrograman
    Bahasa Janet dinamai dari Janet, makhluk abadi di The Good Place yang membantu manusia menavigasi alam baka, jadi judulnya juga lelucon cerdas yang sesuai
    Cukup mengejutkan juga bahwa ia menyertakan PEG (Parsing Expression Grammar), bukan mesin regex bawaan
    Aku selalu berharap bahasa yang menyediakan pustaka regex bawaan juga menyertakan PEG yang layak

    • GNU Guile juga memiliki pustaka PEG di standard library
      Lihat <https://www.gnu.org/software/guile/manual/html_node/PEG-Pars...>
    • Modul spork di Janet menempati posisi semacam libc, dan juga punya submodul regex, jadi kemungkinan besar sudah terpasang
      Aku pertama kali mengenal PEG lewat Janet, dan aku suka karena kuat sekaligus mudah dipakai
      Meski sudah mengutak-atik regex sedikit-sedikit selama lebih dari 20 tahun, aku memahami PEG lebih baik hanya dalam beberapa bulan
      Di komunitas Janet juga ada banyak callback terkait The Good Place, dan beberapa modul pihak ketiga dinamai dari nama-nama karakternya
    • Elm juga mengambil pendekatan serupa
      elm/regex dan elm/parser memang tidak built-in, tetapi elm/regex menyarankan agar menggunakan elm/parser sebagai gantinya
      Aku suka asal-usul namanya, tetapi untuk bahasa bernama Janet, rasanya ada juga kewajiban untuk memprioritaskan kontrol
  • Aku sudah membaca bukunya, dan karena terasa cukup menarik serta playful, belajar Janet jadi jauh lebih menyenangkan
    Namun dokumentasi bahasanya kurang dalam banyak hal
    Fungsi atau perintah sering hanya didaftarkan begitu saja tanpa contoh atau penjelasan, atau tanpa keterangan tentang apa yang dilakukannya
    Sering juga fitur yang kulihat di buku tidak bisa kutemukan di dokumentasi, dan itu menjadi salah satu alasan aku berhenti belajar meskipun menyukai Janet
    Aku suka karena banyak default-nya masuk akal dan ada kemiripan dengan bahasa arus utama alih-alih memaksakan konvensi Lisp lama
    Pada akhirnya, karena bukan cons list, ia sebenarnya bukan Lisp, tetapi itu tidak masalah
    Masalahnya adalah bahasa ini belum terdokumentasi dengan cukup baik

    • Aku penasaran apakah kamu ingat fungsi atau perintah yang belum terdokumentasi itu
      Aku cukup aktif di komunitas Janet, jadi kalau tahu bagian yang kurang, aku bisa ikut berkontribusi pada perbaikan dokumentasi
    • Pengalamanku sama persis, kecuali bahwa aku tidak membaca bukunya
      Sering kali hanya ada signature fungsi tanpa penjelasan tambahan sama sekali
      Aku tahu membuat dokumentasi yang luas butuh banyak waktu dan usaha, tetapi ini terjadi terlalu sering sehingga aku menyerah dan mulai mencari Lisp lain yang bisa dikompilasi menjadi binary
  • Aku tidak terlalu bisa beradaptasi dengan Janet, meski aku tidak tahu apakah masalahnya ada padaku
    Satu-satunya Lisp lain yang pernah kupakai lama adalah Emacs Lisp, dan Janet cukup mirip tetapi juga berbeda secara halus sehingga aku terus membuat kesalahan kecil
    Fitur PEG-nya tampak menarik di dokumentasi, tetapi sintaksnya sulit ditangani dan membingungkan
    Dokumentasinya lengkap dalam arti semua fungsi punya deskripsi, tetapi sangat ringkas karena kurang contoh atau informasi penggunaan yang berguna
    Fitur dasar seperti parsing JSON juga tampaknya tidak disertakan
    Jika untuk bahasa yang ditujukan menulis skrip cepat kita harus menulis parser JSON atau XML terlebih dahulu, tugas itu sudah gagal
    Ini terjadi sekitar 4 tahun lalu, jadi ekosistemnya mungkin sudah membaik, dan bisa jadi kriteria penilaianku terhadap Janet sebagai bahasa scripting memang keliru
    Tetap saja, tulisan ini membuatku ingin memasangnya lagi

    • Hal seperti JSON dan regex dimasukkan ke modul spork, yang menempati posisi semacam libc
      Ada orientasi internal yang kuat untuk menjaga inti tetap ringan
      Banyak proyek bergantung pada spork, jadi kemungkinan besar itu sudah terpasang sejak awal
      Dokumentasinya cukup baik, tetapi aku setuju masih ada celah dalam contoh-contoh praktis
      Bagian ini dilengkapi oleh https://janetdocs.com, yang menautkan “contoh komunitas” untuk tiap fungsi
  • Agak keluar topik, tetapi berkat tulisan blog lain dari penulis aslinya aku mulai memakai keyboard mekanis split
    Selama beberapa tahun aku mengalami nyeri bahu dan pergelangan tangan, dan itu membantu; aku sangat menyarankan untuk melihat tulisan-tulisan Ian lainnya juga

  • Cara menekan Esc kapan saja untuk membuka REPL bawaan yang menempel di bagian bawah mungkin bukan keputusan yang baik
    Browser sudah punya shortcut default Esc, dan Firefox keluar dari mode layar penuh ketika Esc ditekan