PHP-லிருந்து Go-விற்கு: மாற்றியமைக்க எனக்கு அதிக காலம் எடுத்தவை

நான் ஏழு ஆண்டுகள் PHP பயன்படுத்தினேன். அதில் ஐந்து ஆண்டுகள் Laravel பயன்படுத்தினேன். ஒரு Laravel monolith-லிருந்து microservices-க்கு மாற்றும் பணத்தை வழிநடத்த நான் Go-விற்கு மாறியபோது, என்னிடம் ஒரு பயிற்சிப் புத்தகம் (tutorial) இல்லை. மாறாக, ஒரு தசாப்த கால PHP பழக்கவழக்கங்களோடுதான் வந்தேன்.

அதன் தொடரியலை (syntax) கற்றுக்கொள்வது எளிது. ஒரு மதிய நேரத்திலேயே Go-வை நீங்கள் படித்துவிடலாம். ஆனால், குறியீட்டை (code) நான் அணுகும் முறையை மாற்றிக்கொள்வதுதான் கடினமாக இருந்தது.

நான் கற்றுக்கொள்ள பல மாதங்கள் எடுத்த மனநிலை மாற்றங்கள் இதோ:

  • Error Handling PHP-யில், நான் try/catch பயன்படுத்தினேன். பிழைகள் (errors) பெரும்பாலும் ஒரு global handler-க்குத் தெரியாமலேயே சென்றுவிடும். ஆனால் Go-வில், பிழைகள் என்பவை மதிப்புகள் (values). ஒரு function அதன் கடைசி மதிப்பாக ஒரு error-ஐத் திருப்பித் தரும். நீங்கள் அதை அங்கேயே கையாள வேண்டும். ஆரம்பத்தில், இது கூடுதல் வேலை என்று தோன்றியது. ஆனால் பின்னர், இது தோல்விகளைத் தெளிவாகக் காட்டுகிறது என்பதை உணர்ந்தேன். ஒரு service தோல்வியடையும் போது, அந்த error செய்தி ஒரு வழிகாட்டியாக (breadcrumb trail) செயல்படுகிறது. ஒரு பெரிய stack trace இல்லாமலேயே, தோல்வி சரியாக எங்கு நடந்தது என்பதை அது உங்களுக்குத் துல்லியமாகச் சொல்கிறது.

  • Memory and State PHP ஒரு shared-nothing மாதிரியைப் பயன்படுத்துகிறது. ஒவ்வொரு request-ம் ஒரு புதிய தொடக்கத்துடன் ஆரம்பிக்கிறது. Request முடிந்தவுடன் அந்த process முடிந்துவிடுவதால், memory leaks பெரிய பாதிப்பை ஏற்படுத்துவதில்லை. ஆனால் Go வேறுபட்டது. ஒரு process ஆயிரக்கணக்கான requests-களுக்குத் தொடர்ந்து இயங்கிக்கொண்டே இருக்கும். இதன் பொருள், ஒரு package-level variable அனைத்து request-களுக்கும் பகிரப்படுகிறது என்பதாகும். இரண்டு requests ஒரே நேரத்தில் ஒரு map-இல் எழுத முயன்றால், முழு program-உமே செயலிழந்துவிடும் (crash). Go-வில், concurrency-யை நீங்கள் தான் கையாள வேண்டும். பாதுகாப்பாக இருக்க race detector போன்ற கருவிகளை நீங்கள் பயன்படுத்த வேண்டும்.

  • The Role of Context PHP-யில், request என்பதுதான் எல்லையாகும். Request முடிந்ததும், அனைத்தும் நின்றுவிடும். ஆனால் Go-வில், எதுவும் தானாக நின்றுவிடாது. ஒரு client துண்டிக்கப்பட்டால் (disconnect), உங்கள் goroutines தொடர்ந்து இயங்கிக்கொண்டே இருந்து வளங்களை (resources) வீணாக்கலாம். உங்கள் code வழியாக cancellation signals-களை அனுப்ப context.Context-ஐ நீங்கள் பயன்படுத்த வேண்டும். அதிகப்படியான சுமையின் (heavy load) போதும் உங்கள் service ஆரோக்கியமாக இருக்க இதுவே முதுகெலும்பாக அமைகிறது.

  • Composition Over Inheritance Laravel, base classes-களை extend செய்வதையே பெரிதும் நம்பியுள்ளது. ஒரு behaviour-ஐ inherit செய்வதன் மூலம் நீங்கள் புதிய அம்சங்களைச் சேர்க்கிறீர்கள். ஆனால் Go-வில் class inheritance கிடையாது. அது implicitly பூர்த்தி செய்யப்படும் interfaces-களைப் பயன்படுத்துகிறது. உங்களுக்குத் தேவையானதை நீங்கள் பயன்படுத்தும் இடத்திலேயே வரையறுக்கலாம். இது code-ஐ எளிதாகச் சோதனை செய்யவும் (test) மற்றும் மாற்றவும் (swap) உதவுகிறது. சிறந்த Go code-ஐ எழுத, எல்லாவற்றையும் extend செய்ய வேண்டும் என்ற எனது பழக்கத்தை நான் கைவிட வேண்டியிருந்தது.

  • Clarity Over Cleverness PHP, magic methods மற்றும் dynamic typing-ஐ அனுமதிக்கிறது. நீங்கள் மிகவும் புத்திசாலித்தனமான, வெளிப்பாட்டுத் திறன் கொண்ட (expressive) code-ஐ எழுத முடியும். ஆனால் Go வேண்டுமென்றே சாதாரணமாக (boring) வடிவமைக்கப்பட்டுள்ளது. compiler உங்களை நிலையான formatting-ஐப் பயன்படுத்தக் கட்டாயப்படுத்துகிறது மற்றும் பயன்படுத்தப்படாத variables-களைத் தடுக்கிறது. ஆரம்பத்தில், இது கட்டுப்பாடாகத் தோன்றியது. இப்போது, நான் இதை மதிக்கிறேன். Go, code-ஐ எழுதுபவருக்காக அல்லாமல், அதை வாசிப்பவருக்காகவே மேம்படுத்தப்பட்டுள்ளது. ஒரு அவசரச் சூழலில் (incident) நள்ளிரவு 2 மணிக்குக் கூட, சாதாரணமாக இருக்கும் code-ஐ எளிதாகச் சரிசெய்துவிட முடியும்.

ஒரு புதிய மொழியைக் கற்றுக்கொள்வதில் கடினமான பகுதி அதன் புதிய syntax அல்ல. மாறாக, உங்களுடன் நீங்கள் கொண்டு வரும் பழைய அனுமானங்கள் (assumptions) தான்.

Source: https://dev.to/econ__11/from-php-to-go-what-took-me-longest-to-rewire-2nfn