ConstructiCat Logo
CodeBust.
Browse section ▾

النمط القديم أو المهمل.

يقوم مساعدو الذكاء الاصطناعي ببث واجهات برمجة التطبيقات والمكتبات والأساليب البرمجية التي كانت شائعة قبل سنوات ولكنها أصبحت الآن مهملة أو محذوفة أو مستبدلة، وذلك بثقة تامة لأن معرفتهم البارامترية متجمدة عند تاريخ انتهاء التدريب، ولا يزال النمط القديم هو الأكثر شيوعاً إحصائياً في مجموعة بياناتهم.

##Signs and Symptoms

يتعرف المراجع على هذه الرائحة عندما يعمل الكود المولد بنجاح ولكنه يطابق أسلوب درس تعليمي يعود لعامين أو ثلاثة: حيث يستدعي واجهات برمجة تطبيقات يحذر منها إطار العمل الآن، أو يثبت إصدارات رئيسية قديمة، أو يلجأ إلى أساليب برمجية قديمة بدلاً من البنية/المكتبة القياسية الحديثة. العلامات المميزة:

  • تحذيرات الإهمال عند التثبيت/البناء/التشغيل والتي تجاهلها النموذج (DeprecationWarning، و [DEP0005]، و componentWillMount is deprecated).
  • أساليب تسبق الأساس الحالي للغة: مثل استخدام var بدلاً من const/let، أو سلاسل استدعاءات/.then() في حين يستخدم المشروع async/await، أو استخدام require() في مشروع يعتمد على ESM، أو استخدام moment.js بدلاً من Intl/Temporal/date-fns.
  • استدعاءات مكتبات تم حذفها في الإصدار المثبت لديك بالفعل: مثل df.append(...) / .ix[] في pandas، أو دورات حياة React القديمة، أو datetime.utcnow()، أو new Buffer() في Node، أو url.parse().
  • الخيارات الأمنية الافتراضية القديمة التي تهيمن على بيانات التدريب القديمة: مثل تجزئة MD5/SHA1، أو crypto.createCipher، أو استعلامات SQL النصية المدمجة يدوياً.
  • إعادة اختراع ما توفره المنصة الآن (مثل كتابة دوال يدوية لـ deepClone، و groupBy، و UUID) بدلاً من استخدام structuredClone، و Object.groupBy، و crypto.randomUUID().
// مولد بالذكاء الاصطناعي: يجمع (compiles)، ولكن كل سطر يمثل نمطاً متهالكاً/مهدراً الآن
const crypto = require('crypto');                 // مشروع ESM يستخدم الاستيراد (import)

const buf = new Buffer(userInput);                // Buffer() مهمل منذ الإصدار 6 من Node
const id  = crypto.createHash('md5')              // MD5 مهمل لأي استخدام أمني
              .update(token).digest('hex');
const cipher = crypto.createCipher('aes-256-cbc', key);  // واجهة برمجة تطبيقات بمسار محذوف، و KDF ضعيف

request(apiUrl, (err, res, body) => { /* ... */ });      // 'request' غير مدعومة منذ 2020

##Reasons for the Problem

