मास्टर शाखा पर अनुकूलित शाखाओं के सैकड़ों बनाए रखें


140

वर्तमान में हमारे पास एक साझा भंडार में हमारे PHP आवेदन के लिए एक मास्टर शाखा है। हमारे पास 500 से अधिक ग्राहक हैं जो हमारे सॉफ़्टवेयर के ग्राहक हैं, जिनमें से अधिकांश के पास अलग-अलग उद्देश्यों के लिए कुछ अनुकूलन हैं, प्रत्येक एक अलग शाखा में हैं। अनुकूलन एक अलग पाठ क्षेत्र का नाम, एक पूरी तरह से नई सुविधा या मॉड्यूल, या डेटाबेस में नए टेबल / कॉलम हो सकता है।

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

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

मैं अपनी क्लाइंट रिलीज़ शाखाओं को मास्टर शाखा के साथ अद्यतित रखने के लिए अधिक कुशल तरीके की तलाश कर रहा हूं जिसके परिणामस्वरूप विलय के दौरान कम प्रयास होगा।


11
क्षमा करें, "आप X टूल का उपयोग कर सकते हैं" उत्तर देने के लिए नहीं, लेकिन एक नहीं है।
ऑर्बिट

3
या निर्माण के दौरान (जो शायद अधिक सामान्य है)। बस .. पूरी तरह से अलग से कोडबेस नहीं।
१०:४३ पर कक्षा

15
@FernandoTan - आपका दृश्यमान लक्षण कोड हो सकता है, लेकिन आपकी बीमारी का मूल कारण आपका उत्पाद विखंडन है, इलाज को उत्पाद फोकस / उत्पाद क्षमता मानचित्रण से आने की जरूरत है, कोड साफ नहीं - जो अंततः होगा। मैंने अपने उत्तर में अधिक जानकारी दी है - प्रोग्रामर.स्टैकएक्सचेंज.
एलेक्स एस

8
यह एक आर्थिक समस्या भी हो सकती है। क्या आप वास्तव में उन सभी 500 ग्राहकों से पैसा कमाते हैं? यदि आपको अपने मूल्य निर्धारण मॉडल को उखाड़ फेंकना है और ग्राहक द्वारा अतिरिक्त शुल्क का भुगतान नहीं करने पर परिवर्तन अनुरोधों को अस्वीकार करना है।
क्रिश्चियन स्ट्रेम्पफेर 11

13
इसने मेरे दिल को थोड़ा छोटा कर दिया। सौभाग्य से अन्य पहले से ही सही उत्तरों को चिल्ला रहे हैं - मेरी एकमात्र अतिरिक्त सिफारिश यह है कि आप इसे लिखें और इसे TheDailyWTF में जमा करें।
zxq9

जवाबों:


314

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

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

मुख्य अवसंरचना, और कोई भी साझा सुविधाएँ, तब केवल एक बार संग्रहीत, रखरखाव और परीक्षण किया जाना चाहिए ।

आपको शुरू से ऐसा करना चाहिए था। यदि आपके पास पहले से ही पांच सौ उत्पाद वैरिएंट (!) हैं, तो इसे ठीक करना एक बहुत बड़ा काम है ... लेकिन चल रहे रखरखाव से अधिक नहीं।


142
+1 के लिए "आपको शुरू से ऐसा करना चाहिए था"। तकनीकी ऋण का यह स्तर एक कंपनी को नष्ट कर सकता है।
डेनिथ

31
@ डैनिथ: पांच सौ कस्टम शाखाओं के साथ स्पष्ट रूप से मैं चकित हूं कि यह पहले से ही नहीं है। कौन चीजों को यह खराब होने देता है? lol
को ऑर्बिट

73
@FernandoTan मैं ऐसा हूं, इसलिए, आपके लिए बहुत खेद है ...
एंडरलैंड

