بلڈ کے مکمل ہونے کا انتظار کر رہے ڈیولپرز سے بھرے کمرے میں ایک عجیب سی خاموشی ہوتی ہے۔ نظریں دوسرے مانیٹرز کی طرف بھٹکتی ہیں۔ انگوٹھے فون پر اسکرول کرتے ہیں۔ کوئی ایسی کافی لینے کے لیے اٹھتا ہے جس کی اسے واقعی ضرورت نہیں ہوتی۔ اگر آپ نے جدید JavaScript codebase میں کچھ وقت گزارا ہے، تو آپ اس وقفے کو جانتے ہیں۔ یہ کوئی وقفہ نہیں ہے۔ یہ آپ کی سوچ میں ایک خلا ہے۔

ہم فریم ورکس کے بارے میں بہت بات کرتے ہیں۔ React، Vue، Svelte، اور اگلے ہفتے جو کچھ بھی آئے گا، وہ تمام توجہ اپنی طرف کھینچ لیتے ہیں۔ کانفرنسز فریم ورک کے اعلانات پر بک جاتی ہیں۔ بلاگ پوسٹس syntax sugar کا تجزیہ کرتی ہیں۔ لیکن اس تمام صارف کے سامنے ہونے والے شور کے نیچے، زمین اس طرح بدل رہی ہے جو حقیقت میں آپ کے کوڈ لکھنے کے طریقے کو تبدیل کر دے گی۔ انقلاب کسی frontend framework سے نہیں آ رہا۔ یہ tooling layer میں ہو رہا ہے، اور اسے Rust اور Go میں لکھا جا رہا ہے۔

برسوں تک، JavaScript ٹولز JavaScript کے ساتھ بنائے گئے تھے۔ یہ منطقی تھا۔ Babel نے ایک نسل کو سکھایا کہ کل کے سنٹیکس کو آج کیسے لکھا جائے۔ Webpack نے ہمارے تقسیم شدہ کوڈ کو ایسی چیز میں یکجا کر دیا جسے براؤزرز آسانی سے چلا سکیں۔ ESLint نے کوڈ کمٹ کرنے سے پہلے ہی بگ پکڑ لیے۔ یہ ٹولز ایک چھوٹے ویب کے لیے بنائے گئے تھے۔ انہوں نے چند سو ماڈیولز کا تصور کیا تھا، دس ہزار کا نہیں۔ انہوں نے سنگل ریپوزٹریز کا تصور کیا تھا، مونو ریپوزٹریز کا نہیں جہاں ایک شیئرڈ UI پیکیج میں تبدیلی درجنوں ایپلی کیشنز پر اثر انداز ہوتی ہے۔

پھر ایپلی کیشنز بڑھتی گئیں۔ کوڈ بیسز عظیم الشان ریپوزٹریز میں تبدیل ہو گئے۔ ٹولز وہی رہے، اور تاخیر (latency) بڑھتی گئی۔ ایک ہاٹ ری لوڈ جو دو سیکنڈ لیتا تھا وہ بارہ، پھر تیس سیکنڈ کا ہونے لگا۔ لنچ سے پہلے مکمل ٹیسٹ سویٹ چلانا ایک خواب بن گیا۔ لنٹرز ان فائلوں پر اٹکنے لگے جنہیں وہ ہزار بار چیک کر چکے تھے۔ کاغذ پر ہر تاخیر چھوٹی معلوم ہوتی ہے۔ عملی طور پر، یہ وقفے توجہ کو منتشر کر دیتے ہیں۔ یہ آپ کو اپنا کام گروہوں (batch) میں کرنے، کسی اصلاح کے کام کرنے کے بعد اسے چیک کرنے سے پہلے ہچکچانے، اور تجربہ کاری سے بچنے کی عادت ڈال دیتے ہیں کیونکہ فیڈ بیک کی قیمت بہت زیادہ ہوتی ہے۔

ٹولنگ کی اگلی نسل محض JavaScript کے راستے سے ہٹ کر اس تاخیر پر حملہ کرتی ہے۔

