PHP سے Go تک: مجھے سب سے زیادہ وقت کس چیز کو بدلنے میں لگا

میں نے سات سال تک PHP لکھی۔ ان میں سے پانچ سال میں نے Laravel استعمال کیا۔ جب میں Laravel monolith سے microservices کی طرف منتقلی کی قیادت کرنے کے لیے Go پر منتقل ہوا، تو میں اپنے ساتھ کوئی ٹیوٹوریل نہیں لایا تھا۔ میں اپنے ساتھ PHP کی ایک دہائی پر محیط عادات لے کر آیا تھا۔

سنٹیکس (syntax) سیکھنا آسان تھا۔ آپ ایک دوپہر میں Go پڑھنا سیکھ سکتے ہیں۔ مشکل حصہ یہ تھا کہ میں کوڈ کے بارے میں جس طرح سوچتا تھا، اس سوچ کو بدلنا۔

یہاں وہ ذہنی تبدیلیاں ہیں جنہیں مہارت حاصل کرنے میں مجھے مہینوں لگے:

  • Error Handling PHP میں، میں try/catch استعمال کرتا تھا۔ غلطیاں (errors) اکثر خاموشی سے ایک گلوبل ہینڈلر تک پہنچ جاتی تھیں۔ Go میں، غلطیاں 'values' ہوتی ہیں۔ ایک فنکشن اپنی آخری ویلیو کے طور پر ایک error واپس کرتا ہے۔ آپ کو اسے وہیں سنبھالنا پڑتا ہے۔ شروع میں، یہ اضافی کام محسوس ہوا۔ بعد میں، مجھے احساس ہوا کہ یہ ناکامی کو واضح کرتا ہے۔ جب کوئی سروس فیل ہوتی ہے، تو error میسج ایک نشانیوں کے راستے (breadcrumb trail) کا کام کرتا ہے۔ یہ آپ کو بغیر کسی بڑے stack trace کے بالکل صحیح جگہ بتاتا ہے جہاں ناکامی ہوئی۔

  • Memory and State PHP ایک shared-nothing ماڈل استعمال کرتا ہے۔ ہر ریکویسٹ (request) ایک بالکل نئے آغاز کے ساتھ شروع ہوتی ہے۔ میموری لیکس (memory leaks) کم اہمیت رکھتے ہیں کیونکہ ریکویسٹ کے بعد پروسیس ختم ہو جاتا ہے۔ Go مختلف ہے۔ پروسیس ہزاروں ریکویسٹس کے لیے زندہ رہتا ہے۔ اس کا مطلب ہے کہ ایک package-level variable ہر ریکویسٹ میں شیئر کیا جاتا ہے۔ اگر دو ریکویسٹس ایک ہی وقت میں کسی map میں لکھنے کی کوشش کریں، تو پورا پروگرام کریش ہو جاتا ہے۔ Go میں، کنکرنسی (concurrency) کی ذمہ داری آپ کی ہوتی ہے۔ چیزوں کو محفوظ رکھنے کے لیے آپ کو race detector جیسے ٹولز استعمال کرنے پڑتے ہیں۔

  • The Role of Context PHP میں، ریکویسٹ ہی حد (boundary) ہوتی ہے۔ جب ریکویسٹ ختم ہوتی ہے، تو سب کچھ رک جاتا ہے۔ Go میں، کچھ بھی خود بخود نہیں رکتا۔ اگر کوئی کلائنٹ ڈس کنیکٹ ہو جائے، تو آپ کے goroutines چلتے رہ سکتے ہیں اور وسائل (resources) ضائع کر سکتے ہیں۔ آپ کو اپنے کوڈ میں کینسلشن سگنلز (cancellation signals) بھیجنے کے لیے context.Context استعمال کرنا چاہیے۔ یہ وہ ریڑھ کی ہڈی ہے جو بھاری لوڈ کے دوران آپ کی سروس کو صحت مند رکھتی ہے۔

  • Composition Over Inheritance Laravel زیادہ تر base classes کو extend کرنے پر انحصار کرتا ہے۔ آپ رویوں (behavior) کو ورثے (inherit) میں لے کر فیچرز شامل کرتے ہیں۔ Go میں class inheritance نہیں ہوتی۔ یہ interfaces استعمال کرتا ہے جو مضمناً (implicitly) مکمل ہوتے ہیں۔ آپ جہاں ضرورت ہو وہاں اسے ڈیفائن کرتے ہیں۔ اس سے کوڈ کو ٹیسٹ کرنا اور تبدیل کرنا آسان ہو جاتا ہے۔ اچھا Go لکھنے کے لیے مجھے ہر چیز کو extend کرنے کی اپنی جبلت کو ختم کرنا پڑا۔

  • Clarity Over Cleverness PHP میجک میتھڈز (magic methods) اور ڈائنامک ٹائپنگ کی اجازت دیتا ہے۔ آپ ہوشیار اور پرتاثر کوڈ لکھ سکتے ہیں۔ Go جان بوجھ کر سادہ (boring) رکھا گیا ہے۔ کمپائلر آپ کو معیاری فارمیٹنگ استعمال کرنے پر مجبور کرتا ہے اور غیر استعمال شدہ ویری ایبلز (unused variables) سے روکتا ہے۔ شروع میں، یہ پابندی محسوس ہوئی۔ اب، میں اس کی قدر کرتا ہوں۔ Go کوڈ لکھنے والے کے لیے نہیں بلکہ کوڈ پڑھنے والے کے لیے بہتر بنایا گیا ہے۔ سادہ کوڈ کسی حادثے کے دوران رات کے 2 بجے ٹھیک کرنا آسان ہوتا ہے۔

نئی زبان سیکھنے کا مشکل حصہ نیا سنٹیکس نہیں ہے۔ بلکہ وہ پرانے مفروضات ہیں جو آپ اپنے ساتھ لے کر چلتے ہیں۔

ماخذ: https://dev.to/econ__11/from-php-to-go-what-took-me-longest-to-rewire-2nfn