20
@ फर्नान्डोटन: मुझे भी। :( हो सकता है कि आपने साक्षात्कार में अधिक प्रश्न पूछे हों;) स्पष्ट होने के लिए, मेरे उत्तर में "आप" संगठन है। यह एक अमूर्तता है। मैं व्यक्तियों को दोष नहीं दे रहा हूँ।
कक्षा

58
पहले अधिक जानकारी प्राप्त करें: डेवलपर्स को वर्तमान संस्करण और अनुकूलित शाखा के बीच एक अंतर बनाने दें। तो आप कम से कम जानते हैं कि क्या अंतर हैं। वह सूची आपको यह देखने की अनुमति देती है कि आप शाखाओं की सबसे तेज कमी को कैसे जीत सकते हैं। यदि 50 कस्टम फ़ील्डनाम हैं, तो उस पर ध्यान केंद्रित करें और यह आपको 50 शाखाओं को बचाएगा। फिर अगले की तलाश करें। आपके पास कुछ ऐसे भी हो सकते हैं, जो आराम करने योग्य नहीं हैं, लेकिन तब कम से कम राशि कम होगी और अधिक ग्राहक मिलने पर यह आगे नहीं बढ़ेगी।
ल्यूक फ्रेंकेन

93

500 क्लाइंट्स का होना एक अच्छी समस्या है, अगर आपने शाखाओं के साथ इस समस्या से बचने के लिए सामने समय बिताया है, तो आप कभी भी किसी भी क्लाइंट को पाने के लिए लंबे समय तक व्यापार करने में सक्षम नहीं हो सकते हैं।

सबसे पहले, मुझे आशा है कि आप अपने ग्राहकों को उनके कस्टम संस्करणों को बनाए रखने की सभी लागतों को कवर करने के लिए पर्याप्त शुल्क लेंगे । मैं मान रहा हूं कि ग्राहकों को फिर से किए जाने वाले अपने अनुकूलन के लिए भुगतान किए बिना नए संस्करण प्राप्त करने की उम्मीद है। मैं उन सभी फ़ाइलों को खोजकर शुरू करूँगा जो आपकी 95% शाखाओं में समान हैं। वह 95% आपके आवेदन का स्थिर हिस्सा है।

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

फिर रणनीति पैटर्न, निर्भरता इंजेक्शन आदि का उपयोग करके कठिन मुद्दों पर आगे बढ़ें।

क्लाइंट के स्वयं के फ़ील्ड के लिए कॉलम जोड़ने के बजाय डेटाबेस में स्टोरिंग जोंस पर विचार करें - यह आपके लिए काम कर सकता है यदि आपको SQL के साथ इन फ़ील्ड्स को खोजने की आवश्यकता नहीं है।

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

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

आपके पास अभी भी कई वर्षों के समय में 500 शाखाएँ हो सकती हैं, लेकिन यदि उन्हें प्रबंधित करना बहुत आसान है, तो आप जीत गए हैं।


Br3w5 द्वारा टिप्पणी के आधार पर:

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

केवल उपरोक्त अनाज के बाद आपको आसान अनाज मिला है, और इसे पहले कुछ वर्गों के साथ निशान दें।


28
वास्तविक समस्या के लिए एक दृष्टिकोण प्रदान करने के प्रयास के लिए +1
इयान

35
मैं वास्तव में चिंतित था कि आप अपने जवाब पर खुद को बधाई दे रहे थे, जब तक मुझे एहसास नहीं हुआ कि आप वही @Ian नहीं थे जो उत्तर लिखा था।
थेरॉन लुहान

2
हो सकता है कि उन्हें एक स्थिर कोड विश्लेषण उपकरण का उपयोग करना चाहिए ताकि कोड के किन हिस्सों को डुप्लिकेट किया जा सके (सभी फाइलों की पहचान करने के बाद)
br3w5

1
टीम ट्रैक को ट्रैक करने में मदद करने के लिए संस्करण पैकेज बना रहा है जिसमें क्लाइंट के पास कोड का कौन सा संस्करण है
br3w5

