ChatGPT و GitHub Copilot و Cursor وأقرانهم يمكنهم الآن إنتاج مكون React قبل أن تنتهي من كتابة الأمر (prompt). هل تريد ربط مسار Next.js بـ Supabase؟ يتم ذلك في ثوانٍ. هل تريد إعادة هيكلة أداة TypeScript متشابكة؟ إليك ثلاثة خيارات، كاملة مع type guards. بالنسبة لأي شخص يعمل في تقنيات الويب الحديثة، يمكن أن تبدو التجربة سحرية تقريبًا.
أنا أستخدم هذه الأدوات يوميًا. تتكون مجموعتي التقنية من Next.js و TypeScript و Supabase، والذكاء الاصطناعي موجود مباشرة في المحرر الخاص بي، جاهز لبناء هياكل custom hooks، أو إنشاء استعلامات قاعدة البيانات، أو تنظيف المنطق الشرطي الفوضوي. في المهام الصغيرة، يعمل كأنه مطور مبتدئ سريع جدًا. هو يعرف القواعد النحوية (syntax) عن ظهر قلب. يتذكر واجهات برمجة التطبيقات (APIs) التي أضطر للبحث عنها في Google. ولا يمل من كتابة الكود النمطي (boilerplate).
لكن البرمجيات لا تزال تتعطل. التطبيقات تبدو أبطأ. لوحات تحكم العملاء تتأخر. الحالات الاستثنائية (edge cases) تتسبب في انهيار النماذج. إذا كان الذكاء الاصطناعي قد جعل البرمجة أسهل بكثير، فلماذا يبدو استخدام البرمجيات أسوأ مما كان عليه قبل بضع سنوات؟
الإجابة هي أن توليد الكود وبناء البرمجيات ليسا نفس المهمة.
القواعد النحوية ليست هي الهندسة المعمارية
يتعامل الذكاء الاصطناعي مع الرموز (tokens) بشكل رائع. اطلب منه كتابة useEffect hook يستمع إلى قناة Supabase real-time، وستحصل على شيء قابل للتنفيذ. يمكنه تحويل ملف JavaScript غير محدد الأنواع إلى TypeScript صارم، أو إنشاء مكون نموذج مع Zod validation قبل أن تشرب قهوتك.
ما لا يستطيع فعله هو فهم ملامح تطبيقك الخاص. تتطلب البرمجيات الجيدة إدارة متعمدة للحالة (state management)، ومعالجة دقيقة لحالات التسابق (race conditions)، وخريطة واضحة لمكان وجود البيانات مقابل مكان عرضها فقط. يرى الذكاء الاصطناعي الملف الفوري، وليس النظام. إنه يعامل قاعدة الكود الخاصة بك كممر نصي مسطح بدلاً من هيكل حي بجدران حاملة.
فكر في الأمر كمهندس معماري لم يعش أبدًا في منزل. يمكنه رسم مخططات أرضية جميلة. يعرف عدد النوافذ التي يجب أن تحتوي عليها غرفة النوم. لكنه لا يعرف أين تميل الأنابيب للتسرب في شهر فبراير، أو أي ممر يصبح غير قابل للاستخدام في حرارة الصيف. هذه المعرفة المكتسبة من التجربة هي ما يحافظ على صمود المبنى. الكود يعمل بنفس الطريقة.
نقطتا الاحتكاك
عندما أترك الذكاء الاصطناعي يكتب أجزاءً كبيرة من الكود دون ضوابط صارمة، ألاحظ ظهور نفس المشكلتين مرارًا وتكرارًا.
أولاً، يتجاهل أنماط التصميم (design patterns) التي وضعتها بالفعل. ربما يقوم فريقك باستخراج جميع عمليات جلب البيانات إلى طبقة مخصصة من custom hooks. ربما لديك اتفاقية صارمة لكيفية ربط سياسات Supabase RLS بمساعدي الواجهة الأمامية. الذكاء الاصطناعي لا يهتم. سيضع supabase.from().select() خامًا مباشرة في onClick الخاص بزر ما إذا كان ذلك يحل الأمر الفوري. الكود يعمل. بل ويبدو نظيفًا. لكنه يعتبر حالة شاذة في قاعدة الكود الخاصة بك، وكل حالة شاذة هي ضريبة إعادة هيكلة (refactoring tax) مستقبلية. بعد ستة أشهر، سيتعين على شخص ما العثور على تلك الإبرة، وفهم سبب وجودها، وسحبها بلطف لتعود إلى المسار الصحيح.
ثانياً، يلجأ إلى التعقيد عندما يكون التبسيط كافيًا. لقد تم تدريب الأداة على مستودعات (repositories) كبيرة بما يكفي للحاجة إلى مصانع مجردة (abstract factories)، وأنماط reducer معقدة، ومكونات عالية الرتبة (higher-order components) متعددة الطبقات. عندما تطلب منه بناء نموذج اتصال بسيط، فقد يعطيك state machine، و context provider، وتجريد custom hook يمتد عبر ثلاثة ملفات. الحل ليس خاطئًا من الناحية التقنية، لكنه ثقيل فقط. كل طبقة غير ضرورية تضيف دينًا معرفيًا (cognitive debt). أنت لم تتخطَّ العمل؛ بل أجلته مع الفوائد.
فخ السرعة
هناك حلقة مفرغة خطيرة هنا. يتيح لك الذكاء الاصطناعي بناء الميزات بضعف السرعة، لكن انتباه البشر لا يتوسع بنفس الطريقة. إذا كنت تطلق الميزات في نصف الوقت، فهل تقضي ضعف الوقت في مراجعة الكود؟ هل تكتب اختبارات أكثر أم أقل؟
من الناحية العملية، من السهل للغاية الوثوق بالكود المولد لأنه يبدو موثوقًا. يستخدم قواعد نحوية حديثة. التعليقات موزعة في الأماكن الصحيحة تمامًا. أسماء المتغيرات تبدو احترافية. لكن الأخطاء الدقيقة تختبئ خلف هذا اللمعان. مصفوفة تبعية (dependency array) في hook تتجاهل دالة التعيين (setter). نوع TypeScript صحيح تقنيًا ولكنه يسمح بحالة null نسيت معالجتها. استعلام Supabase ينسى مراعاة الصفوف المحذوفة منطقيًا (soft-deleted rows) في مخططك الخاص. أنت تمر سريعًا على الكود بدلاً من قراءة كل سطر، لأن وتيرة التسليم تتطلب ذلك. السرعة تبدو رائعة يوم الاثنين، لكن جلسة تصحيح الأخطاء (debugging) يوم الجمعة تستمر حتى منتصف الليل.
التكلفة الحقيقية
الأشخاص الذين يدفعون ثمن هذا ليسوا المطورين، بل هم المستخدمون النهائيون.
تبدو البرمجيات أكثر تعقيداً وثقلاً لأن التعقيد ينمو بسرعة تفوق قدرة الفرق على إدارته. نحن نبني تطبيقات أكبر بطواقم أصغر، مسلحين بأدوات تجعلنا نشعر بأننا لا نُقهر. عندما يتمكن مطور واحد من بناء هيكل لوحة تحكم كاملة في فترة ما بعد الظهر، تتوقع المؤسسة ثلاث لوحات تحكم بحلول يوم الأربعاء. التوسع دون عناية ينتج أنظمة هشة. تتضخم الـ State. تزداد أحجام الـ Bundle تدريجياً. تتضاعف الـ Race conditions. قد تبدو الواجهة حديثة، لكنها تعيد ضبط نفسها عندما يضغط المستخدم على زر الرجوع، أو تستغرق أربع ثوانٍ لعملية الـ hydration لأن أحداً لم يجد الوقت لتحليل تسلسل عمليات جلب البيانات الناتجة عن الذكاء الاصطناعي.
اعمل مع الآلة، لا لأجلها
لا يعني أي من هذا أنه يجب عليك طرد الذكاء الاصطناعي من محرر الأكواد الخاص بك. بل يعني أنك بحاجة إلى وضع حدود.
استخدمه فيما يجيده. دعه يكتب الأشياء المملة: واجهات TypeScript المتكررة، استعلامات Supabase النمطية، وإعدادات Jest.
