PHP'den Go'ya: Zihniyetimi Değiştirmekte En Çok Zorlandığım Noktalar
Yedi yıl boyunca PHP yazdım. Bunun beş yılında Laravel kullandım. Bir Laravel monolitinden mikroservislere geçiş sürecine liderlik etmek için Go'ya geçtiğimde, yanımda bir eğitim kılavuzu getirmedim. Yanımda on yıllık PHP alışkanlıklarımı getirdim.
Sözdizimini (syntax) öğrenmek kolaydı. Go'yu bir öğleden sonra okuyup anlayabilirsiniz. Zor olan kısım, kod hakkındaki düşünce biçimimi terk etmekti.
Ustalık kazanmam aylarımı alan zihniyet değişimleri şunlar:
Hata Yönetimi (Error Handling) PHP'de
try/catchkullanırdım. Hatalar genellikle görünmez bir şekilde global bir işleyiciye (handler) giderdi. Go'da ise hatalar birer değerdir (value). Bir fonksiyon, hatayı son değer olarak döndürür. Onu tam orada ele almalısınız. İlk başta bu, fazladan iş gibi geldi. Daha sonra, bunun hatayı görünür kıldığını fark ettim. Bir servis hata verdiğinde, hata mesajı bir iz (breadcrumb trail) görevi görür. Devasa bir stack trace olmadan hatanın tam olarak nerede gerçekleştiğini size söyler.Bellek ve Durum (Memory and State) PHP, "shared-nothing" (paylaşımsız) bir model kullanır. Her istek temiz bir sayfa ile başlar. İşlem (process) istekten sonra sona erdiği için bellek sızıntıları (memory leaks) daha az önem taşır. Go ise farklıdır. İşlem, binlerce istek boyunca hayatta kalır. Bu, paket düzeyindeki bir değişkenin her istek arasında paylaşıldığı anlamına gelir. Eğer iki istek aynı anda bir
map'e yazmaya çalışırsa, tüm program çöker. Go'da eşzamanlılık (concurrency) sizin sorumluluğunuzdadır. Her şeyi güvenli tutmak içinrace detectorgibi araçlar kullanmalısınız.Context'in Rolü PHP'de sınır, istektir (request). İstek sona erdiğinde her şey durur. Go'da ise hiçbir şey otomatik olarak durmaz. Eğer bir istemci bağlantıyı keserse,
goroutine'leriniz çalışmaya devam edebilir ve kaynak israfına yol açabilir. İptal sinyallerini kodunuz boyunca iletmek içincontext.Contextkullanmalısınız. Bu, servisinizin ağır yük altında sağlıklı kalmasını sağlayan omurgadır.Kalıtım Yerine Kompozisyon (Composition Over Inheritance) Laravel, temel sınıfları genişletmeye (extending base classes) büyük ölçüde dayanır. Davranışları miras alarak (inheriting) yeni özellikler eklersiniz. Go'da sınıf kalıtımı yoktur. Bunun yerine örtük (implicitly) olarak karşılanan arayüzler (interfaces) kullanır. İhtiyacınız olan şeyi, kullandığınız yerde tanımlarsınız. Bu, kodun test edilmesini ve değiştirilmesini kolaylaştırır. İyi Go kodu yazmak için her şeyi genişletme içgüdümü öldürmem gerekti.
Zekice Olmak Yerine Netlik (Clarity Over Cleverness) PHP, sihirli metodlara (magic methods) ve dinamik tiplemeye izin verir. Zekice ve ifade gücü yüksek kodlar yazabilirsiniz. Go ise kasten "sıkıcıdır". Derleyici (compiler), sizi standart formatlamayı kullanmaya zorlar ve kullanılmayan değişkenleri engeller. İlk başta bu kısıtlayıcı geldi. Şimdi ise buna değer veriyorum. Go, kodu yazan kişi için değil, kodu okuyan kişi için optimize edilmiştir. Sıkıcı kod, bir olay (incident) sırasında gece saat 02:00'de düzeltilmesi kolay olan koddur.
Yeni bir dil öğrenmenin zor kısmı yeni sözdizimi değildir. Yanınızda getirdiğiniz eski varsayımlardır.
Kaynak: https://dev.to/econ__11/from-php-to-go-what-took-me-longest-to-rewire-2nfn