1
यह कहने का एक लंबा घुमावदार तरीका लगता है "बस अपने कोड को रिफलेक्टर करें"
रोलाण्ड टीप्प

40

भविष्य में, अपने साक्षात्कार में जोएल परीक्षण प्रश्न पूछें । आप एक ट्रेनवॉक में नहीं चलने की अधिक संभावना होगी।


यह एक, आह, हम कैसे कहेंगे ... वास्तव में, वास्तव में बुरी समस्या है। इस तकनीकी ऋण पर "ब्याज दर" बहुत, बहुत अधिक होने वाली है। यह पुनर्प्राप्त करने योग्य नहीं हो सकता है ...

"कस्टम" के साथ एकीकृत ये कस्टम परिवर्तन कैसे हैं? क्या आप उन्हें अपना पुस्तकालय बना सकते हैं और एक "कोर" और प्रत्येक विशिष्ट ग्राहक का अपना "ऐड-ऑन" है?

या ये सभी बहुत मामूली विन्यास हैं?

मुझे लगता है कि समाधान का एक संयोजन है:

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

न तो तुच्छ हो जाएगा जैसे कि आप 500+ ग्राहकों के साथ यहां समाप्त हो गए हैं, तो आप संभवतः इसमें कोई वास्तविक अंतर नहीं करेंगे। मुझे उम्मीद है कि इसे अलग करने में आपके बदलाव बहुत समय लेने वाले काम होंगे।

मुझे यह भी संदेह है कि आपके सभी क्लाइंट-विशिष्ट कोड को आसानी से अलग करने और वर्गीकृत करने में आपको महत्वपूर्ण समस्याएं होने वाली हैं।

यदि आपके अधिकांश बदलावों में विशेष रूप से मतभेद हैं, तो मैं भाषा स्थानीयकरण के बारे में इस तरह के प्रश्न पढ़ने का सुझाव देता हूं । चाहे आप पूरी तरह से या सिर्फ एक सबसेट की कई भाषाएँ कर रहे हों, समाधान एक ही है। यह विशेष रूप से PHP और स्थानीयकरण है।


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

10
Joel टेस्ट के किस प्रश्न ने आपको बताया होगा कि कंपनी शाखाओं का दुरुपयोग कर रही है?
स्पेसट्रूकर

2
@SpaceTrucker: ठीक है, "क्या आप रोज़ाना निर्माण करते हैं?" मदद की हो सकती है। 500 शाखाओं के साथ, उनके पास शायद नहीं था, या हो सकता है कि उन्होंने केवल कुछ शाखाओं के लिए ऐसा किया हो।
सेल्के

17

यह सबसे खराब विरोधी पैटर्न में से एक है जिसे आप किसी भी वीसीएस के साथ हिट कर सकते हैं।

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

यह आपको अपने उत्पादन कोड के साथ एक मास्टर शाखा रखने की अनुमति देता है।


3
यदि आप ऐसा करते हैं, तो अपने आप को एक एहसान करें और जितना संभव हो उतना रणनीति पैटर्न का उपयोग करने का प्रयास करें । यह आपके कोड को बनाए रखने की तुलना में बहुत आसान बना देगा यदि आप बस if(getFeature(FEATURE_X).isEnabled())भर में धीमा कर देते हैं।
TMN

13

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

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

ग्राहकों के लिए आपके पास जो अलग-अलग सेटअप हैं, वे या तो केवल बाहरी रूप से कॉन्फ़िगर किए गए राज्य (जैसे एक डेटाबेस) द्वारा एक दूसरे को अलग कर सकते हैं या यदि आवश्यक हो तो अलग-अलग रिपॉजिटरी के रूप में रहते हैं, जो कोर को एक सबमॉड्यूल के रूप में जोड़ते हैं।


6
आप रखरखाव शाखाओं के बारे में भूल गए, जो मूल रूप से आपके उत्तर में वर्णित शाखाओं के विपरीत हैं। :)
लाइटवेज़ दौड़ कक्षा

7

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

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

