কম্পিউটার টিউটোরিয়াল

সায়েন্টিস্ট (Scientist) জেম দিয়ে রেইলসে ক্রিটিক্যাল কোড রিফ্যাক্টরিং: একটি প্রমাণিত পদ্ধতি

কোনো সফটওয়্যার ইঞ্জিনিয়ারকে প্রোডাকশন কোডের মূল অংশগুলো রিভিউ করতে বললে, অবশ্যই তিনি তিনটি জিনিস শোনাবে যা রিফ্যাক্টরিং দরকার। তবু প্রোডাকশনে খারাপ, ভাঙ্গনশীল, বা ভুল বুঝা কোড কেন চলছে?

উত্তর সহজ: ইঞ্জিনিয়াররা এগুলো ছুঁয়ে ভয় পায়। রিফ্যাক্টরিং টাস্কগুলো চিহ্নিত হয় এবং ব্যাকলগে যোগ হয়, কিন্তু বর্তমান স্প্রিন্টে kéও আসে না।

এদের পেছনে অনেক কারণ আছে। কোডটি কোনো ইঞ্জিনিয়ার লিখে गये যারা বছরের আগে টিম ছেড়ে গিয়েছেন, এবং কেউ সম্পূর্ণ বুঝে নাই। অন্য কেসে, ক্ষমতাটি বিসнесের জন্য ক্রিটিক্যাল। কেউ একটি পটেনশিয়াল আউটেজ বা রেভিনিউ লসের দায়দার হতে চায় না।

এই পোস্টে, আমরা দেখব কীভাবে আপনি সায়েন্টিস্ট (Scientist) ব্যবহার করে ক্রিটিক্যাল রুবি প্রোডাকশন কোড মাইগ্রেট, রিফ্যাক্টর, এবং পরিবর্তন করতে পারেন আত্মবিশ্বাসের সাথে।

কিন্তু প্রথমে, আপনি জিজ্ঞাসা করতে পারেন — টেস্টস কি এই কাজের জন্য নয়?

রেইলস টেস্টিং এই কাজের জন্য, ঠিক না?

হ্যাঁ, আর না। কোড পরিবর্তনে ডিপ্লয়মেন্টের আগে পুরো আত্মবিশ্বাস পাওয়া কঠিন। ইউনিট এবং সিস্টেম টেস্টগুলো পাস করে। চলবে, ঠিক না?

বাস্তবতা হল রিয়েল ওয়ার্লড, অর্থাৎ প্রোডাকশনের বিকল্প নেই। কি হবে যদি ডেটা কোয়ালিটি খারাপ হয় বা টেস্টগুলো মিসিং থাকে? আপনি কীভাবে জানবেন নতুন সফটওয়্যার প্রোডাকশন থ্রুপুট হ্যান্ডেল করতে যথেষ্ট পারফরম করবে?

পাবলিক সার্ভিসেস वाली টিমস কখনো কখনো দেখেন যে তাদের "বাগওয়ার্ডস কম্প্যাটিবিলিটি" (bugwards compatibility) ইস্যুস হ্যান্ডেল করতে হয়। যখন একটি বাগ প্রোডাকশনে কিছু সময় থেকে থাকে, ক্লায়েন্টরা এমন কোড লিখতে পারে যা কনসিস্টেন্ট ভুল আচরণের ওপর ডিপেন্ড করে। কাস্টমাররা সফটওয়্যার অপ্রত্যাশিতভাবে ব্যবহার করে।

রুবি এবং রেইলসে সায়েন্টিস্ট (Scientist) দিয়ে প্রোডাকশন পরিবর্তন পর্যবেক্ষণ করুন

