- Ruby bukan bahasa yang paling cepat atau paling populer, tetapi setelah melewati berbagai bahasa selama lebih dari 15 tahun, bahasa ini tetap menjadi pilihan saat ingin kembali menikmati pekerjaan
- refinements, Forwardable, SimpleDelegator,
Object#then, Kernel#tap, dan parameter bernomor memberikan kemudahan sintaks kecil serta alur yang mudah dibaca
Thread::Queue, json, dan csv di pustaka standar, bersama RuboCop dan Ruby LSP, membantu mempertahankan lingkungan pengembangan yang praktis tanpa gem kecil tambahan atau konfigurasi rumit
- YJIT di Ruby 3.x dan ZJIT di 4.x sedang memperkecil kesenjangan untuk pekerjaan yang intensif CPU, dan dalam perbandingan Fibonacci sederhana, Ruby with ZJIT berada dalam kisaran 2–3x dari Go
- Ada area yang lebih cocok untuk Rust·Go·Python, tetapi di aplikasi web, pemrosesan latar belakang, dan alat internal, kebahagiaan pengembang serta kecepatan iterasi tetap menjadi kekuatan Ruby
Alasan linguistik mengapa Ruby terasa nyaman
- Ruby bukan bahasa yang paling cepat atau paling tren, tetapi setelah berpindah-pindah di antara banyak bahasa selama lebih dari 15 tahun, Ruby tetap menjadi bahasa yang dipilih kembali saat benar-benar ingin menikmati pekerjaan
- refinements memungkinkan membuka kelas hanya dalam cakupan terbatas, sehingga kita bisa menambahkan kemudahan sintaks kecil di dalam file atau blok tanpa mencemari seluruh namespace
- Cocok untuk helper pengujian atau DSL internal dalam codebase besar
- Metode seperti
"hello".quote hanya bisa dipakai di lokasi tempat using QuotingRefinement dipanggil
- Forwardable dan
SimpleDelegator dari pustaka standar memungkinkan delegasi yang rapi tanpa harus menulis sendiri metode pembungkus atau menarik gem tambahan
- Jika sudah memakai Rails,
delegate dari Active Support mungkin lebih nyaman, tetapi versi inti Ruby membantu menjaga skrip umum tetap ringan
Object#then dan Kernel#tap memungkinkan rangkaian kerja dibaca dari atas ke bawah tanpa harus membuat variabel perantara
- Alur pembuatan, logging, normalisasi, dan penyimpanan bisa dirangkai seperti
User.new(params).tap { ... }.then { ... }.save
- Parameter bernomor sejak Ruby 2.7 mengurangi kebisingan pada callback pendek
- Tidak perlu mendeklarasikan argumen blok secara eksplisit seperti pada
items.map { _1.price * 1.1 }
- fiber scheduler memungkinkan penulisan kode konkurensi yang terlihat seperti kode sekuensial saat dihubungkan ke event loop
- Kode yang bekerja sama dengan fiber lain bisa diekspresikan dalam bentuk
Fiber.schedule do ... end
Kondisi terkini alat, performa, dan ekosistem
- Ruby LSP dari Shopify menyediakan integrasi editor dengan konfigurasi minimal, dan bekerja baik bersama Steep atau RBS untuk penerapan tipe secara bertahap
- RuboCop membantu menjaga konsistensi gaya tanpa prosedur seremonial yang sering terlihat di ekosistem lain
- Pustaka standar tetap menjadi kekuatan senyap karena untuk tugas umum kita tidak perlu menambahkan banyak gem kecil
- Jika butuh queue, kita bisa memakai
Thread::Queue
- Untuk parsing JSON atau CSV, pustaka
json dan csv menangani sebagian besar kasus penggunaan nyata tanpa banyak prosedur tambahan
- Setelah YJIT di Ruby 3.x, seri 4.x mulai menghadirkan ZJIT
- ZJIT adalah JIT yang bekerja lebih agresif di atas fondasi yang sama, dan mengompilasi jalur eksekusi yang lebih panas dengan efektif
- Angka awal menunjukkan bahwa jarak dengan bahasa-bahasa yang sebelumnya sangat unggul dari Ruby pada pekerjaan intensif CPU telah menyusut secara berarti
- CRuby ZJIT sedang dikembangkan di repositori utama Ruby
- Dalam benchmark sederhana yang membandingkan implementasi Fibonacci rekursif pada mesin yang sama, Ruby with ZJIT berada dalam kisaran 2–3x dari Go, tidak terlalu tertinggal dari Rust yang dioptimalkan pada kasus tersebut, sementara Python with pypy tertinggal
- Microbenchmark memang punya keterbatasan, tetapi pada jalur kode yang sudah hangat dan memberi waktu bagi JIT untuk mengoptimalkan, aplikasi nyata juga bisa mendapatkan manfaat yang lebih besar
- Dibandingkan Rust, Ruby unggul dalam kecepatan iterasi logika bisnis
- Di Rust, waktu bisa habis untuk bergulat dengan borrow checker meskipun sesuatu sudah jelas pada saat runtime
- Go punya primitif konkurensi yang sangat baik, tetapi hingga baru-baru ini tidak memiliki generics, dan penanganan error yang agak kaku bisa membuat skrip sederhana terasa lebih berat dari yang seharusnya
- Python adalah kerabat mental yang paling dekat, tetapi khususnya di sekitar class dan decorator, ia memerlukan lebih banyak boilerplate untuk mengekspresikan ide tingkat tinggi yang sama
- Saat memasukkan kode ke dalam model, efisiensi token juga menjadi keunggulan nyata Ruby
- Blok bisa diekspresikan dengan
do/end atau kurung kurawal, dan pemanggilan metode hampir tidak memerlukan tanda kurung bila keterbacaan masih terjaga
- Hash dan argumen kata kunci adalah fitur kelas satu dan ringkas, sehingga lebih banyak logika nyata bisa dimasukkan ke jendela konteks yang sama dibandingkan bahasa dengan lebih banyak noise struktural
- Utilitas metaprogramming Ruby sangat cocok untuk membuat API yang kecil dan mudah dibaca
- Fitur seperti
define_method, class_eval, dan pencegatan missing method memungkinkan pembuatan API ekspresif tanpa tahap pembangkitan kode
- Pustaka seperti
dry-rb atau aasm memakai kemampuan ini dengan disiplin untuk menyediakan state machine dan lapisan validasi yang bersih
- Alat komunitas dan alur deployment juga telah matang
- byebug dan
pry terasa lebih fleksibel daripada banyak debugger yang pernah dipakai di tempat lain
- Untuk pekerjaan latar belakang,
solid_queue dan good_job cukup sederhana sehingga keseluruhan implementasinya terasa dapat dipahami dalam satu sore
- Kamal telah menggantikan prosedur bergaya capistrano lama bagi banyak orang, dan terasa seperti alat yang benar-benar dibuat oleh orang-orang yang menjalankan tim kecil
- Ini bukan berarti Ruby mengalahkan Rust atau Go dalam semua pekerjaan, dan memang ada area yang lebih cocok untuk Rust atau Go
- Namun, di wilayah tengah yang luas seperti aplikasi web, pemrosesan latar belakang, dan alat internal, Ruby terus memberikan kebahagiaan pengembang tanpa terlalu banyak seremoni atau perpindahan konteks yang sering
- Kenyamanan-kecil dan nuansa keseluruhan bahasa tetap menjadi alasan mengapa tangan masih otomatis meraihnya bahkan setelah lebih dari 10 tahun, dan pekerjaan JIT baru serta perbaikan bahasa yang konsisten makin memperkuat alasan itu
1 komentar
Pendapat di Lobste.rs
Sulit setuju dengan ungkapan “RuboCop tanpa banyak seremoni”
Dengan RuboCop, tetap ada cukup banyak proses untuk membahas cop mana yang dipilih dan disesuaikan, serta apakah cop baru yang ditambahkan lewat pembaruan terbaru perlu diaktifkan atau tidak
StandardRB jauh lebih mendekati pendekatan tanpa banyak ritual, tetapi pada akhirnya itu juga tetap harus dipilih
Bahasa yang lint-nya tertanam di dalam bahasa itu sendiri jauh lebih tidak merepotkan daripada Ruby, dan juga lebih sedikit memicu perdebatan soal gaya yang sepele
Batasan justru memberi kebebasan
Saya pada dasarnya cenderung menolak konfigurasi linter, dan ingin keputusan seperti ini diserahkan ke default komunitas
Di satu sisi, default RuboCop sudah cukup bagus, jadi lebih baik diikuti dan dikembangkan bersama daripada terus memecah gaya penulisan kode
Di sisi lain, kadang pendapat bawaannya terlalu kuat, jadi terasa memang perlu sesuatu seperti standard.rb
Saya menulis dari sudut pandang agar orang yang sedang belajar Ruby atau ingin kembali ke Ruby bisa menulis kode dengan nyaman tanpa harus berurusan dengan segunung gem
Saat Go muncul dengan satu sistem formatting resmi, menurut saya itu keputusan yang sangat tepat
Otak adalah mesin pencocokan pola, jadi setelah terbiasa kita akan langsung melewatinya begitu saja, tetapi kalau ada pilihan, orang jadi merasa tidak nyaman dan semua akan tertarik ke sana-sini
Masalahnya, baik RuboCop maupun Standard tidak bisa punya otoritas seperti itu di Ruby
Otoritas itu harus datang dari tim inti, tetapi kemungkinan besar itu tidak akan terjadi karena bertentangan dengan filosofi Ruby
Di proyek saya, saya mematikan semua cop RuboCop lalu hanya mengaktifkan sebagian saja
Tanda kutip tunggal adalah yang terbaik 😀
Tulisan lain ini tampaknya juga menyorot hal yang sama: https://caio.ca/blog/coding/my-complicated-relationship - “The Wild West of Code Formatting”
Intinya kurang lebih, “Ini bukan solusi bawaan yang sederhana. Ada ratusan cop yang bisa dikonfigurasi, jadi berujung pada perdebatan tanpa akhir tentang aturan mana yang harus diaktifkan”
Secara umum saya setuju, tetapi agak disayangkan refinements dijadikan contoh pertama
Saya paham kenapa itu disukai, tetapi rasanya ini termasuk hal yang lebih baik tidak diketahui cara sosis dibuat
Semantiknya terlalu rumit, sampai sekarang pun, 10 tahun setelah diperkenalkan, bug-bug menyebalkan masih terus ditemukan di MRI
Misalnya, hanya dalam 2 minggu terakhir saja ada https://bugs.ruby-lang.org/issues/22071 dan https://bugs.ruby-lang.org/issues/22058
Dari sisi performa juga, ini cenderung membuat banyak optimisasi jadi lebih sulit, dan sekarang hal serupa sedang terjadi lagi di boxes
Di level implementasi pun sepertinya masih akan ada banyak bug tersembunyi, dan kemungkinan besar di sisi library juga sama
Saya sudah tidak banyak memakai Ruby sekarang, tetapi penasaran bagaimana ini akan menemukan bentuknya
Terlihat menarik
Tulisan ini juga sangat selaras dengan pengalaman saya dalam tulisan “Returning to Rails”[1]
Mungkin ini bias konfirmasi, tetapi rasanya semakin banyak orang yang kembali menemukan atau mengakui keindahan kode Rails
Tetapi saya juga teringat fenomena bahwa selera musik atau seni cenderung terbentuk tetap pada akhir remaja hingga usia 20-an
Jadi saya bertanya-tanya apakah orang-orang yang pertama kali mengenal Ruby pada “masa keemasan” Rails sedang melihat kembali era Rails 3 dan Capistrano dengan kacamata nostalgia
Waktu itu saya sangat tenggelam di “shop” Ruby, dan di sekitar saya juga hanya ada pengembang Rails, jadi rasanya Ruby ada di mana-mana
Namun di thread lobste.rs[2], ada pendapat bahwa Ruby sebenarnya memang selalu cukup niche, jadi mungkin itu juga berpengaruh
Meski begitu, Ruby masih terasa seperti rumah, dan seolah bekerja persis seperti cara otak saya bergerak
Hampir tidak ada proses penerjemahan mental, tidak ada banyak kejutan, dan rasanya seperti berbicara dengan teman alih-alih menulis makalah formal
Saya masih belum menemukan bahasa lain yang benar-benar pas seperti ini, dan saya rasa ini bukan semata-mata pola pikir “anak zaman sekarang itu...”
Bagaimanapun, saya senang bahasa ini masih bertahan selama ini
Dan terima kasih sudah memperkenalkan rantai “tap / new”
Strukturnya begitu indah dan berguna sampai membuat saya berhenti sejenak, dan rasanya pasti akan saya pakai
PS - Tidak berhubungan langsung dengan topik, tetapi avatar AI di halaman depan agak menyeramkan
Itu memberi kesan uncanny valley yang kuat seperti, “Apa tulisan ini ditulis bot?”
Setiap kali melihat hal seperti itu, saya sempat bertanya-tanya apakah saya benar-benar sedang berbicara dengan manusia
[1]=https://www.markround.com/blog/2026/03/05/returning-to-rails-in-2026/
[2]=https://lobste.rs/s/jreqtw/returning_rails_2026
Saya hanya tidak ingin mempublikasikan foto asli, meski avatar itu cukup mirip sampai orang-orang yang mengenal saya di dunia nyata bisa mengenalinya
Ruby 3.4 menambahkan parameter blok
it, dan itu bisa dipakai sebagai pengganti_1di contohhttps://rubyreferences.github.io/rubychanges/3.4.html/…
itMungkin karena ini fitur yang relatif baru, tangan saya sama sekali belum terbiasa mengetik
itdi iteratorSaya dulu sangat suka menulis kode dengan Ruby, tetapi beban pengujiannya jadi terlalu besar
Saya kira menambahkan sedikit keamanan tipe ke bahasa itu akan membantu, tetapi saat
#{last_job}memasukkan Sorbet ke codebase, dorongan dan kesenangan menulis kode benar-benar mati totalMungkin ini pendapat yang tidak populer, tetapi menurut saya fakta bahwa sesuatu seperti Sorbet itu ada justru lebih merupakan tanda yang buruk bagi Ruby
Ruby sendiri adalah bahasa yang kuat dan menyenangkan, tetapi orang-orang mulai memakainya untuk pekerjaan yang sebenarnya tidak dirancang untuknya, lalu dalam prosesnya mulai menambal antifitur bahasa itu dengan berbagai alat tambahan
Pada titik itu, setiap baris terasa seperti kerja paksa yang membosankan, dan saya jauh lebih banyak menunggu berbagai alat build, test, dan lint daripada benar-benar menulis kode
Ditambah lagi dengan proses build dan deployment yang terlalu direkayasa, bahkan hal-hal dasar pun jadi memakan waktu lama dan pekerjaan terasa menyiksa
Saya sangat merindukan dunia Ruby sekitar tahun 2012
Kalau dipikir-pikir lagi, itu benar-benar masa yang bagus
Saya mengira yang dimaksud dengan “pekerjaan yang tidak dirancang untuknya” adalah aplikasi Rails besar
Saya kembali ke Ruby setelah 10 tahun, dan di era “AI”, kemampuan untuk benar-benar memahami kode yang melintas di depan mata serta mengarahkan atau menghentikan LLM terasa berguna
Dalam bahasa yang lebih bertele-tele, ini lebih sulit
Saya merindukan Ruby, dan lebih dari itu saya merindukan kenyataan bahwa bahasa seperti itu bisa ada dalam produksi sehari-hari
Itu adalah harapan, bahkan harapan itu sendiri
Setidaknya bagi saya, selama waktu yang lama memang begitu
Ini terbaca seperti tulisan yang asal dibuat AI
Tulisan blog lain belakangan ini juga mirip
Petunjuk apa yang membuat Anda melihatnya begitu?
Menunjukkan tulisan buruk buatan AI di situs ini itu bagus, tetapi kita perlu menghindari false positive dan menyebutkan dengan tepat kenapa berpikir begitu
Kenapa Anda berpikir begitu?
Peringatan seperti ini bagus, tetapi saya jauh lebih suka kalau alasannya juga dijelaskan
Saya punya kenangan baik bekerja dengan Ruby di awal karier
Ada sesuatu di Ruby yang benar-benar terasa menyenangkan
Tetapi saat saya sedikit memakai Ruby lagi baru-baru ini, mungkin tahun lalu, saya merasa dokumentasi standard library berbasis web sulit dijelajahi
Apa cuma saya? Adakah alternatif untuk dokumentasi ruby-lang.org?
[1] https://rubyapi.org
[2] https://devdocs.io/ruby/
Tulisan ini terasa agak aneh
Saya sempat punya kesempatan menulis satu proyek dan satu SDK dengan Ruby, dan setelah itu saya sama sekali tidak punya keinginan untuk memakai Ruby lagi