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

আমরা ফ্রেমওয়ার্ক নিয়ে অনেক কথা বলি। React, Vue, Svelte, এবং আগামী সপ্তাহে যা নতুন আসবে—সবই সবার মনোযোগ কেড়ে নেয়। কনফারেন্সগুলো ফ্রেমওয়ার্কের ঘোষণার জন্য বুকড হয়ে যায়। ব্লগ পোস্টগুলো সিনট্যাক্স সুগার (syntax sugar) নিয়ে কাটাছেঁড়া করে। কিন্তু ব্যবহারকারী-মুখী এই সমস্ত কোলাহলের নিচে, ভিত্তিটি এমনভাবে পরিবর্তিত হচ্ছে যা আসলে আপনার কোড লেখার পদ্ধতি বদলে দেবে। এই বিপ্লব কোনো ফ্রন্টএন্ড ফ্রেমওয়ার্ক থেকে আসছে না। এটি ঘটছে টুলিং লেয়ারে (tooling layer), এবং এটি লেখা হচ্ছে Rust এবং Go দিয়ে।

বছরের পর বছর ধরে, JavaScript টুলগুলো JavaScript দিয়েই তৈরি করা হয়েছিল। তা যুক্তিযুক্ত ছিল। Babel একটি প্রজন্মকে শিখিয়েছিল কীভাবে আজকের দিনে আগামীকালের সিনট্যাক্স লিখতে হয়। Webpack আমাদের বিভক্ত কোডগুলোকে এমন কিছুতে গুছিয়ে দিত যা ব্রাউজার সহজে বুঝতে পারে। ESLint আমরা কোড কমিট করার আগেই বাগ (bug) ধরে ফেলত। এই টুলগুলো তৈরি করা হয়েছিল একটি ছোট মাপের ওয়েবের জন্য। এগুলো কয়েকশ মডিউল আশা করত, দশ হাজার নয়। এগুলো সিঙ্গেল রিপোজিটরি (single repo) আশা করত, মনোরিপোজিটরি (monorepo) নয় যেখানে একটি শেয়ারড UI প্যাকেজে পরিবর্তন আনলে তা ডজনখানেক অ্যাপ্লিকেশনে প্রভাব ফেলে।

তারপর অ্যাপগুলো বড় হতে শুরু করল। কোডবেসগুলো বিশাল রিপোজিটরিতে পরিণত হলো। টুলগুলো একই রয়ে গেল, আর ল্যাটেন্সি (latency) বাড়তে থাকল। যে হট রিলোড (hot reload) নিতে মাত্র দুই সেকেন্ড লাগত, তা বারো সেকেন্ড, তারপর ত্রিশ সেকেন্ড হয়ে গেল। দুপুরের খাবারের আগে পুরো টেস্ট স্যুট (test suite) চালানো একটি কল্পনার মতো হয়ে দাঁড়াল। লিন্টারগুলো (Linters) সেই ফাইলগুলোর ওপর আটকে যাচ্ছিল যা তারা হাজার বার চেক করেছে। কাগজে-কলমে প্রতিটি বিলম্ব ছোট মনে হতে পারে। কিন্তু বাস্তবে, এই বিরতিগুলো মনোযোগ নষ্ট করে দেয়। এগুলো আপনাকে আপনার কাজগুলো ব্যাচ আকারে করতে, কোনো ফিক্স কাজ করেছে কিনা তা দেখার আগে দ্বিধা করতে এবং পরীক্ষা-নিরীক্ষা এড়িয়ে চলতে বাধ্য করে, কারণ ফিডব্যাকের খরচ বা সময় অনেক বেশি হয়ে যায়।

টুলিংয়ের পরবর্তী প্রজন্ম এই ল্যাটেন্সি বা বিলম্ব দূর করছে শুধুমাত্র JavaScript-এর পথ থেকে সরে গিয়ে।

নতুন ইঞ্জিন রুম

দেখুন কীভাবে নির্দিষ্ট কাজগুলো পুনরায় দখল করা হচ্ছে।

Transformation বলতে আগে Babel বোঝাত। এটি ছিল একটি সার্বজনীন প্রি-প্রসেসর, যা JSX এবং stage-3 প্রপোজালগুলোকে সাধারণ ES5-এ রূপান্তর করত। এটি এখনও একটি চিত্তাকর্ষক সফটওয়্যার, কিন্তু এটি হলো সিঙ্গেল-থ্রেডেড JavaScript যা JavaScript-কেই পার্স (parse) করছে। এবার প্রবেশ করল OXC, একটি Rust-ভিত্তিক টুলচেইন। এটি Babel-এর মতো একই কাজ করে, কিন্তু বেঞ্চমার্ক অনুযায়ী এটি প্রায় ৪০ গুণ দ্রুত এবং ৭০% কম মেমরি ব্যবহার করে। এটি কেবল সামান্য কোনো উন্নতি নয়। এটি এমন একটি পার্থক্য যা একটি টুলকে আপনার নজরে আসা থেকে শুরু করে আপনি ভুলে যান যে সেটি চলছে—এই দুইয়ের মাঝে।

