Programming

All about programming stuff

by anvie

Motor Impian

Apa itu 12 faktor App? Adalah sebuah metodologi dalam membangun sebuah aplikasi (perangkat lunak), beberapa referensi pustaka mengkhususkan pada pembuatan aplikasi untuk SaaS alias Software as a Service, namun sebenarnya metodologi ini bisa juga kita terapkan untuk membuat aplikasi apa saja, dan sangat saya rekomendasikan dijadikan sebagai sebuah "madzhab" baru ehmmm, atau mungkin lebih tepatnya "tarikat" baru untuk para programmer yang ingin mencapai ke level selanjutnya, yakni level "makrifat", ya programmer makrifat! :D

12 Faktor ini bebas bahasa (language agnostik) artinya bisa kita terapkan di semua bahasa pemrograman. Dan walaupun saya banyak menyadur dari https://12factor.net beberapa mungkin tidak tertulis, ada penambahan atau bahkan agak beda dari aslinya, ya karena saya menyesuaikan beberapa materi berdasarkan pengalaman saya secara pribadi selama ini dan menurut saya sangat relevan, sehingga diharapkan bisa menambah pemahaman secara kontekstual dan memenuhi kebutuhan programmer secara psikis dan spiritual, halah opo toh.

Beberapa hal yang diatur dalam metodologi ini adalah:

1. Basis kode

Mengatur tentang basis kode, 12 faktor mengharuskan kode yang kita tulis dalam kontrol revisi menggunakan tool SCM (Source Control Management) contoh SVN dan GIT.

Mainframe Git History

gambar screen shot dari git history Mainframe (full-stack framework) yang sedang saya kembangkan.

Apabila kita mengorganisir kode lebih dari satu basis kode misalnya karena kita bermaksud untuk mencoba memecah aplikasi terdiri dari beberapa komponen maka tidak boleh ada kode yang berbagi untuk digunakan di beberapa komponen secara bersama-sama (shared code), tetapi harus dibuatkan sebuah pustaka (library) yang bisa digunakan di beberapa komponen itu sebagai dependensi pustaka, dan bisa digunakan dengan mudah oleh beberapa komponen tersebut, contoh alat pengelolaan dependensi (dependency management tool) adalah: Maven repository pada bahasa pemrograman Java atau bahasa berbasis JVM lainnya, CPAN pada bahasa pemrograman Perl, Ruby Gems pada bahasa pemrograman Ruby dan Crates RPR (Rust Package Registry) pada bahasa pemrograman Rust.

2. Dependensi

Dalam peraturannya tentang dependensi, 12 faktor mewajibkan dependensi harus dideklarasikan secara eksplisit dan mendukung isolasi, artinya aplikasi harus bisa berjalan dalam lingkungan terisolir tidak bergantung pada dependensi sistem secara luas, hal ini untuk memudahkan aplikasi bisa ditest dalam lingkungan yang bersih dan tidak konflik dengan aplikasi lainnya yang mungkin ada dan jalan di lingkungan sistem yang sama, misalnya untuk keperluan CI (Continuous Integration). Sebagai contoh dalam bahasa pemrograman ular kita mungkin mengenal virtual environment, dan kita bisa menjalankan perintah pip install -r requirements.txt yang mana perintah tersebut akan menginstall semua dependensi aplikasi tapi hanya di lingkungan virtual saja, tidak bercampur dengan lingkungan sistem. Pengguna Node.js mungkin tidak asing dan telah tahu perbedaan antara npm install dan npm install -g.

Bicara tentang dependensi, menurut saya tidak hanya terbatas pada compilable dependency atau dependensi yang hanya dibutuhkan untuk keperluan kompilasi saja, sehingga tidak terbatas hanya pada dependensi pustaka saja, tapi juga termasuk pada dependensi apapun yang mana apabila tidak ada maka aplikasi tidak bisa dijalankan atau ditest dengan benar. Sebagai contoh dependensi pada servis tertentu misalnya database harus jalan ketika integration test. Nah untuk dependensi berjenis seperti ini maka kita perlu menyediakan Dockerfile dan docker-compose.yml misalnya untuk membangun lingkungan terisolir yang terkonfigurasi dan terintegrasi dengan baik dan benar secara mudah dan cepat.

3. Konfigurasi

