Daripada PHP ke Go: Apa yang Paling Lama Mengambil Masa untuk Mengubah Cara Fikir
Saya menulis PHP selama tujuh tahun. Saya menggunakan Laravel selama lima tahun daripadanya. Apabila saya beralih ke Go untuk mengetuai migrasi daripada monolit Laravel kepada mikroperkhidmatan (microservices), saya tidak datang dengan tutorial. Saya datang dengan tabiat PHP selama sedekad.
Mempelajari sintaks adalah mudah. Anda boleh membaca Go dalam satu petang. Bahagian yang sukar adalah membuang cara lama saya berfikir tentang kod.
Berikut adalah anjakan mental yang mengambil masa berbulan-bulan untuk saya kuasai:
Pengendalian Ralat (Error Handling) Dalam PHP, saya menggunakan try/catch. Ralat sering bergerak secara tidak kelihatan ke pengendali global. Dalam Go, ralat adalah nilai (values). Sebuah fungsi mengembalikan ralat sebagai nilai terakhirnya. Anda mesti mengendalikannya di situ juga. Pada mulanya, ini terasa seperti kerja tambahan. Kemudian, saya menyedari ia menjadikan kegagalan lebih jelas. Apabila sesuatu perkhidmatan gagal, mesej ralat bertindak sebagai jejak petunjuk (breadcrumb trail). Ia memberitahu anda dengan tepat di mana kegagalan berlaku tanpa memerlukan stack trace yang besar.
Memori dan Keadaan (Memory and State) PHP menggunakan model 'shared-nothing'. Setiap permintaan bermula dengan keadaan yang bersih. Kebocoran memori (memory leaks) kurang memberi kesan kerana proses tersebut mati selepas permintaan tamat. Go adalah berbeza. Proses tersebut kekal hidup untuk beribu-ribu permintaan. Ini bermakna pemboleh ubah pada tahap pakej (package-level variable) dikongsi merentasi setiap permintaan. Jika dua permintaan cuba menulis ke dalam
mappada masa yang sama, keseluruhan program akan terhenti (crash). Dalam Go, anda menguruskan konkurensi (concurrency) sendiri. Anda mesti menggunakan alatan sepertirace detectoruntuk memastikan semuanya selamat.Peranan Konteks (The Role of Context) Dalam PHP, permintaan adalah sempadannya. Apabila permintaan tamat, semuanya berhenti. Dalam Go, tiada apa yang berhenti secara automatik. Jika klien terputus sambungan, goroutine anda mungkin terus berjalan dan membazirkan sumber. Anda mesti menggunakan
context.Contextuntuk menghantar isyarat pembatalan melalui kod anda. Ia adalah tulang belakang yang memastikan perkhidmatan anda kekal sihat di bawah bebanan berat.Komposisi Melebihi Pewarisan (Composition Over Inheritance) Laravel sangat bergantung pada pengembangan kelas asas (extending base classes). Anda menambah ciri dengan mewarisi tingkah laku. Go tidak mempunyai pewarisan kelas. Ia menggunakan antara muka (interfaces) yang dipenuhi secara tersirat (implicitly). Anda mentakrifkan apa yang anda perlukan di mana anda menggunakannya. Ini menjadikan kod lebih mudah untuk diuji dan ditukar. Saya terpaksa membuang naluri saya untuk mengembangkan (extend) segalanya bagi menulis kod Go yang baik.
Kejelasan Melebihi Kebijaksanaan (Clarity Over Cleverness) PHP membenarkan kaedah ajaib (magic methods) dan pengetikan dinamik (dynamic typing). Anda boleh menulis kod yang bijak dan ekspresif. Go sengaja dibuat membosankan. Kompilator memaksa anda menggunakan format standard dan menghalang penggunaan pemboleh ubah yang tidak digunakan. Pada mulanya, ini terasa menyekat. Sekarang, saya menghargainya. Go dioptimumkan untuk orang yang membaca kod, bukan orang yang menulisnya. Kod yang membosankan mudah diperbaiki pada jam 2 pagi semasa berlakunya insiden.
Bahagian yang sukar dalam mempelajari bahasa baharu bukanlah sintaks baharu. Ia adalah andaian lama yang anda bawa bersama anda.
Sumber: https://dev.to/econ__11/from-php-to-go-what-took-me-longest-to-rewire-2nfn