لماذا تنتجها النماذج؟

  • تاريخ انتهاء التدريب (Training-cutoff staleness). تكون المعرفة البارامترية للنموذج متجمدة عند لحظة انتهاء تدريبه، ولكن المكتبات تستمر في التطور. تجد الدراسات التي تقيس هذا أن معدل استخدام واجهات برمجة التطبيقات المهملة يتراوح بين 25-38% عبر ثماني مكتبات بايثون في مخرجات النماذج (Wang et al., ICSE 2025)، وحتى النماذج الأكثر تطوراً تسجل فقط 48-51% في التوليد المشروط بالإصدار (GitChameleon 2.0). لا يوجد وعي بالوقت الفعلي بالنسخ أو واجهات برمجة التطبيقات في وقت الاستدلال.
  • تكرار الرمز التالي يفضل الطريقة القديمة. تحتوي مجموعة البيانات على سنوات من الكود القديم، وبالتالي فإن الإكمال الإحصائي الأكثر احتمالاً هو غالباً النمط المتهالك. تشير Ox Security إلى أن النماذج تلجأ افتراضياً إلى دمج النصوص واستخدام MD5/SHA1 على وجه التحديد لأنها "تظهر بشكل متكرر في بيانات التدريب"، ووجدت Veracode أن النماذج تختار الخيار غير الآمن/القديم بنسبة ~45% من الحالات عندما تُعطى الخيار (OX Security).
  • غياب سياق المستودع. لا يعرف النموذج عادةً الإصدار الرئيسي الذي قمت بتثبيته بالفعل، أو ما يثبته ملف القفل (lockfile) الخاص بك، أو أن lib/hash.ts موجود بالفعل — لذا لا يمكنه استهداف واجهة برمجة التطبيقات الخاصة بك. صياغة Stack Overflow للموضوع: الوكيل البرمجي هو "أداة ممتازة للتعرف على الأنماط... كود ممتاز يدخل، كود ممتاز يخرج" — وفي غياب مثال حديث، فإنه يعود لمتوسط بيانات تدريبه (Reyes Q&A).
  • مكافأة "جعله يعمل" + التملق. تعمل النماذج على تحسين الكود ليكون قابلاً للتجميع بشكل معقول ويلبي الأمر الموجه، وليس للاستخدام الحالي والمدعوم. لا يزال الاستدعاء المهمل يعمل اليوم، لذا يبدو صحيحاً للنموذج.

لماذا يسبب ضرراً؟

  • قابلية الصيانة / الأعطال الموقوتة. المهمل اليوم يعني محذوف في الإصدار الرئيسي القادم — الكود يعمل حتى يأتي التحديث ويكسره بصمت، ويتم نسخ ولصق هذه الأنماط بدلاً من إعادة هيكلتها. يظهر تحليل GitClear لـ 211 مليون سطر أن السطور المنسوخة/الملصقة ارتفعت من 8.3% إلى 12.3% بينما انخفضت السطور المعاد هيكلتها ("المنقولة") من 24.1% إلى 9.5% من 2020 إلى 2024، مع نمو الكتل المكررة بمقدار 8 أضعاف تقريباً — وبذلك ينتشر أسلوب متقادم واحد بدلاً من إصلاحه مرة واحدة (GitClear 2025).
  • الصحة. غالباً ما تمتلك واجهات برمجة التطبيقات المستبدلة دلالات مختلفة بمهارة (مثل إعادة دالة utcnow() لتاريخ ووقت غير محدد للمنطقة الزمنية؛ أو تشغيل دورات الحياة القديمة في أوقات مختلفة)، مما ينتج أخطاءً قد تتجاوز فحصاً سريعاً.
  • الأمان. يحمل التشفير المهمل (MD5، و createCipher) وإصدارات الحزم القديمة ثغرات أمنية (CVEs) معروفة لا يفحصها النموذج أبداً مقابل أي قاعدة بيانات ثغرات — وهو محرك أساسي للنتيجة التي تفيد بأن غالبية الأكواد البرمجية المولدة بواسطة الذكاء الاصطناعي تُشحن مع ثغرة أمنية واحدة على الأقل.
  • عبء المراجعة والديون التقنية. كل تكرار يتطلب إصلاحاً يدوياً منفصلاً، ولأن النمط مكرر بدلاً من كونه مركزياً، فإن التكلفة تتضاعف عبر قاعدة الكود.

##Treatment

