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 17 Sep 2026 7 min read

File-Backed Mapping Dapat Bertahan Lebih Lama daripada Ukuran File yang Diasumsikan

Sebuah proses dapat mempertahankan virtual memory mapping yang valid setelah pihak lain memperpendek file yang dipetakan. Rentang alamatnya masih ada di dalam proses, tetapi backing object mungkin tidak lagi memiliki setiap page yang sebelumnya direpresentasikan oleh rentang tersebut. Pada sistem POSIX, akses ke satu page terpetakan penuh yang berada di luar akhir file baru dapat menghasilkan SIGBUS, bukan berperilaku seperti pembacaan file biasa yang gagal. Batas ini membuat file-backed mmap() berbeda dari menyalin byte ke private heap storage. Pointer ke dalam mapping bukan bukti bahwa extent file yang sesuai masih ada. Alamat virtual, lifetime mapping, identitas file, dan ukuran file saat ini merupakan state yang saling berkaitan, tetapi bukan satu objek yang tidak dapat dipisahkan.

Rekayasa Perangkat Lunak 17 Sep 2026 6 min read

Event Linux inotify Merupakan Aliran Perubahan yang Dapat Kehilangan Data

File descriptor inotify memaparkan aktivitas filesystem sebagai antrean terurut berisi record event, tetapi antrean tersebut bukan riwayat otoritatif atas state namespace. Event identik yang belum dibaca dapat digabungkan, kapasitas antrean terbatas, dan overflow secara eksplisit berarti sejumlah event telah hilang. Proses yang memperlakukan aliran ini sebagai transaction log lengkap dapat mempertahankan state yang tidak lagi sesuai dengan filesystem. Model yang lebih tepat adalah notifikasi perubahan dengan kewajiban pemulihan. Event dapat menjaga cache tetap mutakhir secara inkremental selama alirannya utuh; kondisi tertentu memutus riwayat inkremental tersebut dan menuntut rekonsiliasi terhadap state filesystem.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

EPOLLET Melaporkan Transisi Readiness, Bukan Pengosongan Buffer

Dengan EPOLLET, sebuah file descriptor dapat tetap memiliki data yang belum dibaca setelah event readiness-nya sudah dikonsumsi. Pemanggilan epoll_wait() berikutnya tidak wajib melaporkan descriptor itu lagi hanya karena state readable sebelumnya masih bertahan. Perilaku ini merupakan batas utama edge-triggered epoll: notifikasi mengikuti perubahan readiness, sedangkan objek I/O di bawahnya mempertahankan state sendiri secara terpisah. Readiness dan pengiriman event merupakan state terpisah Sebuah epoll instance memiliki interest list dan ready list. Registrasi melalui epoll_ctl() menentukan open file description yang dipantau dan kelas event yang relevan. epoll_wait() mengembalikan entry yang sudah mencapai ready list.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

Edge Triggering Linux epoll Melaporkan Transisi Readiness, Bukan Unit Kerja

Edge Triggering Linux epoll Melaporkan Transisi Readiness, Bukan Unit Kerja Dengan EPOLLET, sebuah interest epoll tidak berperilaku seperti antrean yang berisi satu event untuk setiap byte, paket, koneksi, atau pesan aplikasi. Mekanisme ini melaporkan perubahan status readiness. Setelah sebuah file descriptor berada dalam status ready, pekerjaan tambahan dapat terakumulasi tanpa menghasilkan edge lain yang dapat diandalkan aplikasi. Handler karena itu perlu mengonsumsi pekerjaan yang tersedia sampai operasi nonblocking melaporkan bahwa progres berikutnya akan memblokir.

Rekayasa Perangkat Lunak 17 Sep 2026 8 min read

Edge Triggering epoll Mengubah Readiness Menjadi Kewajiban untuk Menguras

Registrasi epoll edge-triggered dapat berhenti menghasilkan notifikasi sementara byte yang belum dibaca masih tersisa di socket atau pipe. Descriptor tetap dapat digunakan untuk I/O, tetapi event loop sudah mengonsumsi notifikasi yang terkait dengan transisi readiness. Jika handler hanya membaca sebagian data yang tersedia lalu kembali ke epoll_wait(), tidak ada keharusan muncul transisi baru, sehingga byte yang tertunda dapat dibiarkan tanpa diproses tanpa batas. Perilaku ini membuat EPOLLET lebih dari sekadar preferensi notifikasi. Ia mengubah kontrak antara ready list kernel dan application state. Loop level-triggered dapat terus menerima descriptor selama kondisi I/O yang diminta tetap benar. Loop edge-triggered harus mempertahankan cukup local state untuk memperlakukan event yang diterima sebagai kewajiban menguras I/O nonblocking yang saat itu tersedia, biasanya sampai operasi mengembalikan EAGAIN.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

