একটি খালি App.js এবং একটি দপদপ করা কার্সার যেন অসীম সম্ভাবনার প্রতীক। কোনো সীমাবদ্ধতা নেই। কী করতে হবে তা বলে দেওয়ার মতো কোনো বয়েলারপ্লেট (boilerplate) নেই। কিন্তু সেই শূন্য ক্যানভাসটি স্বাধীনতা নয়; বরং এটি শুরু থেকে মহাবিশ্বকে নতুন করে গড়ে তোলার একটি খোলা আমন্ত্রণ।

ব্ল্যাঙ্ক স্ক্রিন ট্যাক্স

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

আপনি বুঝতে পারেন যে একটি সাধারণ লিস্ট তৈরি করা মানে কেবল একটি map ফাংশন লেখা নয়। ডেটা লোড হওয়ার সময় স্কেলিটন (skeleton) দেখতে কেমন হবে, সেটি কি পালস করবে নাকি স্লাইড করবে, এবং ডেটা প্রদর্শিত হওয়ার আগে কতক্ষণ বিলম্ব হবে—তা আপনাকে ঠিক করতে হবে। স্ক্রল করার মাঝপথে নেটওয়ার্ক বিচ্ছিন্ন হয়ে গেলে কী হবে, তাও আপনাকে সিদ্ধান্ত নিতে হবে। এটি কি স্বয়ংক্রিয়ভাবে পুনরায় চেষ্টা (retry) করবে? একটি বাটন দেখাবে? নাকি আগের পেজটি চিরতরে ক্যাশ (cache) করে রাখবে? দুটি সক্রিয় ফিল্টার কীভাবে একে অপরের সাথে কাজ করবে এবং সেই ফিল্টারের সমন্বয়ে কোনো ফলাফল না পাওয়া গেলে 'এম্পটি স্টেট' (empty state) দেখতে কেমন হবে, তাও আপনাকে ঠিক করতে হবে। এমনকি আপনার ব্যবহারকারীর কাছে 'শূন্য ফলাফল' মানে কী, সেটিও আপনাকে নির্ধারণ করতে হবে।

এগুলো হলো ফরম্যালাইজেশন (formalization) সংক্রান্ত সমস্যা। একটি অস্পষ্ট ধারণাকে একটি সুনির্দিষ্ট, সামঞ্জস্যপূর্ণ এবং পুনরাবৃত্তিযোগ্য আচরণে রূপান্তর করাই হলো সফটওয়্যার নির্মাণের সবচেয়ে কঠিন অংশ। কোড নিজেই হলো সেই সব সিদ্ধান্তের একটি প্রতিলিপি মাত্র। এই কারণেই অসীম কাস্টমাইজেশন কোনো ফিচার নয়; বরং এটি একটি ট্যাক্স বা কর, আর এর ইনভয়েস বা বিল আসে সেই সব ক্ষুদ্র সিদ্ধান্তের আকারে যা আপনার প্রত্যাশার চেয়েও দ্রুত জমা হতে থাকে।

সিদ্ধান্ত যা চলতেই থাকে

প্রতিটি আর্কিটেকচারাল সিদ্ধান্তকে একটি সাবস্ক্রিপশনের মতো বিবেচনা করুন। যখন আপনি প্রাথমিক ইমপ্লিমেন্টেশন লিখছেন, তখন আপনি প্রথম কিস্তি পরিশোধ করছেন। এরপর থেকে আপনাকে মাস শেষে মাস এটি পরিশোধ করতে হবে।

যখন একজন নতুন ইঞ্জিনিয়ার যোগ দেন এবং জিজ্ঞাসা করেন কেন আপনি স্ট্যান্ডার্ড লাইব্রেরির পরিবর্তে কাস্টম রিট্রাই লজিক (retry logic) বেছে নিয়েছেন অথচ কেউ তা মনে করতে পারে না, তখন আপনি এর মূল্য দেন। যখন একটি ব্রাউজার আপডেট আপনার হাতে তৈরি করা টাচ হ্যান্ডলারকে (touch handler) অকেজো করে দেয় কারণ কেউ লিখে রাখেনি কেন সেই থ্রেশহোল্ডটি ৪৮ পিক্সেল রাখা হয়েছিল, তখনও আপনি এর মূল্য দেন। যখন একটি সিকিউরিটি প্যাচ আপনাকে আপনার নিজস্ব অথেন্টিকেশন ফ্লো (authentication flow) রিফ্যাক্টর করতে বাধ্য করে কারণ এটি রিফ্রেশ টোকেন রোটেশনের কথা আগে থেকে ভাবেনি, তখনও আপনি এর মূল্য দেন।

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