نیا انجن روم

دیکھیں کہ کس طرح مخصوص کاموں کو دوبارہ حاصل کیا جا رہا ہے۔

Transformation کا مطلب پہلے Babel ہوتا تھا۔ یہ ایک عالمگیر پری پروسیسر تھا، جو JSX اور stage-3 پروپوزلز کو سادہ ES5 میں تبدیل کرتا تھا۔ یہ اب بھی متاثر کن سافٹ ویئر ہے، لیکن یہ سنگل تھریڈڈ JavaScript ہے جو JavaScript کو ہی پارس کر رہی ہے۔ اب OXC کی باری ہے، جو کہ ایک Rust پر مبنی toolchain ہے۔ یہ وہی کام کرتا ہے جو Babel کرتا ہے، لیکن بینچ مارکس کے مطابق یہ تقریباً 40 گنا تیز ہے اور 70% کم میموری استعمال کرتا ہے۔ یہ کوئی معمولی بہتری نہیں ہے۔ یہ اس ٹول اور اس ٹول کے درمیان فرق ہے جسے آپ محسوس کرتے ہیں اور اس ٹول کے درمیان جسے آپ بھول جاتے ہیں کہ وہ چل رہا ہے۔

Bundling وہ جگہ ہے جہاں سب سے زیادہ تکلیف ہوتی تھی۔ Webpack ایک دہائی تک معیار رہا، لیکن اس کا اندرونی ڈھانچہ ایک مختلف پیمانے کے لیے بنایا گیا تھا۔ اس کا Rust وارث، Turbopack، صرف تیزی سے دوبارہ کمپائل نہیں کرتا۔ یہ یہ سمجھنے کے لیے جارحانہ memoization کا سہارا لیتا ہے کہ بالکل کیا بدلا ہے اور صرف اسی حصے کو دوبارہ بناتا ہے۔ ایک بڑی ایپلی کیشن میں، ایک سنگل کمپوننٹ کو تبدیل کرنے کی قیمت آپ کو مکمل گراف ٹریورسل کی صورت میں نہیں چکانی چاہیے۔ Turbopack کے ساتھ، بلڈز فوری ہونے کے قریب پہنچ جاتے ہیں۔ پروگریس بار غائب ہو جاتی ہے کیونکہ دیکھنے کے لیے کچھ بچتا ہی نہیں۔

Testing کا اپنا ایک خاص بوجھ ہے۔ Jest نے JavaScript ٹیسٹنگ کی نئی تعریف کی، پھر بھی watch mode میں ایسا محسوس ہوتا ہے جیسے وہ ہر کی اسٹروک پر آپ کے کوڈ بیس کو دوبارہ سیکھ رہا ہو۔ Vitest ایک مختلف آرکیٹیکچرل طریقہ اپناتا ہے۔ چونکہ یہ شروع سے اپنا ڈیپینڈنسی ٹری بنانے کے بجائے Vite کے ماڈیول گراف کو دوبارہ استعمال کرتا ہے، اس لیے یہ watch mode میں Jest کے مقابلے میں تقریباً 8.5 گنا زیادہ رفتار سے رپورٹ کرتا ہے۔ یہاں جیت صرف خام رفتار کی نہیں ہے۔ یہ ہم آہنگی (coherence) کی ہے۔ آپ کا ٹیسٹ رنر اور آپ کا ڈیول سرور آخر کار اس بات پر متفق ہو جاتے ہیں کہ آپ کا پروجیکٹ کیسا دکھتا ہے۔