Adakah diantara kalian yang menulis konfigurasi sebagai konstanta pada kode? Nah, itu haram hukumnya!!! Ya itu melanggar The Ten of Commandements! Eh, maksud saya 12 Factor App!! Kenapa? Karena hal itu membuat aplikasi tidak mudah dikonfigurasi, konfigurasi harus terpisah dari tubuh aplikasi, misalnya harus ditulis pada file dan perlu di-load oleh aplikasi ketika pertama kali dijalankan.

File konfigurasi seharusnya tidak diikutsertakan dalam indek kontrol revisi (SCM). Tetapi menurut saya perlu dibuatkan satu contoh konfigurasi yang bisa digunakan sebagai patokan untuk programmer lainnya, contoh file konfigurasi yang digunakan namanya config.yaml, dan sampel konfigurasi namanya config.example.yaml, nah sampel inilah yang perlu kita ikutsertakan dalam indek kontrol revisi (SCM) bukan config.yaml-nya.

Namun yang lebih mudah adalah menggunakan environment variable atau biasa dipanggil env var saja, kenapa env var? Karena env var mudah untuk disesuaikan pada waktu deploy dan tidak perlu merubah kode, selain itu env var lebih system agnostik jalan di semua sistem operasi, dibanding misal seperti system properties-nya JVM yang lebih domain specific.

Contoh sebuah library untuk mengelola konfigurasi yang memenuhi hukum ini adalah config-rs sebuah library untuk mengelola konfigurasi di bahasa pemrograman Rust, dimana kita bisa menggunakan file sebagai basis konfigurasi tapi kita bisa meng-override atau memprioritaskan konfigurasi melalui env var.

Konfigurasi Reframe

contoh konfigurasi Reframe source untuk membuat aplikasi web menggunakan Python & Flask secara mudah dan cepat.

4. Servis Pendukung

Servis pendukung adalah servis yang berjalan untuk mendukung jalannya aplikasi, sebagai contoh database PostgreSQL/MySQL, Memcached, Redis, termasuk juga servis ekesternal dalam bentuk API yang bisa dikonsumsi seperti akses ke Twitter API, dsb.

Attached Resources

Dalam 12 Faktor app, semua servis pendukung dianggap sebagai sumber daya yang terhubung, maksudnya servis tersebut harus bisa dipasang dan dihubungkan secara mudah di setiap deployment dan bisa dirubah-rubah ke sumber daya di tempat lain dengan cukup merubah konfigurasi tanpa merubah kode.

5. Bangun, Rilis, Jalan

12 faktor app

Atau dalam bahasa inggris disebut: Build, Release, Run. Ini adalah 3 tahapan proses deploy yang harus diterapkan. Mari kita breakdown:

  1. Bangun (Build), merupakan tahapan dimana kita biasanya melakukan kompilasi untuk menghasilkan sebuah output yang siap untuk dijalankan dalam satu kesatuan utuh dimana beberapa komponen dan aset telah disertakan, biasanya dalam bahasa sistem akan menghasilkan output berupa binari yang bisa dieksekusi (executable binary).
  2. Rilis (Release), tahapan ini merupakan penggabungan antara output dari hasil build dengan konfigurasi yang siap dijalankan, di mana hasil binarynya siap untuk dijalankan tanpa merubah apapun termasuk konfigurasi yang sudah berisi nilai bawaan (default).
  3. Jalan (Run), biasa dikenal dengan istilah "runtime", merupakan tahapan dimana aplikasi telah dijalankan.

12 Faktor app mewajibkan untuk membagikan 3 tahapan itu secara terpisah, karena tidak memungkinkan kita merubah kode ketika sudah jalan (runtime) dan mempropagasikan perubahan ke tahapan Bangun.

Untuk keperluan ini biasanya saya membuatkan beberapa script di direktori paling atas (root directory) pada proyek kode saya, di mana biasanya saya meletakkan di etc/script, di dalam direktori tersebut berisi beberapa script untuk keperluan release management yang memanfaatkan tool-tool seperti Ansible, Pupet, Capistrano dll. Dari script tersebut saya bisa memangkas waktu untuk operasi yang berulang-ulang (repetitive), sehingga saya punya waktu lebih banyak untuk hal-hal yang "produktif" lainnya seperti menyaksikan fakta-fakta unik kaum jaman now di Instagram, bukan TikTok ya, apalagi Tinder 😏

BERSAMBUNG.. Karena lumayan banyak dan saya sudah merasa lelah, masih 7 lagi! :O akan saya lanjutkan di tulisan selanjutnya, jadi stay tuned!