جنبش 0deps: وابستگی‌های محلی و قراردادهای تغییرناپذیر

توسعه‌دهندگان نرم‌افزار اغلب در هر پروژه صدها کتابخانه خارجی نصب می‌کنند. فریم‌ورک‌های مدرن به هزاران وابستگی انتقالی (transitive dependencies) متکی هستند. این بدان معناست که اپلیکیشن شما کدی را از صدها مشارکت‌کننده ناشناس اجرا می‌کند.

این ساختار سرعت توسعه را افزایش می‌دهد، اما در عین حال ریسک‌های امنیتی عظیمی در زنجیره تأمین نرم‌افزار شما ایجاد می‌کند.

جنبش 0deps یک سوال ساده می‌پرسد: چه می‌شود اگر اپلیکیشن شما فقط کدی را اجرا کند که واقعاً کنترل آن در دست خودتان است؟

هر وابستگی سطح حمله (attack surface) شما را افزایش می‌دهد. وابستگی‌ها می‌توانند:

  • آسیب‌پذیری‌های امنیتی ایجاد کنند.
  • هدف حملات زنجیره تأمین قرار گیرند.
  • رها شده و بدون پشتیبانی بمانند.
  • API عمومی خود را تغییر دهند.
  • سازگاری با نسخه‌های قبلی (backward compatibility) را از بین ببرند.

در مدل 0deps، شما تمام وابستگی‌های لازم را مستقیماً در مخزن (repository) پروژه خود قرار می‌دهید. آن‌ها را به صورت پویا در حین نصب دانلود نمی‌کنید. تمام آنچه برای ساخت و اجرای اپلیکیشن نیاز است، از اولین کلون (clone) موجود است.

این رویکرد موارد زیر را فراهم می‌کند:

  • بیلد‌های بازتولیدپذیر (Reproducible builds).
  • وابستگی کمتر به رجیستری‌های پکیج خارجی.
  • ممیزی‌های امنیتی متمرکز.
  • پیش‌بینی‌پذیری بالاتر.
  • سطح حمله کوچک‌تر در زنجیره تأمین.

0deps به این معنا نیست که به‌روزرسانی کد را متوقف کنید. الگوریتم‌ها و اصلاحات امنیتی باید تکامل یابند. در عوض، شما قرارداد عمومی (public contract) را پایدار نگه می‌دارید.

هر کتابخانه یک رابط (interface) با طراحی دقیق ارائه می‌دهد. برای مثال:

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

این توابع یک قرارداد را تعریف می‌کنند. این قرارداد ثابت می‌ماند. شما می‌توانید کد زیرین را بازنویسی کنید یا کتابخانه‌های داخلی را بدون تأثیر بر سایر بخش‌های اپلیکیشن خود جایگزین کنید.

زمانی که یک آسیب‌پذیری ظاهر می‌شود، شما پیاده‌سازی (implementation) پشت آن رابط را به‌روزرسانی می‌کنید. API عمومی بدون تغییر باقی می‌ماند. اپلیکیشن شما بدون نیاز به تغییر در کد، به کار خود ادامه می‌دهد.

ساختار به این صورت است: اپلیکیشن (Application) ↓ رابط عمومی (Public Interface) ↓ آداپتور داخلی (Internal Adapter) ↓ پیاده‌سازی (Implementation)

اگر یک کتابخانه خارجی ناپدید شود، شما فقط آداپتور را تغییر می‌دهید. هیچ بخش دیگری از اپلیکیشن شما از کار نمی‌افتد. این جداسازی از شما در برابر پکیج‌های مخرب، هک شدن رجیستری‌ها و حملات اشتباه وابستگی (dependency confusion) محافظت می‌کند.

پروژه‌ها برای دهه‌ها زنده می‌مانند، اما کتابخانه‌ها و فریم‌ورک‌ها نه. 0deps به اپلیکیشن شما اجازه می‌دهد تا سال‌ها از همان قراردادهای پایدار استفاده کند، در حالی که اکوسیستم اطراف آن در حال تغییر است.

شما به نرم‌افزاری با قابلیت پیش‌بینی، تاب‌آوری و قابلیت نگهداری بالا دست می‌یابید.

Source: https://dev.to/fullagenticstack/mouvement-0deps-dependances-locales-contrats-immuables-et-securite-par-conception-24c2

Optional learning community: https://t.me/GyaanSetuAi