حركة 0deps: التبعيات المحلية والعقود غير القابلة للتغيير

غالبًا ما يقوم مطورو البرمجيات بتثبيت مئات المكتبات الخارجية في كل مشروع. وتعتمد أطر العمل الحديثة على آلاف التبعيات المتعدية (transitive dependencies). وهذا يعني أن تطبيقك يقوم بتشغيل أكواد من مئات المساهمين المجهولين.

هذه السرعة تخلق مخاطر جسيمة على سلسلة توريد البرمجيات الخاصة بك.

تطرح حركة 0deps سؤالاً بسيطاً: ماذا لو كان تطبيقك يشغل فقط الأكواد التي تتحكم بها فعلياً؟

كل تبعية تزيد من مساحة الهجوم (attack surface) الخاصة بك. فقد تتسبب في ثغرات أمنية، أو يتم التخلي عنها، أو تؤدي إلى تعطل الكود الخاص بك مع أي تحديث جديد. وبذلك تفقد السيطرة على الكود الذي يعمل في بيئة الإنتاج الخاصة بك.

في نموذج 0deps، تقوم بجلب جميع التبعيات مباشرة إلى مستودع مشروعك. أنت لا تقوم بتنزيلها ديناميكياً أثناء التثبيت؛ فكل ما تحتاجه لبناء وتشغيل تطبيقك موجود بالفعل هناك.

يوفر هذا النهج عدة فوائد:

  • عمليات بناء قابلة لإعادة الإنتاج (Reproducible builds)
  • اعتماد أقل على سجلات الحزم الخارجية
  • عمليات تدقيق أمني مركزية
  • قدرة أفضل على التنبؤ
  • مخاطر أقل في سلسلة التوريد

المبدأ الأساسي ليس منع الكود من التغيير، فالخوارزميات والإصلاحات الأمنية يجب أن تتطور. ما يظل مستقراً هو "العقد العام" (public contract).

توفر كل مكتبة واجهة (interface) مصممة بعناية:

  • authenticate()
  • createSession()
  • verifyPasskey()

تحدد هذه الدوال عقداً، وهذا العقد لا يتغير أبداً. يمكنك إعادة كتابة الكود الأساسي أو استبدال المكتبة بالكامل، بينما يظل باقي تطبيقك كما هو لأنه يتواصل فقط مع العقد.

عندما تظهر ثغرة أمنية، تقوم بإصلاحها داخلياً؛ حيث تقوم بتحديث التنفيذ (implementation) الموجود خلف الواجهة، بينما تظل واجهة برمجة التطبيقات (API) العامة متطابقة. ويستمر تطبيقك في العمل دون الحاجة لتغيير الكود.

يستخدم هذا الهيكل محولاً (adapter) داخلياً لعزل الكود الخارجي: التطبيق (Application) ↓ الواجهة العامة (Public Interface) ↓ المحول (Adapter) ↓ التنفيذ (Implementation)

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

لا تحارب حركة 0deps المصادر المفتوحة، بل تغير طريقة استخدامك لها. تصبح المكتبات مكونات متكاملة تقوم أنت بتدقيقها وإدارة إصداراتها بنفسك.

هذا يؤدي إلى إنشاء برمجيات تدوم لعقود. تتغير عمليات التنفيذ، لكن عقودك تظل ثابتة. هذا الاستقرار يجعل برمجياتك قابلة للتنبؤ ومرنة.

المصدر: https://dev.to/fullagenticstack/mouvement-0deps-dependances-locales-contrats-immuables-et-securite-par-conception-24c2