Membuat Web Framework Sendiri Bernama Izen

Belajar Golang membuka pandangan saya bahwa ternyata ada arsitektur project yang bisa jadi alternatif dari arsitektur MVC yang sudah menjadi arsitektur go-to saya, yaitu screaming architecture.

Screaming architecture sederhananya begini: saat kamu membuka struktur project, kamu bisa langsung tahu kalau project ini tentang apa. Beda dengan arsitektur MVC yang harus buka folder controller, model, atau service untuk benar-benar memahami project secara keseluruhan.

Lebih jauh dari itu, saya mulai mempertimbangkan apakah di project-project selanjutnya saya benar-benar perlu menggunakan framework populer atau bisa membuat framework saya sendiri, mengingat coding sekarang sudah sangat murah berkat bantuan AI.

Sejauh ini, saya belum menemukan framework web Ruby yang menerapkan screaming architecture. Kebanyakan strukturnya menggunakan struktur MVC karena banyak yang terinspirasi oleh Rails. Padahal, Ruby punya keyword module yang menurut saya sangat cocok dengan screaming architecture.

Misal, module user. Kode-nya bisa dibuat seperti berikut:

module User
class Repository; end
end

module User
class Model; end
end

module User
class Controller; end
end

Kodenya tetap elegan: User::Repository, User::Model, atau User::Controller.

Dari ide ini, saya akhirnya membuat sebuah framework Ruby sendiri bernama Izen.

Izen adalah nama panggilan anak kedua saya, sekaligus singkatan dari Ruby(i) Zen: Ruby yang tenang. Sesuai namanya, framework ini dirancang seminimalis mungkin dari sisi dependensi dan memory usage-nya.

Framework ini tidak menggunakan ORM sama sekali. Query dilakukan via raw query, dan ini sengaja. Arsitekturnya pakai screaming architecture. Database pakai SQLite, karena... kenapa tidak? Pokoknya, framework ini adalah framework yang sangat lean karena disengaja secara desain.

Build ke native pakai Spinel

Salah satu hal yang cukup meresahkan dari Ruby adalah memory usage-nya yang cukup besar untuk server saya yang mungil. Satu-satunya cara untuk mengurangi memory usage-nya yaitu dengan mengubahnya menjadi sebuah native binary.

Untungnya, Matz: pembuat bahasa pemrograman Ruby, pertengahan bulan Maret lalu membuat sebuah project bernama Spinel. Project ini bertujuan untuk mengompilasi kode Ruby menjadi native binary. Jujur saja, ini tools yang selama ini saya cari-cari. Beberapa tools dari komunitas belum sesuai ekspektasi saya. Kebanyakan gagal saat build karena sudah terlalu lama tidak di-maintain.

As per saya menulis ini, sudah ada tag yang dirilis oleh Matz bulan lalu, yaitu tag 2026.09.12. Ini artinya, Spinel sudah cukup stabil untuk digunakan. Oleh karena itu, saya membuat semua project yang dikembangkan menggunakan Izen bisa di-build jadi native binary menggunakan Spinel. Fitur ini masih eksperimental, mengingat Spinel juga belum terlalu mature. Tapi, untuk traffic sekala kecil, saya rasa versi native dari Izen sudah lebih dari cukup.

Semua proyek yang saya rewrite ke Padrino kini saya rewrite lagi ke Izen dan di-compile menjadi sebuah native binary. Hasilnya cukup memuaskan. Project-project yang tadinya menghabiskan RAM sekitar 50 sampai 100 MB per project kini hanya menghabiskan 10 sampai 20 MB. 8 project pribadi saya sekarang hanya menghabiskan RAM sekitar 50 MB, dan masih menyisakan space untuk project-project lainnya.

Kenapa nggak sekalian pakai Golang aja?

Karena saya suka Ruby dan Ruby masih jadi bahasa yang nyaman untuk dibaca dan dipahami. Meskipun saya sudah mulai cukup jarang membaca kode yang di-generate oleh AI, saya tetap membacanya di bagian-bagian yang krusial, untuk memastikan bahwa kodenya sudah benar-benar menerapkan best practice, khususnya di bagian yang rawan terhadap celah keamanan.

Selain itu, ada kesenangan tersendiri saat membaca kode Ruby, dan saya tidak mau kesenangan ini hilang karena AI. Selain itu, untuk kebutuhan saya, saya tidak terlalu perlu bahasa pemrograman yang terkenal akan performa-nya, seperti Rust. Ruby bagi saya sudah cukup cepat.

Dengan Izen, saya mendapatkan dua keuntungan: kode Ruby yang nyaman dibaca, dan native binary yang lebih efisien dari segi memory usage. Kalau kamu penasaran atau mau coba pakai, silahkan cek https://github.com/adiprnm/izen.

Ada pertanyaan atau tanggapan tentang artikel ini? Balas via email