Bundling ছিল সেই জায়গা যেখানে সমস্যাটি সবচেয়ে প্রকট ছিল। Webpack এক দশক ধরে স্ট্যান্ডার্ড ছিল, কিন্তু এর অভ্যন্তরীণ কাঠামো তৈরি করা হয়েছিল ভিন্ন স্কেলের জন্য। এর Rust উত্তরাধিকারী Turbopack কেবল দ্রুততরভাবে পুনরায় কম্পাইল করে না। এটি একটি আগ্রাসী মেমোইজেশন (memoization) পদ্ধতি ব্যবহার করে যাতে ঠিক কী পরিবর্তন হয়েছে তা বোঝা যায় এবং শুধুমাত্র সেই অংশটি পুনরায় তৈরি করা যায়। একটি বড় অ্যাপ্লিকেশনে একটি মাত্র কম্পোনেন্ট পরিবর্তন করার জন্য পুরো গ্রাফ ট্রাভার্সাল (graph traversal) করার প্রয়োজন হওয়া উচিত নয়। Turbopack-এর সাথে বিল্ড প্রসেস প্রায় তাৎক্ষণিক হয়ে ওঠে। প্রগ্রেস বারটি অদৃশ্য হয়ে যায় কারণ দেখার মতো কিছু থাকে না।

Testing-এর নিজস্ব একটি ধীরগতি রয়েছে। Jest JavaScript টেস্টিংয়ের সংজ্ঞা বদলে দিয়েছিল, তবুও 'ওয়াচ মোড'-এ (watch mode) মনে হয় যেন এটি প্রতি কি-স্ট্রোকের সাথে আপনার কোডবেসটি নতুন করে শিখছে। Vitest একটি ভিন্ন আর্কিটেকচারাল পদ্ধতি গ্রহণ করে। যেহেতু এটি নতুন করে ডিপেন্ডেন্সি ট্রি (dependency tree) তৈরি করার পরিবর্তে Vite-এর মডিউল গ্রাফ পুনরায় ব্যবহার করে, তাই এটি ওয়াচ মোডে Jest-এর তুলনায় প্রায় ৮.৫ গুণ দ্রুত রিপোর্ট দেয়। এখানে জয় কেবল গতির নয়, বরং সামঞ্জস্যের (coherence)। আপনার টেস্ট রানার এবং আপনার ডেভ সার্ভার অবশেষে আপনার প্রজেক্টটি কেমন তা নিয়ে একমত হয়।

Linting একই ধরনের ওভারহেডের শিকার হয়। ESLint-এর নমনীয়তা হলো এর সুপারপাওয়ার; এর রুলগুলো হলো কেবল একটি AST-এর ওপর কাজ করা JavaScript ফাংশন। এই নমনীয়তার জন্য সাইকেল (cycles) খরচ হয়। Rust-এ লেখা Oxlint সাধারণ ক্ষেত্রগুলোর ওপর মনোযোগ দিয়ে দ্রুত কাজ সম্পন্ন করে। এটি ESLint-এর চেয়ে ৫০ থেকে ১০০ গুণ দ্রুত চলে। এর ব্যবহারিক প্রভাব হলো, আপনার এডিটরের সেভ অ্যানিমেশন শেষ হওয়ার আগেই লিন্টিং শেষ হয়ে যায়। আপনি আর সেই লাল দাগ বা স্কুইগল (red squiggles) সহ্য করেন না যা সমস্যাটি ঠিক করার পরেও কয়েক সেকেন্ড ধরে থেকে যায়।

সম্ভবত সবচেয়ে প্রতীকী পরিবর্তনটি ঘটছে type checking-এর ক্ষেত্রে। Microsoft বর্তমানে Go ভাষায় TypeScript compiler-টি নতুন করে লিখছে। প্রাথমিক বেঞ্চমার্কগুলো চমকপ্রদ: নতুন ইমপ্লিমেন্টেশনের মাধ্যমে VS Code প্রায় ৮ গুণ দ্রুত লোড হয় এবং type checking নিজেই প্রায় ১০ গুণ দ্রুত হয়। এর মানে কী হতে পারে তা ভেবে দেখুন। TypeScript হলো JavaScript-এর সাফল্যের গল্প। এটি এমন একটি ভাষা যা JavaScript-এ কম্পাইল হয়, JavaScript ইকোসিস্টেমের type-check করতে ব্যবহৃত হয়, এবং এখন এর নিজস্ব কম্পাইলার একটি native systems language-এ স্থানান্তরিত হচ্ছে কারণ JavaScript সেই পারফরম্যান্স দিতে পারছে না যা এই ইকোসিস্টেমের প্রয়োজন। টুলটি গতির সন্ধানে নিজের পথ নিজেই তৈরি করছে।

