Para insinyur perangkat lunak sedang mendiskusikan contoh-contoh menarik tentang bagaimana bahasa pemrograman secara aktif melawan Hukum Hyrum - prinsip yang menyatakan bahwa pengguna akan pasti bergantung pada perilaku yang dapat diamati dalam sistem, terlepas dari apa yang dijanjikan secara resmi. Diskusi komunitas terbaru mengungkapkan bagaimana perancang bahasa menggunakan trik cerdas untuk mencegah pengembang secara tidak sengaja bergantung pada detail implementasi.
Solusi Kreatif Go untuk Mencegah Ketergantungan yang Tidak Disengaja
Go mengambil pendekatan yang tidak biasa untuk mencegah pengembang bergantung pada urutan iterasi map. Bahasa ini sengaja mengacak urutan setiap kali Anda melakukan iterasi melalui map. Ini berarti map yang sama akan mengembalikan kunci dalam urutan yang berbeda di beberapa iterasi, memaksa pengembang untuk menulis kode yang tidak bergantung pada urutan tertentu.
Implementasinya sangat efisien. Daripada membuat salinan memori yang mahal, Go memilih bucket awal secara acak, melakukan iterasi melalui bucket dalam urutan normal sambil memutar, dan menghasilkan pengaturan item secara acak dalam setiap bucket 8-item. Pendekatan ini mencegah bug umum di mana kode berfungsi selama pengujian tetapi gagal dalam produksi karena pola iterasi yang berbeda.
Catatan teknis: Bucket dalam implementasi map Go adalah wadah kecil yang menyimpan beberapa pasangan key-value sebagai bagian dari struktur hash table.
Detail Implementasi Go Map
Metode Randomisasi:
- Memilih bucket awal secara acak
- Melakukan iterasi melalui bucket secara berurutan (dengan wrapping around)
- Menghasilkan permutasi acak dari 0-7 untuk item dalam setiap bucket
- Tidak memerlukan overhead memori O(n)
Karakteristik Performa:
- Kompleksitas ruang O(1) untuk randomisasi
- Overhead waktu minimal selama iterasi
- Mencegah ketergantungan urutan yang tidak disengaja
Perjalanan Berlawanan Python dengan Pengurutan Dictionary
Python mengambil jalur yang benar-benar berbeda dengan dictionary-nya. Awalnya, CPython mempertahankan urutan penyisipan sebagai efek samping yang tidak disengaja dari implementasi baru dalam versi 3.6. Begitu banyak pengembang mulai bergantung pada perilaku ini sehingga Python secara resmi menjadikannya bagian dari spesifikasi bahasa dalam versi 3.7.
Ini merupakan kasus klasik Hukum Hyrum dalam tindakan. Apa yang dimulai sebagai detail implementasi menjadi fitur yang sekarang diandalkan oleh jutaan program. Tim Python menyadari bahwa merusak perilaku ini akan menyebabkan masalah yang meluas, jadi mereka merangkulnya.
Timeline Evolusi Dictionary Python
Python 3.6: Dictionary CPython mulai mempertahankan urutan penyisipan sebagai detail implementasi Python 3.7: Pemeliharaan urutan penyisipan menjadi bagian dari spesifikasi bahasa resmi Alasan: Terlalu banyak pengguna yang mulai bergantung pada perilaku pengurutan Dampak: Yang dimulai sebagai detail implementasi menjadi fitur bahasa yang dijamin
Pendekatan Industri Perbankan terhadap Keandalan
Sistem keuangan memberikan perspektif menarik lainnya tentang mengelola ekspektasi pengguna. Jaringan perbankan telah menangani tantangan pengiriman pesan selama puluhan tahun menggunakan proses rekonsiliasi. Ketika komunikasi terputus antara bank, mereka tidak hanya mencoba ulang pesan - mereka memiliki sistem yang rumit untuk memastikan kedua belah pihak setuju tentang transaksi apa yang benar-benar terjadi.
Pendekatan ini mengakui bahwa pengiriman sekali yang sempurna tidak mungkin dalam sistem terdistribusi, tetapi menciptakan solusi yang mencapai hasil praktis yang sama melalui koordinasi yang hati-hati dan pengenal transaksi yang unik.
Jaminan Pengiriman Pesan Perbankan
Opsi Standar:
- "Paling banyak sekali" - kemungkinan terjadi kehilangan pesan
- "Setidaknya sekali" - kemungkinan terjadi duplikasi pesan
- "Tepat sekali" - tidak mungkin dijamin dalam sistem terdistribusi
Solusi Perbankan:
- Menggunakan standar rekonsiliasi ISO 20022
- Menerapkan pengenal transaksi unik untuk idempotency
- Mengimplementasikan pengiriman pesan bolak-balik hingga kedua belah pihak sepakat
- Digunakan oleh SWIFT , FedNow , FedWire , dan sistem di ~70 negara
Implikasi Keamanan dan Pengujian
Diskusi komunitas mengungkapkan bagaimana prinsip-prinsip ini meluas melampaui desain API sederhana. Sistem keamanan bandara menyuntikkan ancaman palsu ke dalam pemindai sinar-X untuk menjaga operator tetap waspada, karena ancaman nyata sangat jarang sehingga pekerja mungkin menjadi lengah. Demikian pula, beberapa menyarankan bahwa mobil self-driving yang memerlukan pemantauan manusia mungkin perlu sesekali meminta pengambilalihan yang tidak perlu untuk memastikan pengemudi tetap terlibat.
Untuk mobil self-driving, jika harus dipantau, maka Anda mungkin perlu mobil secara acak meminta pengemudi untuk mengambil alih, meskipun itu tidak perlu. Atau secara acak tampak membuat kesalahan, untuk melihat apakah pengguna bereaksi.
Tantangan untuk Perancang API
Contoh-contoh ini menyoroti ketegangan yang berkelanjutan antara ekspektasi pengguna dan realitas teknis. Sementara beberapa berpendapat bahwa bergantung pada perilaku yang tidak terdokumentasi merupakan praktik rekayasa yang buruk, kenyataannya adalah ketergantungan seperti itu sering muncul secara tidak sengaja. Seorang pengembang menulis kode yang berfungsi, mengirimkannya, dan baru kemudian menemukan bahwa itu bergantung pada timing atau urutan tertentu yang tidak dijamin.
Praktik pengembangan modern semakin mengenali tantangan ini. Beberapa tim sekarang memperkenalkan kekacauan terkontrol ke dalam sistem mereka - sengaja mengubah perilaku yang tidak dijamin antara rilis untuk mencegah pengguna menjadi terlalu nyaman dengan detail implementasi.
Diskusi menunjukkan bagaimana Hukum Hyrum bukan hanya observasi akademis tetapi tantangan praktis yang membentuk bagaimana kita merancang bahasa pemrograman, API, dan sistem kompleks. Baik melalui randomisasi Go, perubahan spesifikasi Python, atau proses rekonsiliasi perbankan, sistem yang sukses harus memperhitungkan kesenjangan antara apa yang mereka janjikan dan apa yang sebenarnya diandalkan pengguna.
Referensi: Hyrum's Law