जिसका मतलब है:

  1. स्पष्ट परिवर्तन प्रबंधन जिम्मेदारियों: एक ग्राहक कुछ adaptions, की जरूरत है , जो उन्हें बेच रही है, जो उन्हें अनुमति दे रहा है और जो फैसला करता है कि कैसे कोड बदल जाएगा? अगर कुछ चीजों में बदलाव होना चाहिए, तो पेंच कहां हैं?
  2. भूमिका को स्पष्ट करें, कि आपकी टीम में किसे नया प्रतिनिधि बनाने की अनुमति है, और कौन नहीं।
  3. यह सुनिश्चित करने का प्रयास करें कि आपकी टीम में हर कोई पैटर्न की आवश्यकता को देखता है जो सॉफ्टवेयर को लचीलेपन की अनुमति देता है।
  4. अपने प्रबंधन उपकरण को स्पष्ट करें: आप जल्दी से कैसे जानते हैं कि ग्राहक के पास क्या कोड अपनाता है। मुझे पता है, कुछ "500 की सूची" कष्टप्रद लगती है, लेकिन यहाँ कुछ "भावनात्मक अर्थव्यवस्था" है, यदि आप चाहें। यदि आप एक त्वरित समय में ग्राहक के परिवर्तनों को नहीं बता सकते हैं, तो आप और भी अधिक खो गए और खींचे हुए महसूस करते हैं जैसे कि आपको एक सूची शुरू करनी है। फिर, उस सूची का उपयोग उन सुविधाओं के समूह के लिए करें, जिस तरह से अन्य लोगों के जवाब यहां आपको दिखाए गए हैं:
    • छोटे / बड़े परिवर्तन द्वारा समूह ग्राहकों
    • विषय से संबंधित परिवर्तनों द्वारा समूह
    • विलय के लिए आसान और परिवर्तन के लिए मुश्किल से परिवर्तन के द्वारा समूह
    • कई रिपोज के लिए किए गए समान परिवर्तनों के समूह खोजें (ओह हां, कुछ होगा)।
    • शायद अपने प्रबंधक / निवेशक से बात करने के लिए सबसे महत्वपूर्ण: महंगा परिवर्तन और सस्ते परिवर्तनों द्वारा समूह ।

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

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

यदि मैं आपकी स्थिति में हूं तो यह है कि मैं इसे कैसे संभालने की कोशिश करूंगा। हालांकि मुझे नहीं पता कि आपकी टीम ऐसी चीजों को कैसे स्वीकार करने जा रही है, सॉफ्टवेयर वास्तव में यह कैसे अनुमति देता है, आप कैसे समर्थित हैं और यह भी कि आपको अभी भी क्या सीखना है। आप सॉफ्टवेयर वास्तुकार हैं - बस इसके लिए जाएं :-)


2
तकनीकी समस्याओं के पीछे छिपी सामाजिक / संगठनात्मक मुद्दों को स्वीकार करने के बारे में अच्छे अंक। यह भी अक्सर अनदेखी की जाती है।
साल्स्के

5

सभी नाय-कहने वालों के विपरीत, चलो मान लेते हैं कि वास्तविक व्यापार की आवश्यकता है।

(उदाहरण के लिए, वितरण योग्य स्रोत कोड है, ग्राहक व्यवसाय की एक ही पंक्ति से हैं और इसलिए एक-दूसरे के प्रतिस्पर्धी हैं, और आप व्यवसाय मॉडल अपने रहस्यों को गुप्त रखने का वादा करते हैं)