এর কোনোটিই React-এর বিকল্প নয়। এটি Next.js-কে শেষ করে দিচ্ছে না বা TypeScript-কে অপ্রচলিত করে তুলছে না। Frameworks এখনও আপনার component model এবং routing নির্ধারণ করে। এই নতুন টুলগুলো কেবল নিচের স্তরের সবকিছুকে দ্রুততর করে তোলে। এগুলো হলো রাস্তা, গাড়ি নয়।

যখন গতি আচরণ পরিবর্তন করে

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

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

মনোবিজ্ঞানীরা একেই 'flow' বলেন। এর জন্য কাজ এবং তার ফলাফলের মধ্যে একটি নিবিড় সংযোগ প্রয়োজন। একজন গিটারিস্ট বাজাতে পারেন না যদি অ্যাম্প (amp) প্রতিটি নোট দিতে দেরি করে। একজন চিত্রশিল্পী রঙ মেশাতে পারেন না যদি ব্রাশের আপডেট আধ সেকেন্ড দেরি করে আসে। ডেভেলপারদের ক্ষেত্রেও বিষয়টি একই। ল্যাটেন্সি (Latency) কেবল একটি বিরক্তি নয়; এটি চিন্তাশক্তির ওপর একটি করের মতো।

সুতরাং, উৎপাদনশীলতা বৃদ্ধি কেবল প্রযুক্তিগত নয়, এটি অভ্যাসের বিষয়। দ্রুত টুল আপনাকে পরীক্ষা-নিরীক্ষা করতে শেখায়, আর ধীরগতির টুল আপনাকে দ্বিধাবোধ করতে শেখায়। এক বছরের ব্যবধানে, এই পার্থক্যটি সম্পূর্ণ ভিন্ন ধরনের সফটওয়্যার তৈরিতে ভূমিকা রাখে। যে টিমের কাছে তাৎক্ষণিক ফিডব্যাক থাকে, তারা আরও আত্মবিশ্বাসের সাথে শিপ (ship) করতে পারে। তারা কাজকে ছোট ছোট অংশে ভাগ করে নেয় কারণ চেষ্টা করার কোনো বাড়তি খরচ নেই। তাদের code review-এর সময় কমে আসে কারণ বাগগুলো (bugs) মুহূর্তেই ধরা পড়ে যায়, বিশ মিনিট পর CI-তে নয়।

অদৃশ্য কাজ

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

আপনি যদি কোনো টিম পরিচালনা করেন বা কোনো legacy codebase রক্ষণাবেক্ষণ করেন, তবে এটি আপনার অগ্রাধিকার নির্ধারণে সাহায্য করবে। React থেকে Vue-তে মাইগ্রেট করা আপনার component tree-কে নতুন রূপ দিতে পারে। কিন্তু Webpack থেকে Turbopack-এ বা Babel থেকে OXC-তে মাইগ্রেট করা আপনার পুরো কাজের দিনটি বদলে দিতে পারে। দ্বিতীয়টি ম্যানেজমেন্টের কাছে গ্রহণযোগ্য করা কঠিন, কারণ এর জন্য কোনো নতুন হোমপেজ ডেমো নেই। সেখানে কেবল একটি টিম আছে যারা তাদের build terminal দেখে দীর্ঘশ্বাস ফেলা বন্ধ করে দিয়েছে।

আসলে কী আপনাকে ধীর করে দিচ্ছে তা অডিট (audit) করুন। আপনি যদি ২০১৫ সালে তৈরি কোনো toolchain-এ একটি আধুনিক monorepo চালান, তবে আপনি রক্ষণশীল হচ্ছেন না; বরং আপনি প্রতিদিন একটি 'friction tax' বা ঘর্ষণজনিত কর দিচ্ছেন। এর সমাধান নতুন কোনো frontend paradigm শেখা নয়, বরং ইঞ্জিন পরিবর্তন করা।

Frameworks আসতে থাকবে। সেগুলো টুইট এবং কনফারেন্সের মূল আকর্ষণ হয়ে থাকবে। কিন্তু JavaScript লেখার অভিজ্ঞতা কীভাবে পরিবর্তিত হচ্ছে, তার আসল পরিবর্তনটি ঘটছে পর্দার আড়ালে—এমন সব compiled languages-এর মাধ্যমে যা আপনার সময়কে মূল্যবান মনে করে। এটাই বিপ্লব। একটি লিস্ট রেন্ডার করার নতুন পদ্ধতি নয়, বরং এমন একটি toolchain যা আপনার কাজের পথে বাধা না হয়ে আপনাকে চিন্তা করার সুযোগ দেয়।