تكتيكات المراجعة وصياغة الأوامر

  • حدد الإصدارات في نص الأمر أو السياق. "نحن نستخدم React 19، و pandas 2.2، و Node 22 (ESM) — استخدم فقط واجهات برمجة التطبيقات الحالية في هذه الإصدارات". اسحب الوثائق الحالية إلى السياق (مثل docs MCP أو Context7) بدلاً من الثقة في ذاكرة النموذج.
  • افرض فحصاً بالأدوات. اطلب من النموذج تشغيل أداة الفحص ومصحح الأنواع وأمر npm outdated / pip list --outdated، ثم أصلح كل تحذير إهمال قبل إعلان الانتهاء. تحذيرات الإهمال هي أرخص مكتشف ممكن — فلا تسمح بتجاهلها.
  • افرض إعادة الاستخدام على إعادة الاختراع. "استخدم الدالة المساعدة الموجودة في lib/hash.ts؛ ولا تقم بكتابة التجزئة يدوياً". أشر إلى الوحدة المرجعية حتى لا يعيد النموذج توليد إصدار قديم (كود مكرر).
  • استخدم أدوات التحديث التلقائي (Codemods) بدلاً من التعديلات اليدوية. للترقيات المنهجية، قم بتشغيل أدوات codemods/modernizers الرسمية بدلاً من مطالبة النموذج بإعادة الكتابة يدوياً: مثل npx @next/codemod، أو codemods الخاصة بـ React، أو pyupgrade/قواعد Ruff UP. فهي حتمية وكاملة.

إعادة الهيكلة — هذه الحركة هي بالأساس استبدال الخوارزمية (Substitute Algorithm) / استبدال واجهات برمجة التطبيقات المهملة، ويؤدي دمج الاستدعاءات القديمة المكررة في دالة مساعدة واحدة إلى تطبيق استخراج الدالة (Extract Function) في مواجهة الكود المكرر (Duplicate Code):

// قبل — واجهات برمجة تطبيقات مهملة/محذوفة المسار
const buf    = new Buffer(userInput);
const id     = crypto.createHash('md5').update(token).digest('hex');
const cipher = crypto.createCipher('aes-256-cbc', key);

// بعد — حديثة، مدعومة، وسليمة أمنياً
import crypto from 'node:crypto';

const buf    = Buffer.from(userInput);                 // منشئ آمن
const id     = crypto.createHash('sha256').update(token).digest('hex');
const iv     = crypto.randomBytes(16);                 // IV صريح
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
// (بالنسبة لكلمات المرور، استخدم argon2/bcrypt — وليس تجزئة خام)

بالنسبة للتبعيات، فإن الإصلاح المكافئ هو ترقية الإصدار المثبت والسماح لأداة codemod بنقل مواقع الاستدعاء، ثم حظر الانحراف المستقبلي في خادم التكامل المستمر (CI) (قاعدة الفحص أدناه + سياسة Dependabot/Renovate) حتى لا يتمكن النموذج من إعادة تقديم النمط القديم بصمت.

##Detected by

  • ESLint (eslint-plugin-n) n/no-deprecated-apiمنع واجهات برمجة تطبيقات Node.js الأساسية المهملة (Buffer()، و crypto.createCipher، و url.parse، إلخ)
  • typescript-eslint @typescript-eslint/no-deprecatedتمييز استخدام أي رمز يحمل علامة @deprecated في إعلانات JSDoc/TS الخاصة به
  • ESLint (eslint-plugin-react) react/no-deprecatedتمييز واجهات برمجة تطبيقات وأساليب دورة حياة React المهملة (componentWillMount، إلخ)
  • SonarQube / SonarSource RSPEC-1874 ("@Deprecated" code should not be used)الإبلاغ عن استخدام الكود الموشوم/المميز بأنه مهمل
  • Ruff pyupgrade (UP) rulesاكتشاف وإعادة كتابة أساليب بايثون القديمة/المستبدلة بمكافئاتها الحديثة
  • Dependabot version-updatesتمييز إصدارات التبعية القديمة (جانب الحزمة المتقادمة في هذه الرائحة)