“প্রোডে কাজ করে” — এটি সেই বাক্যাংশ যা ডেভেলপার বলেন যখন বাগ প্রোডাকশনে রিপ্রোডিউস হয় না, যদিও স্টেজিং বা লোকাল মেশিনে ত্রুটিটি স্থিরভাবে দেখা যায়। সমস্যাটি প্রায় সবসময় এনভায়রনমেন্টের অমিলের কারণে ঘটে: ডিপেন্ডেন্সির বিভিন্ন সংস্করণ, কনফিগারেশন ফাইল, ডাটাবেসের অবস্থা বা সার্ভার সেটিংস। Stack Overflow Developer Survey 2024-এর বিশ্লেষণ অনুসারে, 43% ডেভেলপার মাসে অন্তত একবার এমন পরিস্থিতির মুখোমুখি হন যেখানে কোড লোকাল মেশিনে কাজ করে কিন্তু প্রোডাকশনে ব্যর্থ হয়। আসুন বুঝি কেন এই অমিল দেখা দেয় এবং কীভাবে এটি প্রতিরোধ করা যায়।
মূল বিষয়
“প্রোডে কাজ করে” — এটি ডেভেলপার পরিবেশে একটি স্থির অভিব্যক্তি, যা এমন পরিস্থিতি বোঝায় যখন কোড প্রোডাকশন সার্ভারে কাজ করে কিন্তু টেস্ট এনভায়রনমেন্ট বা সহকর্মীর লোকাল মেশিনে কাজ করতে অস্বীকার করে। বাহ্যিকভাবে এটি “কোনো সমস্যা নেই” বলে শোনায়, যদিও আসলে সমস্যা আছে — এটি কেবল প্রোডাকশন এনভায়রনমেন্টে রিপ্রোডিউস হয় না। অমিলের মূল — এনভায়রনমেন্টের মধ্যে কনফিগারেশন, সংস্করণ এবং ডেটার পার্থক্য।
বাক্যাংশটি অন্য একটি পরিচিত অজুহাতের বিপরীত হিসেবে জন্ম নিয়েছে — “আমার লোকালে কাজ করে”। যদি ডেভেলপার বলেন “লোকালে কাজ করে”, তাহলে বাগ কেবল অন্যদের কাছে আছে। আর যদি “প্রোডে কাজ করে” — বাগ কেবল স্টেজিং বা টেস্ট এনভায়রনমেন্টে আছে, কিন্তু প্রোডাকশন পরিষ্কার। ভাগ্যের পরিহাস: উভয় ক্ষেত্রেই সমস্যা বাস্তব, এটি কেবল সেই ব্যক্তির কাছে প্রকাশ পায় না যে দেখছে। DevOps Research and Assessment (DORA) 2023-এর গবেষণা অনুসারে, উচ্চ মাত্রার ডিপ্লয় অটোমেশনযুক্ত টিমগুলি এই ধরনের অমিলের মুখোমুখি হয় ৩ গুণ কম।
ব্যবসার দৃষ্টিকোণ থেকে, “প্রোডে কাজ করে” পরিস্থিতি যতটা মনে হয় তার চেয়ে বেশি বিপজ্জনক। যদি বাগ স্টেজিংয়ে থাকে কিন্তু প্রোডে না থাকে, ডেভেলপার এটি উপেক্ষা করতে পারেন — এবং পরবর্তী ডিপ্লয়ে ত্রুটিটি প্রোডাকশনে চলে যাবে। অস্থায়ী স্বস্তি ভবিষ্যতের সমস্যায় পরিণত হয় যা ব্যবহারকারীদের চাপে ফিক্স করতে হবে।
বাক্যাংশটি টিকে থাকার মনস্তাত্ত্বিক কারণ — প্রতিরক্ষামূলক রিফ্লেক্স। ডেভেলপার যিনি স্টেজিংয়ে বাগ দেখেন কিন্তু প্রোডে নন, তিনি অজ্ঞানভাবে সমস্যাটিকে ছোট করতে পারেন: “যেহেতু প্রোডাকশনে সব ঠিক আছে, তাই এটি জরুরি নয়”। ক্লাসিক cognitive bias — সারভাইভারশিপ এরর, যেখানে প্রোডাকশনের দৃশ্যমান সাফল্য ভবিষ্যতের ব্যর্থতার সম্ভাব্য হুমকির চেয়ে বেশি ওজন বহন করে।
দ্বিতীয় কারণ — অস্পষ্ট দায়িত্ব। যদি প্রোডাকশন কাজ করে কিন্তু স্টেজিং না করে, তবে এনভায়রনমেন্ট দোষী হয়, কোড নয়। ডেভেলপার নিজের থেকে বাগের দায়িত্ব সরিয়ে DevOps ইঞ্জিনিয়ার বা অ্যাডমিনের উপর চাপান। Atlassian State of DevOps 2022 অনুসারে, ইউনিফাইড ডিপ্লয় এনভায়রনমেন্ট (Docker, Kubernetes) ছাড়া টিমগুলিতে এই ধরনের দায়িত্ব স্থানান্তর 60% বেশি ঘটে।
তৃতীয় কারণ — শূন্য ডাউনটাইম সহ রিলিজের ভয়। যদি ডেভেলপার স্টেজিংয়ে বাগ ফিক্স করেন এবং সংশোধন ডিপ্লয় করেন, তাহলে পুনরায় code review, টেস্টিং এবং ডিপ্লয় প্রয়োজন হবে। “প্রোডে কাজ করে” বাক্যাংশটি পরবর্তী রিলিজ পর্যন্ত ফিক্স স্থগিত করতে দেয়, বর্তমান লোড কমিয়ে। স্থগিত ফিক্স — টিমগুলিতে টেকনিক্যাল ডেট জমার প্রধান কারণগুলির একটি।
প্রোডাকশন এবং স্টেজিং কখনই সম্পূর্ণ অভিন্ন হয় না — এটি স্কেল, লোড এবং ডেটার পার্থক্যের কারণে টেকনিক্যালি অসম্ভব। তবে মূল প্যারামিটারগুলি মিলে যাওয়া উচিত: অপারেটিং সিস্টেমের সংস্করণ, কম্পাইলার, ইন্টারপ্রেটার, ডাটাবেস, ওয়েব সার্ভার এবং প্রকল্পের সব ডিপেন্ডেন্সি। যদি কমপক্ষে একটি প্যারামিটার ভিন্ন হয় — কোডের আচরণ পরিবর্তন হতে পারে।
এনভায়রনমেন্টের মধ্যে প্রধান পার্থক্যগুলির মধ্যে রয়েছে:
কন্টেইনারাইজেশন এই সমস্যার অধিকাংশ সমাধান করে। প্রোডাকশনের জন্য তৈরি Docker ইমেজ স্টেজিংয়েও ব্যবহার করা উচিত। একমাত্র পার্থক্য — এনভায়রনমেন্ট ভেরিয়েবল এবং volume-মাউন্টিং। Docker State of Application Development 2023 অনুসারে, সব এনভায়রনমেন্টের জন্য ইউনিফাইড ইমেজ ব্যবহারকারী টিমগুলি অমিলের সংখ্যা 74% কমায়।
| প্যারামিটার | লোকাল এনভায়রনমেন্ট | স্টেজিং | প্রোডাকশন |
|---|---|---|---|
| ওএস | macOS / Windows | Linux সার্ভার | Linux সার্ভার |
| ডাটাবেস | SQLite / লোকাল MySQL | MySQL ক্লাস্টার | MySQL ক্লাস্টার রেপ্লিকেশন সহ |
| লোড | ১ ব্যবহারকারী | সিমুলেশন ১০–100 | ১০০০+ বাস্তব |
| ডেটা | ফিক্সচার | মাস্ক করা | বাস্তব |
| CDN / ক্যাশ | না | আংশিক | সম্পূর্ণ |
প্রথম এবং সবচেয়ে সাধারণ কারণ — ডিপেন্ডেন্সির বিভিন্ন সংস্করণ। ডেভেলপার লোকালি --save ফ্ল্যাগ দিয়ে প্যাকেজ ইনস্টল করেন কিন্তু package.json বা lock-ফাইল আপডেট করতে ভুলে যান। প্রোডে ডিপ্লয়ের সময় অন্য সংস্করণ ইনস্টল হয় যা ভিন্ন আচরণ করে। npm-ইকোসিস্টেমের জন্য lock-ফাইল সম্পূর্ণরূপে সমস্যা সমাধান করে, অন্যান্য প্যাকেজ ম্যানেজারের জন্য — অনুরূপ মেকানিজম (Gemfile.lock, Podfile.lock, pubspec.lock)।
দ্বিতীয় কারণ — অনুপস্থিত বা অতিরিক্ত এনভায়রনমেন্ট ভেরিয়েবল। ডেভেলপার লোকাল মেশিনে .env ফাইল ব্যবহার করেন কিন্তু CI/CD পাইপলাইন বা সার্ভারে সংশ্লিষ্ট ভেরিয়েবল যোগ করেন না। ফলাফল — কোড API বা ডাটাবেসের সাথে সংযোগ ত্রুটিতে ব্যর্থ হয়। GitLab DevSecOps Survey 2023 অনুসারে, প্রোডে 27% ইনসিডেন্ট ভুল এনভায়রনমেন্ট ভেরিয়েবলের সাথে সম্পর্কিত।
তৃতীয় কারণ — ডাটাবেসের অবস্থা। স্টেজিংয়ে ডাটাবেসে এমন রেকর্ড থাকতে পারে যা প্রোডে নেই, বা বিপরীতভাবে — মাইগ্রেশনের অভাব থাকতে পারে। টিপিক্যাল পরিস্থিতি: ডেভেলপার কোড লেখেন যা টেবিলের নতুন ফিল্ডের সাথে কাজ করে, কিন্তু মাইগ্রেশন এখনও প্রোডে প্রয়োগ করা হয়নি। ব্যাকওয়ার্ড কম্প্যাটিবিলিটি সহ মাইগ্রেশন কৌশল — এই ধরনের পরিস্থিতি এড়ানোর একমাত্র উপায়।
চতুর্থ কারণ — আঞ্চলিক এবং ভাষাগত সেটিংস। তারিখ ফরম্যাটিং, ভগ্নাংশ সংখ্যার বিভাজক, টেক্সট এনকোডিং — এগুলি ডেভেলপারের লোকাল মেশিন এবং সার্ভারে ভিন্ন হতে পারে। আন্তর্জাতিকীকরণ সহ প্রকল্পগুলির জন্য বিশেষভাবে প্রাসঙ্গিক। সমাধান — অ্যাপ্লিকেশন কনফিগারেশনে locale স্পষ্টভাবে উল্লেখ করা এবং সিস্টেম সেটিংসের উপর নির্ভর না করা।
প্রথম ধাপ — উভয় এনভায়রনমেন্টের লগ তুলনা করা। লগিং লেভেলের পার্থক্য প্রায়ই কারণ লুকিয়ে রাখে: প্রোডে INFO চালু থাকতে পারে, আর স্টেজিংয়ে DEBUG। একই লগিং লেভেল সেট করুন এবং নিশ্চিত করুন যে উভয় এনভায়রনমেন্ট এমন ফরম্যাটে লিখছে যা মেশিন তুলনা সক্ষম করে। কেন্দ্রীভূত লগ সংগ্রহ সিস্টেম ব্যবহার করুন — Sentry, Datadog, ELK Stack।
দ্বিতীয় ধাপ — ডিপেন্ডেন্সির সংস্করণ পরীক্ষা করা। lock-ফাইল তুলনা করুন, উভয় এনভায়রনমেন্টে ইনস্টল করা প্যাকেজের তালিকা দেখুন। মাইনর বা প্যাচ সংস্করণের পার্থক্য — অমিলের সবচেয়ে সম্ভাব্য কারণ। npm ls, pip freeze, mvn dependency:tree-এর মতো টুল দ্রুত অসঙ্গতি সনাক্ত করতে সাহায্য করবে।
তৃতীয় ধাপ — প্রোডাকশন এনভায়রনমেন্ট লোকালি রিপ্রোডিউস করা। Docker Compose বা অনুরূপ টুল ব্যবহার করে প্রোডাকশন পরিকাঠামোর সঠিক কপি তৈরি করুন। যদি বাগ লোকাল কন্টেইনারে রিপ্রোডিউস হয় — তাহলে সমস্যা কোডে, এনভায়রনমেন্টে নয়। যদি না হয় — কনফিগারেশনের পার্থক্য খুঁজুন।
চতুর্থ ধাপ — feature flags এবং A/B টেস্ট পরীক্ষা করা। সম্ভবত প্রোডে কোড অন্য মোডে কাজ করে কারণ ভুল ফ্ল্যাগ চালু আছে। LaunchDarkly State of Feature Management 2023 অনুসারে, প্রোডে 40% পর্যন্ত অপ্রত্যাশিত আচরণ ভুল feature flags মানের সাথে সম্পর্কিত। সব এনভায়রনমেন্টের জন্য ইউনিফাইড ফ্ল্যাগ ম্যানিফেস্ট এই সমস্যা সমাধান করে।
প্রতিরোধের প্রধান টুল — Infrastructure as Code (IaC)। সব এনভায়রনমেন্ট কোডে বর্ণনা করা উচিত: Dockerfile, docker-compose.yml, Terraform-স্ক্রিপ্ট বা Ansible-প্লেবুক। সার্ভারে ম্যানুয়াল পরিবর্তন নিষিদ্ধ — কনফিগারেশনের যেকোনো পরিবর্তন রিপোজিটরি এবং code review এর মাধ্যমে হয়। এটি নিশ্চিত করে যে সব এনভায়রনমেন্টের একই কনফিগারেশন আছে।
দ্বিতীয় গুরুত্বপূর্ণ টুল — ইউনিফাইড CI/CD পাইপলাইন। একই বিল্ড, টেস্টিং এবং ডিপ্লয় স্ক্রিপ্ট সব এনভায়রনমেন্টের জন্য ব্যবহার করা উচিত। পার্থক্য — কেবল টার্গেট ভেরিয়েবলে (URL, কী)। যদি স্টেজিং এবং প্রোডাকশনের পাইপলাইন ধাপে ভিন্ন হয় — অমিল অনিবার্য।
তৃতীয় টুল — স্বয়ংক্রিয় ডেটা সিঙ্ক্রোনাইজেশন। নিয়মিত (দিনে একবার বা নির্ধারিত সময়ে) প্রোডাকশন ডাটাবেসের অ্যানোনিমাইজড কপি দিয়ে স্টেজিং আপডেট করুন। এটি সিন্থেটিক ফিক্সচারের পরিবর্তে বাস্তব ডেটায় কোড টেস্ট করতে দেয়। টুল: PostgreSQL-এর জন্য pg_dump/pg_restore, MySQL-এর জন্য mysqldump, DataGrip-এর মতো বিশেষায়িত সার্ভিস।
চতুর্থ — অমিল পর্যবেক্ষণ। স্টেজিং এবং প্রোডাকশনের মধ্যে পার্থক্য শনাক্ত হলে সতর্কতা সেট আপ করুন। একটি সাধারণ স্ক্রিপ্ট যা কনফিগারেশন ফাইলের হ্যাশ বা ইনস্টল করা প্যাকেজের সংস্করণ তুলনা করে, ডিবাগিংয়ের ঘন্টা বাঁচাবে। প্রতিরোধ সবসময় নির্ণয়ের চেয়ে সস্তা: এনভায়রনমেন্টের অমিল প্রতিরোধ “প্রোডে কাজ করে” বাগের কারণ খোঁজার চেয়ে কম প্রচেষ্টা প্রয়োজন।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
প্রথম ক্ষেত্রে বাগ স্টেজিংয়ে দেখা যায় কিন্তু প্রোডে নয়। দ্বিতীয় ক্ষেত্রে — বাগ সবাই দেখে, ডেভেলপার ছাড়া, যার কোড লোকালি কাজ করে। সাধারণ মূল — এনভায়রনমেন্টের অমিলে, কিন্তু পরিস্থিতি ভিন্ন ধাপে প্রকাশ পায়।
দেখান যে স্টেজিংয়ে বাগ — এটি এমন একটি বাগ যা ইতিমধ্যে প্রস্তুত নিকটবর্তী ডিপ্লয়ের সাথে প্রোডাকশনে যাওয়ার জন্য। এখনই ফিক্স করা ব্যবহারকারীদের চাপে hotfix-এর চেয়ে সস্তা হবে। প্রকল্পের ইতিহাস থেকে উদাহরণ দিন।
DORA 2023-এর তথ্য অনুসারে, প্রোডে প্রায় 25–30% ইনসিডেন্ট এনভায়রনমেন্টের পার্থক্যের কারণে ঘটে। কন্টেইনারাইজেশন ছাড়া টিমগুলিতে এই সূচক 50% পর্যন্ত পৌঁছায়। কন্টেইনারাইজেশন এটি 10–15% পর্যন্ত কমায়।
হ্যাঁ, এটি একটি সাধারণ কারণ। প্রোডে CDN, Varnish বা Redis-ক্যাশ চালু থাকে, কিন্তু স্টেজিংয়ে থাকে না। যদি বাগ ক্যাশ করা ডেটা প্রদানের সাথে সম্পর্কিত হয়, তবে এটি স্টেজিংয়ে দেখা যাবে এবং প্রোডে ক্যাশের আড়ালে লুকিয়ে থাকবে।
Docker সব ধাপে এনভায়রনমেন্টের অভিন্নতা নিশ্চিত করে: ডেভেলপমেন্ট, টেস্টিং, স্টেজিং, প্রোডাকশন। যদি ইমেজ একবার তৈরি করা হয় এবং সর্বত্র ব্যবহার করা হয় — সংস্করণ এবং কনফিগারেশনের অমিল বাদ দেওয়া হয়। ইউনিফাইড ইমেজ — ডিপ্লয় পুনরাবৃত্তিযোগ্যতার ভিত্তি।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন