निर्भरता को कब अद्यतन किया जाना चाहिए?


30

हमारे पास दो अलग-अलग कोड बेस (Android, और एक Node.js वेब ऐप) के साथ दो प्रमुख निर्भरता-संबंधित संकट थे। Android रेपो को Flurry से Firebase की ओर स्थानांतरित करने की आवश्यकता थी, जिसे Google Play Services लाइब्रेरी को चार प्रमुख संस्करणों को अपडेट करने की आवश्यकता थी । इसी तरह की एक घटना हमारे हरोकू-होस्टेड नोड ऐप के साथ हुई जहां हमारे उत्पादन स्टैक (सीडर) को हटा दिया गया और इसे देवदार -14 में अपग्रेड किए जाने की आवश्यकता थी। हमारे PostgreSQL डेटाबेस को भी 9.2 से 9.6 तक अपडेट करने की आवश्यकता थी।

इनमें से प्रत्येक ऐप की निर्भरता लगभग दो साल तक बासी रही, और जब कुछ लोग वंचित हो गए और हम 'सूर्यास्त' की अवधि तक पहुंच गए, तो उन्हें अपडेट करना, या उन्हें बदलना एक बड़ा सिरदर्द रहा। मैंने पिछले महीने में 30 से अधिक घंटे बिताए हैं या दो धीरे-धीरे संघर्षों और टूटे हुए कोड को हल कर रहे हैं।

स्पष्ट रूप से दो साल के लिए चीजों को बैठने देना बहुत लंबा है। जब आप हेरोकू जैसे प्लेटफ़ॉर्म प्रदाता का उपयोग कर रहे हों, तो प्रौद्योगिकी तेज़ी से चलती है। मान लेते हैं कि हमारे पास एक पूर्ण परीक्षण सूट है, और ट्रैविस सीआई जैसी एक सीआई प्रक्रिया है, जो अद्यतन करने के लिए बहुत सारे अनुमान लगाती है। उदाहरण के लिए यदि किसी अपग्रेड के बाद कोई फंक्शन हटा दिया गया था, और आप इसका उपयोग कर रहे थे, तो आपके परीक्षण विफल हो जाएंगे।

निर्भरता कितनी बार अपडेट की जानी चाहिए, या निर्भरता कब अपडेट की जानी चाहिए? हमने अपडेट किया क्योंकि हम मजबूर थे, लेकिन ऐसा लगता है कि किसी प्रकार का पूर्व-खाली दृष्टिकोण बेहतर होगा। जब मामूली संस्करण जारी किए जाते हैं तो क्या हमें अपडेट करना चाहिए? प्रमुख संस्करण? हर महीने अगर अपडेट उपलब्ध हैं? मैं ऐसी स्थिति से बचना चाहता हूं जैसे मैंने हर कीमत पर अनुभव किया है।

PS - मेरी व्यक्तिगत रेल परियोजनाओं में से एक के लिए, मैं Gemnasium नामक एक सेवा का उपयोग करता हूं जो आपकी निर्भरता को ट्रैक करता है ताकि आपको उदाहरण के लिए सुरक्षा कमजोरियों के बारे में सूचित किया जा सके। यह एक महान सेवा है, लेकिन हमें उन परियोजनाओं के लिए मैन्युअल रूप से निर्भरता की जांच करनी होगी जिनका मैंने उल्लेख किया था।

जवाबों:


32

जब आप आम तौर पर निर्भरता का उन्नयन करना चाहिए:

  1. यह आवश्यक है
  2. ऐसा करने का एक फायदा है
  3. ऐसा नहीं करना नुकसानदेह है

(ये परस्पर अनन्य नहीं हैं।)

प्रेरणा 1 ("जब आपको" करना होगा) सबसे जरूरी ड्राइवर है। कुछ घटक या मंच जिस पर आप निर्भर करते हैं (जैसे हरोकू) इसकी माँग करता है, और आपको लाइन में लगना पड़ता है। आवश्यक अपग्रेड अक्सर अन्य विकल्पों में से कैस्केड होता है; आप PostgreSQL संस्करण को ऐसे-और-अप में अपग्रेड करने का निर्णय लेते हैं। अब आपको अपने ड्राइवरों, अपने ओआरएम संस्करण आदि को अपडेट करना होगा।

