Pandangan John Carmack tentang variabel yang dapat diubah
(twitter.com/id_aa_carmack)- John Carmack membagikan pandangan pribadinya tentang penggunaan variabel yang dapat diubah (mutable variable)
- Ia menyebut bahwa saat menggunakan Python, ia jadi cenderung mengabaikan prinsip single assignment, dan mengatakan bahwa dirinya sendiri perlu waspada terhadap hal itu
- Ia menekankan bahwa selain perhitungan berulang dalam loop, penugasan ulang atau pembaruan variabel sebaiknya dihindari
- Jika semua tahap perhitungan antara tetap tersimpan, hal itu membantu saat debugging, dan dapat mencegah masalah ketika nilai sebelumnya tidak sengaja digunakan saat memindahkan blok kode
- Ia menjelaskan bahwa di C/C++, merupakan kebiasaan yang baik untuk mendeklarasikan hampir semua variabel sebagai
constpada saat inisialisasi - Terakhir, ia menegaskan harapannya bahwa "mutable seandainya menjadi keyword", sehingga immutability menjadi nilai default
1 komentar
Komentar Hacker News
Setelah memakai Clojure selama 2 tahun, terasa sangat sulit menjelaskan kejernihan yang diberikan immutability kepada developer lain
Orang yang terbiasa dengan pola pikir menghasilkan efek lewat perubahan state sulit memahaminya sebelum mengalaminya sendiri
Misalnya jika ditulis seperti
x = 7; x = x + 3; x = x / 2, menukar urutannya tidak menimbulkan error tetapi hasilnya berubahSebaliknya, jika memakai variabel baru seperti
x1,x2, urutan yang salah akan memunculkan error dan membuat masalahnya terlihat jelasPada akhirnya, single assignment adalah cara untuk mengekspresikan ketergantungan ini secara eksplisit
Meski dijelaskan kepada rekan yang belum pernah memakai bahasa fungsional betapa mudah diuji dan rapi pola pikir yang berpusat pada fungsi, mereka tetap sulit merasakannya
Python sulit dipakai untuk menulis gaya fungsional dengan cara yang enak dibaca, dan JS terasa malah lebih baik
Pada akhirnya, hanya developer yang penasaran yang akan mencoba bahasa seperti Clojure
Fungsi tidak perlu mengetahui state luar, dan pihak luar juga tidak perlu mengetahui bagian dalam fungsi
Tanpa mengetahui keseluruhan state program, kita bisa menguji atau men-debug fungsi tertentu secara terpisah
Menarik melihat komunitas Haskell pada akhirnya mencoba menemukan kembali mutability di dalam type system
Intinya adalah mengendalikan side effect dengan biaya serendah mungkin
Haskell punya hambatan masuk tinggi karena type system-nya, dan F# terlalu kompromistis sehingga akhirnya saya menulis kode dengan sintaks C#
Berkat homoiconicity dan struktur data Clojure yang kuat, konsep “bekerja dengan nilai” untuk pertama kalinya terasa benar-benar jelas
Saya mungkin tidak akan memakainya secara profesional, tetapi untuk orang yang belum punya pengalaman dengan bahasa fungsional atau Lisp, saya sangat ingin merekomendasikannya
Saya berharap variabel pada dasarnya immutable dan semuanya adalah expression
Tapi kenyataannya, sebagai developer Clojure saya sedang menderita karena invasi Python
Sekarang saya sedang menderita karena invasi TypeScript, jadi saya sangat paham
Pendekatan ini sangat berguna untuk membatasi ruang lingkup perubahan
Tidak perlu terseret dalam perang suku antarbahasa
Di era peningkatan produktivitas, batas-batas seperti itu tidak lagi berarti
Saya merekomendasikan tulisan Don’t Call Yourself a Programmer
Saya berusaha meminimalkan reassignment variabel, tetapi kadang memakai variable shadowing
Saya suka pola seperti
result = result.process()karena ringkasMisalnya jika
process()adalah fungsi validasi, bisa jadi tidak jelas pada titik mana nilainya sudah diprosesKarena itu, lebih baik membedakan state dengan nama yang jelas
Contoh:
result = x |> foo |> bar |> bazatau(-> x foo bar baz)result.process()? Sebenarnya result yang mana dan process yang seperti apa?”Orang yang membaca kode nanti akan bingung
Istilah “variabel(variable)” sendiri selalu terasa mengganjal
Kalau immutable, kenapa disebut variable?
Di Rust, perubahan hanya bisa dilakukan jika dinyatakan eksplisit dengan
mutSebaliknya, di C harus memakai preprocessor untuk membuat konstanta, sehingga membingungkan
xmenerima nilai yang berbeda di setiap pemanggilan, jadi itu sendiri adalah nilai yang berubahWalau tidak ada reassignment, itu tetap bisa disebut variabel
Pemrograman mengambil konsep ini apa adanya
Konstanta(constant) memiliki nilai yang sama di semua eksekusi
Lihat Variable (mathematics)
Akan bagus jika IDE bisa menandai secara visual apakah sebuah variabel pernah diubah
Misalnya, variabel yang diubah cukup diberi penanda kecil
Jika sebisa mungkin memakai
final, kode jadi lebih mudah dibaca dan dipeliharaIDE sebaiknya memberi peringatan, dan hanya mengizinkan perubahan jika benar-benar diperlukan
Seperti pembahasan set vs list oleh Rich Hickey, kita harus memilih struktur yang mengekspresikan makna dengan jelas
Dulu saya pernah mengerjakan proyek yang menerapkan immutability secara ketat demi thread safety
Hasilnya kode jadi mudah dibaca, dan lebih mudah melacak apa yang bisa berubah
Sejak itu saya menjadi penggemar berat immutability
Setelah bekerja di codebase Haskell yang besar lalu kembali ke C, saya jadi merasa seharusnya immutability menjadi default
constterasa belum cukupUntuk mengubah sesuatu harus memakai pointer, sedangkan di C++ argumen bisa diubah hanya lewat pemanggilan fungsi, sehingga kurang transparan
Saya setuju dengan pendapat bahwa “hampir semua variabel sebaiknya dideklarasikan sebagai const”
Rust layak disebut di sini
Saya membayangkan sintaks di mana immutable menjadi default, dan mutable hanya diizinkan di dalam blok tertentu
Misalnya seperti blok
withdi PythonSetelah keluar dari blok, semuanya kembali immutable
Kalau melihat borrow checker Rust, kita bisa tahu betapa rumit konsep ini
Ada ungkapan “State is the enemy”
Semakin banyak state, semakin bertambah secara eksponensial kondisi yang harus diuji
Immutability adalah cara untuk mencegah ledakan state seperti ini
Separation of Church and State