যদি প্রোডাকশন একটি পরিবর্তনে আত্মবিশ্বাস পাওয়ার সেরা জায়গা, তবে সেখানে কোড কীভাবে বیهেভ করে সেটি পর্যবেক্ষণ করার কথা চিন্তা করুন। এটা প্রথমে ভয়ঙ্কর লাগতে পারে, কারণ "প্রোডাকশনে টেস্টিং" ক্লাসিক্যাল সফটওয়্যার ইঞ্জিনিয়ারিং প্র্যাকটিসের বিরুদ্ধে।

তবে, ভালো খবর হল রুবি এবং রেইলসে সায়েন্টিস্ট (Scientist) জেম ব্যবহার করে এটি সহজ এবং নিরাপদে করা যায়। সায়েন্টিস্টের নাম বিজ্ঞানী পদ্ধতির ওপর ভিত্তি করে রেখা হয়েছে এক্সপেরিমেন্ট চালিয়ে একটি হাইপোথেসিস ভেরিফাই করার জন্য। এই কেসে, আমাদের হাইপোথেসিস হল নতুন কোডটি কাজটি করে।

আমরা এই পদ্ধতি নিরাপদে अपना পারি কারণ এক্সপেরিমেন্টগুলো এখনও বিদ্যমান কোডের ফলাফল ব্যবহার করে। নতুন কোড শুধু পর্যবেক্ষণ এবং তুলনার জন্য ইভ্যালুয়েট করা হয়, একুরেসি এবং পারফরম্যান্স দুটির জন্য। আমরা আগে আলোচনা করা টেস্ট কভারেজ চিন্তা কমিয়ে দিই রিয়েল-ওয়ার্ল্ড ডেটা এবং প্যারামিটারস ব্যবহার করে পারফরম্যান্স ইভ্যালুয়েট করে। এক্সপেরিমেন্টস সাধারণত রিকোয়েস্টের একটি চয়ন করা স্যাম্পল রেট ইভ্যালুয়েট করে প্রোডাকশনে প্রভাব মিনিমাইজ করার জন্য। যেদবি, আপনি প্রতিটি রিকোয়েস্ট ইভ্যালুয়েট করতে পারেন যদি চান।

এখন দ্রুত একটি নজর দেই কীভাবে সায়েন্টিস্ট ব্রাঞ্চ বাই অ্যাবস্ট্র্যাকশন (Branch by Abstraction) প্যাটার্নে কাজ করে।

রুবির সায়েন্টিস্ট-এ ব্রাঞ্চ বাই অ্যাবস্ট্র্যাকশন প্যাটার্ন

সায়েন্টিস্টের পদ্ধতি শুরু হয় ব্রাঞ্চ বাই অ্যাবস্ট্র্যাকশন প্যাটার্ন দিয়ে যা মার্টিন ফাউলার (Martin Fowler) বর্ণনা করেছেন "একটি বড় স্কেলের পরিবর্তন একটি সফটওয়্যার সিস্টেমে ধীরে ধীরে করার জন্য।"

আমরা একটি অ্যাবস্ট্র্যাকশন লেয়ার আনায় আপডেট হওয়া কোডটি আইসোলেট করতে। এই লেয়ারটি ডিসাইড করে কোন ইমপ্লিমেন্টেশন ব্যবহার করতে হবে যাতে এক্সপেরিমেন্টটি বাকি সিস্টেমের কাছে ট্রান্সপেরেন্ট থাকে। এই কৌশলটি ফিচার ফ্ল্যাগ ব্যবহার করার সাথে সম্পর্কিত যা কোড পাথ নির্ধারণ করে।

সায়েন্টিস্ট জেম, যা গিটহাব থেকে উদ্ভূত, এই প্যাটার্নটি একটি এক্সপেরিমেন্ট ব্যবহার করে ইমপ্লিমেন্ট করে। বিদ্যমান কোডকে কন্ট্রোল (control) বলা হয়, এবং নতুন ইমপ্লিমেন্টেশনকে ক্যান্ডিডেট (candidate)। উভয় কোড পাথ র‍্যান্ডমাইজড অর্ডারে রান করা হয়, কিন্তু শুধু কন্ট্রোলের ফলাফল ক্লায়েন্টের কাছে ফেরত দেওয়া হয়।

