PHP થી Go સુધી: મને સૌથી વધુ સમય શેના માટે લાગ્યો
મેં સાત વર્ષ સુધી PHP લખ્યું છે. તેમાંથી પાંચ વર્ષ મેં Laravel નો ઉપયોગ કર્યો હતો. જ્યારે હું Laravel મોનોલિથમાંથી માઇક્રોસર્વિસિસમાં સ્થળાંતર (migration) ને દોરી જવા માટે Go પર આવ્યો, ત્યારે હું કોઈ ટ્યુટોરીયલ સાથે નહોતો આવ્યો. હું PHP ની એક દાયકા જૂની આદતો સાથે આવ્યો હતો.
સિન્ટેક્સ (syntax) શીખવું સરળ હતું. તમે એક બપોરે Go વાંચી શકો છો. અઘરો ભાગ એ હતો કે કોડ વિશે હું જે રીતે વિચારતો હતો તે ભૂલીને નવું શીખવું.
અહીં એ માનસિક પરિવર્તનો છે જેને માસ્ટર કરવામાં મને મહિનાઓ લાગ્યા:
Error Handling PHP માં, હું try/catch નો ઉપયોગ કરતો હતો. ભૂલો (errors) ઘણીવાર અદ્રશ્ય રીતે ગ્લોબલ હેન્ડલર સુધી પહોંચતી હતી. Go માં, ભૂલો એ values છે. એક ફંક્શન તેની છેલ્લી વેલ્યુ તરીકે એરર રિટર્ન કરે છે. તમારે તેને ત્યાં જ હેન્ડલ કરવી પડે છે. શરૂઆતમાં, આ વધારાનું કામ લાગતું હતું. પછીથી, મને સમજાયું કે તે નિષ્ફળતાને સ્પષ્ટ બનાવે છે. જ્યારે કોઈ સર્વિસ નિષ્ફળ જાય છે, ત્યારે એરર મેસેજ એક માર્ગદર્શક (breadcrumb trail) તરીકે કામ કરે છે. તે કોઈ મોટા stack trace વગર તમને બરાબર જણાવે છે કે નિષ્ફળતા ક્યાં થઈ હતી.
Memory and State PHP 'shared-nothing' મોડેલનો ઉપયોગ કરે છે. દરેક રિક્વેસ્ટ (request) એક નવી શરૂઆત સાથે થાય છે. મેમરી લીક (memory leaks) ઓછું મહત્વ ધરાવે છે કારણ કે રિક્વેસ્ટ પછી પ્રોસેસ પૂરી થઈ જાય છે. Go અલગ છે. પ્રોસેસ હજારો રિક્વેસ્ટ માટે જીવંત રહે છે. આનો અર્થ એ છે કે પેકેજ-લેવલ વેરિએબલ દરેક રિક્વેસ્ટમાં શેર કરવામાં આવે છે. જો બે રિક્વેસ્ટ એકસાથે મેપ (map) માં લખવાનો પ્રયાસ કરે, તો આખો પ્રોગ્રામ ક્રેશ થઈ જાય છે. Go માં, તમે કન્કરન્સી (concurrency) ના માલિક છો. વસ્તુઓને સુરક્ષિત રાખવા માટે તમારે race detector જેવા સાધનોનો ઉપયોગ કરવો જ પડે છે.
The Role of Context PHP માં, રિક્વેસ્ટ એ સીમા (boundary) છે. જ્યારે રિક્વેસ્ટ પૂરી થાય છે, ત્યારે બધું જ અટકી જાય છે. Go માં, કંઈપણ આપમેળે અટકતું નથી. જો ક્લાયન્ટ ડિસ્કનેક્ટ થઈ જાય, તો તમારા goroutines ચાલુ રહી શકે છે અને રિસોર્સિસનો બગાડ કરી શકે છે. તમારે તમારા કોડમાં કેન્સલેશન સિગ્નલ મોકલવા માટે context.Context નો ઉપયોગ કરવો જ જોઈએ. તે ભારે લોડ હેઠળ તમારી સર્વિસને સ્વસ્થ રાખતી કરોડરજ્જુ સમાન છે.
Composition Over Inheritance Laravel બેઝ ક્લાસિસને એક્સટેન્ડ (extending) કરવા પર ઘણો આધાર રાખે છે. તમે વર્તણૂક વારસામાં મેળવીને (inheriting behavior) ફીચર્સ ઉમેરો છો. Go માં ક્લાસ ઇનહેરિટન્સ (class inheritance) નથી. તે ઇન્ટરફેસ (interfaces) નો ઉપયોગ કરે છે જે ઈમ્પ્લીસીટલી (implicitly) સંતોષાય છે. તમે જેની જરૂર હોય તેને જ્યાં ઉપયોગ કરો છો ત્યાં જ વ્યાખ્યાયિત કરો છો. આનાથી કોડ ટેસ્ટ કરવો અને બદલવો સરળ બને છે. સારું Go લખવા માટે મારે બધું જ એક્સટેન્ડ કરવાની મારી વૃત્તિને છોડવી પડી હતી.
Clarity Over Cleverness PHP મેજિક મેથડ્સ (magic methods) અને ડાયનેમિક ટાઇપિંગની મંજૂરી આપે છે. તમે ચતુર અને અભિવ્યક્ત કોડ લખી શકો છો. Go જાણીજોઈને 'બોરિંગ' રાખવામાં આવ્યું છે. કમ્પાઈલર તમને સ્ટાન્ડર્ડ ફોર્મેટિંગ વાપરવા માટે મજબૂર કરે છે અને વણવપરાયેલા વેરિએબલ્સને અટકાવે છે. શરૂઆતમાં, આ પ્રતિબંધિત લાગતું હતું. હવે, હું તેની કદર કરું છું. Go કોડ લખનાર વ્યક્તિ માટે નહીં, પણ કોડ વાંચનાર વ્યક્તિ માટે ઓપ્ટિમાઇઝ કરવામાં આવ્યું છે. કોઈ ઇન્સિડન્ટ દરમિયાન રાત્રે ૨ વાગ્યે 'બોરિંગ' કોડને સુધારવો સરળ હોય છે.
નવી ભાષા શીખવાનો અઘરો ભાગ નવો સિન્ટેક્સ નથી. તે તમારી સાથે લાવેલી જૂની ધારણાઓ છે.
Source: https://dev.to/econ__11/from-php-to-go-what-took-me-longest-to-rewire-2nfn
