লগইন পেজটি সঠিকভাবে রেন্ডার হয়েছে। REST API একটি 200 OK রিটার্ন করেছে। SaaS boilerplate কোনো লিন্টিং এরর ছাড়াই চালু হয়ে গেল। এক বিকেলেই আপনি সেই কাজ শেষ করে ফেললেন যা করতে আগে এক সপ্তাহ লাগত। AI কোডিং অ্যাসিস্ট্যান্টগুলো সফটওয়্যার ডেভেলপমেন্টকে এতটাই বদলে দিয়েছে যে ফিচার তৈরি করা এখন ইঞ্জিনিয়ারিংয়ের চেয়ে মেনু থেকে অর্ডার করার মতো বেশি মনে হয়। এই সুবিধাটি বাস্তব। কিন্তু এর একটি মূল্য রয়েছে যা কেবল পরে প্রকাশ পায়, সাধারণত যখন ঝুঁকি সবচেয়ে বেশি থাকে। ডেভেলপাররা এই ফাঁদটিকে Vibe Coding বলতে শুরু করেছেন, এবং নামটি সমস্যাটিকে নিখুঁতভাবে ফুটিয়ে তোলে।

কপি-পেস্ট লুপ

এই লুপটি আসলে দেখতে কেমন: আপনি চ্যাট উইন্ডোতে কার্সার রেখে সাধারণ ইংরেজিতে একটি ফিচারের বর্ণনা দেন। মুহূর্তের মধ্যেই কোডের একটি ব্লক চলে আসে। আপনি সেটি হাইলাইট করেন, কপি করেন, এডিটরে ফিরে যান, পেস্ট করেন এবং সেভ করেন। টার্মিনালে কোনো এরর দেখায় না। ব্রাউজারে সঠিক লেআউট প্রদর্শিত হয়। আপনি পরিবর্তনটি কমিট করেন এবং পরবর্তী টিকিটটি ওপেন করেন। লজিকটি যাচাই করার জন্য কোনো বিরতি ছিল না। ইমপোর্ট করা ডিপেন্ডেন্সিগুলো পরীক্ষা করা হয়নি। ওই থার্ড-পার্টি লাইব্রেরিটি আসলে প্রয়োজনীয় কি না অথবা একটি স্ট্যান্ডার্ড লাইব্রেরি টুল দিয়ে কাজ হবে কি না, তা নিয়ে কোনো প্রশ্ন তোলা হয়নি। কাজের ধারাটি হলো কেবল জিজ্ঞাসা করা, কপি করা, পেস্ট করা এবং রান করা। যদি উপরিভাগ ঠিক দেখায়, তবে ধরে নেওয়া হয় যে গভীরতাও ঠিক আছে। এটি কোনো অর্থবহ অর্থে কোডিং নয়। এটি ম্যানুয়াল না পড়ে কেবল আগে থেকে তৈরি করা অংশগুলো জোড়া লাগানো মাত্র। যেকোনো শর্টকাটের মতো, এটি ততক্ষণ কাজ করে যতক্ষণ না এটি কাজ করা বন্ধ করে দেয়।

সবচেয়ে খারাপ সময়ে নিয়ন্ত্রণ হারানো

যখন বাগটি প্রোডাকশনে আসে, তখন সেটি আপনার কাছে আসে, AI-এর কাছে নয়। রাত দুটোয় চ্যাটবট আপনার অবজারভেবিলিটি প্ল্যাটফর্মে লগ-ইন করা থাকে না। আপনি থাকেন। আপনি যদি আপনার শিপ করা কোডটি কখনও না পড়েন, তবে এর ব্যর্থতার কারণ আপনি বুঝতে পারবেন না। আপনি এমন সব ফাইল grep করতে থাকবেন যা আপনি বোঝেন না, এবং এমন লজিক প্যাচ করার চেষ্টা করবেন যা আপনি কখনও শিখেননি। এই অনুভূতিটি বিভ্রান্তিকর। একজন ডেভেলপার যিনি নিজের কনস্ট্রাক্ট নিজে লেখেন, তিনি সিস্টেমের একটি মানসিক মানচিত্র (mental map) তৈরি করেন। তারা জানেন কোথায় জটিলতা রয়েছে এবং কোন ধারণাগুলো সিস্টেমটিকে ধরে রেখেছে। Vibe Coding সেই মানচিত্রটি মুছে দেয়। আপনি ব্ল্যাক বক্সের একজন অপারেটরে পরিণত হন। সিনট্যাক্স সঠিক, ডেমো ক্লায়েন্টকে মুগ্ধ করেছে, কিন্তু সিস্টেমটি আসলে আপনার নয়। ওনারশিপ বা মালিকানার জন্য অনুধাবন প্রয়োজন, আর অনুধাবনের জন্য সময় লাগে। সেই ধাপটি বাদ দিলে খরচ কমে যায় না; এটি কেবল সবচেয়ে ব্যয়বহুল মুহূর্তে এসে আঘাত করে।