একটি রুবি সার্ভিস রিফ্যাক্টর করতে সায়েন্টিস্ট ব্যবহার

একটি রুবি সার্ভিস বিবেচনা করুন যা একটি দেয়া নম্বরের জন্য সবচেয়ে বড় প্রাইম ফ্যাক্টর (largest prime factor) ফেরত দেয়। ধরে নিন, আমরা অপ্টিমাইজেশন চিহ্নিত করেছি যা ক্যান্ডিডেট সেট প্রুন (prune) করে, সার্ভিসকে দ্রুত করে।

তবে, সার্ভিস মালিকরা নিশ্চিত হতে চান কোনো বাগ ইন্ট্রোডিউস হয়নি। তারা পারফরম্যান্স ইমপ্রুভমেন্টও পর্যবেক্ষণ করতে চান। নিচের কোড চালু করুন, ক্লায়েন্টগুলো মডিফাই করুন এই মেথড কল করার জন্য:


এই পয়েন্টে, শুধু use (control) এক্সপ্রেশনই ইনভোক হয়। এক্সপেরিমেন্টটিকে ওয়ারথওয়থি (worthwhile) করার জন্য, একটি কাস্টম Experiment ক্লাস ডিফাইন করুন এটি ইনাবেল করতে (নিচে 100% সময়) এবং ফলাফল পাবলিশ করতে (এই কেসে, শুধু লগিং)। সায়েন্টিস্ট চমৎকার ডেটা জেনারেট করে কিন্তু ডিফল্টলি সেটির সাথে কিছু করে না। সেটি আপনার ওপর ছেড়ে দেয়া হয়েছে।


এক্সপেরিমেন্টের ফলাফল লগ হবে, এবং আমরা ফিডব্যাকের ভিত্তিতে সময়ের সাথে সাথে ইমপ্রুভমেন্ট করতে পারি। একবার নতুন কোড প্রয়োজনীয়তা পূরণ করে এবং আত্মবিশ্বাস বেশি হলে, সায়েন্স কোডটি নতুন ইমপ্লিমেন্টেশনে ডেলিগেশন দিয়ে রিপ্লেস করে কাটওভার (cutover) সম্পন্ন করুন।

LabTech রুবি অন রেইলসে সায়েন্টিস্ট এক্সপেরিমেন্টস সিম্পলিফাই করে

আপনি আপনার রেইলস অ্যাপ্লিকেশনে LabTech জেম ব্যবহার করতে পারেন সায়েন্টিস্ট সহজে কনফিগার করতে এবং ফলাফল হ্যান্ডেল করতে।

AppSignal ব্যবহার করে এমন অ্যাপ্লিকেশনগুলো Appsignal.instrument কাস্টম ইন্সট্রুমেন্টেশন হেল্পার ব্যবহার করতে পারে সায়েন্টিস্ট ইভেন্টগুলো কতক্ষণ লাগে সেটি ট্র্যাক করতে। এক্সপেরিমেন্ট কোড ব্লকগুলো এর চারদিকে র‍্যাপ করুন যাতে ইভেন্টগুলো পারফরম্যান্স টাইমলাইনে দেখতে পান।

এখন, LabTech-এ ফিরে যাই — নিচের ওয়েব পেজটি শুধু একটি নম্বর এক্সেপ্ট করে ফ্যাক্টর করতে।

সায়েন্টিস্ট (Scientist) জেম দিয়ে রেইলসে ক্রিটিক্যাল কোড রিফ্যাক্টরিং: একটি প্রমাণিত পদ্ধতি

শুরু করা সহজ যদি আপনার কনসোল অ্যাক্সেস থাকে। প্রথমে, LabTech জেম আপনার Gemfile-এ যোগ করুন এবং bundle install চালান।


টেবিলগুলো রেজাল্ট এবং এক্সপেরিমেন্ট কনফিগারেশন স্টোর করে, তাই ডাটাবেস মাইগ্রেশন চালান।


অবস্ট্রাকশন লেয়ারটি একই, শুধু LabTech মডিউল ব্যবহার করা হয়। পূর্ণ কোড গিটহাবে উপলব্ধ।


এই পয়েন্টে, এক্সপেরিমেন্টটি ডিজেবলড, তাই কনসোল ব্যবহার করে সেটি সব কেসে বা টাইমের একটি শতাংশের জন্য ইনাবেল করুন।


আমরা এখন টেস্ট রান করতে পারি এবং এক্সপেরিমেন্টটি ইভ্যালুয়েট হবে। টেক্সটুয়াল ভিউ অফ রেজাল্টসের জন্য, রেইলস কনসোল থেকে নিচের যেকোনো একটি কমান্ড ব্যবহার করুন।


কয়েকটি সফল রান এবং একটি তৈরি করা এররের পর, রেজাল্টস সামারি কেমন দেখায় সেটির একটি উদাহরণ। সাকসেস এবং ফেইলারের ওভারভিউ, এবং পারফরম্যান্স পার্থক্য দেখানো একটি ASCII চার্ট।


Blazer জেম রেজাল্টস সহজে অ্যানালাইজ করার একটি চমৎকার উপায় প্রদান করে। এটি ইনস্টল করা সহজ এবং SQL কোয়েরি টেবিলস বিরুদ্ধে চালানোর অনুমতি দেয়। এখানে কোয়েরিটি দেখাচ্ছে যে ক্যান্ডিডেট ইমপ্লিমেন্টেশন オリজিনাল চেয়ে উল্লেখযোগ্যভাবে দ্রুত।

সায়েন্টিস্ট (Scientist) জেম দিয়ে রেইলসে ক্রিটিক্যাল কোড রিফ্যাক্টরিং: একটি প্রমাণিত পদ্ধতি

উদাহরণ প্রাইম ফ্যাক্টরিং সার্ভিসে, উন্নত ইমপ্লিমেন্টেশনে স্পিডআপ আসে একটি হিউরিস্টিক (heuristic) থেকে যা কিছু সম্ভাব্য ফ্যাক্টর এলিমিনেট করে। যেহেতু আমরা উন্নত নম্বরগুলো বিবেচনা করি এবং একটি প্রাইম ফ্যাক্টর পাই, আমরা সার্চিং বন্ধ করতে পারি আপনার টার্গেট নম্বর সেটি দিয়ে ভাগ দিয়ে পাওয়া ফ্যাক্টর পাওয়ার পর। নতুন কোড পাথ শুধু একটি স্টেটমেন্ট যোগ করে এটা অর্জন করে।

আমরা এক্সিকিউশন টাইমে রিডাকশনও দেখতে পাচ্ছি Blazer কোয়েরি ব্যবহার করে LabTech টেবিলস বিরুদ্ধে।

সায়েন্টিস্ট (Scientist) জেম দিয়ে রেইলসে ক্রিটিক্যাল কোড রিফ্যাক্টরিং: একটি প্রমাণিত পদ্ধতি

সায়েন্টিস্টের ইউজ কেস এবং লিমিটেশনস

সায়েন্টিস্টের অপ্টিমাল ইউজ কেসগুলো شامل: সার্চ, ক্যালকুলেশন, এবং কোড যেন কোনো সাইড-ইফেক্ট নেই। কোড যেগুলো ট্রানজ্যাকশনাল আপডেট বা এক্সটার্নাল ইন্টিগ্রেশন (যেমন ইমেইল) অন্তর্ভুক্ত করে, সেগুলো মডেলে ক্লিনলি ফিট করে না কারণ ক্যাপাবিলিটি দুবার রান হয় (পুরানো এবং নতুন ইমপ্লিমেন্টেশন দুটো)।