अपग्रेड करना क्योंकि आप या आपकी टीम ऐसा करने में एक फायदा समझती है क्योंकि यह नरम और अधिक वैकल्पिक है। एक निर्णय कॉल का अधिक: "क्या नई सुविधा, क्षमता, प्रदर्शन, ... प्रयास और अव्यवस्था के लायक है जो इसे लाएगा?" ओल्डन टाइम्स में, वैकल्पिक उन्नयन के खिलाफ एक मजबूत पूर्वाग्रह था। वे मैनुअल और कठोर थे, सैंडबॉक्स में उन्हें आज़माने के अच्छे तरीके नहीं थेया वर्चुअल वातावरण, या अपडेट को वापस रोल करने के लिए अगर वह काम नहीं करता था, और यह पुष्टि करने के लिए तेज़ स्वचालित परीक्षण नहीं थे कि अपडेट "सेब कार्ट को परेशान नहीं" किया था। आजकल पूर्वाग्रह बहुत तेजी से, अधिक आक्रामक अद्यतन चक्रों की ओर है। चुस्त तरीके प्यार करने वाली चीजों को पसंद करते हैं; स्वचालित इंस्टॉलर, निर्भरता प्रबंधक, और रेपो स्थापित प्रक्रिया को तेज और अक्सर लगभग अदृश्य बना देते हैं; आभासी वातावरण और सर्वव्यापी संस्करण नियंत्रण शाखाओं, कांटों और रोलबैक को आसान बनाते हैं; और स्वचालित परीक्षण हमें एक अद्यतन की कोशिश तो आसानी से और पर्याप्त मूल्यांकन "यह काम किया था? यह कुछ भी पेंच?" पूर्वाग्रह ने थोक को स्थानांतरित कर दिया है, "अगर यह टूट नहीं गया है, तो इसे ठीक न करें" को "जल्दी अपडेट करें, अक्सर अपडेट करें"

प्रेरणा 3 सबसे नरम है। उपयोगकर्ता कहानियां खुद को "प्लंबिंग" से चिंतित नहीं करती हैं और कभी भी उल्लेख नहीं करती हैं "और बुनियादी ढांचे को मौजूदा एक के पीछे एन रिलीज से अधिक नहीं रखें।" संस्करण बहाव के नुकसान (मोटे तौर पर, वक्र के पीछे गिरने से जुड़े तकनीकी ऋण) चुपचाप अतिक्रमण करते हैं, फिर अक्सर टूटने के माध्यम से खुद की घोषणा करते हैं। "क्षमा करें, वह API अब समर्थित नहीं है!" एजाइल टीमों के भीतर भी वृद्धिशीलता को प्रेरित करना कठिन हो सकता है और "शीर्ष पर रहना" घटकों की ताजगी जब यह किसी दिए गए स्प्रिंट या रिलीज को पूरा करने के लिए निर्णायक के रूप में नहीं देखा जाता है। अगर कोई भी अपडेट की वकालत नहीं करता है, तो वे अप्रशिक्षित जा सकते हैं। जब तक कि वह टूटने के लिए तैयार न हो, या जब तक वह टूट न जाए, तब तक वह पहिया चीख़ नहीं सकता।

व्यावहारिक दृष्टिकोण से, आपकी टीम को संस्करण बहाव समस्या पर अधिक ध्यान देने की आवश्यकता है। 2 साल बहुत लंबा है। कोई जादू नहीं है। यह सिर्फ "अभी मुझे भुगतान करो या बाद में मुझे भुगतान करो" की बात है। या तो संस्करण बहाव की समस्या को गंभीर रूप से संबोधित करें, या पीड़ित हों और फिर हर कुछ वर्षों में बड़े झटके पर उठें। मैं वृद्धिशीलता को पसंद करता हूं, क्योंकि प्लेटफॉर्म के कुछ झटके बहुत अधिक हैं। एक महत्वपूर्ण एपीआई या प्लेटफॉर्म जिस पर आप काम नहीं करते हैं, वह वास्तव में आपके दिन, सप्ताह या महीने को बर्बाद कर सकता है। मैं प्रति वर्ष कम से कम 1-2 बार घटक ताजगी का मूल्यांकन करना पसंद करता हूं। आप स्पष्ट रूप से समीक्षाओं को शेड्यूल कर सकते हैं, या उन्हें अपेक्षाकृत मेट्रोनोमिक द्वारा व्यवस्थित किया जा सकता है, आमतौर पर पायथन, पोस्टग्रेजक्यूएल और नोड जैसे प्रमुख घटकों के वार्षिक अपडेट चक्र। यदि घटक अपडेट आपकी टीम को बहुत दृढ़ता से ट्रिगर नहीं करते हैं, तो प्रमुख रिलीज पर ताजगी की जांच होती है, प्राकृतिक परियोजना के पठारों पर, या हर k रिलीज पर भी काम हो सकता है। जो भी अधिक नियमित ताल पर सही संस्करण के बहाव पर ध्यान देता है।


