Langsung ke konten

Topic archive

Rekayasa Perangkat Lunak

Rekayasa Perangkat Lunak membahas developer tooling, arsitektur, maintainability, workflow engineering, protokol, dan praktik yang meningkatkan cara perangkat lunak dirancang dan dibangun.

183 articles
Rekayasa Perangkat Lunak 19 Sep 2026 5 min read

Write Skew Merusak Invariant Lintas Row pada Snapshot Isolation

Snapshot isolation dapat membiarkan dua transaksi commit meskipun hasil gabungannya melanggar aturan yang sudah diperiksa masing-masing transaksi sebelum melakukan write. Anomali ini muncul saat kedua transaksi membaca kondisi logis yang sama, lalu menulis row yang berbeda. Karena write set keduanya tidak beririsan, deteksi konflik write-write biasa tidak memiliki benturan untuk ditolak. Kondisi ini disebut write skew. Batas masalahnya berada di antara invariant aplikasi dan isolation database: sebuah transaksi dapat melihat snapshot yang konsisten, tetapi tetap ikut menghasilkan state akhir yang akan gagal terhadap predicate yang sebelumnya diperiksa.

Rekayasa Perangkat Lunak 19 Sep 2026 7 min read

Transactional Outbox Mengikat Perubahan State dengan Intensi Pesan

Service yang memperbarui database dan memublikasikan event ke message broker melewati dua batas commit yang independen. Jika commit database berhasil lalu publish ke broker gagal, state yang durable sudah ada tanpa pesan pasangannya. Membalik urutannya hanya membalik bentuk kegagalan: consumer dapat melihat pesan untuk perubahan state yang pada akhirnya tidak pernah commit. Transactional outbox mempersempit celah ini dengan menempatkan write aplikasi dan record pesan yang durable dalam transaksi database lokal yang sama. Proses publikasi dipindahkan ke relay terpisah. Pola ini tidak membuat database dan broker menjadi satu sistem atomik; batasnya diubah sehingga intensi pesan menjadi bagian dari commit database.

Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Sequence Counter Mendeteksi Write Konkuren Tanpa Lock pada Reader

Sequence counter dapat memungkinkan reader menyalin shared state tanpa mengambil lock milik writer. Reader mengambil nilai counter, menyalin field yang dilindungi, lalu mengambil nilai counter sekali lagi. Nilai genap yang sama pada kedua observasi menandakan tidak ada writer yang overlap dengan proses penyalinan berdasarkan kontrak sinkronisasi. Nilai yang berubah atau ganjil memaksa reader membuang snapshot dan mengulang operasi. Pola ini memindahkan pekerjaan dari kepemilikan lock pada sisi reader, tetapi tidak menghapus sinkronisasi. Writer tetap memerlukan serialisasi, transisi counter memerlukan semantik memory ordering yang terdefinisi, dan data yang dilindungi harus tetap aman diakses selama write yang overlap. Constraint tersebut membuat sequence counter cocok untuk sebagian snapshot yang dominan dibaca, tetapi tidak aman untuk data yang lifetime-nya dapat berakhir saat reader masih mengaksesnya.

Rekayasa Perangkat Lunak 19 Sep 2026 5 min read

seccomp User Notification Memindahkan Keputusan Syscall Terpilih ke Broker

Filter seccomp dapat melakukan lebih dari sekadar langsung mengizinkan atau menolak system call. Dengan user notification, call yang cocok dapat ditahan sementara proses lain menerima request terstruktur melalui listener file descriptor dan menentukan hasil yang diterima thread yang diblokir. Mekanisme ini mengubah keputusan syscall terpilih menjadi interface berbasis broker tanpa memindahkan seluruh implementasi syscall ke user space. Batasnya presisi, tetapi lebih sempit daripada lapisan interposition umum. Kernel tetap memiliki syscall dispatch, task state, descriptor table, dan validasi yang dilakukan kode kernel. Broker menerima metadata dan dapat mengembalikan nilai, error, atau pada kasus yang didukung meminta eksekusi syscall asli dilanjutkan. Desain yang benar memperhitungkan memory target yang mutable, lifetime notification, serta fakta bahwa keputusan policy tidak otomatis menjadi transaksi atas state proses.

Rekayasa Perangkat Lunak 19 Sep 2026 8 min read

