एक ही परियोजना के लिए ब्रांचिंग मॉडल सुझाव कई क्लाइंट


11

हमारे पास एक बहुत बड़ी परियोजना है जिसमें कई एप्लिकेशन शामिल हैं जो विभिन्न ग्राहकों के लिए आधार के रूप में कार्य करते हैं।

प्रत्येक ग्राहक के उत्पाद का अपना निजीकरण होता है, अलग-अलग मील के पत्थर, अलग-अलग आवश्यकताएं और इतने पर, और इस प्रकार प्रत्येक परियोजना अपनी आवश्यकताओं के आधार पर स्वतंत्र रूप से विकसित होगी।

परियोजना का मूल, हर परियोजना में समान (लेकिन समान नहीं है) और संगठन ऐसा बनाया गया है कि ऐसी टीमें हों जो प्रत्येक ग्राहक को स्वतंत्र रूप से संभालती हैं (लेकिन आवश्यकतानुसार उनके बीच संचार के साथ)। अब तक, मैं ऐसी किसी भी योजना को खोजने में असमर्थ रहा हूँ जो हमारी आवश्यकताओं के अनुकूल हो, या तो इंटरनेट पर खोज करके या कुछ शानदार विचार के साथ आ रही है :)

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

  • प्रत्येक ग्राहक के लिए अलग-अलग मील के पत्थर: जिसका अर्थ है कि प्रत्येक टीम को स्थिरता या उनके उत्पाद को प्रभावित करने वाले बाकी कमिट्स के बिना अलग-अलग समय के रूप में संस्करण तैयार करने होंगे।
  • विभिन्न आवश्यकताएं, जो कुछ मामलों में सिस्टम की कोर को प्रभावित कर सकती हैं या नहीं।
  • बड़ी टीमें (20+ टीम के सदस्य)
  • सिस्टम में बग्स को हैंडल करना: यदि कोई टीम अपने प्रोजेक्ट में बग ढूंढती है तो क्या होगा जो अन्य क्लाइंट्स को प्रभावित कर सकता है?

नोट: हम एक ऐसी परियोजना के बारे में बात कर रहे हैं जिसमें 10 + M LOC है।

नोट: हम टीम फाउंडेशन सिस्टम, विजुअल स्टूडियो 2008 और C # (मुख्य रूप से) का उपयोग कर रहे हैं।

किसी भी सुझाव, स्रोत या विचारों के बारे में कैसे स्थिति को संबोधित करने के लिए? क्या बाजार में कोई मॉडल है जो एक समान समस्या है?

जवाबों:


9

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

इस दृष्टिकोण का नाम सॉफ्टवेयर उत्पाद लाइनें या कभी-कभी उत्पाद लाइन इंजीनियरिंग है । से CMU एसईआई के सॉफ्टवेयर उत्पाद लाइन्स पेज :

एक सॉफ्टवेयर उत्पाद लाइन (एसपीएल) सॉफ्टवेयर-सघन प्रणालियों का एक सेट है जो किसी विशेष बाजार खंड या मिशन की विशिष्ट आवश्यकताओं को पूरा करने वाली सुविधाओं का एक सामान्य, प्रबंधित सेट साझा करता है और जो एक निर्धारित तरीके से कोर परिसंपत्तियों के एक सामान्य सेट से विकसित होते हैं। ।

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

फिर इन सभी शाखाओं को बनाए रखने के बजाय, आप ग्राहक-विशिष्ट कॉन्फ़िगरेशन के एक सेट के साथ एक सिस्टम को बनाए रखते हैं।

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

कुछ अतिरिक्त उपयोगी लिंक:


11

जब मैंने अपनी पहली नौकरी शुरू की तो मैंने इसी तरह की परियोजनाओं पर काम किया (लेकिन छोटे पैमाने पर) और हमने समान समस्याओं का सामना किया। हमने सभी ग्राहकों के लिए सामान्य समाधान हैंडलिंग आवश्यकताओं के साथ भी शुरुआत की लेकिन यह केवल उसी बिंदु पर संभव था जहां आवश्यकताएं विरोधाभासी हो जाती हैं। हमने वही किया जो आपने सुझाया और प्रत्येक ग्राहक के लिए अलग संस्करण शुरू किया। यहां तक ​​कि यह समस्या को आवश्यकताओं और अनुकूलन के साथ हल करता है यह बग और वैश्विक परिवर्तनों को हल करने के लिए एक रखरखाव दुःस्वप्न बन जाता है।

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

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


2

मैं आधार का तरीका हो सकता हूं, लेकिन मुझे लगता है कि आप अपने सिस्टम के मूल के साथ जो सामना कर रहे हैं, वही समस्या है जो सभी को सामना करना पड़ता है जो घटकों का उपयोग करते हैं और उनके सॉफ़्टवेयर के विभिन्न रिलीज को बनाए रखने और समर्थन करने की आवश्यकता होती है और प्रत्येक अलग रिलीज़ को अलग सेट की आवश्यकता होती है घटक संस्करणों के।

उदाहरण के लिए

  • रिलीज़ 1.0 में लाइब्रेरी ए 1.0, लाइब्रेरी बी 2.0, लाइब्रेरी सी 5.6 की आवश्यकता होती है
  • रिलीज़ 2.0 के लिए लाइब्रेरी ए 1.0, लाइब्रेरी बी 3.7, लाइब्रेरी सी 5.7 की आवश्यकता होती है
  • रिलीज 3.0 के लिए लाइब्रेरी ए 1.2, लाइब्रेरी बी 3.7, लाइब्रेरी सी 5.8 की आवश्यकता होती है

जिस तरह से हमने घटक समस्या को हल किया है वह है हमारे संस्करण नियंत्रण प्रणाली में पुस्तकालयों के सभी संस्करणों (हम उन्हें स्रोत पर बनाते हैं) और प्रत्येक परियोजना को अपने खोज पथ (संदर्भ पथ?) को बदलकर उचित पुस्तकालय संस्करण का उपयोग करना है।

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

आपके कोर सिस्टम का एक समाधान यह हो सकता है कि आप इसे एक पुस्तकालय के रूप में मानें जिसके लिए आप विभिन्न संस्करणों को बनाए रखते हैं। संक्षेप में जिसका अर्थ है कि आपको प्रत्येक संस्करण के लिए अलग-अलग शाखाएँ स्थापित करने की आवश्यकता है। क्लाइंट का एप्लिकेशन फिर उचित कोर सिस्टम के ब्रांच फ़ोल्डर को संदर्भित करके आपके कोर सिस्टम के उचित "संस्करण" का उपयोग कर सकता है।

जहाँ आपके कोर सिस्टम के लिए निर्भरताएँ ऊपर दिए गए उदाहरण से मिलती जुलती होंगी, तो आपके क्लाइंट अनुप्रयोगों के लिए निर्भरताएँ "बस" में एक अतिरिक्त संदर्भ होगा: आपके कोर सिस्टम का संस्करण।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.