5

पुस्तकालयों को तब अद्यतन किया जाना चाहिए जब उन्हें अद्यतन करने की आवश्यकता हो। इसका मतलब है, अगर अपडेट करने से कोई मूल्य नहीं है, तो आपको नहीं करना चाहिए।

आपके विशेष मामले में, आप एक पुराने तकनीकी स्टैक से एक नए से माइग्रेट कर रहे थे, और ऐसा करने के लिए आपको अपनी निर्भरता को अपडेट करने के लिए मजबूर किया गया था। निर्भरता को अपडेट करने का यह सही समय है।

यदि आप "अब सिरदर्द नहीं है" के लिए, आप समय-समय पर अपनी निर्भरता को अपडेट कर रहे थे, तो आपको बिना रिटर्न वैल्यू के लिए बहुत काम का समय (कोडिंग) निवेश करना होगा। और जब आप अंतिम अपडेट करने वाले थे (अब आप जो कर रहे हैं, लेकिन 4 के बजाय 1 प्रमुख संस्करण को अपडेट कर रहे हैं), तो आपको शायद अभी भी कहीं न कहीं सिरदर्द होगा (आखिरकार, मुख्य संस्करण का अर्थ है परिवर्तन को तोड़ना)। इसलिए मुझे लगता है कि आप सही रास्ते पर हैं।

हालाँकि, यदि आपको प्रवास करना बहुत कठिन लगता है, और बहुत अधिक रिफ्लेक्टर करना पड़ता है, तो संभावना है कि समस्या आपके कोडबेस में है। एंड्रॉइड परियोजनाओं के लिए कोड संरचना के संदर्भ में समग्र वास्तुकला नहीं होना बहुत आम है। एक अच्छा निर्भरता इंजेक्शन ढांचा जैसे Dagger 2 , और SOLID जैसे सॉफ़्टवेयर इंजीनियरिंग सिद्धांतों के एक जोड़े ने समान व्यवहार / आवश्यकताओं को ध्यान में रखते हुए कोड कार्यान्वयन को बदलना आसान बना दिया होगा।

इसके अलावा, जब से हम रिफैक्टिंग कर रहे हैं, यूनिट टेस्टिंग के बारे में थोड़ा बहुत पढ़ें, क्योंकि इस तरह के काम को करने में बहुत मदद मिलेगी।


4

यदि आप पैकेज प्रबंधन उपकरण (जैसे npm, NuGet) का उपयोग कर रहे हैं और एक व्यापक स्वचालित परीक्षण सूट है तो निर्भरता को कम करना एक कम प्रयास वाली गतिविधि होनी चाहिए, बस पैकेज को अपग्रेड करें, अपना परीक्षण सूट चलाएं और देखें कि क्या कोई समस्या है। यदि इसके बाद रोलबैक होते हैं और समस्या की जांच करने और उसे ठीक करने के लिए कार्य आइटम बढ़ाते हैं।

जब तक निर्भरता के उन्नयन की लागत कम है, तब तक इसकी कीमत अच्छी है।

  • यदि अपग्रेड के साथ समस्याएँ हैं, तो आप बाद में जानना चाहते हैं कि बाद में अपस्ट्रीम में बदलाव की आवश्यकता है।
  • अंतिम समय पर निर्भरता उन्नयन छोड़ने का मतलब है कि आप उन उन्नयनों को क्रंच समय पर कर रहे हैं (जैसे सुरक्षा महत्वपूर्ण बग के जवाब में)। अपनी निर्भरताओं के शीर्ष पर रखने का मतलब है कि आप उस नियंत्रण में हैं जब आप उस प्रयास को खर्च करते हैं और उन उन्नयनों को कई बार कर सकते हैं जब आप उतना व्यस्त नहीं होते हैं।
  • नए संस्करणों में उत्पादकता में सुधार हो सकता है जैसे बेहतर प्रलेखन, एपीआई का उपयोग करना आसान, बगफिक्स (हालांकि रिवर्स भी संभव है)।