SaaS Utility Berbasis Iklan: Pertahankan Pemrosesan Stateless dan Data Tetap Ephemeral

SaaS Utility Berbasis Iklan: Pertahankan Pemrosesan Stateless dan Data Tetap Ephemeral SaaS utility tidak membutuhkan operasi konten besar untuk mendapatkan kunjungan berulang. Pengguna bisa datang untuk resize gambar, membersihkan CSV, mengonversi data terstruktur, membuat QR code, memvalidasi dokumen, atau menjalankan transformasi sempit lainnya. Tantangan teknisnya berbeda dari situs konten biasa: setiap kunjungan benar-benar menjalankan pekerjaan. Biaya dapat naik cepat bila setiap request selalu meng-upload file, memakai memori server, menulis object sementara, menyentuh database, lalu menyimpan artifact setelah pengguna pergi. Pada free tier yang dimonetisasi iklan, tekanan ini lebih terasa karena pendapatan per kunjungan biasanya kecil dibanding biaya compute atau storage yang berat.

Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Request Terhubung io_uring Mengodekan Dependensi dalam Urutan Submission

Submission queue io_uring dapat memuat banyak operasi sekaligus, tetapi setiap operasi tidak harus independen. Menetapkan IOSQE_IO_LINK pada sebuah submission queue entry mengikatnya ke entry berikutnya, membentuk rantai dengan urutan eksekusi dan propagasi kegagalan sebagai bagian dari struktur request yang terlihat oleh kernel. Kontrak ini berbeda dari dua SQE independen yang koordinasinya baru dilakukan setelah completion. Rantai terhubung menyatakan dependensi sebelum kernel mulai memproses operasi. Perbedaan tersebut penting saat request berikutnya hanya valid setelah request sebelumnya selesai, atau saat kegagalan satu tahap harus mencegah tahap yang tersisa dijalankan.

Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Request Coalescing Menyatukan Cache Miss Konkuren Menjadi Satu Fill

Cache dapat mengurangi trafik backend pada kondisi stabil, tetapi justru memperbesar kerja saat sebuah entry populer kedaluwarsa. Jika seratus request melihat key yang sama dalam keadaan kosong sebelum nilai pengganti tersimpan, jalur lookup biasa dapat mengirim seratus read yang setara ke origin. Cache tetap bekerja sesuai aturan lookup-nya; amplifikasi muncul dari concurrency selama interval kosong tersebut. Request coalescing mengubah interval itu. Caller pertama untuk sebuah key memulai fill, sedangkan caller berikutnya dengan key yang sama bergabung ke operasi yang sedang berjalan alih-alih memulai kerja setara. Setelah operasi selesai, hasilnya dibagikan kepada caller yang menunggu dan, bila sesuai, disimpan ke cache.

Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Propagasi Deadline Membatasi Umur Request Lintas Service

Sebuah request dapat kehilangan kegunaannya sebelum semua proses yang menanganinya berhenti bekerja. HTTP client mungkin berhenti menunggu setelah dua detik, sementara service upstream masih menjalankan database query, RPC, dan rangkaian retry selama beberapa detik berikutnya. Operasi tersebut tetap memakai connection, CPU time, kapasitas queue, dan konkurensi downstream meski hasilnya sudah tidak memiliki penerima. Deadline membuat batas kegunaan itu eksplisit. Propagasi deadline melalui call bertingkat memberi komponen yang terlibat satu batas atas bersama yang berasal dari request awal. Ini berbeda dari pemberian timeout independen pada setiap hop: timeout lokal membatasi operasi individual, sedangkan deadline yang dipropagasikan membatasi umur seluruh graph operasi.

Rekayasa Perangkat Lunak 19 Sep 2026 5 min read

process_vm_readv dan process_vm_writev Mentransfer Memori Melintasi Batas Proses

process_vm_readv() dan process_vm_writev() memungkinkan satu proses Linux menyalin byte secara langsung antara address space miliknya dan address space proses lain. Kedua call bekerja pada vektor rentang memori lokal dan remote, tetapi keberhasilan pencarian proses tidak membuat remote memory menjadi stabil. Perubahan mapping, aksesibilitas page, permission, dan mutasi concurrent tetap menjadi bagian kontrak yang terpisah. Interface ini merupakan system call khusus Linux. Keduanya tidak menetapkan lifetime object C, sinkronisasi, atau model interprocess memory yang portabel.

