Sebuah pasukan yang menghantar runtime Python bersaiz 5.5 MB ke pelayar web mendapati bahawa 69% daripada ralat yang direkodkan semasa sprint baru-baru ini jatuh di bawah satu tajuk tunggal yang mengelirukan, dan 89% daripadanya sebenarnya adalah masa tamat rangkaian (network timeouts). Pelaporan yang salah ini telah menyebabkan pembangun menyimpang ke laluan penyahpepijatan yang salah dan menyebabkan sebahagian besar pengguna mengalami kegagalan muat turun senyap—satu masalah yang boleh dialami oleh mana-mana aplikasi web yang membundel aset besar.

Papan pemuka mengelirukan

Sistem penjejakan ralat secara automatik mengelompokkan insiden mengikut lokasi kod di mana ia pertama kali muncul. Tajuk yang terhasil kelihatan seperti pepijat ringkas dalam pemuat runtime, jadi masa sprint dihabiskan untuk memburu laluan kod yang tidak pernah mengalami masa tamat. Apabila pasukan mengambil sampel metadata asas, gambaran sebenar muncul: kebanyakan kegagalan bukanlah pepijat langsung, sebaliknya adalah sambungan rangkaian yang terhenti yang mencetuskan masa tamat.

Pengajaran: Tajuk ralat hanyalah untuk kemudahan, bukan diagnosis. Selidik data mentah secara berkala untuk mengesahkan apa yang sebenarnya diwakili oleh tajuk tersebut.

API sambungan pelayar memberikan penanda tempat

Untuk mengelakkan pengguna dengan sambungan perlahan daripada terpaksa menunggu muat turun 5.5 MB, pembangun merujuk kepada Network Information API pelayar (navigator.connection). API tersebut melaporkan lebar jalur (bandwidth) yang malar sebanyak 1.7 Mbps bagi setiap pelawat kali pertama.

Pelayar mengeluarkan nilai lalai apabila tiada data sejarah untuk pengguna baharu. Nilai lalai tersebut hanyalah petunjuk, bukan kelajuan yang muktamad. Apabila penanda tempat yang sama muncul bagi setiap sesi baharu, ia menandakan bahawa API tersebut belum dikalibrasi untuk audiens berkenaan.

Pengajaran: Anggap sebarang isyarat rangkaian yang tidak pernah berubah sebagai nilai sandaran (fallback), bukan sebagai metrik yang muktamad.

Tangkapan tunggal tidak boleh dipercayai

Selepas mengetepikan petunjuk lebar jalur yang tidak boleh dipercayai, pasukan beralih kepada isyarat berbeza yang kelihatan berfungsi dalam set ujian mereka. Satu larian ujian berjaya, tetapi mengulangi ujian tersebut sebanyak tiga kali menghasilkan kegagalan setiap kali. Kelajuan rangkaian turun naik secara berterusan. Kod tersebut telah mengambil satu tangkapan (snapshot) tunggal, membuat keputusan kekal, dan kemudian meneruskan proses walaupun sambungan berubah sejenak kemudian.

Pengajaran: Jangan buat tindakan kekal berdasarkan satu bacaan sahaja bagi sasaran yang sentiasa berubah. Langgan acara perubahan (change events) dan bukannya melakukan polling sekali sahaja.

Pembaikan praktikal yang dilaksanakan oleh pasukan

  • Langgan perubahan sambungan. Daripada membaca navigator.connection sekali sahaja, kod kini mendengar acara change dan bertindak balas jika lebar jalur turun atau naik semasa muat turun.
  • Tambah "penjaga" (watchdog) "tiada-kemajuan". Pemasa akan membatalkan sebarang permintaan yang tidak menunjukkan sebarang kemajuan selepas selang masa yang singkat, membolehkan pelayar mencuba semula atau menggunakan nilai sandaran.
  • Berhenti menukar CDN di tengah-tengah muat turun. Menukar sumber fail besar pada sambungan perlahan akan memulakan semula pemindahan dari sifar, membazirkan bait yang telah diterima. Muat turun kini kekal pada CDN yang dipilih pada mulanya untuk keseluruhan tempohnya.
  • Tangguhkan kerja pengecachean yang berat. Tugasan yang menulis sejumlah besar data ke dalam cache ditangguhkan sehingga runtime selesai dimuatkan, bagi memastikan laluan kritikal kekal singkat.

Jika papan pemuka anda memaparkan gambaran yang terlalu kemas sehingga mencurigakan, selidik dengan lebih mendalam. Jika ukuran rangkaian tidak pernah berubah, anggap ia sebagai penanda tempat. Dan jika satu tangkapan tunggal menentukan nasib muat turun berbilang megabait, anda sebenarnya sedang bertaruh pada fatamorgana. Pertaruhan tersebut akan muncul sebagai kegagalan senyap yang menghakis kepercayaan pengguna—sesuatu yang tidak dapat diperbaiki sepenuhnya oleh kod yang paling bijak sekalipun selepas ia berlaku.