Skip to main content
simplified northern lights aurora visualizationNur Arif

The Blueprint of Perception

Agustus 2026

Saya selalu curiga ketika seseorang membicarakan paradigma pemrograman seolah itu soal selera, seperti memilih antara kopi hitam atau kopi susu. Objek-oriented untuk yang suka struktur, functional untuk yang suka matematika, begitu katanya. Penjelasan ini terdengar masuk akal, sampai kita sadar bahwa yang sedang dipilih bukan cuma gaya menulis kode, tapi seperangkat pertanyaan yang boleh diajukan dan pertanyaan yang otomatis tidak pernah muncul.

Kata paradigma sendiri berasal dari cara Thomas Kuhn menjelaskan bagaimana ilmu pengetahuan berubah. Bukan lewat penambahan fakta baru sedikit demi sedikit, tapi lewat pergantian kerangka yang menentukan fakta mana yang dianggap relevan sejak awal. Sebelum pergantian itu terjadi, anomali-anomali kecil biasanya sudah menumpuk lama, hanya saja tidak terlihat sebagai masalah karena kerangka lama sudah keburu menentukan apa yang layak dipertanyakan.

Hal yang mirip terjadi di software engineering, meskipun jarang dibingkai sebagai pergeseran paradigma dalam arti yang sama. Ketika kita menulis kode dengan gaya object-oriented, encapsulation membuat mutasi state terasa aman karena disembunyikan di balik method. Pertanyaan seperti “siapa saja yang bisa mengubah objek ini” jadi terasa tidak relevan, karena secara desain hanya method milik objek itu yang boleh menyentuhnya. Tapi begitu sistem membesar dan objek-objek saling memanggil satu sama lain, pertanyaan yang tadinya tidak relevan itu kembali muncul, hanya dengan bentuk yang lebih rumit: rantai pemanggilan antar objek yang saling mengubah state satu sama lain, sesuatu yang encapsulation aslinya dijanjikan untuk mencegah.

Functional programming mencoba menjawab dengan cara berbeda, menghindari mutable state sejak awal. Pertanyaan soal siapa mengubah apa jadi tidak relevan lagi, karena tidak ada yang benar-benar diubah. Tapi kompleksitas yang tadinya tersembunyi di dalam objek kini berpindah ke komposisi fungsi. Pertanyaan barunya jadi soal bagaimana efek samping direpresentasikan, bagaimana urutan evaluasi dijaga, bagaimana struktur data yang immutable tetap efisien saat diubah berkali-kali. Paradigma tidak menghilangkan kompleksitas. Paradigma memindahkan kompleksitas ke tempat yang lain, lalu meyakinkan kita bahwa tempat baru itu lebih masuk akal untuk dipikirkan.

Di dunia security, sesuatu yang serupa terjadi pada asumsi trust boundary. Kita terbiasa berpikir bahwa selama input divalidasi dengan benar di titik masuk, sistem di baliknya aman untuk mempercayai data itu. Ini masuk akal selama sistem sederhana, satu aplikasi dengan satu titik masuk. Begitu sistem terdiri dari banyak service yang saling memanggil, validasi di titik masuk pertama diam-diam berubah jadi asumsi yang dipinjam oleh semua service di belakangnya, meskipun tidak satu pun dari mereka pernah benar-benar memverifikasi ulang. Kerangka berpikir “validasi sekali di depan sudah cukup” bukan salah dari awal. Ia hanya berhenti cukup ketika topologi sistem berubah, dan kegagalannya baru terlihat sebagai kegagalan setelah insiden terjadi, bukan sebelumnya.

Yang menarik dari paradigma bukan bahwa ia salah, tapi bahwa ia bekerja dengan sangat baik sampai batas tertentu, dan justru karena bekerja dengan baik, kita berhenti mempertanyakannya. Sebuah paradigma yang gagal total sejak awal akan cepat ditinggalkan. Paradigma yang berbahaya justru yang sukses cukup lama, sampai kegagalannya terasa seperti kesalahan implementasi, bukan kesalahan kerangka berpikir. Programmer yang menambal race condition demi race condition di sistem object-oriented yang membesar jarang bertanya apakah masalahnya ada pada paradigma. Lebih mudah menganggap dirinya kurang hati-hati.

Mungkin ini alasan kenapa pergantian paradigma, baik dalam sains maupun dalam rekayasa perangkat lunak, jarang datang dari orang yang paling ahli memakai paradigma lama. Orang yang paling ahli justru paling terlatih melihat dunia lewat kerangka itu, dan karena itu paling sulit melihat anomali sebagai sinyal bahwa kerangkanya yang perlu dipertanyakan, bukan implementasinya.

Pertanyaan yang lebih berguna dari “paradigma mana yang lebih baik” barangkali adalah: pertanyaan apa yang secara diam-diam berhenti saya ajukan begitu saya memilih paradigma ini. Karena setiap paradigma, seberapa pun elegan, selalu punya sisi yang tidak ia terangi. Bukan karena paradigmanya cacat, tapi karena itulah cara kerja sebuah kerangka berpikir: ia hanya bisa memberi bentuk pada dunia dengan cara meninggalkan sebagian dunia di luar bentuk itu.