কাজ করছে এমন কোড মানেই নিরাপদ কোড নয়

AI মডেলগুলো ট্রেনিং ডেটাতে পাওয়া প্যাটার্নের ওপর ভিত্তি করে রেসপন্স তৈরি করে। সেই প্যাটার্নগুলোর মধ্যে প্রচুর পুরনো এবং অনিরাপদ উদাহরণ থাকে। আপনি যে লগইন ফাংশনটি পেস্ট করেছেন সেটি হয়তো একটি salted slow hash-এর পরিবর্তে একটি দ্রুত এবং সেকেলে হ্যাশ ব্যবহার করে পাসওয়ার্ড সংরক্ষণ করছে, কারণ ট্রেনিং স্ন্যাপশটটি পুরনো ফোরামের স্নিপেটগুলোকে প্রাধান্য দিয়েছিল। API এন্ডপয়েন্টটি সরাসরি ইউজার ইনপুটকে একটি র (raw) SQL স্ট্রিংয়ের সাথে যুক্ত করতে পারে কারণ আপনি একটি সহজ উদাহরণ চেয়েছিলেন এবং মডেলটি তা মেনে নিয়েছে। আপনার ডাটাবেস ক্রেডেনশিয়াল ক্লায়েন্ট-সাইড JavaScript-এ ফাঁস হয়ে যেতে পারে কারণ AI জানত না যে আপনি একটি সার্ভারলেস ফ্রন্টএন্ড তৈরি করছেন, কোনো ব্যাকএন্ড রুট নয়।

ইনপুট ভ্যালিডেশনের অভাব একটি সাধারণ সমস্যা। জেনারেট করা ফর্ম হ্যান্ডলারটি ধরে নেয় যে ব্যবহারকারীরা নিয়ম মেনে চলবেন এবং স্ট্যাকের গভীরে ডেটা পাঠানোর আগে স্ট্রিংয়ের দৈর্ঘ্য, নিউমেরিক রেঞ্জ বা ফাইলের ধরন পরীক্ষা করতে ব্যর্থ হয়। অথেন্টিকেশন চেকগুলো সঠিক সার্ভার-সাইড ভেরিফিকেশন ছাড়াই ক্লায়েন্ট-সাইড টোকেনের ওপর নির্ভর করতে পারে, যা নিরাপত্তার একটি মিথ্যা ধারণা তৈরি করে। একটি AI হয়তো HttpOnly বা Secure ফ্ল্যাগ ছাড়াই একটি সেশন কুকি তৈরি করতে পারে কারণ এর ট্রেনিংয়ে পুরনো Stack Overflow-এর উত্তরগুলো অন্তর্ভুক্ত ছিল। ডেমোর সময় প্রতিটি সমস্যা অদৃশ্য থাকে। অ্যাপটি কাজ করে। ব্যবহারকারীরা লগ-ইন করেন। ডেটা প্রবাহিত হয়। কিন্তু একজন আক্রমণকারীর জন্য একটি অরক্ষিত এন্ট্রি পয়েন্টই যথেষ্ট। সিকিউরিটি লেন্স দিয়ে AI আউটপুট রিভিউ করা কোনো প্যারানয়া নয়। এটি পেশাদার সফটওয়্যারের জন্য একটি মৌলিক প্রয়োজনীয়তা।

অসংগতির মাসুল

একটি কোডবেস হলো একটি গল্পের মতো। এটি নতুন টিম মেম্বারদের শেখায় কীভাবে কাজগুলো করা উচিত। Vibe Coding সেই বর্ণনাকে এক ডজন পরস্পরবিরোধী উপভাষায় বিভক্ত করে ফেলে। আপনি গতকাল যে ফিচারটি তৈরি করেছিলেন সেটি স্পষ্ট state reducers সহ functional React hooks ব্যবহার করে। আজকের ফিচারটি, যা সামান্য ভিন্ন প্রম্পট থেকে তৈরি হয়েছে, সেখানে class components চলে আসে কারণ মডেলটি ডিফল্টভাবে একটি পুরনো প্যাটার্ন অনুসরণ করেছে। API লেয়ারটি OpenAPI-জেনারেটেড stubs এবং হাতে লেখা route handlers-এর মধ্যে পরিবর্তন করতে থাকে। নেমিং কনভেনশন camelCase এবং snake_case-এর মধ্যে বিচ্যুত হয়। এক ফাইলে এরর হ্যান্ডলিং নেই, আবার অন্য ফাইলে তা অতিরিক্ত জটিল নেস্টেড try-catch ব্লক হিসেবে ফিরে আসে।

কয়েক সপ্তাহ পর, প্রজেক্টটি একটি প্রত্নতাত্ত্বিক খননের মতো হয়ে দাঁড়ায়। আপনি নিরাপদে একটি মডিউল পরিবর্তন করতে পারেন না কারণ আপনি জানেন না যে