यदि उन्नयन निर्भरता कम प्रयास नहीं है (उदाहरण के लिए, क्योंकि आपको मैन्युअल रूप से उन्नयन का परीक्षण करने की आवश्यकता है या क्योंकि ज्ञात मुद्दे / परिवर्तन तोड़ रहे हैं) तो आपको अपने अन्य कार्यों के खिलाफ पेशेवरों और विपक्षों को तौलना होगा। पुरानी निर्भरताएं एक तरह का कम-ब्याज तकनीकी ऋण हैं, और इसलिए तदनुसार इलाज किया जाना चाहिए।


2

आपको एक रिलीज़ नहीं करना चाहिए जहाँ आप जानबूझकर अपने निर्भरता के पुराने संस्करणों का उपयोग करते हैं, जब तक कि उन संस्करणों को विकल्प का समर्थन नहीं किया जाता है।

यानी यदि आप V1 पर हैं और यह अभी भी समर्थित है, तो आप अभी भी v1 के नवीनतम संस्करण का उपयोग कर सकते हैं।

केवल समय जो आपको पुराना होना चाहिए, यदि है:

A: आपने कुछ समय में रिलीज़ नहीं किया है।

B: आप v1 पर इतने लंबे समय से हैं कि यह अब समर्थित नहीं है

अपडेट एक कारण से जारी किए जाते हैं, उनमें सुरक्षा फ़िक्सेस होते हैं जो आपको बोर्ड पर लेने चाहिए।

यदि आपकी निर्भरता का एक नया संस्करण सामने आता है, तो आपको एक रिलीज भी करना चाहिए


1

मुझे लगता है कि यह कुछ हद तक विचाराधीन लाइब्रेरी पर निर्भर होना चाहिए, लेकिन मुझे खुद पर निर्भरता समान है।

कॉमन सेंस मुझे कहता है कि एक प्रमुख संस्करण शायद अपग्रेड करने का सही समय है, और एक छोटा संस्करण जो एक गंभीर दोष को संबोधित करता है, या इसमें एक महत्वपूर्ण लाभ शामिल होता है जो सुपरसाइड करता है।

कभी-कभी हमारे पास हर उस एप्लिकेशन पर काम करने की लग्जरी नहीं होती है जिसके लिए रखरखाव की आवश्यकता होती है, या यहां तक ​​कि किसी मिशन को महत्वपूर्ण समझने के लिए, लेकिन वे आपको अंततः काट लेंगे और रोकथाम का एक औंस अक्सर इलाज का एक पाउंड मारता है!


0

पुस्तकालयों को अपडेट किया जाना चाहिए जब आप एक लाभ प्रदान करते हैं कि आप सॉफ्टवेयर का उपयोग करेंगे जो परिवर्तन में खर्च किए गए काम की भरपाई करते हैं।

यहां तक ​​कि मामूली पुस्तकालय संस्करण अपग्रेड, ऐप्स में विसंगतियों को तोड़ या डाल सकते हैं। उस दृष्टिकोण से कोई मामूली बदलाव नहीं हुआ है।

पुराने कामों का उपयोग करने में कोई शर्म नहीं है। जब परिवर्तन की आवश्यकता होती है तो यह दर्दनाक हो सकता है लेकिन यह नौकरी का हिस्सा है।


मैं मानता हूं कि हर अपग्रेड को अच्छी तरह से समझा जाना चाहिए। और तकनीकी ऋण लेना ठीक है यदि आप इसे वापस भुगतान कर सकते हैं। हमें नवीनतम संस्करण पर होने के लिए काम पर नहीं रखा गया है (और बिना किसी विचार या विश्लेषण के हर समय नवीनतम संस्करण का पीछा करते हुए), लेकिन नवीनतम संस्करण उन चीजों में मदद कर सकते हैं जिन्हें हम करने के लिए काम पर रखा गया है।
जियोक्सिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.