Topik ini menimbang tiga kandidat proyek Clojure dengan kriteria yang terukur, memilih satu kandidat, lalu merumuskan lingkup minimal yang bisa jalan. Kandidatnya adalah layanan antrean pekerjaan percetakan kampus, wiki catatan belajar, dan dasbor analitik statistik nilai ujian. Hasil akhirnya berupa satu proyek terpilih beserta daftar keputusan desain yang dibawa ke topik desain data-first.
Tiga kandidat proyek#
Proyek yang layak dikerjakan harus memiliki alur yang dapat dipahami utuh dalam satu hari kerja, tetapi tetap menuntut keputusan desain yang nyata. Tiga kandidat berikut diambil dari kebutuhan kampus yang tidak bermuatan komersial, sehingga latihannya menyerupai pekerjaan sungguhan tanpa menuntut kredensial maupun infrastruktur berbayar. Setiap kandidat dinyatakan lengkap dengan sisi yang paling menentukan bentuk programnya.
Layanan antrean pekerjaan (job queue) menerima pekerjaan cetak, menampungnya dalam antrean, dan memprosesnya satu per satu menurut prioritas. Pada percetakan kampus, pekerjaannya berupa dokumen soal ujian, modul praktikum, dan kartu ujian dengan jumlah halaman yang berbeda-beda. Setiap pekerjaan membawa status yang berubah dari :menunggu menjadi :jalan, lalu berakhir pada :selesai atau :gagal. Proyek ini menuntut kontrak data yang jelas, model state yang berubah, dan aturan urutan pengerjaan.
Wiki catatan belajar menyimpan catatan per halaman, menautkan satu halaman dengan halaman lain, dan menyajikannya kembali sesuai permintaan. Inti pekerjaannya berupa transformasi teks menjadi struktur data bertaut. Sumbu utamanya adalah data yang relatif statis, sedangkan perubahan state yang perlu dikoordinasikan sedikit sekali.
Dasbor analitik (dashboard) mengagregasi statistik nilai ujian menjadi rata-rata, distribusi, dan tabel ringkas per mata kuliah. Alirannya satu arah, yaitu dari kumpulan nilai mentah menuju laporan ringkas. Proyek ini kaya akan pipeline transformasi data, tetapi hampir tidak menuntut state yang berubah seiring waktu.
Ketiganya sama-sama layak dikerjakan, sehingga pembeda yang menentukan bukan temanya, melainkan bentuk state dan data yang dituntut.
Kriteria penilaian yang terukur#
Perbandingan kandidat menggunakan empat kriteria yang dapat dinilai sebelum satu baris kode aplikasi ditulis, sehingga pilihan tidak bergantung pada selera:
- Model state menanyakan cara terbaik menampung bagian yang berubah, yaitu
atomuntuk state independen yang diganti secara sinkron,refuntuk beberapa identitas yang wajib berubah secara terkoordinasi, atau channel untuk penyerahan tugas antar thread. - Bentuk data inti menanyakan struktur data yang menampung informasi terpenting, misalnya map pekerjaan, pohon halaman, atau vector nilai ujian. Data inti yang sederhana membuat fungsi pendukungnya sederhana pula.
- Batasan interop host menanyakan seberapa jauh proyek menuntut pemanggilan Java secara langsung. Lingkup minimal ketiga kandidat dapat dijalankan tanpa interop, sehingga kriteria ini menjadi catatan risiko, bukan pembeda utama.
- Lingkup minimal yang bisa jalan menanyakan bagian terkecil yang benar-benar berjalan dari hulu ke hilir. Kandidat yang lingkupnya mudah dibatasi memberi umpan balik paling cepat.
Dengan keempat kriteria tersebut, setiap kandidat dinilai dari pekerjaan yang dituntutnya, bukan dari seberapa menarik ceritanya.
Perbandingan kandidat#
| Kriteria | Antrean pekerjaan | Wiki catatan belajar | Dasbor analitik |
|---|---|---|---|
| Model state | atom untuk status pekerjaan, channel untuk pembagian tugas | atom untuk indeks halaman, sisanya nilai murni | nilai murni satu arah |
| Bentuk data inti | map pekerjaan dengan status dan prioritas | pohon halaman bertaut | vector nilai ujian |
| Batasan interop host | tidak menuntut interop | tidak menuntut interop | tidak menuntut interop |
| Lingkup minimal | antrean terurut, satu worker, fungsi status | satu halaman tersimpan dan tampil | agregasi satu mata kuliah |
Tabel tersebut memperlihatkan pembeda yang sesungguhnya, yaitu model state. Dasbor analitik bergerak satu arah dengan nilai murni, sehingga sebagian besar kemampuannya hanyalah pipeline map, filter, dan reduce yang tidak menuntut identitas yang berubah. Wiki catatan belajar melatih pemodelan pohon dan transformasi teks, tetapi state-nya monoton karena halaman yang tersimpan jarang berubah bentuk.
Layanan antrean pekerjaan memberi kombinasi paling lengkap untuk sebuah proyek penutup. Proyek ini memuat kontrak data berupa map pekerjaan, state yang benar-benar berubah berupa status, dan kebutuhan koordinasi yang ringan berupa penyerahan tugas ke worker, tanpa menuntut database maupun kredensial apa pun. Kriteria interop host dan lingkup minimal tidak menjadi pembeda pada tahap ini karena ketiga kandidat memenuhinya. Keduanya tetap dicantumkan karena berperan sebagai pengawas pada tahap berikutnya, yaitu setiap penambahan fitur dinilai ulang terhadap dua kriteria tersebut sebelum diterima. Penambahan yang menuntut pemanggilan Java berat atau melampaui lingkup minimal harus menunggu hingga alur inti selesai dan teruji.
Kandidat terpilih dan lingkup minimalnya#
Layanan antrean pekerjaan percetakan kampus dipilih sebagai proyek. Alasannya mengikuti tabel di atas, yaitu proyek ini menyatukan tiga perkakas yang paling sering digunakan pada aplikasi backend nyata, yakni kontrak data, model state, dan koordinasi antar proses. Lingkup minimalnya dinyatakan sebagai komponen berikut:
- penerimaan pekerjaan, berupa fungsi yang menerima map pekerjaan dan menempatkannya ke antrean
- penjadwalan, berupa pengurutan antrean menurut prioritas terkecil terlebih dahulu
- worker, yaitu proses yang mengambil pekerjaan terdepan, menandainya
:jalan, dan mengakhirinya pada:selesai - fungsi status, yang mengembalikan status pekerjaan untuk sebuah
:iddan kelak disajikan sebagai endpoint
Empat komponen tersebut membentuk alur utuh dari penerimaan hingga pertanyaan status, tanpa satu pun di antaranya menuntut keputusan yang belum selesai dianalisis. Penyimpanan permanen, pemrosesan ulang pekerjaan gagal, dan antarmuka web sengaja tidak masuk lingkup. Ketiganya menuntut keputusan yang berdiri sendiri.
Simulasi antrean dengan struktur data inti#
Sebelum perancangan diteruskan, alur inti dibuktikan dengan simulasi yang dapat dijalankan. Demo berikut meniru worker menggunakan struktur data inti, yaitu vector sebagai antrean, map sebagai state, dan reduce sebagai perulangan pemrosesan. Simulasi ini sekaligus menjadi ukuran kesederhanaan, yaitu seluruh alur dari penjadwalan hingga ringkasan dapat dinyatakan dengan satu fungsi murni dan satu panggilan reduce. Buat berkas simulasi-antrean.clj dengan isi berikut, lalu jalankan dengan clojure -M simulasi-antrean.clj.
;; simulasi worker layanan antrean percetakan kampus
;; seluruh state disimulasikan dengan struktur data inti: vector, map, dan fungsi murni
(def antrean-awal
[{:id "PJC-101" :dokumen "soal-midterm-a" :halaman 12 :prioritas 1}
{:id "PJC-102" :dokumen "modul-praktikum" :halaman 40 :prioritas 3}
{:id "PJC-103" :dokumen "kartu-ujian" :halaman 6 :prioritas 2}])
;; worker mengambil pekerjaan dengan prioritas terkecil terlebih dahulu
(def antrean-urut (vec (sort-by :prioritas antrean-awal)))
(defn proses-satu
"Memproses pekerjaan terdepan dan mengembalikan state berikutnya."
[state]
(let [pekerjaan (first (:sisa state))]
(assoc state
:log (conj (:log state)
(format "%s %s selesai (%d halaman)"
(:id pekerjaan)
(:dokumen pekerjaan)
(:halaman pekerjaan)))
:sisa (rest (:sisa state))
:halaman-total (+ (:halaman-total state) (:halaman pekerjaan)))))
(def hasil
(reduce (fn [state _] (proses-satu state))
{:log [] :sisa antrean-urut :halaman-total 0}
(range (count antrean-urut))))
(doseq [baris (:log hasil)]
(println baris))
(println "Total halaman tercetak:" (:halaman-total hasil))
(println "Pekerjaan tersisa:" (count (:sisa hasil)))PJC-101 soal-midterm-a selesai (12 halaman)
PJC-103 kartu-ujian selesai (6 halaman)
PJC-102 modul-praktikum selesai (40 halaman)
Total halaman tercetak: 58
Pekerjaan tersisa: 0Urutan log membuktikan aturan penjadwalan, yaitu PJC-101 dengan prioritas 1 diproses lebih dahulu, diikuti PJC-103 dengan prioritas 2. Fungsi proses-satu murni karena state berikutnya selalu diturunkan dari state yang masuk, sehingga seluruh perulangan dapat dijalankan dengan reduce tanpa efek samping. Kunci baru juga dapat ditambahkan ke struktur map state tanpa mengubah fungsi yang sudah ada, karena proses-satu hanya membaca kunci yang dibutuhkannya. Dua baris terakhir menjadi bukti keutuhan alur, yaitu total 58 halaman tercetak dan antrean habis.
Keputusan desain awal#
Proyek yang dipilih membawa sejumlah keputusan yang sudah tertutup oleh bukti di atas, sedangkan sisanya masih terbuka dan diperiksa pada topik desain data-first. Keputusan yang sudah tertutup adalah sebagai berikut:
- bentuk data pekerjaan, yaitu map dengan kunci
:id,:dokumen,:prioritas,:halaman, dan:status - status pekerjaan, yaitu
:menunggu,:jalan,:selesai, dan:gagal - urutan pengerjaan, yaitu prioritas terkecil terlebih dahulu tanpa penjadwalan waktu
- model state, yaitu atom untuk status pekerjaan yang sedang diproses dan model channel untuk penyerahan tugas ke worker
- batasan data, yaitu prioritas lima tingkat, jumlah halaman positif, dan dokumen yang tidak boleh kosong
Keputusan-keputusan inilah bahan baku langsung bagi rancangan schema dan pilihan state pada topik desain data-first. Tingkat kepastian setiap butir berbeda. Bentuk data dan status pekerjaan sudah terbukti oleh simulasi, sedangkan model state dan batasan data baru disepakati secara konsep dan masih menunggu pemeriksaan formal. Pemeriksaan itulah pekerjaan utama pada topik desain data-first.
Kesalahan umum#
Memilih proyek dari tema yang menarik tanpa menilai model state. Proyek yang seluruh alurnya satu arah, misalnya dasbor, memberi sedikit latihan tentang state yang berubah, sehingga pembelajarannya bertumpuk pada transformasi data semata. Perbaikannya dengan menilai keempat kriteria terlebih dahulu, sebelum tema dan nama proyek.
Melingkupkan terlalu luas sejak awal. Menambahkan server HTTP, database, dan antarmuka pengguna pada hari pertama menunda umpan balik yang paling dibutuhkan, yaitu bukti bahwa data inti mengalir dari hulu ke hilir. Perbaikannya dengan mencatat bagian yang tidak dikerjakan bersama lingkup minimal, lalu menunda semuanya hingga inti data berjalan.
Membandingkan kandidat dengan klaim mutlak. Pernyataan seperti paling mudah atau paling cocok tanpa ukuran membuat pilihan sulit dipertanggungjawabkan. Perbaikannya dengan mengikat setiap penilaian kepada kriteria yang tercantum pada tabel perbandingan.
Ringkasan#
- Tiga kandidat dinilai dengan empat kriteria, yaitu model state, bentuk data inti, batasan interop host, dan lingkup minimal yang bisa jalan.
- Layanan antrean pekerjaan percetakan kampus terpilih karena menggabungkan kontrak data map, state yang berubah, dan koordinasi yang ringan tanpa menuntut infrastruktur tambahan.
- Lingkup minimalnya terdiri atas penerimaan pekerjaan, penjadwalan menurut prioritas, satu worker, dan fungsi status.
- Simulasi dengan vector, map, dan
reducemembuktikan alur inti berjalan hanya dengan struktur data inti.
Referensi#
- Rationale — Clojure — Alasan desain Clojure yang menempatkan data dan fungsi murni sebagai pusat program.
- Concurrent Programming — Clojure — Model state dan konkurensi Clojure yang menjadi dasar penilaian atom, ref, dan channel.
- Deps and CLI — Clojure — Panduan resmi menyiapkan proyek minimal dengan Clojure CLI dan deps.edn.