0deps चळवळ: स्थानिक डिपेंडन्सीज आणि अपरिवर्तनीय कॉन्ट्रॅक्ट्स

सॉफ्टवेअर डेव्हलपर्स अनेकदा प्रत्येक प्रोजेक्टमध्ये शेकडो बाह्य लायब्ररी (external libraries) इन्स्टॉल करतात. आधुनिक फ्रेमवर्क्स हजारो ट्रान्झिटिव्ह डिपेंडन्सीजवर (transitive dependencies) अवलंबून असतात. याचा अर्थ असा की तुमचे ॲप्लिकेशन शेकडो अज्ञात योगदानकर्त्यांचा कोड चालवते.

ही गती तुमच्या सॉफ्टवेअर सप्लाय चेनसाठी (software supply chain) एक मोठा धोका निर्माण करते.

0deps चळवळ एक साधा प्रश्न विचारते: जर तुमचे ॲप्लिकेशन फक्त तोच कोड चालवत असेल ज्यावर तुमचे प्रत्यक्ष नियंत्रण आहे, तर काय होईल?

प्रत्येक डिपेंडन्सी तुमचा अटॅक सरफेस (attack surface) वाढवते. यामुळे सुरक्षा त्रुटी (security holes) निर्माण होऊ शकतात, एखादी लायब्ररी सोडून दिली जाऊ शकते (abandoned), किंवा नवीन अपडेटमुळे तुमचा कोड बिघडू शकतो. यामुळे तुमच्या प्रोडक्शन एन्व्हायरमेंटमध्ये (production environment) चालणाऱ्या कोडवर तुमचे नियंत्रण सुटते.

0deps मॉडेलमध्ये, तुम्ही सर्व डिपेंडन्सीज थेट तुमच्या प्रोजेक्ट रिपॉझिटरीमध्ये (project repository) आणता. तुम्ही इन्स्टॉलेशन दरम्यान त्या डायनॅमिकली डाउनलोड करत नाही. तुमचे ॲप बिल्ड करण्यासाठी आणि चालवण्यासाठी आवश्यक असलेली सर्व सामग्री आधीच तिथे उपलब्ध असते.

हा दृष्टिकोन अनेक फायदे प्रदान करतो:

  • पुनरुत्पादनीय बिल्ड्स (Reproducible builds)
  • बाह्य पॅकेज रजिस्ट्रीजवरील कमी अवलंबित्व
  • केंद्रीकृत सुरक्षा ऑडिट्स (Centralized security audits)
  • अधिक चांगली अंदाजक्षमता (Predictability)
  • कमी झालेला सप्लाय चेन रिस्क

मुख्य तत्त्व कोड बदलण्यापासून रोखणे हे नाही. अल्गोरिदम आणि सुरक्षा सुधारणा (security fixes) विकसित होणे आवश्यक आहे. जे स्थिर राहते ते म्हणजे 'पब्लिक कॉन्ट्रॅक्ट' (public contract).

प्रत्येक लायब्ररी एक काळजीपूर्वक डिझाइन केलेले इंटरफेस (interface) प्रदान करते.

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

ही फंक्शन्स एक कॉन्ट्रॅक्ट परिभाषित करतात. ते कॉन्ट्रॅक्ट कधीही बदलत नाही. तुम्ही त्याखालील कोड पुन्हा लिहू शकता किंवा संपूर्ण लायब्ररी बदलू शकता. तुमच्या ॲप्लिकेशनचा उर्वरित भाग तसाच राहतो कारण तो फक्त त्या कॉन्ट्रॅक्टशी संवाद साधतो.

जेव्हा एखादी असुरक्षितता (vulnerability) दिसून येते, तेव्हा तुम्ही ती अंतर्गत पद्धतीने सुधारता. तुम्ही इंटरफेसच्या मागे असलेली इम्प्लिमेंटेशन (implementation) अपडेट करता. पब्लिक API तसाच राहतो. तुमच्या कोडमध्ये कोणताही बदल न करता तुमचे ॲप्लिकेशन काम करत राहते.

ही रचना बाह्य कोडला वेगळे करण्यासाठी अंतर्गत अ‍ॅडॅप्टरचा (internal adapter) वापर करते: Application ↓ Public Interface ↓ Adapter ↓ Implementation

जर एखादी बाह्य लायब्ररी उपलब्ध नसेल, तर तुम्हाला फक्त अ‍ॅडॅप्टर अपडेट करावा लागतो. तुमच्या ॲपचा इतर कोणताही भाग बिघडत नाही.

0deps चळवळ ओपन सोर्सच्या विरोधात नाही. ती तुम्ही त्याचा वापर कसा करता हे बदलते. लायब्ररी हे असे एकात्मिक घटक (integrated components) बनतात ज्यांचे ऑडिट आणि व्हर्जनिंग तुम्ही स्वतः करता.

यामुळे दशकानुदशके टिकणारे सॉफ्टवेअर तयार होते. इम्प्लिमेंटेशन बदलू शकते, परंतु तुमचे कॉन्ट्रॅक्ट्स स्थिर राहतात. ही स्थिरता तुमच्या सॉफ्टवेअरला अधिक अंदाजक्षम (predictable) आणि लवचिक (resilient) बनवते.

स्रोत: https://dev.to/fullagenticstack/mouvement-0deps-dependances-locales-contrats-immuables-et-securite-par-conception-24c2