Rekayasa Perangkat Lunak 19 Sep 2026 5 min read

Precondition ETag Mencegah Lost Write pada API Update HTTP

Dua client dapat membaca resource yang sama, mengedit field berbeda, lalu mengirim update dengan selang beberapa detik. Jika server menerima kedua write tanpa memeriksa representasi yang menjadi dasar edit masing-masing client, request yang datang belakangan dapat diam-diam menggantikan state dari write sebelumnya. Transport berhasil, tetapi aplikasi kehilangan perubahan konkuren. HTTP menyediakan mekanisme conditional request untuk batas ini. Server dapat menyertakan entity tag pada representasi, lalu client mengirim kembali tag tersebut melalui If-Match saat mengajukan request yang mengubah state. Update hanya berjalan selama representasi yang dipilih masih memenuhi precondition yang diberikan.

Rekayasa Perangkat Lunak 19 Sep 2026 5 min read

Penulisan Array di Go, PHP, JavaScript, Kotlin, Rust, dan Python

Tanda kurung siku membuat kode array di beberapa bahasa terlihat seolah dapat diterjemahkan langsung. Di Rust, [10, 20, 30] dapat menjadi array berukuran tetap dengan panjang sebagai bagian dari tipe. Di Python, bentuk yang hampir sama menghasilkan list yang mutable. PHP memakai sintaks bracket untuk ordered map, sedangkan JavaScript membuat object Array yang dapat berubah ukuran. Sintaksnya mudah diingat. Perbedaan yang lebih penting adalah arti dari nilai tersebut setelah dibuat.

Rekayasa Perangkat Lunak 19 Sep 2026 7 min read

Open File Description Lock Mengikat Byte Range ke Instance File

Sebuah byte-range lock dapat melindungi inode yang sama tetapi memiliki semantik lifetime yang sangat berbeda bergantung pada objek pemilik lock. Record lock fcntl() tradisional terkait dengan proses. Open file description lock justru menempel pada open file description kernel yang dirujuk oleh descriptor. Pergeseran ini mengubah operasi close mana yang melepas lock, state yang bertahan setelah fork(), serta kemampuan dua thread dalam satu proses untuk saling berkompetisi pada region file yang sama.

Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Notifikasi Prioritas Android Bukan Saluran VIP

Notifikasi Prioritas Android Bukan Saluran VIP Aplikasi Android bergaya pager dapat menyediakan tombol atau menu bernama saluran VIP, tetapi Android tidak mengubah label tersebut menjadi frekuensi radio privat, bearer seluler khusus, atau jalur delivery yang dijamin. Yang dapat dibangun aplikasi adalah kebijakan prioritas. Server dapat mengklasifikasikan event sebagai mendesak, meminta high-priority delivery dari Firebase Cloud Messaging (FCM), lalu menampilkan notifikasi melalui Android notification channel dengan importance tinggi. Kontrol tersebut bekerja pada layer yang berbeda, dan tidak satu pun sendirian memberikan jaminan delivery seperti yang sering dibayangkan dari sebuah pager.

Rekayasa Perangkat Lunak 19 Sep 2026 5 min read

Nilai Poison LLVM Menunda Undefined Behavior di Sepanjang IR

LLVM IR tidak mengubah setiap kondisi aritmetika atau pointer yang tidak valid menjadi undefined behavior seketika. Banyak instruksi justru menghasilkan nilai poison. Nilai itu dapat mengalir ke instruksi berikutnya, sehingga optimizer tetap dapat bertumpu pada janji seperti “penjumlahan ini tidak overflow” tanpa menjadikan pelanggaran janji tersebut sebagai undefined behavior tepat pada instruksi asalnya. Perbedaan ini merupakan bagian dari semantik LLVM, bukan detail implementasi optimizer. Frontend yang menghasilkan nsw, nuw, inbounds, noundef, atau constraint terkait sedang menyatakan fakta yang boleh dipercaya oleh pass berikutnya.

Rekayasa Perangkat Lunak 19 Sep 2026 8 min read

MQTT dan QUIC Menyelesaikan Bagian Berbeda dari Transport Chat