इसके अलावा, मान लें कि आपकी कंपनी के पास सभी शाखाओं को बनाए रखने के लिए उपकरण हैं, जो या तो मैनपावर है ( मान लीजिए कि 100 डेवलपर्स विलय के लिए समर्पित हैं, 5-दिवसीय रिलीज में देरी के लिए समर्पित है, या 10 -दिवसीय रिलीज के लिए 10 दिन मानने वाले लैग ठीक है), या; इस तरह के भयानक स्वचालित परीक्षण जो स्वचालित रूप से प्रत्येक शाखा में कोर कल्पना और विस्तार कल्पना दोनों के लिए सही मायने में परीक्षण किए जाते हैं , और इस प्रकार केवल ऐसे परिवर्तन जो "स्वच्छ" विलय नहीं करते हैं उन्हें मानव हस्तक्षेप की आवश्यकता होती है। यदि आपके ग्राहक न केवल कस्टमाइज़ेशन के लिए, बल्कि उसके रखरखाव के लिए भुगतान करते हैं, तो यह एक मान्य व्यवसाय मॉडल हो सकता है।

मेरा (और ने-कहने वालों का) सवाल है, क्या आपके पास प्रत्येक ग्राहक को वितरण के लिए एक समर्पित व्यक्ति है ? यदि आप कहते हैं, 10,000-व्यक्ति कंपनी है, तो यह मामला हो सकता है।

इसे कुछ मामलों में प्लगइन आर्किटेक्चर द्वारा नियंत्रित किया जा सकता है, मान लीजिए कि आपका कोर ट्रंक है, प्लगइन्स को ट्रंक या शाखाओं में रखा जा सकता है, और प्रत्येक ग्राहक के लिए कॉन्फ़िगरेशन या तो विशिष्ट नाम वाली फ़ाइल है या ग्राहक शाखा में आयोजित की जाती है।

प्लगइन्स को रन टाइम पर लोड किया जा सकता है, या कंपाइल टाइम में बनाया जा सकता है।

सचमुच कई परियोजनाएं इस तरह से की जाती हैं, मौलिक रूप से एक ही समस्या अभी भी लागू होती है - सरल कोर परिवर्तन एकीकृत करने के लिए तुच्छ होते हैं, संघर्ष परिवर्तनों को या तो वापस रोल किया जाना चाहिए, या कई प्लगइन्स में परिवर्तन की आवश्यकता है।

ऐसे मामले होते हैं जब प्लगइन्स पर्याप्त अच्छे नहीं होते हैं, यही कारण है कि कोर के इतने सारे इंटर्नल को ट्वीक किया जाना चाहिए कि प्लगइन इंटरफ़ेस गिनती को संभालने के लिए बहुत बड़ी हो जाती है।

आदर्श रूप से इसे पहलू-उन्मुख प्रोग्रामिंग द्वारा नियंत्रित किया जाएगा , जहां ट्रंक कोर कोड है, और शाखाएं पहलू हैं (अतिरिक्त कोड और निर्देश हैं कि एक्सट्रा को कोर से कैसे जोड़ा जाए)

एक सरल उदाहरण, आप निर्दिष्ट कर सकते हैं कि कस्टम fooकोर से पहले या बाद में चलाया गया है klass.fooया यह इसे बदल देता है, या जो इसे लपेटता है और इनपुट या आउटपुट को बदल सकता है।

इसके लिए पुस्तकालयों का एक टन है, हालांकि मर्ज संघर्षों की समस्या दूर नहीं होती है - स्वच्छ मर्जों को एओपी द्वारा नियंत्रित किया जाता है और संघर्षों को अभी भी मानवीय हस्तक्षेप की आवश्यकता है।

अंत में इस तरह के व्यवसाय को वास्तव में शाखा रखरखाव के साथ खुद को चिंतित करना पड़ता है , अर्थात्, ग्राहक-विशिष्ट सुविधा एक्स इतना सामान्य है कि इसे कोर में स्थानांतरित करना सस्ता है, भले ही सभी ग्राहक इसके लिए भुगतान न कर रहे हों?


3

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

आपका 'कस्टम' कोड उत्पाद विशेषताओं और क्षमताओं के विस्तार के अलावा और कुछ भी नहीं दिखाता है और डेटा फ़ील्ड दूसरों पर बदलता है।