Linting بھی اسی طرح کے اوور ہیڈ کا شکار ہے۔ ESLint کی لچک اس کی سب سے بڑی طاقت ہے؛ اس کے رولز محض JavaScript فنکشنز ہیں جو AST پر کام کرتے ہیں۔ یہ لچک سائیکل خرچ کرتی ہے۔ Rust میں لکھا گیا Oxlint، عام کیسز تک دائرہ کار کو محدود کرتا ہے اور بجلی کی طرح تیز چلتا ہے۔ یہ ESLint سے 50 سے 100 گنا زیادہ تیز ہے۔ اس کا عملی اثر یہ ہے کہ لنٹنگ آپ کے ایڈیٹر کے سیو اینیمیشن سے پہلے ہی مکمل ہو جاتی ہے۔ آپ ان سرخ لہراتی لکیروں (red squiggles) کو برداشت کرنا چھوڑ دیتے ہیں جو مسئلہ حل کرنے کے بعد بھی سیکنڈوں تک موجود رہتی ہیں۔

شاید سب سے علامتی تبدیلی type checking میں ہو رہی ہے۔ Microsoft اس وقت TypeScript compiler کو Go میں دوبارہ لکھ رہا ہے۔ ابتدائی benchmarks حیران کن ہیں: نئی implementation کے ساتھ VS Code تقریباً 8 گنا تیزی سے لوڈ ہوتا ہے، اور type checking خود تقریباً 10 گنا تیز ہے۔ غور کریں کہ اس کا کیا مطلب ہے۔ TypeScript، JavaScript کی کامیابی کی کہانی ہے۔ یہ ایک ایسی زبان ہے جو JavaScript میں compile ہوتی ہے، JavaScript ecosystems کی type-check کرنے کے لیے استعمال ہوتی ہے، اور اب اس کا اپنا compiler ایک native systems language کی طرف منتقل ہو رہا ہے کیونکہ JavaScript وہ کارکردگی فراہم نہیں کر سکتی جس کا ecosystem تقاضا کرتا ہے۔ یہ ٹول رفتار کے حصول کے لیے اپنے ہی راستے کو کھا رہا ہے۔

ان میں سے کوئی بھی چیز React کی جگہ نہیں لیتی۔ یہ Next.js کو ختم نہیں کرتا اور نہ ہی TypeScript کو متروک بناتا ہے۔ Frameworks اب بھی آپ کے component model اور routing کا تعین کرتے ہیں۔ یہ نئے ٹولز محض نیچے کی تمام چیزوں کو تیز تر بنا دیتے ہیں۔ یہ سڑک ہیں، گاڑی نہیں۔

جب رفتار رویے کو بدل دیتی ہے

Tooling کے بارے میں گفتگو اکثر benchmark charts میں پھنس کر رہ جاتی ہے۔ نمبروں کا موازنہ کرنا آسان ہے۔ لیکن اصل اثر انسانی رویے میں نظر آتا ہے۔

جب feedback سیکنڈوں سے ملลิ سیکنڈز تک گر جاتا ہے، تو آپ صرف کام تیزی سے ختم نہیں کرتے، بلکہ آپ انہیں مختلف طریقے سے مکمل کرتے ہیں۔ آپ تبدیلیوں کو جمع کرنا چھوڑ دیتے ہیں۔ آپ ایک لائن لکھتے ہیں، نتیجہ دیکھتے ہیں، اور پھر اس میں ترمیم کرتے ہیں۔ آپ tests اس لیے چلاتے ہیں کیونکہ وہ فوری ہوتے ہیں، اس لیے نہیں کہ آپ کی pull request کا تقاضا ہے۔ آپ وہ refactor آزمانے کی کوشش کرتے ہیں جو شاید کام نہ کرے، کیونکہ اسے واپس لینا (undo کرنا) کچھ بھی خرچ نہیں کرتا۔ آپ مشین کے دوبارہ اجازت دینے کا انتظار کرنے کے بجائے مسئلے کے اندر ہی رہتے ہیں۔

اسے ماہرین نفسیات 'flow' کہتے ہیں۔ اس کے لیے عمل اور نتیجے کے درمیان ایک مضبوط تعلق (tight loop) کی ضرورت ہوتی ہے۔ ایک گٹار بجانے والا تب تک نہیں بجا سکتا اگر amp ہر نوٹ میں تاخیر کرے۔ ایک مصور رنگوں کو اس وقت تک نہیں ملا سکتا اگر برش آدھا سیکنڈ دیر سے اپ ڈیٹ ہو۔ ڈویلپرز بھی اس سے مختلف نہیں ہیں۔ Latency محض ایک پریشانی نہیں ہے۔ یہ سوچنے پر ایک ٹیکس ہے۔

