ایک خالی App.js اور ایک ٹمٹماتا ہوا کرسر (cursor) محض امکانات کا احساس دلاتا ہے۔ کوئی پابندی نہیں۔ کوئی بوائلر پلیٹ (boilerplate) نہیں جو آپ کو بتائے کہ کیا کرنا ہے۔ لیکن وہ خالی کینوس آزادی نہیں ہے۔ یہ کائنات کو شروع سے دوبارہ بنانے کی ایک کھلی دعوت ہے۔
خالی اسکرین کا ٹیکس
صرف ایک کمپائلر اور ٹیکسٹ ایڈیٹر کے ساتھ پروجیکٹ شروع کریں۔ پہلا دن انتہائی پرجوش محسوس ہوتا ہے۔ آپ فولڈر کا ڈھانچہ، نام رکھنے کا طریقہ (naming convention)، اور معطل (disabled) بٹنز کے لیے گرے (gray) کا بالکل درست شیڈ خود منتخب کرتے ہیں۔ تیسرے دن تک، وہ جوش ختم ہو جاتا ہے اور اصل کام سامنے آ جاتا ہے۔
آپ کو احساس ہوتا ہے کہ ایک سادہ لسٹ بنانا محض ایک map فنکشن لکھنے کا نام نہیں ہے۔ آپ کو یہ فیصلہ کرنا پڑتا ہے کہ ڈیٹا لوڈ ہوتے وقت ڈھانچہ (skeleton) کیسا نظر آئے گا، کیا وہ دھڑکتا (pulse) ہے یا سلائیڈ (slide) کرتا ہے، اور اس کے ظاہر ہونے سے پہلے کتنا وقفہ ہونا چاہیے۔ آپ کو یہ فیصلہ کرنا پڑتا ہے کہ جب اسکرولنگ کے دوران نیٹ ورک فیل ہو جائے تو کیا ہو؟ کیا اسے خود بخود دوبارہ کوشش (retry) کرنی چاہیے؟ کوئی بٹن دکھانا چاہیے؟ یا پچھلے صفحے کو ہمیشہ کے لیے کیش (cache) کر لینا چاہیے؟ آپ کو یہ فیصلہ کرنا پڑتا ہے کہ دو فعال فلٹرز (active filters) کیسے باہم عمل کرتے ہیں، اور جب اس مجموعے سے صفر نتائج حاصل ہوں تو خالی حالت (empty state) کیسی نظر آئے گی۔ آپ کو یہاں تک فیصلہ کرنا پڑتا ہے کہ آپ کے صارف کے لیے 'صفر نتائج' کا کیا مطلب ہے۔
یہ فارملائزیشن (formalization) کے مسائل ہیں۔ ایک مبہم تصور کو ایک مخصوص، مستقل اور قابلِ اعادہ رویے میں بدلنا سافٹ ویئر کی تعمیر کا مشکل ترین حصہ ہے۔ کوڈ خود ان انتخابوں کی محض ایک نقل (transcription) ہے۔ یہی وجہ ہے کہ لامحدود کسٹمائزیشن (customization) کوئی فیچر نہیں ہے۔ یہ ایک ٹیکس ہے، اور اس کا بل ان مائیکرو فیصلوں کی صورت میں آتا ہے جو آپ کی توقع سے کہیں زیادہ تیزی سے جمع ہوتے جاتے ہیں۔
وہ فیصلے جو مسلسل لیتے رہتے ہیں
ہر آرکیٹیکچرل انتخاب (architectural choice) کو ایک سبسکرپشن کی طرح سمجھیں۔ آپ پہلی قسط تب ادا کرتے ہیں جب آپ ابتدائی کوڈ لکھتے ہیں۔ پھر آپ مہینہ در مہینہ ادائیگی کرتے رہتے ہیں۔
آپ تب ادائیگی کرتے ہیں جب ایک نیا انجینئر شامل ہوتا ہے اور پوچھتا ہے کہ آپ نے اسٹینڈرڈ لائبریری کے بجائے کسٹم ری ٹرائی لاجک (custom retry logic) کیوں منتخب کیا، اور کسی کو کچھ یاد نہیں ہوتا۔ آپ تب ادائیگی کرتے ہیں جب براؤزر کی اپ ڈیٹ آپ کے ہاتھ سے تیار کردہ ٹچ ہینڈلر (hand-rolled touch handler) کو توڑ دیتی ہے کیونکہ کسی نے یہ دستاویز (document) نہیں کیا تھا کہ اس تھریش ہولڈ (threshold) کو اڑتالیس پکسلز پر کیوں رکھا گیا تھا۔ آپ تب ادائیگی کرتے ہیں جب ایک سیکیورٹی پیچ آپ کو اپنے مخصوص آتھنٹیکیشن فلو (bespoke authentication flow) کو ری فیکٹر (refactor) کرنے پر مجبور کر دیتا ہے کیونکہ اس میں ری فریش ٹوکن روٹیشن (refresh token rotation) کا پہلے سے تصور نہیں کیا گیا تھا۔
اگر آپ کے لیے کچھ بھی طے شدہ نہیں ہے، تو ہر چیز آپ کا مسئلہ بن جاتی ہے۔ جو آپ چاہتے ہیں وہی بنانے کی آزادی، اسے ہمیشہ کے لیے اپنائے رکھنے کے بوجھ سے الگ نہیں ہے۔ آپ ان پیٹرنز (patterns) کے واحد ماہر بن جاتے ہیں جنہیں انڈسٹری نے برسوں پہلے حل کر لیا تھا۔ آپ گھر بنانے کے بجائے بنیادوں کی دیکھ بھال کرنے میں اپنے گھنٹے گزارتے ہیں۔
اے آئی (AI)، رفتار کا جال
مصنوعی ذہانت (Artificial Intelligence) اس صورتحال کو کم کرنے کے بجائے مزید خطرناک بنا دیتی ہے۔ ایک لارج لینگویج ماڈل (large language model) تیس سیکنڈ میں ایک مکمل آتھنٹیکیشن ماڈیول تیار کر سکتا ہے۔ یہ آپ کی کافی ٹھنڈی ہونے سے پہلے اسٹیٹ لیئر (state layer) کا ڈھانچہ تیار کر سکتا ہے، کیشنگ اسٹریٹجی (caching strategy) کا خاکہ بنا سکتا ہے، اور نیویگیشن گارڈز (navigation guards) لکھ سکتا ہے۔
لیکن یہاں ایک مسئلہ ہے۔ اے آئی فیصلے کرنے کی لاگت کو کم کر دیتا ہے جبکہ ان فیصلوں کی ذمہ داری اٹھانے کی لاگت کو پہلے کی طرح بلند رکھتا ہے۔ اب آپ تاریخ میں کسی بھی ٹیم کے مقابلے میں زیادہ تیزی سے ٹیکنیکل ڈیٹ (technical debt) پیدا کر سکتے ہیں۔ کوڈ ڈیمو کے دن کام کرتا ہے۔ یہ سموک ٹیسٹ (smoke test) پاس کر لیتا ہے۔ چھ ماہ بعد، جب OAuth فراہم کنندہ (provider) کسی اینڈ پوائنٹ (endpoint) کو ختم کر دیتا ہے یا سست کنکشن کے دوران کیش انویلڈیشن لاجک (cache invalidation logic) میں مسئلہ پیدا ہوتا ہے، تو آپ ان فیصلوں کی ڈی بگنگ (debugging) کر رہے ہوتے ہیں جو آپ نے کسی مشین کو سونپ دیے تھے۔
چھپا ہوا بل ہمیشہ واجب الادا ہوتا ہے۔ یہ انجینئرنگ کے گھنٹوں، کانٹیکسٹ سوئچنگ (context switching) اور رفتار کی بتدریج کمی کی صورت میں ادا کیا جاتا ہے۔
بورنگ چیزوں کو دہائیوں کے لیے خرید لیں۔
ایک اچھا فریم ورک یا پلیٹ فارم کوئی قید خانہ نہیں ہے۔ یہ وقت کی خریداری ہے۔
اس پر غور کریں کہ تقریباً ہر جدید ایپلی کیشن میں کیا چیز معیاری (standard) ہے۔ صارفین کو سائن ان (sign in) کرنے کی ضرورت ہوتی ہے۔ ڈیٹا کو اسکرینوں کے درمیان منتقل ہونا چاہیے۔ ریموٹ معلومات کو مقامی طور پر اسٹور کرنے کی ضرورت ہوتی ہے تاکہ انٹرفیس رک نہ جائے۔ لوگ کانٹیکسٹ (context) کھوئے بغیر نیویگیٹ کر سکیں۔ یہ عام چیزیں (commodities) ہیں، کوئی منفرد خصوصیات (differentiators) نہیں۔
ایک پختہ فریم ورک ان پیٹرنز کو ایک بار فارملائز کر دیتا ہے۔ وہ فیصلہ کرتا ہے:
- لوڈنگ اسٹیٹس (loading states) کیسے نظر آتے ہیں اور وہ کب ظاہر ہوتے ہیں
- نیٹ ورک کی غلطیاں (network errors) انٹرفیس تک کیسے پہنچتی ہیں
- جب دو نیویگیشن پیرامیٹرز یا فعال فلٹرز میں ٹکراؤ ہو تو وہ کیسے حل ہوتے ہیں
- جب بنیادی سروس اپ ڈیٹ ہوتی ہے تو مقامی ڈیٹا کا کیا ہوتا ہے
پھر یہ رویے کو دستاویز (document) کرتا ہے، ایج کیسز (edge cases) کی جانچ کرتا ہے، اور آپ کے سوتے ہوئے پیچز (patches) بھیجتا رہتا ہے۔ آپ اپنی تمام تر توانائی اس آخری دس فیصد کام پر لگا سکتے ہیں جو واقعی آپ کا ہے۔ وہ منفرد انٹرایکشن (interaction)۔ وہ مخصوص بزنس...