এটি একটি তুচ্ছ লিমিটেশন নয়, কারণ এটি অনেক ইউজ কেস এলিমিনেট করে। যেদবি, কিছু ওয়ার্কঅראউন্ড আছে যদি এক্সপেরিমেন্ট আপনার সাফল্যের জন্য ক্রিটিক্যাল। বিবেচনা করুন সাইড-ইফেক্টগুলো প্রাসঙ্গিক কিনা বা ডুপ্লিকেশন ইস্যু কিনা। উদাহরণস্বরূপ, কিছু কেসে দুটি ইমেইল পাঠানো জিনিসটি মэтার করতে পারে না ইভ্যালুয়েশন এর সময়। আরেকটি অপশন হল নতুন কোড ফলাফল নির্ধারণ করবে কিন্তু পার্সিস্ট করবে না। এটি কোনো অর্থবহ পারফরম্যান্স তুলনা রোধ করবে। যেদবি, এটি আপনাকে একুরেসি ভেরিফাই করতে দেবে।

অন্যান্য লিমিটেশন সায়েন্টিস্টের রিটার্ন ভ্যালু ফোকাস থেকে উদ্ভূত। কিছু কেসে, ভ্যালিড রেজাল্টস সময়ের সাথে সাথে পার্থক্য প্রদর্শন করতে পারে, চাহে তারা রেসপন্সে টাইমস্ট্যাম্প অন্তর্ভুক্ত করে বা কিছু ফ্যাক্টর ভিন্ন হয়। অনেক কেসে, আমরা এক্সপেরিমেন্টে কাস্টম কম্পারিজন লজিক লিখতে পারি বেসিক স্ট্রিং কম্পারিজনের বাইরে একুরেসি ভেরিফাই করার জন্য।

শেষে, LabTech-এর একটি লিমিটেশন হল লেখা পর্যন্ত এটি রেইলস ৭-এ পোর্ট করা হয়নি।

রেইলসে ইফেক্টিভ সায়েন্টিস্ট এক্সপেরিমেন্টের জন্য সেরা অনুশীলন (Best Practices)

আপনার এক্সপেরিমেন্ট ইমপ্লিমেন্ট করার সময় এই আইটেমগুলো বিবেচনা করুন:

  • রেইলস প্রজেক্টসে, সায়েন্টিস্ট বা তো একটি ইনিশিয়ালাইজারে কনফিগার করা যায় অথবা LabTech জেমের মতো একটি র‍্যাপার দিয়ে। অধিকাংশ রেইলস অ্যাপ্লিকেশনের ইতিমধ্যে একটি ডাটাবেস থাকে, তাই LabTech ActiveRecord ব্যবহার করে রেজাল্টস স্টোর করে।
  • ডেভেলপমেন্ট এবং টেস্টিং স্লো না করাতে, আপনার এক্সপেরিমেন্ট শুধু স্টেজিং এবং প্রোডাকশন এনভায়রনমেন্টে ইনাবেল করুন।
  • প্রোডাকশনে কোনো পটেনশিয়াল প্রভাব মিনিমাইজ করতে, শুধু রিকোয়েস্টের একটি শতাংশে এক্সপেরিমেন্ট রান করুন। LabTech এটি বক্সের বাইরে সাপোর্ট করে একটি অপশনাল প্যারামিটার হিসেবে যখন আপনি এক্সপেরিমেন্ট ইনাবেল করেন (এটি ডিফল্টলি ডিজেবলড থাকে)। পিউর সায়েন্টিস্ট ব্যবহার করে, এই লজিক ইজিলি এক্সপেরিমেন্টের enabled? মেথডে কোড করা যায়।
  • কিছু লজিক রিসোর্স-ইনটেনসিভ, তাই একটি লো স্যাম্পলিং রেট শুরু করার জন্য ভালো জায়গা। আপনি জব ফলাফলগুলোতে আত্মবিশ্বাস পাবেন, ইভ্যালুয়েট হওয়া রিকোয়েস্টের শতাংশ বাড়ান।
  • আপনি কন্টেক্সট অ্যাট্রিবিউট যোগ করতে পারেন আপনার রেজাল্টস থেকে সর্বোচ্চ ফলাফল পেতে। এক্সপেরিমেন্ট কন্টেক্সট সেট করা যায় একটি সিম্বল-কিড হ্যাশ অফ ডেটা যা পাবলিশড রেজাল্টসে উপলব্ধ থাকবে, উদাহরণস্বরূপ:


সমাপন: আপনার রুবি অ্যাপ পর্যবেক্ষণ এবং মনিটর করুন সায়েন্টিস্ট দিয়ে

এই পোস্টে, আমরা এক্সপ্লোর করেছি কীভাবে সায়েন্টিস্ট (Scientist) জেম ব্যবহার করে রুবি কোড প্রোডাকশনে পরিবর্তন, মাইগ্রেট, এবং রিফ্যাক্টর করতে হয়।

আমরা সায়েন্টিস্টের উৎস ব্রাঞ্চ বাই অ্যাবস্ট্র্যাকশন প্যাটার্নে দেখেছি, তারপর রিফ্যাক্টরিং-এ গভীরে গিয়েছি। এরপর, আমরা দেখেছি LabTech কীভাবে সাহায্য করতে পারে রেজাল্টস গ্যাথারিং এবং আপনার সায়েন্টিস্ট কনফিগারেশনে।

তারপর, আমরা সায়েন্টিস্টের কিছু লিমিটেশন ছুঁইয়েছি এবং শেষে কিছু সেরা অনুশীলন আউটলাইন করেছি।

আপনাকে অবশ্যই পর্যবেক্ষণ এবং মনিটর করতে হবে আপনার সিস্টেমে কী হচ্ছে। সায়েন্টিস্ট আপনার ডেভেলপমেন্ট প্রসেসে ইন্টিগ্রেট করুন আপনার রুবি কোডে ক্রিটিক্যাল পরিবর্তন আরও আত্মবিশ্বাসের সাথে করার জন্য।

খুশি কোডিং!

P.S. আপনি যদি রুবি ম্যাজিক পোস্টগুলো প্রেস থেকে বের होतेই পড়তে চান, আমাদের রুবি ম্যাজিক নিউজলেটার সাবস্ক্রাইব করুন এবং একক পোস্টও মিস করবেন না!

সায়েন্টিস্ট (Scientist) জেম দিয়ে রেইলসে ক্রিটিক্যাল কোড রিফ্যাক্টরিং: একটি প্রমাণিত পদ্ধতি

ড্যারেন ব্রোয়েমার (Darren Broemmer)

ড্যারেন লেখা শব্দের মাধ্যমে অনুপ্রাণিত করতে পছন্দ করেন এবং জটিল জিনিসগুলো সহজ করে বুঝাতে। তার আগ্রহের বিষয়গুলো شامل বিজ্ঞান এবং পদার্থবিজ্ঞান, এবং সেগুলো বুঝতে যথেষ্ট ম্যাথ। তিনি হাই-কোডালিটি কন্টেন্ট এবং টেকনোলজি সলিউশন তৈরি করেন, এবং কখনো কখনো সেগুলো সম্পর্কে টুইট করেন।

ড্যারেন ব্রোয়েমারের সব আর্টিকেল


  1. C++-এ একটি বাইনারি ট্রি লেভেলওয়াইজ সর্টেড কিনা চেক করা

  2. HTML-এ <div> ট্যাগ ব্যবহার করে ব্লক-লেভেল এলিমেন্ট স্টাইল করা

  3. অ্যান্ড্রয়েডে ConcurrentLinkedDeque-এ push() কীভাবে ব্যবহার করবেন?

  4. Android-এ TextView-এ টেক্সট জাস্টিফাই (Justify) করা