حركة 0deps: التبعيات المحلية والعقود غير القابلة للتغيير
غالبًا ما يقوم مطورو البرمجيات بتثبيت مئات المكتبات الخارجية. وتعتمد أطر العمل الحديثة على آلاف التبعيات المتعدية (transitive dependencies). وهذا يعني أن تطبيقك يقوم بتشغيل أكواد برمجية من جهات مجهولة.
وهذا يخلق مخاطر في سلسلة توريد البرمجيات.
كل تبعية تزيد من مساحة سطح الهجوم لديك. ويمكن أن تؤدي إلى:
- إدخال ثغرات أمنية.
- أن تصبح هدفًا لهجمات سلسلة التوريد.
- أن يهجرها القائمون على صيانتها.
- تغيير واجهة برمجة التطبيقات (API) العامة الخاصة بها.
- كسر التوافق مع الإصدارات السابقة.
تطرح حركة 0deps سؤالًا بسيطًا: ماذا لو كان تطبيقك يعتمد فقط على الأكواد التي تتحكم بها؟
في نموذج 0deps، تقوم بتضمين التبعيات الضرورية مباشرة في مستودع مشروعك (repository). وتتوقف عن تحميلها ديناميكيًا أثناء عمليات البناء (builds). كل ما يلزم لتشغيل التطبيق يبقى في المستودع منذ البداية.
يوفر هذا النهج:
- عمليات بناء قابلة لإعادة الإنتاج (reproducible builds).
- اعتمادًا أقل على السجلات الخارجية (external registries).
- عمليات تدقيق أمني مركزية.
- قدرة أعلى على التنبؤ.
المبدأ الأساسي ليس إبقاء الكود ثابتًا؛ إذ يجب أن تتطور التنفيذات (implementations) والخوارزميات لإصلاح الأخطاء وتحسين الأمن. ما يظل مستقرًا هو العقد العام (public contract).
توفر كل مكتبة واجهة مصممة بعناية. وتشمل الأمثلة ما يلي:
authenticate()createSession()verifyPasskey()
تحدد هذه الدوال عقدًا. هذا العقد لا يتغير أبدًا. يمكنك إعادة كتابة الكود الموجود خلفه أو استبدال المكتبة بالكامل، ولن يلاحظ باقي تطبيقك هذا التغيير.
عندما تظهر ثغرة أمنية، فإنك تواجه عادةً مشكلتين:
- إصلاح الخلل.
- التحقق مما إذا كان التحديث سيؤدي إلى تعطل تطبيقك.
في بنية 0deps، تختفي المشكلة الثانية. فأنت تقوم بتحديث التنفيذ الداخلي بينما تظل واجهة برمجة التطبيقات (API) العامة كما هي، ويستمر تطبيقك في العمل دون الحاجة لتغيير الكود.
يمكنك عزل التكاملات الخارجية باستخدام محول (adapter) داخلي: التطبيق -> الواجهة العامة -> المحول -> التنفيذ
إذا اختفت مكتبة ما غدًا، فستقوم فقط بتغيير المحول، ولن يتعطل أي جزء آخر من تطبيقك.
لا تجعل 0deps البرمجيات مثالية، لكنها تقلل من مخاطر سلسلة التوريد. فهي تمنع مشكلات مثل الحزم الخبيثة، واختراق السجلات، وارتباك التبعيات (dependency confusion).
تستمر المشاريع لعقود، بينما تتغير المكتبات وأطر العمل. مع 0deps، يستمر تطبيقك في استخدام نفس العقود المستقرة بغض النظر عن كيفية تطور النظام البيئي (ecosystem).
