ChatGPT, GitHub Copilot, Cursor, اور ان کے ساتھی اب آپ کے پرامپٹ (prompt) مکمل کرنے سے پہلے ہی ایک React component تیار کر سکتے ہیں۔ Next.js روٹ کو Supabase سے جوڑنا؟ چند سیکنڈوں میں ہو گیا۔ اس الجھے ہوئے TypeScript utility کو ریفیکٹر (refactor) کرنا ہے؟ یہاں تین آپشنز موجود ہیں، مکمل type guards کے ساتھ۔ جدید ویب اسٹیک (web stacks) پر کام کرنے والے کسی بھی شخص کے لیے، یہ تجربہ کسی جادو سے کم محسوس نہیں ہوتا۔
میں ان ٹولز کو روزانہ استعمال کرتا ہوں۔ میرا اسٹیک Next.js، TypeScript، اور Supabase ہے، اور AI میرے ایڈیٹر میں ہی موجود ہے، جو custom hooks بنانے، ڈیٹا بیس کوئریز (database queries) تیار کرنے، یا الجھی ہوئی کنڈیشنل لاجک (conditional logic) کو صاف کرنے کے لیے تیار رہتا ہے۔ چھوٹے پیمانے پر، یہ ایک بہت تیز جونیئر ڈویلپر کی طرح کام کرتا ہے۔ اسے سنٹیکس (syntax) اچھی طرح یاد ہے۔ اسے وہ API surface areas یاد ہیں جن کے لیے مجھے گوگل کرنا پڑتا ہے۔ یہ بوائلر پلیٹ (boilerplate) لکھنے سے نہیں تھکتا۔
لیکن سافٹ ویئر اب بھی ٹوٹ رہا ہے۔ ایپس سست محسوس ہوتی ہیں۔ کسٹمر ڈیش بورڈز (dashboards) میں تاخیر ہوتی ہے۔ ایج کیسز (edge cases) فارمز کو کریش کر دیتے ہیں۔ اگر AI نے کوڈنگ کو اتنا آسان بنا دیا ہے، تو سافٹ ویئر کا استعمال چند سال پہلے کے مقابلے میں اب برا کیوں محسوس ہوتا ہے؟
جواب یہ ہے کہ سنٹیکس تیار کرنا اور سافٹ ویئر بنانا ایک ہی کام نہیں ہے۔
Syntax Is Not Architecture
AI ٹوکنز (tokens) کو حیرت انگیز طور پر سنبھالتا ہے۔ اس سے ایک ایسا useEffect hook لکھنے کو کہیں جو Supabase real-time channel کو سنتا ہو، اور آپ کو ایسا کچھ ملے گا جو کمپائل (compile) ہو جائے۔ یہ ایک untyped JavaScript فائل کو سخت TypeScript میں تبدیل کر سکتا ہے، یا آپ کے کافی پینے سے پہلے Zod validation کے ساتھ ایک فارم کمپوننٹ تیار کر سکتا ہے۔
جو کام یہ نہیں کر سکتا، وہ ہے آپ کی مخصوص ایپلی کیشن کے ڈھانچے (contours) کو سمجھنا۔ اچھے سافٹ ویئر کے لیے سوچ سمجھ کر اسٹیٹ مینجمنٹ (state management)، ریس کنڈیشنز (race conditions) کا احتیاط سے انتظام، اور اس بات کا واضح نقشہ ضروری ہے کہ ڈیٹا کہاں رہتا ہے اور کہاں صرف دکھایا جاتا ہے۔ AI صرف فوری فائل کو دیکھتا ہے، پورے سسٹم کو نہیں۔ یہ آپ کے کوڈ بیس کو ایک زندہ ڈھانچے کے بجائے محض ایک ہموار ٹیکسٹ راہداری کی طرح سمجھتا ہے۔
اسے ایک ایسے آرکیٹیکٹ کی طرح سمجھیں جس نے کبھی حقیقت میں کسی گھر میں رہائش اختیار نہ کی ہو۔ وہ خوبصورت فلور پلان بنا سکتے ہیں۔ وہ جانتے ہیں کہ ایک بیڈ روم میں کتنی کھڑکیاں ہونی چاہئیں۔ لیکن وہ یہ نہیں جانتے کہ فروری میں پائپ کہاں سے لیک ہونے کا امکان ہوتا ہے، یا گرمیوں کی تپش میں کون سی راہداری ناقابل استعمال ہو جاتی ہے۔ وہی تجرباتی علم ہے جو کسی عمارت کو کھڑا رکھتا ہے۔ کوڈ بھی اسی طرح کام کرتا ہے۔
The Two Friction Points
جب میں AI کو سخت حفاظتی حدود (guardrails) کے بغیر کوڈ کے بڑے حصے لکھنے دیتا ہوں، تو میں بار بار دو ہی مسائل کو ابھرتے ہوئے دیکھتا ہوں۔
پہلا یہ کہ، یہ ان ڈیزائن پیٹرنز (design patterns) کو نظر انداز کر دیتا ہے جو آپ پہلے ہی قائم کر چکے ہیں۔ ہو سکتا ہے کہ آپ کی ٹیم تمام ڈیٹا فیچنگ (data fetching) کو custom hooks کی ایک مخصوص لیئر میں رکھتی ہو۔ ہو سکتا ہے کہ آپ کے پاس اس بات کا ایک سخت طریقہ کار ہو کہ Supabase RLS policies کو فرنٹ اینڈ ہیلپرز (frontend helpers) کے ساتھ کیسے جوڑا جائے۔ AI کو اس سے کوئی فرق نہیں پڑتا۔ اگر اس سے فوری پرامپٹ حل ہو رہا ہے، تو وہ ایک بٹن کے onClick میں براہ راست supabase.from().select() ڈال دے گا۔ کوڈ چل جائے گا۔ یہ صاف ستھرا بھی لگے گا۔ لیکن یہ آپ کے کوڈ بیس میں ایک غیر معمولی چیز (outlier) ہوگی، اور ہر غیر معمولی چیز مستقبل میں ریفیکٹورنگ کا ٹیکس (refactoring tax) بنتی ہے۔ چھ ماہ بعد، کسی کو اس سوئی کو ڈھونڈنا ہوگا، یہ سمجھنا ہوگا کہ یہ کیوں موجود ہے، اور اسے نرمی سے دوبارہ ترتیب میں لانا ہوگا۔
دوسرا یہ کہ، جب سادگی کافی ہو، تب بھی یہ پیچیدگی کی طرف لپکتا ہے۔ اس ٹول کو ایسے ریپوزٹریز (repositories) پر تربیت دی گئی ہے جو اتنے بڑے ہیں کہ انہیں abstract factories، پیچیدہ reducer patterns، اور کثیر الجہتی higher-order components کی ضرورت ہوتی ہے۔ جب آپ اسے ایک سادہ کانٹیکٹ فارم بنانے کو کہتے ہیں، تو یہ آپ کو ایک state machine، ایک context provider، اور ایک custom hook abstraction دے سکتا ہے جو تین فائلوں پر پھیلا ہوا ہو۔ یہ حل تکنیکی طور پر غلط نہیں ہے۔ یہ بس بھاری ہے۔ ہر غیر ضروری لیئر "کاگنیٹیو ڈیٹ" (cognitive debt) میں اضافہ کرتی ہے۔ آپ نے کام سے بچنے کے لیے اسے چھوڑا نہیں ہے؛ بلکہ آپ نے اسے سود کے ساتھ آگے بڑھا دیا ہے۔
The Velocity Trap
یہاں ایک خطرناک فیڈ بیک لوپ (feedback loop) موجود ہے۔ AI آپ کو فیچرز دوگنی رفتار سے بنانے کی اجازت دیتا ہے، لیکن انسانی توجہ اسی طرح نہیں بڑھتی۔ اگر آپ آدھے وقت میں کام مکمل کر رہے ہیں، تو کیا آپ کوڈ ریویو (code review) پر دوگنا وقت صرف کر رہے ہیں؟ کیا آپ زیادہ ٹیسٹ لکھ رہے ہیں، یا کم؟
عملی طور پر، تیار کردہ کوڈ پر بھروسہ کرنا حیرت انگیز طور پر آسان ہے کیونکہ یہ مستند (authoritative) لگتا ہے۔ یہ جدید سنٹیکس استعمال کرتا ہے۔ کمنٹس (comments) بالکل صحیح جگہوں پر ہوتے ہیں۔ ویری ایبل کے نام پیشہ ورانہ لگتے ہیں۔ اس چمک دمک میں باریک غلطیاں چھپی ہوتی ہیں۔ ایک hook میں dependency array جو setter کو چھوڑ دے۔ ایک TypeScript type جو تکنیکی طور پر درست ہو لیکن ایک ایسے null state کی اجازت دے جسے آپ سنبھالنا بھول گئے ہوں۔ ایک Supabase query جو آپ کے مخصوص اسکیما میں soft-deleted rows کا حساب رکھنا بھول جائے۔ آپ ہر لائن پڑھنے کے بجائے اسے صرف سرسری دیکھ لیتے ہیں، کیونکہ ڈیلیوری کی رفتار اس کا تقاضا کرتی ہے۔ پیر کے دن یہ رفتار بہت اچھی لگتی ہے۔ لیکن جمعہ کا ڈیبگنگ سیشن آدھی رات تک چلتا ہے۔
The Real Cost
اس کی قیمت وہ لوگ نہیں چلاتے جو ڈویلپرز ہیں۔ بلکہ وہ اینڈ یوزرز (end users) ہوتے ہیں۔
Software feels clunkier because complexity is growing faster than teams can steward it. We are building bigger applications with smaller crews, armed with tools that make us feel invincible. When one developer can scaffold an entire dashboard in an afternoon, the organization expects three dashboards by Wednesday. Scale without care produces fragile systems. State balloons. Bundle sizes creep up. Race conditions multiply. The interface might look modern, but it resets itself when a user hits the back button, or it takes four seconds to hydrate because nobody had time to profile the waterfall of AI-generated data fetches.
Work With the Machine, Not For It
None of this means you should throw AI out of your editor. It means you need boundaries.
Use it for what it is good at. Let it write the dull stuff: repetitive TypeScript interfaces, boilerplate Supabase queries, Jest setup
