کوڈ کی بہترین لائن وہ ہے جو آپ کبھی لکھتے ہی نہیں۔ یہ خیال سستی کا بہانہ معلوم ہوتا ہے جب تک کہ آپ چند سال کسی دوسرے کے جوش و خروش کو برقرار رکھنے میں نہ گزار دیں۔ سافٹ ویئر لکھنا تعمیراتی کام جیسا محسوس ہوتا ہے، لیکن یہ باغبانی کی طرح زیادہ کام کرتا ہے۔ اگر اسے اکیلا چھوڑ دیا جائے تو باغ چاہے آپ چاہیں یا نہ چاہیں، خود بخود بڑھتا ہے۔ کوڈ بھی ایسا ہی کرتا ہے۔ اصل مہارت یہ جاننے میں ہے کہ کب پودے لگانا بند کرنا ہے۔
آپ کا کوڈ ایک ذمہ داری (Liability) ہے
آپ کی ہر کمٹ (commit) کی گئی لائن مستقل ذمہ داریوں کا ایک مجموعہ پیدا کرتی ہے۔ آپ اسے رات گئے کسی حادثے (incident) کے دوران دوبارہ پڑھیں گے۔ آپ اسے اس وقت ٹیسٹ کریں گے جب آپ کا فریم ورک (framework) ایک چھوٹا ورژن اپ ڈیٹ (minor version bump) جاری کرے گا جو اسٹرنگ ہینڈلنگ (string handling) کو تبدیل کر دے گا۔ آپ اسے اس وقت ڈی بگ (debug) کریں گے جب پروڈکشن (production) کے لاگز (logs) سے کچھ سمجھ نہ آ رہا ہو۔ آپ اسے اس ساتھی کو سمجھائیں گے جو پچھلے ہفتے آیا ہے، یا خود کو بارہ ماہ بعد جب اس کا سیاق و سباق (context) ختم ہو چکا ہوگا۔
یہ پیچیدگی (obscurity) کے حق میں کوئی دلیل نہیں ہے۔ یہ جیومیٹری ہے۔ بگ (bugs) کو چھپنے کے لیے جگہ چاہیے ہوتی ہے۔ آپ کا سطح کا رقبہ (surface area) جتنا کم ہوگا، ناکامی کے چھپنے کی جگہیں اتنی ہی کم ہوں گی۔ اسی خطی (lines) کا ایک فنکشن جس میں اسی خطی کوڈ اور چھ نیسٹڈ (nested) شرائط ہوں، وہ نہ صرف پڑھنے میں مشکل ہے بلکہ اس کے آپ کو حیران کرنے کے امکانات بھی زیادہ ہیں۔ ضبط (restraint) کا مطلب کوشش کی کمی نہیں ہے۔ بلکہ یہ اس بات کا اعتراف ہے کہ جو کوڈ لکھا نہیں گیا، اس میں غلطیوں (defects) کا امکان بالکل صفر ہے۔
جب ذہانت ایک ٹیکس بن جائے
ایک آرڈر کا کل (total) نکالنے کے کام پر غور کریں جس میں کچھ کاروباری اصول (business rules) ہوں: ڈسکاؤنٹ لاگو کریں، ٹیکس کے قابل اشیاء چیک کریں، اور ہر اس چیز کو چھوڑ دیں جسے ہٹایا گیا ہو۔ ایک ڈویلپر ایک ہی ایکسپریشن (expression) لکھتا ہے۔ یہ ایک پیچیدہ فلٹر چین (filter chain) کے ذریعے لسٹ کو اسٹریم (stream) کرتا ہے، ایک ہیلپر لائبریری (helper library) کو کال کرتا ہے، کرائیڈ ریڈیوسر (curried reducer) کے ساتھ نتیجے کو فولڈ کرتا ہے، اور مجموعہ واپس کرتا ہے۔ یہ مختصر ہے۔ یہ شاید علمی لحاظ سے پروقار (elegant) بھی لگے۔ لیکن اسے پڑھنے کے لیے، آپ کو ہیلپر لائبریری کی امپلیسٹ کاسٹنگ (implicit casting)، اسٹریم کے اندر آپریشنز کی ترتیب، اور کاروباری منطق (business logic) کو ایک ہی وقت میں سمجھنا ہوگا۔ آپ درمیان میں بریک پوائنٹ (breakpoint) نہیں لگا سکتے۔ آپ پوری چین کو توڑے بغیر لاگ اسٹیٹمنٹ (log statement) نہیں ڈال سکتے۔ یہ کوڈ صفحے پر تو چھوٹا ہے لیکن ذہن پر بوجھ ہے۔
دوسرا ڈویلپر ایک سادہ لوپ (loop) لکھتا ہے۔ وہ ایک چلتا ہوا ٹوٹل (running total) ڈکلیئر کرتا ہے، اشیاء پر عمل (iterate) کرتا ہے، اور یہ فیصلہ کرنے کے لیے کہ ٹیکس لاگو ہوگا یا نہیں، ایک سادہ if اسٹیٹمنٹ استعمال کرتا ہے۔ یہ بلاک عمودی طور پر لمبا ہے، لیکن اس کا مقصد واضح ہے۔ آپ اسے پانچ تجریدی تصورات (abstractions) کو ذہن میں رکھے بغیر اوپر سے نیچے تک پڑھ سکتے ہیں۔ آپ اسے ڈی بگگر (debugger) میں مرحلہ وار چلا سکتے ہیں۔ آپ پوری ایکسپریشن کو ریفیکٹر (refactor) کیے بغیر چوتھی لائن پر لاگنگ (logging) شامل کر سکتے ہیں۔
ذہین کوڈ ایک پل ریکوسٹ (pull request) میں تقریباً دس منٹ کے لیے سمجھدار لگتا ہے۔ سادہ کوڈ بورنگ لگتا ہے، اور جب آپ رات کے دو بجے ٹربل شوٹنگ (troubleshooting) کر رہے ہوں تو بورنگ ہونا ہی اصل ضرورت ہے۔ آپ کا مقصد وضاحت (clarity) ہے، ذہانت کا مظاہرہ نہیں ہے۔
سسٹم کو ڈھانچے کی ضرورت ہے، ہیروز کی نہیں
یہ اصول آرکیٹیکچر (architecture) تک پھیل جاتا ہے۔ ایک ذہین سسٹم ہاتھ سے لکھے گئے کنسنسس لاجک (consensus logic)، مخصوص آرکیسٹریشن اسکرپٹس (orchestration scripts)، اور ان غیر دستاویزی کیشنگ شارٹ کٹس (caching shortcuts) پر انحصار کر سکتا ہے جنہیں صرف ایک انجینئر واقعی سمجھتا ہے۔ وہ سسٹم خود سے نہیں چلتا؛ وہ اس شخص کی مسلسل ذہانت پر چلتا ہے جو اسے جوڑے ہوئے ہے۔ جب وہ شخص چھٹی پر جاتا ہے یا نئی ملازمت اختیار کرتا ہے، تو سسٹم لڑکھڑانے لگتا ہے۔
اس کے بجائے، بہتر ڈیزائن کیے گئے سسٹم ڈھانچے اور حدود (constraints) پر انحصار کرتے ہیں۔ وہ ڈیٹا بیس اسکیموں (database schemas) کا استعمال کرتے ہیں جو غلط ڈیٹا کو مسترد کر دیتے ہیں، API کنٹریکٹس (API contracts) جو حدود کا تعین کرتے ہیں، ٹائپ سسٹم (type systems) جو ڈیپلائمنٹ سے پہلے غلطیوں کو پکڑ لیتے ہیں، اور ماڈیول کی علیحدگی (module separation) جو مطلوبہ راستے کو واضح کر دیتی ہے۔ انہیں مستحکم رہنے کے لیے کسی ہیروئیزم (heroics) کی ضرورت نہیں ہوتی۔ انہیں تھکے ہوئے انسانوں کے ساتھ کام کرنے کے لیے ڈیزائن کیا گیا ہے، جو کہ واحد قسم کے انسان ہیں جو پروڈکشن میں سافٹ ویئر چلاتے ہیں۔
AI کے پھیلاؤ کا مسئلہ
مصنوعی ذہانت (AI) کے کوڈنگ اسسٹنٹ اس سبق کو مزید ضروری بنا دیتے ہیں۔ یہ ٹولز متن تیزی سے تیار کرتے ہیں۔ ان کے سامنے ایک سادہ مسئلہ رکھیں اور وہ اکثر ایک بڑا اور پیچیدہ حل پیش کریں گے جو ایسی یوٹیلیٹیز (utilities) کو امپورٹ کرتا ہے جن کے ریپرز (wrappers) پہلے سے آپ کے پاس موجود ہیں، ایسے ایج کیسز (edge cases) کو ہینڈل کرتا ہے جو آپ کے ڈومین (domain) میں موجود ہی نہیں ہیں، اور فریم ورک کے ایسے آئیڈیمز (idioms) استعمال کرتا ہے جس سے آپ دو سال پہلے ہی ہٹ چکے ہیں۔ AI فوری کام کو دیکھتا ہے۔ آپ کو پورے سسٹم کو دیکھنا ہوگا۔
اگر آپ طویل مدتی لاگت کا انتظام کیے بغیر ہر تجویز کو قبول کر لیتے ہیں، تو کوڈ جنریشن میں غیر ضروری اضافہ ہو جاتا ہے۔ آپ کی ریپوزٹری ایسے کوڈ سے بھر جاتی ہے جو دیکھنے میں تو مناسب لگتا ہے، کمپائل ہو جاتا ہے، اور ٹیسٹ بھی پاس کر لیتا ہے، لیکن حقیقت میں اسے کوئی نہیں سمجھ پاتا۔ خطرہ کوئی واضح سنٹیکس ایرر نہیں ہے۔ وہ تو ریویو کے دوران پکڑے جاتے ہیں۔ اصل خطرہ کوڈ بیس کا بتدریج گھنا ہونا ہے، جہاں ہر انفرادی فائل الگ سے تو معقول نظر آتی ہے لیکن مجموعی طور پر وہ کسی ایک انسانی دماغ میں سما نہیں پاتی۔ اسی طرح انجینئرنگ کی رفتار ختم ہوتی ہے۔ کسی بڑے حادثے سے نہیں، بلکہ ان چیزوں کے خاموش ارتکاز سے جنہیں کوئی حذف کرنے کے لیے تیار نہیں ہوتا کیونکہ وہ ان چیزوں کو چھونے سے ڈرتے ہیں جنہیں وہ مکمل طور پر سمجھ نہیں پاتے۔
حذف کرنا ایک ڈیزائن کی مہارت ہے
عظیم انجینئرز دوسروں سے زیادہ تیزی سے ٹائپ کر کے خود کو ثابت نہیں کرتے۔ وہ سادگی کو منتخب کر کے اور جمع کرنے کے بجائے حذف کرنے کو ترجیح دے کر جیتتے ہیں۔ کوڈ کو ہٹانے کے لیے اسے سمجھنا ضروری ہے۔ آپ کو ڈیٹا فلو کا سراغ لگانا پڑتا ہے، اس بات کی تصدیق کرنی پڑتی ہے کہ کسی فیچر کا کوئی چھپا ہوا کالر (caller) تو نہیں ہے، اور یہ بھی دیکھنا پڑتا ہے کہ کیا بزنس کی ضرورت اب بدل چکی ہے۔
ٹیمیں اکثر نئے فیچرز کی کامیابی اور بڑے پل ریکویسٹس (pull requests) لانے والوں کا جشن مناتی ہیں۔ بہت کم ٹیمیں اس انجینئر کی تعریف کرتی ہیں جو چار ہزار لائنوں پر مشتمل غیر ضروری لاجک کو ختم کر دیتا ہے اور سسٹم کو تیز اور سمجھنے میں آسان بنا دیتا ہے۔ لیکن لائنوں کی یہ منفی تعداد اکثر ادارے کے مستقبل کے لیے ایک بڑی خدمت ثابت ہوتی ہے۔
مہنگا حصہ
اب کوڈ سستا ہے۔ کوئی بھی چند سیکنڈوں میں اس کے صفحات تیار کر سکتا ہے۔ اصل مہنگی چیز وضاحت ہے۔ کسی سسٹم کو قابل فہم رکھنے کے لیے وقت، بہتر فیصلے اور ضبط کی ضرورت ہوتی ہے۔ حقیقی انجینئرنگ ڈرافٹنگ میں نہیں بلکہ ایڈیٹنگ میں ہوتی ہے۔
کم لکھیں۔ زیادہ حذف کریں۔ سادہ ڈیزائن بنائیں۔