MQTT dan QUIC Menyelesaikan Bagian Berbeda dari Transport Chat MQTT dan QUIC sering ditempatkan dalam tabel perbandingan yang sama ketika membahas chat real-time. Perbandingan itu praktis, tetapi mencampur dua layer protokol yang berbeda menjadi satu pilihan. MQTT adalah protokol messaging pada application layer. Ia mendefinisikan konsep seperti client, broker, topic, subscription, retained message, session state, dan quality of service untuk delivery. QUIC adalah protokol transport aman di atas UDP. Ia menyediakan connection, stream, flow control, loss recovery, encryption, dan mekanisme connection migration.

Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Linux pidfd Mengikat Operasi Proses ke Referensi Kernel yang Stabil

Process ID numerik menamai sebuah proses hanya selama PID tersebut masih dialokasikan kepadanya. Setelah proses keluar dan di-reap, Linux dapat menggunakan kembali angka itu untuk proses lain. Kode yang mengamati PID, melakukan pekerjaan lain, lalu bertindak memakai angka tersebut dapat melewati batas lifetime yang tidak dikodekan oleh integer itu sendiri. Linux pidfd menyediakan referensi berbentuk file descriptor ke sebuah proses sehingga operasi berikutnya dapat menargetkan objek proses yang direferensikan tanpa mengulang lookup PID numerik.

Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Linux membarrier Memindahkan Biaya Memory Ordering ke Thread Koordinator

Sebuah runtime concurrent dapat menjalankan ribuan operasi fast path untuk setiap transisi state langka yang membutuhkan koordinasi global. Menempatkan full memory barrier pada setiap fast path membuat seluruh operasi membayar biaya transisi yang jarang terjadi itu. Linux membarrier() mendukung susunan sebaliknya: thread koordinator masuk ke kernel dan memaksakan titik ordering yang terdefinisi pada sekumpulan thread target, sehingga biaya yang lebih besar berpindah ke sisi protokol yang jarang dijalankan. Mekanisme ini bukan pengganti umum untuk atomic, mutex, atau memory model bahasa pemrograman. Ini adalah antarmuka kernel Linux dengan jaminan yang berlaku pada akses memory dan thread target berdasarkan command tertentu. Penggunaan yang benar memerlukan protokol yang sudah menentukan akses mana yang terjadi sebelum dan sesudah titik koordinasi.

Rekayasa Perangkat Lunak 19 Sep 2026 5 min read

Kolom Versi Mengubah Update Database Menjadi Transisi State Bersyarat

Client database dapat membaca sebuah row, memakai waktu untuk menghitung perubahan, lalu menjalankan UPDATE setelah transaksi lain lebih dulu mengubah row yang sama. Jika statement terakhir hanya mengidentifikasi row lewat primary key, write yang datang kemudian dapat mengganti state yang dihitung dari kondisi lama tanpa konflik yang terlihat. Kolom versi mengubah batas tersebut. Client membaca state aplikasi beserta nilai revisinya, lalu menyertakan revisi itu dalam predicate update. Database menerima write hanya selama revisi yang tersimpan masih sama dengan state yang sebelumnya diamati client.

Rekayasa Perangkat Lunak 19 Sep 2026 7 min read

Idempotency Key Mengikat Retry ke Satu Mutasi Logis

Client dapat kehilangan HTTP response setelah server melakukan commit terhadap mutasi yang diminta. Dari sisi client, status operasi belum pasti: koneksi gagal, tetapi kegagalan itu tidak menunjukkan apakah durable state sudah berubah. Retry terhadap POST yang sama kemudian dapat membuat order, percobaan pembayaran, reservasi, atau mutasi lain untuk kedua kalinya. Idempotency key memberi retry sebuah identitas stabil yang terpisah dari satu percobaan transport tertentu. Server dapat mengaitkan request berulang yang membawa identitas tersebut dengan satu operasi logis. Mekanisme ini mempersempit ambiguitas pada batas API, tetapi key saja bukan jaminan. Scope, persistensi, perbandingan request, kontrol konkurensi, dan kebijakan replay menentukan arti sebenarnya dari pengiriman berulang.

Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Idempotency Key Membatasi Keamanan Retry pada Identitas Request

