Hijrah Backend (3): Mem-port Puluhan Parser Protokol GPS Tanpa Menghentikan Armada

10 September 2026 oleh Faiq Najib Al-Aziz


Mari mulai dari laporan paling membingungkan yang pernah saya tangani: ada kendaraan yang sedang parkir, mesin mati, tapi sistem membaca kecepatannya 66 km/jam. Satelitnya juga ramai, datanya masuk terus. Kalau Anda penasaran bagaimana akhirnya sebuah tanda baca yang salah bisa membuat mobil parkir ngebut, cerita ini untuk Anda hehe~

Rewind: Januari 2025 #

Seperti yang dibahas di episode pertama, mandat migrasi sudah menunggu sejak sebelum saya diterima kerja. Salah satu bagian terbesarnya jatuh ke tangan saya: protokol. Pintu masuk seluruh data armada.

Bentuknya begini: puluhan tipe tracker GPS, tiap vendor punya bahasa binernya sendiri, dan sistem lama punya satu parser untuk tiap bahasa itu. Tugas saya menulis ulang semuanya di Go, sambil armada terus berkirim data setiap detik. Tidak ada jendela “kita matikan dulu semalam ya”.

Jadi jadwal harian saya Januari 2025: baca parser PHP, tulis parser Go, ulangi. Kantor bahkan membelikan langganan AI premium era itu untuk mempercepat konversi.

Jejaknya masih tersimpan sampai sekarang: percakapan pertama dengan sang pemegang mandat tercatat tanggal 2 Januari, jam tiga sore, isinya lokasi folder proyek; dan kalimat kerja pertama saya di sana adalah permintaan konversi file CodeIgniter pertama ke Go. Hasil sprint-nya juga tercatat resmi di grup atasan: listener selesai konversi sepuluh hari lebih cepat dari timeline. Satu-satunya hal di mandat itu yang datang lebih cepat dari jadwal hahaha. Setiap orang punya cara menghabiskan malam-malamnya; cara saya sedang menulis ulang dua puluh satu versi parser hehe~

Keberuntungan yang Sering Dilupakan #

Sebelum cerita salah pahamnya, catat dulu keberuntungannya: untuk setiap parser Go yang saya tulis, ada kode PHP aslinya yang bisa dibandingkan. Porting jadi soal 1:1, bukan menebak dari spesifikasi protokol.

Metodenya sederhana tapi ketat: bandingkan offset pembacaan GPS, struktur pembacaan elemen IO (posisi mulai bacanya), dan jumlah cabang case-nya, file demi file. Dua puluh satu versi, satu per satu. Bukan sekali layan semua, bukan “kan polanya sama”. Karena, seperti akan Anda lihat, pola yang “sama” itulah yang hampir menggagalkan saya hahaha.

Mobil Parkir yang Ngebut #

Gejala muncul belakangan, di satu keluarga parser: tracker dengan codec tertentu terbaca 66 km/jam saat sebenarnya diam. Satu field: kecepatan.

Teori pertama saya terdengar sangat masuk akal. Di parser itu ada cabang yang menimpa kecepatan hasil pembacaan blok GPS dengan nilai elemen IO bernomor 24. “Nah, IO-24-nya yang salah timpa! Buang saja timpaannya.” Maka saya buang, di sembilan parser sekaligus, karena “kan polanya sama”.

Patch itu bertahan kurang dari sehari. Setelah dicek ulang: cabang timpaan itu justru benar, versi PHP juga punya, dan membuangnya malah merusak kasus lain. Revert di hari yang sama juga hahaha. Tercatat di riwayat commit dengan anggun: fix jam begitu, revert jam segini.

Detektif Data: Device atau Parser? #

Sebelum menuduh lagi, saya pelajari dulu cara membedakan dua tersangka yang sering tertukar: tracker-nya yang rusak, atau parser-nya yang salah.

Heuristiknya ternyata sederhana dan bisa diandalkan:

Lalu bandingkan paket yang sama di sistem lama dan sistem baru: waktu sama, koordinat sama, jumlah satelit sama. Bedanya satu: kecepatan. Sistem lama membaca 9, sistem saya membaca 66. Bukan device. Parser saya. Terbukti di kertas, bukan cukup di mulut hehe.

Satu Karakter yang Menggerakkan Mobil #

Akar masalahnya akhirnya ketemu, dan ini bagian favorit saya: di kode PHP asli tertulis startPosition =+ startRecord.1 Ya, =+. Di PHP itu dibaca sebagai assignment biasa dengan tanda plus unary di depan angka. Tangan saya yang sudah mulai terbiasa Go menuliskannya kembali sebagai +=, yang artinya tambah-terus-assign.

Beda satu karakter. Akibatnya: posisi mulai pembacaan elemen IO bergeser beberapa byte, sehingga parser “menemukan” elemen IO yang sebenarnya bukan di posisi itu, termasuk IO-24 yang membawa angka 66. Mobil-mobil yang parkir pun ikut lari tanpa izin mereka hahaha.

Perbaikannya: satu karakter, di dua file. Commit-nya berdua hari itu juga, bersama jenasah band-aid-nya. Seminggu-squared perjuangan forensic, titiknya ditutup oleh perbedaan antara = dan += hehe.

Cuci Besi: Mengembalikan 514.380 Baris #

Kode sudah benar belum cukup. Data yang sempat salah juga harus pulang.

Untuk rentang dua minggu yang terkontaminasi, saya tarik arsip dari sistem lama, cocokkan per paket, dan perbaiki 514.380 baris lokasi di sistem baru.2 Pencocokannya 100%: tidak ada satu baris pun yang gagal dipulangkan. Dan glitch lamanya terverifikasi hilang, di timestamp yang sama, 66 berubah menjadi 9.

Bagian ini tidak glamor dan tidak ada di tutorial mana pun: migrasi bukan cuma soal kode baru yang benar, tapi juga soal membersihkan jejak kode lama yang sempat keliru. Data tidak boleh meninggalkan masa lalu dalam keadaan salah.

Jujur Soal Kata “Selesai” #

Sprint ini bagian dari periode tiga bulan yang menagih bayarannya ke kesehatan mental saya. Itu fakta, dan saya tulis apa adanya.

Dan soal kata “selesai”: waktu itu saya umumkan selesai dengan percaya diri setengah hati, karena verifikasi paritasnya belum 100%. Benar saja, sampai episode ini ditulis pun, sesekali masih ada perbaikan parser yang masuk. Sekarang saya lebih tenang memaknainya: “selesai” itu spektrum, bukan tombol. Yang penting bukan klaimnya; yang penting tiap laporan baru diperlakukan sebagai data, bukan sebagai penghinaan hahaha.

Pelajaran #

  1. Porting kode biner itu beda satu byte = beda dunia. Bandingkan file demi file, jangan menggeneralisasi pola antar file yang “kelihatan sama”.
  2. Pahami dulu, patch kemudian. Band-aid yang dibuang di sembilan file sekaligus harus saya revert di hari yang sama. Mahalnya bukan di jamnya, tapi di kepercayaan dirinya.
  3. Konsistensi pola adalah detektor. Beku = device, acak = drift, konsisten-persis = curigai parser.
  4. “Selesai” itu hipotesis sampai diverifikasi. Dan itu normal; yang tidak normal adalah berhenti memverifikasi.
  5. Migrasi mencakup data lama. Kode baru yang benar wajib diikuti pembersihan jejak salah yang sempat tertinggal.

Episode berikutnya kita bedah filosofi yang menopang semua episode sebelumnya: kenapa “yang benar adalah yang lama”, dan apa yang terjadi ketika “perbaikan” harus saya hapus sendiri. Sampai ketemu di sana.

Sekian. Salam.


  1. Potongan kode disederhanakan; nama protokol dan field IO dipertahankan secukupnya untuk bercerita. ↩︎

  2. Angka baris dan jumlah device ditampilkan apa adanya karena saat itu benar-benar terukur; skala infrastruktur lain tetap tidak disebut demi anonimitas. ↩︎