PHP ਤੋਂ Go ਤੱਕ: ਮੈਨੂੰ ਸਭ ਤੋਂ ਵੱਧ ਸਮਾਂ ਕਿਸ ਚੀਜ਼ ਨੂੰ ਬਦਲਣ ਵਿੱਚ ਲੱਗਿਆ

ਮੈਂ ਸੱਤ ਸਾਲਾਂ ਤੱਕ PHP ਲਿਖੀ। ਉਨ੍ਹਾਂ ਵਿੱਚੋਂ ਪੰਜ ਸਾਲ ਮੈਂ Laravel ਦੀ ਵਰਤੋਂ ਕੀਤੀ। ਜਦੋਂ ਮੈਂ Laravel monolith ਤੋਂ microservices ਵਿੱਚ ਮਾਈਗ੍ਰੇਸ਼ਨ ਦੀ ਅਗਵਾਈ ਕਰਨ ਲਈ Go ਵੱਲ ਵਧਿਆ, ਤਾਂ ਮੈਂ ਕੋਈ ਟਿਊਟੋਰਿਅਲ ਲੈ ਕੇ ਨਹੀਂ ਆਇਆ ਸੀ। ਮੈਂ PHP ਦੀਆਂ ਇੱਕ ਦਹਾਕੇ ਪੁਰਾਣੀਆਂ ਆਦਤਾਂ ਲੈ ਕੇ ਆਇਆ ਸੀ।

ਸਿੰਟੈਕਸ (syntax) ਸਿੱਖਣਾ ਆਸਾਨ ਸੀ। ਤੁਸੀਂ ਇੱਕ ਦੁਪਹਿਰ ਵਿੱਚ Go ਨੂੰ ਪੜ੍ਹ ਸਕਦੇ ਹੋ। ਮੁਸ਼ਕਲ ਹਿੱਸਾ ਇਹ ਸੀ ਕਿ ਮੈਂ ਕੋਡ ਬਾਰੇ ਜਿਸ ਤਰ੍ਹਾਂ ਸੋਚਦਾ ਸੀ, ਉਸ ਨੂੰ ਭੁਲਾਉਣਾ।

