Saya baru-baru ini menemukan sebuah komentar yang menarik
sambil menjelajahi basis kode Go.
“Karena hukum Hyrum, teks ini tidak dapat diubah.”
func (e *MaxBytesError) Error() string {
return "http: request body too large"
}
- Sebelumnya, saya belum pernah mendengar tentang hukum Hyrum.
- Pencarian cepat mengungkapkan bahwa ini adalah prinsip yang dinamai demikian Hyrum Wrightseorang insinyur perangkat lunak di Google.
Itu “hukum” sederhana:
Dengan jumlah pengguna API yang memadai, apa pun yang Anda janjikan dalam kontrak tidak menjadi masalah: semua perilaku sistem Anda yang dapat diamati akan bergantung pada seseorang.
Dengan kata lain, perilaku apa pun yang dapat diamati dalam kode – baik disengaja atau tidak – pada akhirnya akan menjadi sesuatu yang diandalkan oleh seseorang, di suatu tempat.
Jadi pada kode di atas, penulis mengakui bahwa pesan error tersebut tidak dapat diubah karena kemungkinan besar diandalkan oleh seseorang, di suatu tempat. Meskipun mungkin tampak sepele untuk mengubah pesan kesalahan, hal itu dapat menyebabkan masalah yang tidak diinginkan bagi siapa pun yang mengandalkan pesan khusus ini. Dalam kasus ini, perubahan yang tampaknya kecil dapat merusak kode yang ada di mana seseorang bergantung pada frasa yang tepat dari “http: isi permintaan terlalu besar”.
Misalnya, berikut beberapa basis kode sumber terbuka yang akan terpengaruh jika pesan kesalahan diubah:
Ini bukan satu-satunya contoh. Saya menemukan komentar serupa yang merujuk pada Hukum Hyrum di Go
crypto/rsa
Dan internal/weak
paket juga.
Ini dia:
func EncryptOAEP(hash hash.Hash, random io.Reader, pub *PublicKey, msg ()byte, label ()byte) (()byte, error) {
func SignPSS(rand io.Reader, priv *PrivateKey, hash crypto.Hash, digest ()byte, opts *PSSOptions) (()byte, error) {
if opts != nil && opts.Hash != 0 {
hash = opts.Hash
}
Using go:linkname to access this package and the functions it references
is explicitly forbidden by the toolchain because the semantics of this
package have not gone through the proposal process. By exposing this
functionality, we risk locking in the existing semantics due to Hyrum's Law.
Pengamatan
Ini jelas sekali tidak spesifik untuk Golang
dan disebutkan dalam lainnya
basis kode demikian juga.
TBH, semua ini mengingatkan saya bagaimana evolusi JavaScript selama bertahun-tahun telah banyak dibentuk oleh ketergantungan yang meluas pada segala macam perilaku unik dan tidak disengaja, yang menjadi standar de facto. Sekarang, saya akhirnya tahu apa yang dimaksud dengan fenomena ini – Hukum Hyrum.
Pikiran terakhir
- Pengingat yang baik untuk berhati-hati saat mengubah kode yang mungkin diandalkan orang lain—dan mencoba merancang sesuatu dengan cara yang tidak mengunci kebiasaan aneh secara tidak sengaja.
- Dan yang lebih baik lagi, merancang sistem dengan cara yang meminimalkan kemungkinan terjadinya perilaku yang tidak diinginkan.
- Lagi pula, Anda tahu pepatah: “Yang diperlukan hanyalah satu perubahan kecil untuk… sesuatu sesuatu…” Saya tidak ingat keseluruhan kutipannya.
😶🌫️️