Counter eventfd Menggabungkan Notifikasi Sebelum Read

Sebuah eventfd Linux dapat menerima beberapa write sebelum consumer berjalan, tetapi descriptor tersebut tidak menyimpan setiap write sebagai pesan terpisah. Setiap write yang diterima menambahkan nilai unsigned 64-bit ke counter yang dikelola kernel. Tanpa EFD_SEMAPHORE, satu read yang berhasil mengembalikan nilai counter saat itu lalu meresetnya menjadi nol. Perilaku tersebut membuat eventfd menjadi primitive notifikasi berbasis counter, bukan message queue. Readiness menyatakan bahwa counter tidak nol; readiness tidak mempertahankan jumlah operasi write, urutan, atau boundary setiap write.

Rekayasa Perangkat Lunak 17 Sep 2026 3 min read

Cookie Rename inotify Mengorelasikan Event Move Tanpa Membuatnya Atomik

Sebuah rename() di Linux yang diamati melalui inotify dapat menghasilkan dua record dengan cookie nonzero yang sama: IN_MOVED_FROM untuk directory entry lama dan IN_MOVED_TO untuk entry baru. Cookie tersebut mengorelasikan kedua record, tetapi tidak mengubahnya menjadi satu item queue yang atomik. Batas ini penting bagi perangkat lunak yang memelihara indeks pathname, menyinkronkan state direktori, atau mengubah notifikasi filesystem menjadi record perubahan tingkat lebih tinggi. Rename merupakan satu operasi filesystem, sedangkan representasinya di inotify dapat berupa pasangan dengan properti pengelompokan delivery yang lebih lemah.

Rekayasa Perangkat Lunak 16 Sep 2026 6 min read

Negative Caching DNS Dapat Bertahan Setelah Record Dibuat

Recursive DNS resolver dapat terus mengembalikan hasil ketiadaan lama setelah authoritative zone memperoleh nama yang diminta. Record baru dan negative answer yang tersimpan di cache tidak saling bertentangan: keduanya berada pada titik berbeda dalam jalur resolution, dan cache tetap valid sampai negative TTL berakhir atau policy lokal menghapusnya lebih cepat. Perilaku ini memberi ketiadaan DNS lifetime cache tersendiri. Menerbitkan record mengubah state authoritative, tetapi tidak secara sinkron membatalkan negative entry yang sudah tersimpan pada recursive resolver.

Rekayasa Perangkat Lunak 16 Sep 2026 6 min read

HTTP Stale-While-Revalidate Memindahkan Refresh Cache dari Request Path

Cache dapat langsung mengembalikan stored response yang sudah expired dan memulai validation secara paralel ketika stale-while-revalidate mengizinkan reuse tersebut. Request yang menemukan stale entry karena itu tidak harus ikut menanggung origin validation latency, tetapi dapat menerima representation data yang lebih lama daripada normal freshness lifetime. Ini adalah pergeseran yang disengaja dalam cache contract. Freshness tetap berakhir pada boundary yang dikonfigurasi. Extension menambahkan interval terpisah tempat stale reuse diizinkan sementara validation berlangsung, sehingga response age dan request latency menjadi sebagian terpisah.

Rekayasa Perangkat Lunak 16 Sep 2026 8 min read

HTTP If-Range Mengikat Pengambilan Parsial pada Identitas Representasi

Client yang hanya memiliki sebagian dari sebuah representasi HTTP menghadapi masalah konsistensi ketika kemudian meminta byte yang belum diterima. Offset byte hanya bermakna terhadap representasi yang byte-nya menjadi dasar offset tersebut. Jika representasi terpilih berubah di antara request, menggabungkan prefix lama dengan suffix baru dapat menghasilkan data yang tidak pernah dikirim server mana pun. If-Range mengikat identitas representasi pada boundary pengambilan parsial tersebut. Ketika validator-nya cocok, server dapat memproses field Range yang menyertainya. Ketika tidak cocok, server mengabaikan Range dan mengirim representasi terpilih secara lengkap melalui jalur response sukses biasa, alih-alih mengembalikan response failed-precondition.

