Myers Visualizer
Tayangan ulang interaktif tentang cara kerja git diff, termasuk alasan ia kadang salah menunjuk baris

- algoritma diff ditulis dari makalahnya
- 4
- pada graf suntingan 300×300
- 59,9 fps
- langkah pencarian kasus terburuk, tanpa macet
- 135.152
- preset, masing-masing menunjukkan satu perilaku diff
- 8
Di halaman ini
Masalahnya
Developer menjalankan git diff hampir setiap hari kerja, tapi hanya sedikit yang tahu cara kerjanya. Diff hanya terlihat sebagai hasil akhir. Tidak ada yang menunjukkan bahwa hasil itu lahir dari pencarian jalur terpendek di sebuah kisi.
Bagian yang membingungkan juga tidak pernah dijelaskan. Semua orang pernah melihat diff menempelkan kurung kurawal penutup ke fungsi yang salah, atau menampilkan "tambah 2 baris" sebagai "hapus 5, tambah 7". Orang menganggapnya keanehan biasa. Penyebab sebenarnya: kumpulan suntingan terpendek biasanya tidak tunggal, dan aturan pemecah seri di algoritma memilih salah satunya tanpa peduli mana yang enak dibaca. Itu juga alasan git menyertakan algoritma diff lain, seperti patience.
Saya membuat Myers Visualizer untuk developer, untuk mahasiswa dan pengajar pencarian graf, dan untuk siapa pun yang membaca makalah Eugene Myers tahun 1986 dan ingin diagramnya bergerak.
Yang saya bangun
Mesin diff saya tulis langsung dari makalahnya
Saya mengimplementasikan empat algoritma diff sendiri: Myers greedy, Myers versi hemat memori (linear-space), patience, dan histogram. Tidak ada pustaka diff di proyek ini. Mesinnya menerima dua teks dan opsi, lalu mengembalikan daftar suntingan, rekaman lengkap pencariannya, dan statistik. Tidak ada jam atau unsur acak, jadi input yang sama selalu memberi hasil yang sama. Karena pencarian direkam sekali, mundur selangkah tidak memakan biaya apa pun.
Pemeriksanya saya tulis sebelum algoritmanya
Sebelum kode Myers ditulis, saya menulis dua pemeriksa yang berdiri sendiri. Yang pertama menerapkan daftar suntingan ke teks pertama dan memastikan hasilnya sama dengan teks kedua. Yang kedua adalah pencarian brute-force yang lambat untuk menemukan jumlah suntingan minimum yang sebenarnya. Setiap algoritma, di setiap input, harus lolos keduanya. Tesnya tidak pernah menuntut dua algoritma menghasilkan suntingan yang sama, cukup jumlahnya yang sama, karena beberapa jawaban minimal bisa sama-sama benar.
Kisi digambar di canvas, pencarian jalan di latar
Graf suntingan adalah produknya, jadi uji gambar kisi 300×300 saya kerjakan sebelum kode algoritma apa pun. Kisi digambar di canvas, sehingga halaman tidak membuat satu elemen per sel. Setiap frame hanya menggambar ulang garis depan pencarian. Pencariannya sendiri jalan di worker latar dengan batas langkah, jadi preset kasus terburuk pun tidak bisa membekukan halaman.
Klaim setiap preset diuji
Dua klaim preset pertama saya ternyata salah saat saya periksa. Aturan pemecah seri di implementasi saya tidak menempelkan kurung ke fungsi yang salah pada input pertama yang saya coba. Keduanya saya ganti dengan input yang memang menunjukkan fenomenanya, dan sekarang kedelapan preset membuktikan klaimnya lewat tes. Aturan itu juga saya tulis di panduan kerja repo.
Situsnya saya susun ulang untuk orang yang belum pernah menjalankan git diff
Menjelang akhir, saya menyusun ulang halaman depan untuk pendatang baru. Halaman dibuka dengan pertanyaan, lalu contoh tanpa istilah teknis, gagasannya dalam tiga langkah, dan alasan diff bisa salah menunjuk baris. Notasi dan glosarium baru muncul di akhir. Kisinya juga diberi label sumbu, karena pendatang baru yang salah menebaknya akan membaca seluruh gambar secara terbalik.
Hasilnya
Myers Visualizer sudah live, publik, dan open source. Situs ini bisa dipasang seperti aplikasi dan tetap jalan offline setelah kunjungan pertama. Situs menampilkan graf suntingan saat terisi, memori kerja algoritma di sebelahnya, berapa banyak jawaban yang sama-sama minimal, dan perbandingan keempat algoritma. Di contoh situsnya sendiri, keempatnya butuh 5 suntingan, dan patience tetap memangkas jumlah blok perubahan menjadi separuh.
Kisi 300×300 berjalan di 59,9 frame per detik. Di batas input, kasus terburuk butuh 135.152 langkah pencarian dan halaman tetap responsif. Tersedia dalam bahasa Inggris dan Indonesia. Saya membangunnya dalam dua hari pada Agustus 2026.
Di balik layarDetail teknis untuk engineer
- Mesinnya fungsi murni,
(a, b, options) → { script, trace, stats }, tanpa React, DOM, jam, unsur acak, atau state tingkat modul. Teks diubah dulu menjadi id integer, sehingga granularitas baris atau karakter dan penanganan spasi menjadi pengaturan yang eksplisit. lib/diff/(~1.750 baris) berisi Myers greedy dengan perekamanVdan backtrack, varian dua arah linear-space dengan middle snake, patience, dan histogram. Tanpa pustaka diff.apply.ts(script + A → B) tidak berbagi kode dengan pencarian mana pun;brute.tsadalah BFS di graf suntingan untukDminimal yang sebenarnya. Keduanya ditulis sebelummyers.ts. Tes mengecek kesamaanDdan kebenaran apply, tidak pernah kesamaan script.- Array
Vdiindeks dengank = x − y, yang bisa negatif. Offset-nya ditaruh di balik satu accessor bernama dan tidak pernah ditulis langsung, karena off-by-one di situ tetap terlihat masuk akal pada input simetris. - Render Canvas 2D ditulis sendiri. Kerja per frame O(frontier), bukan O(N·M), dijaga oleh unit test.
pnpm bench:rendermelakukan build, menyajikan situs di basePath produksi, dan menjalankan headless Chrome: 220 frame, rata-rata gambar 0,13 ms, p95 0,30 ms, median frame 16,70 ms (59,9 fps). Tidak dijalankan di CI karena pengukuran waktu di runner bersama sering meleset.- jsdom tidak punya
Workerdan canvas-nya cuma tiruan, jadi smoke test Puppeteer membaca piksel dari hasil build dan memastikan chunk worker dimuat. Tes ini langsung menemukan bug: hash URL hanya dibaca saat mount. URL live lolos smoke suite 15/15. - Kasus terburuk di batas input:
D = 600, 135.152 langkah pencarian, 362.404 selV. Mode linear-space menampilkan penghitung memori langsung untuk O(D²) vs O(N+M). Di contoh perbandingan, keempat algoritma sepakat diD = 5. - 8 preset:
minimal-edit,pure-insert,pure-delete,transposition,brace-misattribution,patience-wins,worst-case,char-level, masing-masing diuji ditests/presets/. - Perbaikan static export:
app/manifest.tsmengabaikanbasePath(404 diam-diam, prompt install tidak muncul), jadi manifest dijadikan file statis yang dikunci tes.metadataBasesudah membawa basePath, sehingga gambar OG yang root-relative mendapatkannya dua kali. - Proyek ini awalnya berbahasa Indonesia sebagai default, lalu diganti nama dan default-nya dipindah ke bahasa Inggris. Istilah algoritma tetap bahasa Inggris di kedua bahasa.
- Tiga dependensi runtime (Next.js 14.2, React, react-dom). JS first-load bersama 87,4 KB gzip, 107 KB di halaman graf, dari anggaran 250 KB.
- Di luar cakupan: unggah file, diff direktori, three-way merge, diff AST, akun. Situs menyebut bahwa git memakai heuristik tambahan dan tidak mengklaim hasilnya identik byte demi byte dengan git diff.
- ~8.900 baris TypeScript, 152 tes di 24 file, 25 commit dari 4 sampai 5 Agustus 2026.
Tangkapan layar
Sedang merekrut, atau membangun hal serupa?
Saya terbuka untuk posisi full-time dan proyek freelance tertentu.