कस्टम सुविधाएँ कितनी व्यापक हैं, कितनी भिन्न हैं, कैसे प्रासंगिक रूप से समान हैं या नहीं, आपके उत्पाद के कोड आधार को 'सैनिटाइज़िंग' करने में बहुत भूमिका निभाएंगी।

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

क्योंकि, दिन के अंत में, कोड आपके व्यवसाय और उत्पाद सुविधाओं / सेवाओं की पेशकश के अलावा कुछ भी नहीं है। यही आपकी कंपनी के लिए भुगतान किया जा रहा है।

इस पर एक बेहतर हैंडल प्राप्त करना 'क्षमताओं' के दृष्टिकोण से होना चाहिए न कि कोड के दृष्टिकोण से।

आप, आपकी कंपनी और उत्पाद हर किसी के लिए सब कुछ नहीं हो सकते। अब जब आपके पास 500 ग्राहकों का एक सभ्य राजस्व आधार है, तो यह उस पर उत्पाद करने का समय है जो आप होना चाहते हैं।

और अगर आप कई चीजों की पेशकश कर रहे हैं, तो यह एक संगठित फैशन में आपकी उत्पाद क्षमताओं को संशोधित करने के लिए समझ में आएगा।

आपके उत्पाद कितने व्यापक और गहरे होंगे? या फिर यह 'गुणवत्ता की सेवा' मुद्दों और 'उत्पाद कमजोर पड़ने और विखंडन' की ओर ले जाएगा क्योंकि आप रेखा से नीचे जाते हैं।

क्या आप सीआरएम या ईआरपी या ऑर्डर प्रोसेसिंग / डिस्पैच या माइक्रोसॉफ्ट एक्सेल होंगे?

आपके मौजूदा एक्सटेंशन को एक स्टार्टअप से अधिग्रहीत उत्पादों को बड़े सॉफ्टवेयर में खींचने और विलय करने के तरीके को रोल करने और सामंजस्य बनाने की आवश्यकता है ।

आपको एक मजबूत उत्पाद प्रबंधन और डेटा आर्किटेक्चर व्यक्ति को निम्नलिखित मानचित्र बनाने की आवश्यकता होगी :

  • मास्टर शाखा, इसकी उत्पाद क्षमताएं और सुविधाएँ आधार
  • कस्टम विस्तार सुविधाएँ, प्रकार और विविधताएँ
  • 'कस्टम फ़ील्ड' का महत्व और विविधता

..तो अपने मुख्य अनुप्रयोग के भव्य संदर्भ में इन सभी ढीले उत्पाद धागे / शाखाओं के आत्मसात और सामंजस्य का रोड मैप बनाएं।

पुनश्च: मेरे साथ कनेक्ट करें, मैं एक व्यक्ति को जानता हूं जो आपको इसे ठीक करने में मदद कर सकता है :)


-5

मैं इससे संबंधित कर सकता हूं। मैंने कई प्रोजेक्ट लिए हैं। वास्तव में, हमारे विकास के काम का 90% ऐसी चीजों को ठीक कर रहा है। हर कोई परिपूर्ण नहीं है, इसलिए मेरा सुझाव है कि आप सही तरीके से संस्करण नियंत्रण का उपयोग करें और जहां आप हैं, यदि संभव हो तो आप निम्न कार्य कर सकते हैं।

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

मैंने व्यक्तिगत रूप से GitHub से 40 शाखाओं के साथ Bitbucket में एक रिपॉजिटरी आयात किया है और 40 रिपॉजिटरी बनाई हैं। इसमें केवल चार घंटे लगे। यह वर्डप्रेस थीम विविधता थी इसलिए पुश और पुल त्वरित था।

"इसे पहली बार सही तरीके से नहीं करने" के कई कारण हैं, और मुझे लगता है कि जो लोग इन्हें जल्दी स्वीकार करते हैं और "इस समय इसे सही करते हैं" हमेशा सफल रहेंगे।


16
एकाधिक रिपॉजिटरी कैसे रखरखाव को आसान बनाएगी?
मैथलेटिक्स

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