ਇੱਥੇ ਉਹ ਮਾਨਸਿਕ ਤਬਦੀਲੀਆਂ ਹਨ ਜਿਨ੍ਹਾਂ ਨੂੰ ਮਾਸਟਰ ਕਰਨ ਵਿੱਚ ਮੈਨੂੰ ਮਹੀਨੇ ਲੱਗੇ:

  • Error Handling PHP ਵਿੱਚ, ਮੈਂ try/catch ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਸੀ। Errors ਅਕਸਰ ਅਦਿੱਖ ਰੂਪ ਵਿੱਚ ਇੱਕ ਗਲੋਬਲ ਹੈਂਡਲਰ ਤੱਕ ਪਹੁੰਚ ਜਾਂਦੀਆਂ ਸਨ। Go ਵਿੱਚ, errors ਇੱਕ value ਹਨ। ਇੱਕ function ਆਪਣੀ ਆਖਰੀ value ਵਜੋਂ error ਰਿਟਰਨ ਕਰਦਾ ਹੈ। ਤੁਹਾਨੂੰ ਉਸ ਨੂੰ ਉੱਥੇ ਹੀ ਸੰਭਾਲਣਾ ਪੈਂਦਾ ਹੈ। ਸ਼ੁਰੂ ਵਿੱਚ, ਇਹ ਵਾਧੂ ਕੰਮ ਵਾਂਗ ਲੱਗਿਆ। ਬਾਅਦ ਵਿੱਚ, ਮੈਨੂੰ ਅਹਿਸਾਸ ਹੋਇਆ ਕਿ ਇਹ ਅਸਫਲਤਾ ਨੂੰ ਦਿਖਾਈ ਦੇਣਯੋਗ ਬਣਾਉਂਦਾ ਹੈ। ਜਦੋਂ ਕੋਈ service ਫੇਲ੍ਹ ਹੁੰਦੀ ਹੈ, ਤਾਂ error message ਇੱਕ ਨਿਸ਼ਾਨ (breadcrumb trail) ਵਾਂਗ ਕੰਮ ਕਰਦਾ ਹੈ। ਇਹ ਤੁਹਾਨੂੰ ਬਿਨਾਂ ਕਿਸੇ ਵੱਡੇ stack trace ਦੇ ਬਿਲਕੁਲ ਦੱਸਦਾ ਹੈ ਕਿ ਅਸਫਲਤਾ ਕਿੱਥੇ ਹੋਈ ਸੀ।

  • Memory and State PHP ਇੱਕ shared-nothing ਮਾਡਲ ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ। ਹਰ request ਇੱਕ ਸਾਫ਼ ਸਲੇਟ (clean slate) ਨਾਲ ਸ਼ੁਰੂ ਹੁੰਦੀ ਹੈ। Memory leaks ਘੱਟ ਮਾਇਨੇ ਰੱਖਦੇ ਹਨ ਕਿਉਂਕਿ request ਤੋਂ ਬਾਅਦ process ਖਤਮ ਹੋ ਜਾਂਦੀ ਹੈ। Go ਵੱਖਰਾ ਹੈ। Process ਹਜ਼ਾਰਾਂ requests ਲਈ ਜਿਉਂਦੀ ਰਹਿੰਦੀ ਹੈ। ਇਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਇੱਕ package-level variable ਹਰ request ਵਿੱਚ ਸਾਂਝਾ ਹੁੰਦਾ ਹੈ। ਜੇਕਰ ਦੋ requests ਇੱਕੋ ਸਮੇਂ ਕਿਸੇ map ਵਿੱਚ ਲਿਖਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੀਆਂ ਹਨ, ਤਾਂ ਪੂਰਾ ਪ੍ਰੋਗਰਾਮ ਕ੍ਰੈਸ਼ ਹੋ ਜਾਂਦਾ ਹੈ। Go ਵਿੱਚ, concurrency ਤੁਹਾਡੇ ਹੱਥ ਵਿੱਚ ਹੁੰਦੀ ਹੈ। ਚੀਜ਼ਾਂ ਨੂੰ ਸੁਰੱਖਿਅਤ ਰੱਖਣ ਲਈ ਤੁਹਾਨੂੰ race detector ਵਰਗੇ ਟੂਲਸ ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਪੈਂਦੀ ਹੈ।

  • The Role of Context PHP ਵਿੱਚ, request ਹੀ ਸੀਮਾ (boundary) ਹੁੰਦੀ ਹੈ। ਜਦੋਂ request ਖਤਮ ਹੁੰਦੀ ਹੈ, ਤਾਂ ਸਭ ਕੁਝ ਰੁਕ ਜਾਂਦਾ ਹੈ। Go ਵਿੱਚ, ਕੁਝ ਵੀ ਆਪਣੇ ਆਪ ਨਹੀਂ ਰੁਕਦਾ। ਜੇਕਰ ਕੋਈ client ਡਿਸਕਨੈਕਟ ਹੋ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਤੁਹਾਡੀਆਂ goroutines ਚੱਲਦੀਆਂ ਰਹਿ ਸਕਦੀਆਂ ਹਨ ਅਤੇ resources ਬਰਬਾਦ ਕਰ ਸਕਦੀਆਂ ਹਨ। ਤੁਹਾਨੂੰ ਆਪਣੇ ਕੋਡ ਰਾਹੀਂ cancellation signals ਭੇਜਣ ਲਈ context.Context ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਪੈਂਦੀ ਹੈ। ਇਹ ਉਹ ਰੀੜ੍ਹ ਦੀ ਹੱਡੀ ਹੈ ਜੋ ਭਾਰੀ ਲੋਡ ਦੇ ਹੇਠਾਂ ਤੁਹਾਡੀ service ਨੂੰ ਸਿਹਤਮੰਦ ਰੱਖਦੀ ਹੈ।

  • Composition Over Inheritance Laravel ਬਹੁਤ ਜ਼ਿਆਦਾ base classes ਨੂੰ extend ਕਰਨ 'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ। ਤੁਸੀਂ behavior ਨੂੰ inherit ਕਰਕੇ features ਜੋੜਦੇ ਹੋ। Go ਵਿੱਚ class inheritance ਨਹੀਂ ਹੁੰਦੀ। ਇਹ interfaces ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ ਜੋ ਅਸਪਸ਼ਟ (implicitly) ਤੌਰ 'ਤੇ ਪੂਰੇ ਕੀਤੇ ਜਾਂਦੇ ਹਨ। ਤੁਸੀਂ ਜੋ ਚਾਹੁੰਦੇ ਹੋ, ਉਸ ਨੂੰ ਉੱਥੇ ਹੀ ਪਰਿਭਾਸ਼ਿਤ ਕਰਦੇ ਹੋ ਜਿੱਥੇ ਤੁਸੀਂ ਇਸਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋ। ਇਹ ਕੋਡ ਨੂੰ ਟੈਸਟ ਕਰਨਾ ਅਤੇ ਬਦਲਣਾ ਆਸਾਨ ਬਣਾਉਂਦਾ ਹੈ। ਚੰਗਾ Go ਲਿਖਣ ਲਈ ਮੈਨੂੰ ਹਰ ਚੀਜ਼ ਨੂੰ extend ਕਰਨ ਦੀ ਆਪਣੀ ਆਦਤ ਨੂੰ ਖਤਮ ਕਰਨਾ ਪਿਆ।

  • Clarity Over Cleverness PHP magic methods ਅਤੇ dynamic typing ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦਾ ਹੈ। ਤੁਸੀਂ ਚਲਾਕ ਅਤੇ ਪ੍ਰਭਾਵਸ਼ਾਲੀ ਕੋਡ ਲਿਖ ਸਕਦੇ ਹੋ। Go ਜਾਣਬੁੱਝ ਕੇ ਬੋਰਿੰਗ ਰੱਖਿਆ ਗਿਆ ਹੈ। Compiler ਤੁਹਾਨੂੰ standard formatting ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਮਜਬੂਰ ਕਰਦਾ ਹੈ ਅਤੇ ਅਣਵਰਤੇ variables ਨੂੰ ਰੋਕਦਾ ਹੈ। ਸ਼ੁਰੂ ਵਿੱਚ, ਇਹ ਪਾਬੰਦੀਸ਼ੁਦਾ ਲੱਗਿਆ। ਹੁਣ, ਮੈਂ ਇਸਦੀ ਕਦਰ ਕਰਦਾ ਹਾਂ। Go ਕੋਡ ਲਿਖਣ ਵਾਲੇ ਲਈ ਨਹੀਂ, ਸਗੋਂ ਕੋਡ ਪੜ੍ਹਨ ਵਾਲੇ ਵਿਅਕਤੀ ਲਈ ਅਨੁਕੂਲ (optimize) ਬਣਾਇਆ ਗਿਆ ਹੈ। ਬੋਰਿੰਗ ਕੋਡ ਨੂੰ ਕਿਸੇ ਘਟਨਾ (incident) ਦੌਰਾਨ ਰਾਤ ਦੇ 2 ਵਜੇ ਠੀਕ ਕਰਨਾ ਆਸਾਨ ਹੁੰਦਾ ਹੈ।

ਨਵੀਂ ਭਾਸ਼ਾ ਸਿੱਖਣ ਦਾ ਮੁਸ਼ਕਲ ਹਿੱਸਾ ਨਵਾਂ syntax ਨਹੀਂ ਹੈ। ਇਹ ਉਹ ਪੁਰਾਣੀਆਂ ਧਾਰਨਾਵਾਂ ਹਨ ਜੋ ਤੁਸੀਂ ਆਪਣੇ ਨਾਲ ਲੈ ਕੇ ਚੱਲਦੇ ਹੋ।

ਸਰੋਤ: https://dev.to/econ__11/from-php-to-go-what-took-me-longest-to-rewire-2nfn