PHP থেকে Go: কোন বিষয়টি পরিবর্তন করতে আমার সবচেয়ে বেশি সময় লেগেছে
আমি সাত বছর PHP লিখেছি। তার মধ্যে পাঁচ বছর Laravel ব্যবহার করেছি। যখন আমি একটি Laravel monolith থেকে microservices-এ মাইগ্রেশন করার নেতৃত্ব দিতে Go-তে চলে আসি, তখন আমার সাথে কোনো টিউটোরিয়াল ছিল না। আমার সাথে ছিল এক দশকের PHP অভ্যাস।
সিনট্যাক্স শেখা সহজ ছিল। আপনি এক বিকেলেই Go পড়তে পারবেন। কঠিন অংশটি ছিল কোড নিয়ে আমার চিন্তাভাবনা বদলে ফেলা।
নিচে সেই মানসিক পরিবর্তনগুলো দেওয়া হলো যা আয়ত্ত করতে আমার কয়েক মাস সময় লেগেছে:
Error Handling PHP-তে আমি try/catch ব্যবহার করতাম। error-গুলো প্রায়ই একটি global handler-এ অদৃশ্যভাবে চলে যেত। Go-তে, error হলো একটি value। একটি function তার শেষ value হিসেবে একটি error রিটার্ন করে। আপনাকে ঠিক সেখানেই সেটি হ্যান্ডেল করতে হবে। শুরুতে এটি অতিরিক্ত কাজ বলে মনে হয়েছিল। পরে আমি বুঝতে পারলাম যে এটি ব্যর্থতাকে দৃশ্যমান করে তোলে। যখন কোনো service ব্যর্থ হয়, তখন error message-টি একটি breadcrumb trail হিসেবে কাজ করে। এটি কোনো বিশাল stack trace ছাড়াই আপনাকে ঠিক বলে দেয় কোথায় ব্যর্থতা ঘটেছে।
Memory and State PHP একটি shared-nothing model ব্যবহার করে। প্রতিটি request একটি পরিষ্কার অবস্থা (clean slate) থেকে শুরু হয়। memory leak এখানে খুব একটা বড় সমস্যা নয় কারণ request শেষ হওয়ার সাথে সাথে process-টি বন্ধ হয়ে যায়। Go ভিন্ন। এখানে process হাজার হাজার request-এর জন্য সচল থাকে। এর মানে হলো একটি package-level variable প্রতিটি request-এর মধ্যে শেয়ার করা হয়। যদি দুটি request একই সময়ে একটি map-এ লেখার চেষ্টা করে, তবে পুরো প্রোগ্রামটি ক্র্যাশ করবে। Go-তে concurrency-র দায়িত্ব আপনার। সবকিছু নিরাপদ রাখতে আপনাকে race detector-এর মতো টুল ব্যবহার করতে হবে।
The Role of Context PHP-তে, request-ই হলো সীমানা। যখন request শেষ হয়, সবকিছু থেমে যায়। Go-তে, কোনো কিছুই স্বয়ংক্রিয়ভাবে থামে না। যদি কোনো client ডিসকানেক্ট হয়ে যায়, আপনার goroutines চলতে থাকতে পারে এবং রিসোর্স অপচয় করতে পারে। আপনার কোডের মাধ্যমে cancellation signal পাঠানোর জন্য আপনাকে context.Context ব্যবহার করতে হবে। এটি হলো সেই মেরুদণ্ড যা অতিরিক্ত চাপের মধ্যেও আপনার service-কে সুস্থ রাখে।
Composition Over Inheritance Laravel মূলত base class extend করার ওপর নির্ভর করে। আপনি behavior inherit করার মাধ্যমে নতুন ফিচার যোগ করেন। Go-তে class inheritance নেই। এটি interface ব্যবহার করে যা implicitly satisfy হয়। আপনি যেখানে প্রয়োজন সেখানেই তা সংজ্ঞায়িত করেন। এটি কোড টেস্ট করা এবং পরিবর্তন করা সহজ করে তোলে। ভালো Go কোড লেখার জন্য আমাকে সবকিছু extend করার সহজাত প্রবৃত্তি ত্যাগ করতে হয়েছে।
Clarity Over Cleverness PHP magic methods এবং dynamic typing-এর অনুমতি দেয়। আপনি খুব চতুর এবং প্রকাশভঙ্গি সম্পন্ন কোড লিখতে পারেন। Go উদ্দেশ্যমূলকভাবে সাদামাটা (boring)। কম্পাইলার আপনাকে standard formatting ব্যবহার করতে বাধ্য করে এবং অব্যবহৃত variable ব্যবহার করতে বাধা দেয়। শুরুতে এটি সীমাবদ্ধতা বলে মনে হয়েছিল। এখন আমি এর গুরুত্ব বুঝি। Go কোড লেখার মানুষের চেয়ে কোড পড়ার মানুষের কথা মাথায় রেখে অপ্টিমাইজ করা হয়েছে। কোনো সমস্যার সময় রাত ২টোর সময় সাদামাটা কোড ঠিক করা অনেক সহজ।
নতুন ভাষা শেখার কঠিন অংশটি নতুন সিনট্যাক্স নয়। এটি হলো আপনার সাথে বয়ে আনা পুরনো ধারণা বা অনুমানগুলো।
Source: https://dev.to/econ__11/from-php-to-go-what-took-me-longest-to-rewire-2nfn