چنانچہ، پیداواری صلاحیت میں اضافہ محض تکنیکی نہیں ہے۔ یہ عادتی ہے۔ تیز ٹولز آپ کو تجربہ کرنے کی تربیت دیتے ہیں۔ سست ٹولز آپ کو ہچکچانے کی تربیت دیتے ہیں۔ ایک سال کے دوران، یہ فرق بالکل مختلف سافٹ ویئر کی شکل اختیار کر لیتا ہے۔ فوری feedback والی ٹیم زیادہ اعتماد کے ساتھ کام مکمل (ship) کرتی ہے۔ وہ کام کو چھوٹے حصوں میں تقسیم کرتے ہیں کیونکہ کوشش کرنے کی قیمت صفر ہے۔ ان کے code reviews مختصر ہو جاتے ہیں کیونکہ بگ (bugs) اسی لمحے پکڑے جاتے ہیں، نہ کہ بیس منٹ بعد CI میں۔

پوشیدہ کام

یہی وجہ ہے کہ سرخیاں گمراہ کن ہوتی ہیں۔ Frameworks کے بارے میں لکھنا آسان ہے۔ ان کے لوگو، APIs اور Twitter ڈرامہ ہوتا ہے۔ Infrastructure ڈیزائن کے لحاظ سے پوشیدہ ہوتا ہے۔ آپ کسی bundler کو configure کرنے کے لیے پرجوش ہو کر نہیں جاگتے۔ آپ چاہتے ہیں کہ وہ غائب ہو جائے۔ لیکن غائب ہونا ہی وہ کام ہے جو ایک اچھا infrastructure کرتا ہے۔ یہ بوجھ اٹھاتا ہے تاکہ ظاہری تہہ (visible layer) ہلکی رہ سکے۔

اگر آپ کسی ٹیم کی قیادت کر رہے ہیں یا کسی legacy codebase کی دیکھ بھال کر رہے ہیں، تو اسے اپنی ترجیحات کا حصہ بنانا چاہیے۔ React سے Vue پر منتقل ہونا آپ کے component tree کو نئی شکل دے سکتا ہے۔ Webpack سے Turbopack پر یا Babel سے OXC پر منتقل ہونا آپ کے پورے کام کے دن کو بدل سکتا ہے۔ دوسرے معاملے کو مینجمنٹ کو سمجھانا مشکل ہے کیونکہ اس کے لیے کوئی نیا homepage demo نہیں ہوتا۔ وہاں صرف ایک ایسی ٹیم ہوتی ہے جو اپنے build terminal پر آہ بھرنا بند کر دیتی ہے۔

اس کا جائزہ لیں کہ اصل میں آپ کو کیا چیز سست کر رہی ہے۔ اگر آپ 2015 میں تیار کردہ toolchain پر ایک جدید monorepo چلا رہے ہیں، تو آپ محتاط نہیں ہو رہے، بلکہ آپ روزانہ 'friction tax' ادا کر رہے ہیں۔ اس کا حل کوئی نیا frontend paradigm سیکھنا نہیں ہے، بلکہ انجن کو تبدیل کرنا ہے۔

Frameworks آتے رہیں گے۔ انہیں ٹویٹس اور کانفرنسز کے اہم خطاب ملتے رہیں گے۔ لیکن JavaScript لکھنے کے احساس میں اصل تبدیلی 'under the hood' ہو رہی ہے، ان compiled languages میں جو آپ کے وقت کو قیمتی سمجھتی ہیں۔ یہی انقلاب ہے۔ کسی لسٹ کو render کرنے کا نیا طریقہ نہیں، بلکہ ایک ایسا toolchain جو اتنا تیز ہو کہ آپ کے راستے سے ہٹ جائے اور آپ کو سوچنے کا موقع دے۔