Crafting Interpreters: Buku 640 Halaman yang Diselesaikan dalam 15 Bulan
(journal.stuffwithstuff.com)- Setelah serial web selesai, Crafting Interpreters masih memerlukan 15 bulan pekerjaan tambahan hingga menjadi buku sungguhan, dan akhirnya rampung sebagai edisi cetak, ebook, dan PDF
- Untuk mengubah kumpulan Markdown dan PNG menjadi buku, perlu dibuat ulang sistem build Dart, impor XML InDesign, otomasi JavaScript, hingga verifikasi tata letak
- Hasil akhirnya berukuran 8×10 inci, 640 halaman, lebih dari 200 ribu kata, 1.133 cuplikan kode, dan ratusan ilustrasi, dengan batasan tata letak yang jauh lebih rumit daripada konten web biasa
- Prosesnya berlanjut dengan 5 bulan peninjauan ulang menyeluruh, copyediting profesional, 2 bulan tata letak, 2 minggu pembuatan indeks, pemeriksaan proof cetak, dan otomasi perbandingan PDF
- Buku teknis yang diterbitkan sendiri tidak selesai hanya dengan menulis; otomasi build, layout, verifikasi, dan distribusi menentukan kualitas dan tingkat penyelesaian buku
Pekerjaan yang Masih Tersisa Setelah Konten Web Selesai
- Naskah Crafting Interpreters sebenarnya sudah selesai, tetapi saat itu hasilnya masih berupa Markdown dan file PNG yang diubah menjadi situs web dengan kode Python
- Tujuannya sejak awal adalah buku kertas sungguhan, dan setelah bab terakhir diunggah ke web, penulis beristirahat sekitar satu bulan
- Setelah menulis setiap hari selama hampir 4 tahun, ia sangat kelelahan, dan situasi pada awal 2020 juga bukan masa yang mudah untuk melanjutkan pekerjaan
Sistem Build yang Dibuat Ulang dengan Dart
- Penulis lebih dulu memperbaiki typo dan kesalahan yang dilaporkan pembaca lewat issue GitHub
- Setelah itu, seluruh sistem build buku ditulis ulang dengan Dart
- Skrip build untuk buku pertamanya adalah satu skrip Python yang merender file Markdown per bab menjadi HTML dan menyisipkan potongan kode
- Crafting Interpreters membutuhkan build yang lebih kompleks karena harus menyusun kode dua interpreter lengkap secara bertahap sepanjang 30 bab
- Sistem build baru dapat menghasilkan kode interpreter secara terprogram sampai bab tertentu atau titik tertentu di dalam bab, lalu mengompilasinya dan menjalankannya dalam pengujian otomatis
- Perkakas berbasis Python terasa berat untuk dipelihara berdasarkan tingkat kemahiran penulis, dan juga lambat
- Versi Dart menghasilkan HTML dan kode dengan syntax highlighting persis seperti yang diinginkan, serta 10 kali lebih cepat daripada versi Python sebelumnya
- Kontrol yang lebih besar atas pemrosesan Markdown juga kemudian berguna saat mengekspor XML untuk InDesign
Desain Buku dan Penentuan Format
- Desain buku lebih mirip membuat framework terlebih dahulu, seperti dalam pengembangan web atau game, lalu menuangkan konten ke dalamnya
- Di InDesign, penulis mengatur master untuk menentukan margin dan grid halaman, serta style untuk menentukan font, gaya, dan warna teks maupun objek
- Crafting Interpreters memiliki banyak elemen dengan tingkat kesulitan desain yang tinggi
- Banyak teks isi
- Banyak aside panjang yang menjelaskan kalimat tertentu, kode, atau ilustrasi tepat di sebelahnya
- Banyak kode, dan di samping setiap cuplikan kode ada keterangan posisi dalam program hasil akhir
- Lebar horizontal harus mempertimbangkan baris kode yang panjang, area aside, dan margin dalam buku yang tebal sekaligus
- Buku teks CS umum di rak penulis banyak yang lebarnya 7,5 inci, tetapi itu menyulitkan untuk memuat kode, aside, dan margin, sehingga diputuskan menggunakan lebar 8 inci
- Dalam penerbitan mandiri, harus menggunakan ukuran format terbatas yang didukung KDP dan IngramSpark, dan pilihan yang masuk akal untuk lebar 8 inci adalah 8×10 inci
- Arah vertikal disejajarkan dengan baseline grid 12pt yang klasik
Pipeline XML untuk Memindahkan ke InDesign
- InDesign tidak memahami Markdown atau sistem build penulis secara langsung, sehingga menyalin dan menempel secara manual tidak realistis
- InDesign mendukung impor XML dan penerapan style otomatis berdasarkan tag
- Namun, dukungan XML-nya memiliki keterbatasan dalam menangani tag bersarang, sehingga tidak dapat menangani dengan benar cara seperti HTML yang menyarangkan tag italic di dalam header
- Karena penulis dapat mengendalikan sendiri sistem build, ia menulis custom XML exporter yang menghasilkan tag yang lebih mudah diterima InDesign
Otomasi JavaScript InDesign dan Keterbatasannya
- Impor XML menghasilkan “story” InDesign, yaitu satu aliran teks kontinu yang mengikuti kotak teks utama
- Teks isi dan cuplikan kode masuk ke aliran utama, tetapi aside dan location marker harus dikeluarkan ke samping
- Pada buku sebelumnya, penulis memotong aside secara manual dan menempelkannya ke kotak teks baru, tetapi cara yang sama mustahil untuk buku ini karena ada 1.133 cuplikan kode
- InDesign mendukung scripting JavaScript, tetapi dokumentasi dan lingkungan debugging-nya sangat minim
- Tidak ada debugger
- Tidak ada stack trace
- Tidak ada debug print biasa
- Hanya bisa menggunakan
alert(), dan saat dipanggil skrip akan berhenti
- Skrip JavaScript mencari aside dan location marker, mengeluarkannya dari aliran teks utama, lalu menjadikannya kotak teks terpisah
- Otomasi penentuan posisi tidak pernah sepenuhnya selesai
- Penulis mencoba menempatkannya dengan fitur anchor InDesign dan Object Style, tetapi dalam beberapa kasus muncul masalah tepi cuplikan kode di sekitarnya menghilang
- Akhirnya beberapa location tag tetap harus diposisikan secara manual
Penyuntingan dan Copyediting
- Penulis melakukan editing pass dengan membaca ulang seluruh naskah dari awal sampai akhir
- Setiap bab sudah melewati tiga draft saat ditulis, tetapi ia meninjaunya sekali lagi untuk melihat alur buku secara keseluruhan
- Pekerjaan ini memakan waktu 5 bulan, dan sebagian besar lelucon yang berulang diperbaiki
- Setelah itu, ia mempekerjakan copyeditor profesional Kari Somerton
- Alur kerja penyuntingan umum sering memakai Microsoft Word dan Track Changes, tetapi penulis ingin mempertahankan alur kerja berbasis plaintext dan Git
- Kari Somerton mempelajari Git dan sistem build kustom, lalu meninjau seluruh buku dan menemukan ratusan kesalahan
- Meski sudah ada empat draft dan ratusan issue dari pembaca, copyeditor profesional tetap menemukan banyak masalah
Batasan Tata Letak 640 Halaman
- Setelah kata-kata cukup dipoles, penulis melakukan tata letak per bab di InDesign
- Pekerjaan per bab diulang dengan alur berikut
- Membuat file InDesign baru
- Mengekspor XML
- Mengimpor XML ke InDesign
- Mengeluarkan aside dan location marker dengan JavaScript
- Mengatur anchor elemen sidebar
- Menyesuaikan ruang kosong di akhir halaman
- Lima langkah pertama dapat diselesaikan sekitar 30 menit per bab, tetapi penyesuaian ruang kosong terakhir adalah bagian tersulit
- Tata letak buku memiliki banyak batasan penempatan vertikal
- Ilustrasi tidak boleh dipotong di tengah halaman
- Aside lebih mudah dipahami jika berada dalam satu halaman
- Cuplikan kode juga sebaiknya tidak terbelah melewati halaman jika memungkinkan
- Harus menghindari situasi header tertinggal sendirian di akhir halaman
- Widows and orphans juga sebaiknya dihindari
- Dalam situasi seperti ini, InDesign mendorong konten ke halaman berikutnya, tetapi akibatnya muncul ruang putih besar di bagian bawah halaman
- Ilustrasi dan cuplikan kode bekerja seperti masalah bin-packing yang saling terkait, dan karena itu tata letak seluruh bab memakan waktu 2 bulan
- Untuk mengurangi ruang kosong, penulis harus membagi cuplikan kode menjadi dua, menyesuaikan margin di sekitar gambar, atau mengubah tinggi ilustrasi
Ilustrasi, Indeks, dan Materi Depan-Belakang
- Ilustrasi dipilih sebagai gambar pena hitam-putih yang ramah cetak, dan saat pertama kali dipindai digunakan resolusi 1200 DPI
- Mengekspornya sebagai bitmap resolusi tinggi mudah, tetapi menempatkannya dalam layout halaman sulit
- Karena teks isi tidak memakai pola “lihat Figure 123”, melainkan struktur kalimat yang menunjuk langsung ke ilustrasi di sebelahnya, ilustrasi harus berada di posisi yang dekat
- Tanpa mempekerjakan pembuat indeks profesional, penulis sendiri menelusuri ulang semua bab selama 2 minggu untuk membuat indeks
- Fitur indeks InDesign dapat menjadikan teks terpilih sebagai entri indeks dan menghasilkan keseluruhan indeks, tetapi menambahkan entri itu sendiri merupakan pekerjaan berulang dan membosankan
- Bagian belakang buku berisi indeks, sedangkan bagian depan berisi halaman judul, halaman hak cipta, dedikasi, ucapan terima kasih, dan daftar isi yang dihasilkan InDesign
Desain Sampul
- Penulis berpendapat bahwa nilai artistik sampul buku teknis mungkin tidak sepenting novel, tetapi karena ia tidak berada dalam posisi profesor yang bisa mewajibkan penjualan, ia menghabiskan banyak waktu untuk sampul
- Awalnya ia ingin memakai foto yang diambil sendiri sebagai sampul, tetapi tidak menemukan foto yang cocok
- Akhirnya ia memutuskan memakai ilustrasi pena dan tinta, bahasa visual buku tersebut
- Ia menggambar ulang gambar gunung yang menjelaskan proses kompilasi agar lebih besar dan detail, serta membuat ulang huruf judul dengan nuansa tulisan tangan
- Judul dicetak dengan Acumin Pro Extra Condensed lalu dijiplak tangan agar terasa tidak sempurna, dan ia memilih palet warna seperti manual pramuka hasil mesin stensil tahun 1950-an
Proof Cetak dan Verifikasi Perubahan PDF
- Penulis mengunggah PDF ke KDP dan memesan proof cetak, lalu seminggu kemudian menerima kotak yang berat
- Baru setelah melihat buku fisik, ia merasakan skala proyek sebagai benda fisik, bukan sekadar file data
- Karena banyak pekerjaan manual dalam proses tata letak, ia membaca sendiri proof cetak untuk mencari kesalahan dan menandainya dengan sticky note
- File InDesign dimasukkan ke repositori Git, tetapi karena berupa file biner besar yang tidak transparan, diff tidak bisa dilihat seperti kode sumber
- InDesign kadang mengubah file meski tampaknya tidak ada perubahan nyata, sehingga sulit memastikan perubahan apa yang terjadi
- Penulis membuat skrip Dart untuk mengekstrak semua halaman PDF buku dan menjadikannya satu gambar tile PNG besar
- Pada setiap commit, ia mengekspor PDF, membuat gambar tile, lalu dengan Photoshop action menggambar tepi merah pada piksel yang berbeda di antara dua gambar untuk menemukan halaman yang berubah
- Cara ini tidak memberi tahu detail perubahan secara langsung, tetapi menunjukkan halaman mana yang perlu diperiksa secara visual dan memungkinkan verifikasi bahwa hanya perubahan yang diharapkan yang masuk
Ebook dan Peluncuran
- Setelah koreksi proof edisi cetak selesai, penulis juga membuat ebook Kindle dan EPUB
- Ia memodifikasi sistem build sendiri agar dapat mengekspor XHTML lama, metadata, dan manifest yang dibutuhkan EPUB
- Setelah menjalankan beberapa perintah command line, ia membuat ebook Kindle dan EPUB, lalu mengujinya di beberapa reader sambil menyesuaikan CSS
- Setelah file akhir siap, ia memperbarui halaman pertama situs buku agar mengarah ke tempat pembelian, serta merapikan foto dan layout responsif
- Setelah unggahan ke toko, pembaruan situs, dan pemberitahuan ke mailing list selesai, buku itu berada dalam keadaan “benar-benar” selesai
Rencana Setelahnya
- Bahkan setelah bab terakhir selesai, orang-orang menanyakan pekerjaan berikutnya atau topik buku berikutnya
- Setelah mencurahkan 6 tahun untuk satu proyek, penulis tidak ingin merencanakan buku baru untuk sementara waktu
- Ada banyak hal yang tertunda selama pandemi, dan rencananya ia akan beristirahat tanpa menentukan apa yang akan dilakukan untuk sementara
- Ia menyebut beberapa kemungkinan seperti membuat musik, memancing, menghabiskan waktu dengan teman dan keluarga, atau mengerjakan proyek roguelike, tetapi tidak segera memutuskan apa pun
- Ia mengatakan mungkin suatu saat ingin mengerjakan proyek besar lagi, tetapi tidak ingin menghabiskan 6 tahun lagi untuk satu proyek
1 komentar
Pendapat di Hacker News
Halaman ini memuat tautan untuk membeli buku sekaligus tautan ke versi online gratis: https://craftinginterpreters.com/
Buku ini jelas layak dibeli. Usaha Nystrom dalam desain buku fisik saja sudah cukup bagi orang yang menyukai cetakan, ditambah ilustrasi gambar tangan dan tulisan yang bagus, menurut saya ini lebih baik daripada 99% buku teknis
Ini salah satu buku teknis terbaik yang pernah saya baca. Struktur yang menyisakan kode yang berkembang bertahap dan program yang bisa dijalankan di setiap bab adalah gagasan yang luar biasa, dan saya kagum penulisnya benar-benar berhasil mewujudkannya
Karena pernah menulis sesuatu yang mirip sebelumnya, saya hanya membaca sekilas bagian interpreter traversal tree, dan belajar jauh lebih banyak saat mengikuti interpreter bytecode berbasis C
Saya mengira tulisan ini baru dan sempat menyangka edisi kedua sudah terbit
Saya ingin mengucapkan selamat kepada penulisnya. Buku ini adalah sumber yang sangat bagus, bukan hanya karena kedalaman teknisnya di bidang bahasa, tetapi juga detail kecil pada tata letak dan grafis yang membuat pembaca terus terpikat. Rasanya seperti buku yang akan tetap relevan untuk waktu lama
Saya mulai mengikuti Crafting Interpreters pada 2017, dan saat mengerjakan paruh pertama buku ini saya menulis implementasi lox dengan Scala alih-alih Java. Dalam prosesnya, tokenizer/lexer/parser/interpreter menjadi sama sekali tidak lagi terasa misterius
Dulu saya menganggapnya sebagai ranah seperti visi khusus yang hanya bisa ditangani oleh jenis programmer tertentu, tetapi menurut saya itu berkat tulisan Nystrom yang luar biasa dan pemahamannya yang mendalam atas topik ini. Saya mulai menulis interpreter kedua dengan Rust, tetapi karena kehidupan makin sibuk saya tidak banyak maju dan tidak pernah menyelesaikannya. Sepertinya sekarang saatnya kembali lagi. Tulisan ini memang dari beberapa tahun lalu, tetapi saya tidak tahu bukunya sudah diterbitkan dalam bentuk fisik. Walau mungkin bukan cara belajar yang paling optimal bagi saya, saya jadi ingin membeli satu eksemplar untuk dikoleksi dan mendukung penulisnya
Ini termasuk buku teknis komputer terbaik yang pernah saya baca. Saya benar-benar sangat menikmatinya dan belajar banyak
Selain konten teknisnya yang hebat, tulisannya juga bagus, menyenangkan, dan ilustrasinya bagus. Menurut saya ini adalah pencapaian monumental
Ini wawancara bagus tempat Bob membicarakan buku ini, layak didengarkan: https://corecursive.com/032-bob-nystrom-on-building-an-inter...
Ironisnya, saya butuh 15 bulan untuk membaca dan menyelesaikan buku ini :). Saya sangat bersimpati dengan situasi penulisnya. Ini buku yang luar biasa dari penulis yang tekun dan hebat, dan saya jadi begitu menyukai buku ini sampai membuat halaman berdasarkan hal-hal yang saya pelajari: https://hexmos.com/compiler
Apakah penulisnya berubah dari desainer grafis menjadi compiler engineer? Mengejutkan dan mengesankan
Buku ini ada di rak buku saya. Ini akan menjadi buku interpreter berikutnya yang saya baca setelah “Writing an interpreter in Go”, dan buku itu sekitar 200 halaman, jadi saya sangat menyukainya
Saya baru saja menyelesaikan lexer dengan Rust, bukan Java, dan menantikan sisanya. Sejauh ini bukunya luar biasa