AI, একটি গতি-ফাঁদ

কৃত্রিম বুদ্ধিমত্তা এই পরিস্থিতিকে আরও বিপজ্জনক করে তোলে, কম নয়। একটি লার্জ ল্যাঙ্গুয়েজ মডেল (LLM) মাত্র ৩০ সেকেন্ডে একটি সম্পূর্ণ অথেন্টিকেশন মডিউল তৈরি করে দিতে পারে। আপনার কফি ঠান্ডা হওয়ার আগেই এটি একটি স্টেট লেয়ার (state layer) তৈরি করতে পারে, ক্যাশিং স্ট্র্যাটেজি (caching strategy) ড্রাফট করতে পারে এবং নেভিগেশন গার্ড (navigation guards) লিখে দিতে পারে।

কিন্তু এখানেই আসল সমস্যা। AI সিদ্ধান্ত নেওয়ার খরচ কমিয়ে দেয়, কিন্তু সেই সিদ্ধান্তের দায়ভার বহনের খরচ আগের মতোই উচ্চ রাখে। আপনি এখন ইতিহাসের যেকোনো টিমের চেয়ে দ্রুত টেকনিক্যাল ডেট (technical debt) তৈরি করতে পারেন। ডেমো দেওয়ার দিন কোডটি কাজ করে। এটি স্মোক টেস্টেও (smoke test) পাস করে। কিন্তু ছয় মাস পরে, যখন OAuth প্রোভাইডার একটি এন্ডপয়েন্ট বাতিল (deprecate) করে দেয় অথবা ধীরগতির সংযোগের সময় ক্যাশ ইনভ্যালিডেশন লজিক (cache invalidation logic) সমস্যা তৈরি করে, তখন আপনি সেই সব সিদ্ধান্ত ডিবাগ করতে থাকেন যা আপনি একটি মেশিনের ওপর ছেড়ে দিয়েছিলেন।

লুকানো বিল বা খরচ সবসময় আসে। এটি পরিশোধ করতে হয় ইঞ্জিনিয়ারিং ঘণ্টা, কনটেক্সট সুইচিং (context switching) এবং কাজের গতির ধীরগতির মাধ্যমে।

এক দশকের জন্য 'বোরিং' বা একঘেয়ে জিনিস কিনে নিন

একটি ভালো ফ্রেমওয়ার্ক বা প্ল্যাটফর্ম কোনো খাঁচা নয়। এটি হলো সময়ের কেনা।

প্রায় প্রতিটি আধুনিক অ্যাপ্লিকেশনে যা স্ট্যান্ডার্ড বা মানসম্মত, তা বিবেচনা করুন। ব্যবহারকারীদের সাইন-ইন করতে হয়। স্ক্রিনের মধ্যে ডেটা চলাফেরা করতে হয়। রিমোট তথ্য লোকালি স্টোর করতে হয় যাতে ইন্টারফেসটি স্থবির না হয়ে যায়। মানুষ কনটেক্সট না হারিয়ে নেভিগেট করতে চায়। এগুলো হলো সাধারণ পণ্য (commodities), কোনো বিশেষত্ব (differentiators) নয়।

একটি পরিপক্ক ফ্রেমওয়ার্ক এই প্যাটার্নগুলোকে একবারই ফরম্যালাইজ করে। এটি সিদ্ধান্ত নেয়:

  • লোডিং স্টেটগুলো দেখতে কেমন হবে এবং কখন সেগুলো প্রদর্শিত হবে
  • নেটওয়ার্ক ত্রুটিগুলো কীভাবে ইন্টারফেসে পৌঁছাবে
  • দুটি নেভিগেশন প্যারামিটার বা সক্রিয় ফিল্টার যখন সাংঘর্ষিক হয়, তখন কীভাবে তা সমাধান করা হবে
  • মূল সার্ভিস আপডেট হলে লোকাল ডেটার কী হবে

এরপর আপনি যখন ঘুমান, তখন এটি সেই আচরণগুলো ডকুমেন্ট করে, এজ কেসগুলো (edge cases) টেস্ট করে এবং প্যাচ (patches) পুশ করে। আপনি আপনার সমস্ত শক্তি সেই শেষ ১০ শতাংশ কাজে ব্যয় করতে পারেন যা আসলে আপনার নিজস্ব। সেই অভিনব ইন্টারঅ্যাকশন বা নির্দিষ্ট ব্যবসায়িক প্রয়োজন।