PHP कडून Go कडे: मला सर्वात जास्त वेळ कशात लागला
मी सात वर्षे PHP मध्ये कोडिंग केले. त्यापैकी पाच वर्षे मी Laravel वापरले. जेव्हा मी Laravel monolith कडून microservices कडे स्थलांतर करण्यासाठी Go कडे वळलो, तेव्हा माझ्याकडे कोणतेही ट्युटोरियल नव्हते. माझ्याकडे दशकातील PHP च्या सवयी होत्या.
सिंटॅक्स (syntax) शिकणे सोपे होते. तुम्ही एका दुपारी Go वाचायला शिकू शकता. कठीण भाग म्हणजे कोडबद्दलच्या माझ्या जुन्या विचारसरणीला विसरणे (unlearning) हा होता.
हे ते मानसिक बदल आहेत जे आत्मसात करण्यासाठी मला महिने लागले:
Error Handling PHP मध्ये, मी try/catch वापरत असे. एरर्स (Errors) अनेकदा अदृश्यपणे ग्लोबल हँडलरकडे (global handler) जात असत. Go मध्ये, एरर्स ही व्हॅल्यूज (values) असतात. एक फंक्शन त्याच्या शेवटच्या व्हॅल्यू म्हणून एरर रिटर्न करते. तुम्हाला तिथेच ती हाताळावी लागते. सुरुवातीला, हे अतिरिक्त काम वाटले. नंतर मला समजले की यामुळे त्रुटी (failure) स्पष्टपणे दिसून येते. जेव्हा एखादी सर्विस फेल होते, तेव्हा एरर मेसेज एका खुणांच्या पाऊलखुणांप्रमाणे (breadcrumb trail) काम करतो. मोठ्या स्टॅक ट्रेसशिवाय (stack trace) त्रुटी नेमकी कुठे झाली हे तो तुम्हाला सांगतो.
Memory आणि State PHP 'shared-nothing' मॉडेल वापरते. प्रत्येक रिक्वेस्ट एका नवीन सुरुवातीने (clean slate) सुरू होते. मेमरी लीक्स (Memory leaks) फारसे महत्त्वाचे नसतात कारण रिक्वेस्ट संपल्यानंतर प्रोसेस संपते. Go वेगळे आहे. प्रोसेस हजारो रिक्वेस्टसाठी जिवंत राहते. याचा अर्थ असा की पॅकेज-लेव्हल व्हेरिएबल (package-level variable) प्रत्येक रिक्वेस्टमध्ये शेअर केले जाते. जर दोन रिक्वेस्ट्सने एकाच वेळी एका map मध्ये लिहिण्याचा प्रयत्न केला, तर संपूर्ण प्रोग्राम क्रॅश होतो. Go मध्ये, कॉनकरन्सी (concurrency) तुमच्या नियंत्रणात असते. गोष्टी सुरक्षित ठेवण्यासाठी तुम्हाला race detector सारखी साधने वापरावी लागतात.
Context ची भूमिका PHP मध्ये, रिक्वेस्ट हीच सीमा (boundary) असते. जेव्हा रिक्वेस्ट संपते, तेव्हा सर्व काही थांबते. Go मध्ये, काहीही आपोआप थांबत नाही. जर क्लायंट डिस्कनेक्ट झाला, तर तुमचे goroutines चालू राहू शकतात आणि रिसोर्सेस वाया घालवू शकतात. तुमच्या कोडमधून कॅन्सलेशन सिग्नल्स (cancellation signals) पाठवण्यासाठी तुम्हाला
context.Contextवापरावे लागते. हे तुमच्या सर्विसला जास्त लोड असतानाही सक्षम ठेवण्याचे कणा (spine) आहे.Composition Over Inheritance Laravel बेस क्लासेस (base classes) एक्सटेंड करण्यावर मोठ्या प्रमाणावर अवलंबून असते. तुम्ही बिहेव्हियर इनहेरिट (inheriting behavior) करून फीचर्स जोडता. Go मध्ये क्लास इनहेरिटन्स (class inheritance) नसते. ते इंटरफेसेस (interfaces) वापरते जे इम्प्लिसिटली (implicitly) पूर्ण केले जातात. तुम्हाला जे हवे आहे ते तुम्ही जिथे वापरता तिथेच डिफाइन करता. यामुळे कोड टेस्ट करणे आणि बदलणे सोपे होते. चांगले Go कोड लिहिण्यासाठी मला प्रत्येक गोष्ट एक्सटेंड करण्याची माझी सवय सोडावी लागली.
Clarity Over Cleverness PHP मॅजिक मेथड्स (magic methods) आणि डायनॅमिक टायपिंगला (dynamic typing) परवानगी देते. तुम्ही हुशार आणि एक्सप्रेसिव्ह (expressive) कोड लिहू शकता. Go मुद्दामहून 'बोरिंग' (boring) आहे. कंपायलर तुम्हाला स्टँडर्ड फॉरमॅटिंग वापरण्यास भाग पाडतो आणि न वापरलेले व्हेरिएबल्स रोखतो. सुरुवातीला, हे बंधनकारक वाटले. आता, मी त्याचे महत्त्व जाणतो. Go हे कोड लिहिणाऱ्या व्यक्तीसाठी नाही, तर तो वाचणाऱ्या व्यक्तीसाठी ऑप्टिमाइझ केलेले आहे. एखादी समस्या (incident) आल्यावर रात्री २ वाजता 'बोरिंग' कोड दुरुस्त करणे सोपे असते.
नवीन भाषा शिकण्याचा कठीण भाग नवीन सिंटॅक्स नसतो. तर तुमच्यासोबत असलेल्या जुन्या गृहितकांचा (assumptions) तो असतो.
Source: https://dev.to/econ__11/from-php-to-go-what-took-me-longest-to-rewire-2nfn
