Filosofi “Let It CRASH!” sebagai pola pikir untuk menangani kesalahan pada sistem
Tags: elixir, erlang, supervisor, faulttolerance
Published: 2020-05-08 15:55:53

Hampir setiap bahasa pemrograman memiliki filosofi agar membantu para penggunanya (dalam hal ini programmer) untuk mengerti behaviour, sifat alami dan citra yang ingin dibangun oleh pengembang bahasa pemrograman tersebut.

Misalnya bahasa pemrograman Golang memiliki filosofi “Radical Simple”, bagaimana bahasa Golang ini ingin mencitrakan dirinya sebagai bahasa pemrograman yang sederhana dan mudah untuk dikuasai. Kemudian ada Python dengan “Explicit is better than Implicit”, Python berusaha mengkomunikasikan kepada programmernya untuk selalu gamblang dalam melakukan aktifitas koding, tanpa “magic code” dengan suatu koding yang tersembunyi di belakang layar.

**Filosofi di Erlang/Elixir**

Erlang dan dalam hal ini Elixir pun menganut filosofi “Let It CRASH!”. Dengan “Let It CRASH!” ini, pengembang dari Erlang ingin mengkomunikasikan bagaimana penanganan kesalahan pada program (Error Handling), sebagian besar telah ditangani oleh BEAM (Erlang VM). Perlu diingat bahwa bukan berarti sebagai programmer tidak perlu memikirkan Error Handling, hanya saja sebagian besar tanggung jawab dari Error Handling ini telah diambil alih oleh BEAM.

Jika kita perhatikan tentang Error Handling pada bahasa pemrograman yang lain, programmer dipaksa untuk melakukan “Defensive Programming”, dimana programmer harus memikirkan setiap Error yang mungkin akan muncul jika suatu baris kode di eksekusi dan harus mengantisipasi semua kemungkinan Error tersebut dengan menangkap Exception atau menulis kode “if else”. Padahal tidak semua Error adalah kesalahan pada kode, ada Error yang bukan merupakan kendali dari programmer, misalnya kesalahan pada Database, kesalahan Network, kegagalan pada operasi Disk (Disk Failure) dan kesalahan lain yang berasal dari Sistem. Disini BEAM ingin memposisikan dirinya sebagai “penghancur Defensive Programming” (https://www.amberbit.com/blog/2019/7/26/the-misunderstanding-of-let-it-crash/).
<figure>
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/mogaao0dxfgo99dnuiwu.png)<figcaption>Ilustrasi Sebagian kecil class Exception dan Error pada Java yang harus ditangani oleh programmer (https://beginnersbook.com/2013/04/java-exception-handling/)</figcaption>
</figure>

Filosofi “Let It Crash!” juga ingin menyatakan bahwa dengan terjadinya Error dari program, baik yang berasal dari Error kode atau Error sistem, bukan berarti keseluruhan program yang berjalan akan berhenti atau Crash. Telah disinggung pada <a href="https://dev.to/rizki96/mengenal-pemrograman-konkurensi-pada-bahasa-pemrograman-elixir-2959">artikel blog ini sebelumnya</a> bagaimana Erlang menganut “Actor-based Concurrency”, dimana setiap proses yang dikerjakan ada banyak (ratusan, ribuan, jutaan) Aktor yang melakukan pekerjaan. Bagaimana jika pekerjaan yang dikerjakan oleh beberapa jumlah Aktor tadi terjadi Error ? Jawabannya adalah hanya Aktor dengan pekerjaan yang Error saja yang akan Crash, sedangkan sisa Aktor lain akan terus bekerja. Kemudian apakah Aktor yang Crash akan tetap Crash ? Jawabannya adalah tidak, ada “Supervisor” yang akan menghidupkan kembali Aktor yang Crash.

**Apa itu “Supervisor” pada Erlang/Elixir**

Supervisor pada Erlang/Elixir adalah jenis lain dari Aktor yang bertugas untuk melakukan “link and monitor” kepada Aktor lain yang bertugas untuk menjalankan proses (Worker). Dengan link, Supervisor dapat mengikat secara kuat dengan Aktor turunannya, sehingga jika terjadi Crash pada Aktor yang dimonitor, notifikasi atau pesan pemberitahuan akan dikirimkan ke Supervisor.
<figure>
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/z054byqewhg68690ifii.png)<figcaption>Ilustrasi contoh hubungan antara Supervisor dan Worker pada BEAM (supevision tree). Supervisor dapat melakukan “link and monitor” pada Worker turunannya (http://isaacjarquin.github.io/software/2017/09/01/supervision-tree.html)</figcaption>
</figure>
Dengan mekanisme ini, cara kerja Aktor di dalam BEAM sangat teratur dan terorganisir, dimana seperti sebuah organisasi, yang didalamnya terdapat konsep Supervisor dan Worker yang akan memastikan seluruh jalannya aplikasi/sistem berjalan dengan lancar. Ini merupakan sebuah konsep toleransi terhadap kesalahan (Fault Tolerance) yang mungkin belum ada pada bahasa pemrograman lainnya. Karena pada bahasa pemrograman / jenis Stack aplikasi lainnya, tanggung jawab ini diserahkan kepada entity Stack yang lain di dalam ekosistem, sehingga Stack yang dibangun menjadi kompleks. Contohnya adalah pada stack django python yang membutuhkan gunicorn untuk melakukan pengaturan terhadap proses worker, atau zookeeper pada java untuk menghadirkan fungsi Fault Tolerance, Service Discovery dan Cluster.

**Hanya menulis kode “The Happy Path”**

Dengan semua filosofi yang ingin dibangun oleh pengembang Erlang/Elixir ini apakah tujuan besarnya ? Tujuannya adalah “Programmer Happiness”, semuanya adalah demi kebahagian programmer Erlang/Elixir. Kebahagian dalam arti programmer hanya diperlukan menulis bagian kode “The Happy Path”, bagian kode “The Sad Path” seperti Error, sebagian besarnya dapat dihapus dari baris kode. Impact atau pengaruhnya adalah kode yang bersih, jelas dan hanya berisikan logika aplikasi, jikapun ada Error Handling, itu hanya merupakan bagian dari logika aplikasi, seperti Error pada input pengguna yang perlu ditangani.

“The Happy Path” pun tidak hanya berlaku bagi programmer, tetapi bagi tim yang menangani infrastruktur, akan terdampak juga. Karena stack aplikasi yang dibutuhkan menjadi lebih sederhana dan berkurang kompleksitasnya. Sebagai contoh seperti Whatsapp yang memiliki aplikasi yang diakses dengan jutaan pengguna, hanya dibutuhkan sekitar 50 orang engineer untuk menanganinya.

Demikian sedikit penjelasan tentang filosofi “Let It CRASH!” pada Erlang/Elixir. Lebih lanjut tentang Supervisor bisa dilihat di https://code.tutsplus.com/id/articles/supervisors-in-elixir--cms-29330 . Terima kasih dan semoga bermanfaat.