Movement 0deps: ലോക്കൽ ഡിപെൻഡൻസികളും ഇമ്മ്യൂട്ടബിൾ കോൺട്രാക്റ്റുകളും (Immutable Contracts)

സോഫ്റ്റ്‌വെയർ ഡെവലപ്പർമാർ പലപ്പോഴും ഓരോ പ്രോജക്റ്റിലും നൂറുകണക്കിന് എക്സ്റ്റേണൽ ലൈബ്രറികൾ ഇൻസ്റ്റാൾ ചെയ്യാറുണ്ട്. ആധുനിക ഫ്രെയിംവർക്കുകൾ ആയിരക്കണക്കിന് ട്രാൻസിറ്റീവ് ഡിപെൻഡൻസികളെ (transitive dependencies) ആശ്രയിക്കുന്നു. ഇതിനർത്ഥം നിങ്ങളുടെ ആപ്ലിക്കേഷൻ നൂറുകണക്കിന് അജ്ഞാതരായ വ്യക്തികളുടെ കോഡ് പ്രവർത്തിപ്പിക്കുന്നു എന്നാണ്.

ഈ വേഗത നിങ്ങളുടെ സോഫ്റ്റ്‌വെയർ സപ്ലൈ ചെയിനിന് (software supply chain) വലിയൊരു അപകടസാധ്യത ഉണ്ടാക്കുന്നു.

0deps മൂവ്‌മെന്റ് ലളിതമായ ഒരു ചോദ്യം ചോദിക്കുന്നു: നിങ്ങളുടെ ആപ്ലിക്കേഷൻ നിങ്ങൾ നിയന്ത്രിക്കുന്ന കോഡ് മാത്രം പ്രവർത്തിപ്പിക്കുകയാണെങ്കിൽ എങ്ങനെയുണ്ടാകും?

ഓരോ ഡിപെൻഡൻസിയും നിങ്ങളുടെ അറ്റാക്ക് സർഫേസ് (attack surface) വർദ്ധിപ്പിക്കുന്നു. അവ സുരക്ഷാ വീഴ്ചകൾ ഉണ്ടാക്കാം, ഉപയോഗശൂന്യമായിപ്പോകാം, അല്ലെങ്കിൽ പുതിയ അപ്‌ഡേറ്റുകളിലൂടെ നിങ്ങളുടെ കോഡ് തകരാറിലാക്കാം. നിങ്ങളുടെ പ്രൊഡക്ഷൻ എൻവയോൺമെന്റിൽ (production environment) പ്രവർത്തിക്കുന്ന കോഡിന്മേലുള്ള നിയന്ത്രണം നിങ്ങൾക്ക് നഷ്ടപ്പെടുന്നു.

0deps മോഡലിൽ, നിങ്ങൾ എല്ലാ ഡിപെൻഡൻസികളെയും നേരിട്ട് നിങ്ങളുടെ പ്രോജക്റ്റ് റിപ്പോസിറ്ററിയിലേക്ക് കൊണ്ടുവരുന്നു. ഇൻസ്റ്റാളേഷൻ സമയത്ത് അവ ഡൈനാമിക് ആയി ഡൗൺലോഡ് ചെയ്യുന്നില്ല. നിങ്ങളുടെ ആപ്പ് നിർമ്മിക്കാനും പ്രവർത്തിപ്പിക്കാനും ആവശ്യമായതെല്ലാം അവിടെത്തന്നെ ഉണ്ടാകും.

ഈ സമീപനം നിരവധി ഗുണങ്ങൾ നൽകുന്നു:

  • പുനരാവർത്തിക്കാവുന്ന ബിൽഡുകൾ (Reproducible builds)
  • എക്സ്റ്റേണൽ പാക്കേജ് രജിസ്ട്രികളിലുള്ള ആശ്രയത്വം കുറയ്ക്കുന്നു
  • കേന്ദ്രീകൃതമായ സുരക്ഷാ ഓഡിറ്റുകൾ
  • മെച്ചപ്പെട്ട പ്രവചനാതീതത (Better predictability)
  • കുറഞ്ഞ സപ്ലൈ ചെയിൻ റിസ്ക്

കോഡ് മാറുന്നത് തടയുക എന്നതല്ല ഇതിന്റെ പ്രധാന തത്വം. അൽഗോരിതങ്ങളും സുരക്ഷാ പരിഹാരങ്ങളും മാറിക്കൊണ്ടിരിക്കണം. എന്നാൽ 'പബ്ലിക് കോൺട്രാക്റ്റ്' (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