Client dapat mengirim operasi logis yang sama lebih dari sekali meski hanya menginginkan satu efek. Timeout setelah POST /payments meninggalkan batas yang ambigu: server mungkin sudah melakukan commit pembayaran sementara client tidak menerima response. Retry memulihkan pengiriman, tetapi retry biasa dapat membuat pembayaran kedua. Idempotency key mengubah interface dengan memberi identitas request yang stabil pada percobaan berulang. Key tersebut bukan pengganti transactionality dan tidak membuat setiap operasi secara intrinsik idempotent. Key membentuk protokol antara client dan server: percobaan dengan key yang sama diperlakukan sebagai kandidat untuk operasi logis yang sama. Server tetap memerlukan aturan mengenai ekuivalensi request, kedatangan konkuren, masa persistensi, pemulihan kegagalan, dan replay response.

Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Generation Counter Menjaga Handle yang Dipakai Ulang Tetap Terikat ke Resource yang Tepat

Handle yang ringkas sering direpresentasikan sebagai integer karena murah untuk disimpan, disalin, dibandingkan, dan diteruskan melewati batas API. Pada resource manager berbasis tabel, integer tersebut dapat berupa index ke array slot. Representasi ini bermasalah saat sebuah slot dilepas lalu dipakai kembali. Handle lama dapat menunjuk resource baru yang kebetulan menempati index yang sama. Kegagalannya bukan akses di luar batas array. Index tersebut bisa sepenuhnya valid. Masalahnya ada pada identitas: handle menyebut lokasi penyimpanan, sementara caller memperlakukannya sebagai identitas resource yang sebelumnya menempati lokasi itu.

Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Fencing Token Menutup Celah Writer dari Lease Kedaluwarsa

Lease terdistribusi dapat kedaluwarsa ketika pemegangnya tidak dapat berjalan. Pemegang tersebut kemudian dapat aktif lagi dengan state lokal yang masih menyatakan bahwa lease dimilikinya, padahal client lain sudah memperoleh lease yang lebih baru. Jika storage atau service yang dilindungi menerima operasi hanya karena client pernah memperoleh lease, dua client dapat memutasi resource yang sama pada titik waktu berbeda. Fencing token memindahkan pemeriksaan penentu dari kepemilikan lease ke resource yang dilindungi. Setiap akuisisi yang berhasil memperoleh token yang berurutan setelah semua token sebelumnya. Resource mencatat token terbesar yang pernah diterima dan menolak operasi dengan nilai lebih lama. Lease tetap mengoordinasikan akuisisi, sedangkan token membatasi tindakan pemegang lama yang terlambat setelah kembali aktif.

Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Fencing Token Menolak Writer Usang Setelah Lease Kedaluwarsa

Distributed lease dapat memindahkan kepemilikan tanpa menghentikan proses yang sebelumnya memegang lease tersebut. Sebuah worker dapat berhenti cukup lama hingga lease kedaluwarsa, lalu aktif kembali setelah worker lain memperoleh lease yang sama. Pada saat itu, kedua proses dapat mengeksekusi kode yang ditulis dengan asumsi bahwa kepemilikan bersifat eksklusif. Kedaluwarsa lease menyelesaikan status kepemilikan di coordination service. Mekanisme itu tidak mencabut waktu CPU, membatalkan network request yang sedang berjalan, atau menghapus I/O yang sudah masuk buffer pada holder lama. Fencing token menutup celah tersebut dengan membawa nilai pengurutan dari keputusan kepemilikan menuju resource yang dilindungi.

Rekayasa Perangkat Lunak 19 Sep 2026 7 min read

FCM Adalah Jalur Wake-Up, Bukan Transport Real-Time

FCM Adalah Jalur Wake-Up, Bukan Transport Real-Time Aplikasi mobile dapat mempertahankan WebSocket ketika aktif dan tetap membutuhkan Firebase Cloud Messaging saat sistem operasi menangguhkannya. Kedua mekanisme itu menangani kondisi kegagalan yang berbeda. WebSocket, MQTT, dan SignalR mengasumsikan client dapat berpartisipasi dalam sesi komunikasi yang hidup. FCM justru berguna ketika asumsi itu tidak lagi berlaku: aplikasi mungkin berada di background, prosesnya mungkin tidak berjalan, atau koneksi persistennya sudah hilang. Menganggap FCM sebagai transport real-time lain menyamarkan boundary tersebut. Desain yang lebih kuat memakai live channel selama tersedia dan memperlakukan push delivery sebagai sinyal agar aplikasi kembali aktif lalu merekonsiliasi state.