Rekayasa Perangkat Lunak 16 Sep 2026 7 min read

HTTP If-Match Mengubah State Representasi Menjadi Write Precondition

Origin HTTP dapat menolak PUT atau DELETE sebelum menerapkannya ketika request membawa If-Match dan representasi yang dipilih tidak lagi memiliki entity tag yang diterima. Kondisi ini mengubah representation validator menjadi write precondition: client dapat menyatakan bahwa mutasi hanya valid terhadap state yang masih cocok dengan versi yang sebelumnya diamati. Mekanisme ini menangani boundary konkurensi tertentu. Ia dapat mencegah satu client diam-diam mengganti resource state setelah client lain mengubah representasi yang dipilih. Namun ia tidak mengubah HTTP menjadi transaction protocol, tidak mengunci resource antar-request, dan tidak menjamin bahwa entity tag mewakili setiap bagian application state yang terlibat dalam mutasi.

Rekayasa Perangkat Lunak 16 Sep 2026 6 min read

HTTP 421 Misdirected Request Menandai Batas Authority Koneksi

Client HTTP/2 dapat menggunakan ulang satu secured connection untuk request ke lebih dari satu origin ketika server authoritative untuk origin-origin tersebut. Namun, sebuah request tetap dapat mencapai server instance yang connection context-nya tidak sesuai dengan target URI. 421 Misdirected Request ada untuk boundary ini: server menolak routing context, bukan memperlakukan target resource itu sendiri sebagai tidak ada. Perbedaan ini memisahkan resource semantics dari connection authority. Response 421 berarti server ini, pada path atau connection context ini, tidak mampu atau tidak bersedia menghasilkan authoritative response untuk target URI. Itu tidak berarti resource telah dihapus, method-nya dilarang, atau request representation tidak valid.

Rekayasa Perangkat Lunak 16 Sep 2026 6 min read

HTTP 103 Early Hints Memisahkan Spekulasi dari Semantik Response Final

Server HTTP dapat mengirim response informasional 103 Early Hints sebelum response final selesai dibuat. Client dapat bertindak atas field yang sesuai pada interim message tersebut, misalnya memulai preload yang disebut oleh Link, walaupun status code, header field, dan representasi final masih belum tersedia. Hal ini sengaja memisahkan speculative work dari authoritative response semantics. Interim response dapat memindahkan sebagian preparation lebih awal, tetapi tidak dapat menggantikan final response atau menentukan maknanya.

Rekayasa Perangkat Lunak 16 Sep 2026 7 min read

File Descriptor Duplikat Berbagi Offset tetapi Tidak Descriptor Flag

Memanggil dup() tidak membuat posisi stream yang independen. Descriptor yang dikembalikan mengacu pada open file description yang sama dengan descriptor sumber, sehingga seek melalui salah satu descriptor mengubah offset yang terlihat melalui keduanya. Pada saat yang sama, state lokal descriptor seperti flag close-on-exec tetap melekat pada masing-masing descriptor secara terpisah. Pemisahan ini mudah terlewat karena kedua jenis state dimanipulasi melalui file descriptor berupa integer. Integer tersebut hanyalah referensi lokal milik proses. Beberapa descriptor dapat menunjuk ke satu open file description, dan objek bersama itulah yang membawa state yang memengaruhi read, write, seek, serta perubahan status flag.

Rekayasa Perangkat Lunak 09 Sep 2026 8 min read

Mengubah Input Mentah Menjadi Nilai Domain Tepercaya

Sebuah nilai sering masuk ke program sebagai string, angka, atau objek dengan struktur longgar, lalu bergerak melewati beberapa layer. Jika setiap layer harus menanyakan apakah nilai itu kosong, malformed, atau berada di luar rentang yang diizinkan, logika validasi akan menyebar ke seluruh codebase. Sebagian caller mengulang pemeriksaan, sebagian melupakannya, dan sebagian lain diam-diam membuat asumsi yang berbeda. Alternatif yang berguna adalah memperlakukan input eksternal sebagai representasi yang tidak tepercaya dan mengubahnya pada sebuah boundary menjadi nilai yang merepresentasikan fakta domain. Setelah konversi berhasil, kode downstream dapat mengandalkan jaminan yang diberikan nilai baru tersebut alih-alih berulang kali memvalidasi representasi awal.