جنبش 0deps: وابستگیهای محلی و قراردادهای تغییرناپذیر
توسعهدهندگان نرمافزار اغلب در هر پروژه صدها کتابخانه خارجی نصب میکنند. فریمورکهای مدرن به هزاران وابستگی گذرا (transitive dependencies) متکی هستند. این بدان معناست که اپلیکیشن شما کدی را از صدها مشارکتکننده ناشناس اجرا میکند.
این سرعت، ریسک عظیمی برای زنجیره تأمین نرمافزار شما ایجاد میکند.
جنبش 0deps یک سؤال ساده میپرسد: چه میشود اگر اپلیکیشن شما فقط کدی را اجرا کند که واقعاً کنترل آن را در دست دارید؟
هر وابستگی، سطح حمله (attack surface) شما را افزایش میدهد. یک وابستگی میتواند حفرههای امنیتی ایجاد کند، متروک شود یا با یک بهروزرسانی جدید، کد شما را از کار بیندازد. در این حالت، شما کنترل خود را بر کدی که در محیط عملیاتی (production) اجرا میشود، از دست میدهید.
در مدل 0deps، شما تمام وابستگیها را مستقیماً به مخزن (repository) پروژه خود میآورید. آنها را بهصورت پویا در حین نصب دانلود نمیکنید. هر آنچه برای ساخت و اجرای اپلیکیشن خود نیاز دارید، از قبل در آنجا موجود است.
این رویکرد چندین مزیت دارد:
- بیلدهای بازتولیدپذیر (Reproducible builds)
- وابستگی کمتر به رجیستریهای پکیج خارجی
- ممیزیهای امنیتی متمرکز
- پیشبینیپذیری بهتر
- ریسک کمتر در زنجیره تأمین
اصل اساسی این نیست که جلوی تغییر کد را بگیریم. الگوریتمها و اصلاحات امنیتی باید تکامل یابند. آنچه پایدار میماند، قرارداد عمومی (public contract) است.
هر کتابخانه یک رابط (interface) با طراحی دقیق را ارائه میدهد.
authenticate()createSession()verifyPasskey()
این توابع یک قرارداد را تعریف میکنند. آن قرارداد هرگز تغییر نمیکند. شما میتوانید کد زیرین را بازنویسی کنید یا کل کتابخانه را جایگزین کنید. بقیه اپلیکیشن شما بدون تغییر باقی میماند، زیرا فقط با آن قرارداد تعامل دارد.
وقتی آسیبپذیریای ظاهر میشود، آن را بهصورت داخلی رفع میکنید. شما پیادهسازی (implementation) پشت آن رابط را بهروزرسانی میکنید. API عمومی بدون تغییر باقی میماند و اپلیکیشن شما بدون نیاز به تغییر در کد، به کار خود ادامه میدهد.
این ساختار از یک آداپتور داخلی برای ایزوله کردن کد خارجی استفاده میکند: Application ↓ Public Interface ↓ Adapter ↓ Implementation
اگر یک کتابخانه خارجی ناپدید شود، شما فقط آداپتور را بهروزرسانی میکنید. هیچ بخش دیگری از اپلیکیشن شما از کار نمیافتد.
جنبش 0deps با متنباز (open source) مبارزه نمیکند، بلکه نحوه استفاده از آن را تغییر میدهد. کتابخانهها به اجزای یکپارچهای تبدیل میشوند که خودتان آنها را ممیزی و نسخهبندی میکنید.
این کار نرمافزاری میسازد که دههها دوام میآورد. پیادهسازیها تغییر میکنند، اما قراردادهای شما پابرجا میمانند. این پایداری، نرمافزار شما را پیشبینیپذیر و تابآور میکند.
