अगर आप एजाइल या एक्सपी जैसे विकासवादी तरीकों में एक डिजाइन डेड-एंड तक पहुंचते हैं तो आप क्या करते हैं?


11

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

यह संभव हो सकता है कि जब एक प्रोग्रामर का स्तर अच्छा हो, और वे डिजाइन के निहितार्थ को समझते हैं और महत्वपूर्ण गलतियां नहीं करते हैं, तो कोड विकसित होना जारी है। हालांकि, एक सामान्य संदर्भ में, इस संदर्भ में जमीनी वास्तविकता क्या है?

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

मैं यहां किसी भी गैर-चुस्त अभ्यास की वकालत नहीं कर रहा हूं, लेकिन मैं उन लोगों से जानना चाहता हूं जो अपने वास्तविक अनुभवों के अनुसार चुस्त या पुनरावृत्ति या विकासवादी तरीकों का अभ्यास करते हैं।

क्या आप कभी ऐसे डेड-एंड पर पहुंचे हैं ? आप इससे कैसे बच पाए या इससे बच गए? या क्या यह सुनिश्चित करने के लिए उपाय हैं कि डिजाइन साफ ​​और लचीला बना रहे क्योंकि यह विकसित होता है?

जवाबों:


17

मैंने अभी आपके द्वारा पोस्ट किए गए लेख लिंक को पढ़ा है, मुझे कहना है कि फाउलर ने कुछ बहुत अच्छे अंक बनाए हैं और बहुत सारी बातें उन्होंने कहा है, मैं वर्षों से हमारी टीम के साथ वकालत कर रहा हूं।

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

चूंकि मैं OO भूमि से आता हूं, मेरे लिए प्रत्येक ब्लॉक एक वर्ग है और उस ब्लॉक का सतह क्षेत्र सार्वजनिक इंटरफ़ेस है (बाहरी या व्युत्पन्न वर्गों द्वारा दिखाई देता है)। यदि आप अच्छे SOLID सिद्धांतों का पालन करते हैं, तो आप यह सुनिश्चित करेंगे कि प्रत्येक ब्लॉक बेहद सरल और एक सहज सार्वजनिक इंटरफ़ेस है। मेरे सादृश्य में वापस जाना, आप यह सुनिश्चित करना चाहते हैं कि आप कोड केवल सरल आकृतियाँ बनाते हैं। जब भी आप कक्षाएं बनाते हैं, तो वे बहुत जटिल होते हैं (कई फ़ंक्शन, कई चर), आप ऐसे आकार बनाते हैं जो आवश्यकताएं बदलने पर पुन: उपयोग करना कठिन होते हैं।

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

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

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

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

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

अंतिम नोट के रूप में, मैं डिजाइन दस्तावेजों में एक दृढ़ विश्वास रखने वाला व्यक्ति हूं (कम से कम मेरी वर्तमान टीम की व्यावसायिक स्थितियों के लिए) लेकिन हमारे डिजाइन डॉक्स के लिए प्राथमिक लक्ष्य संगठनात्मक मेमोरी है , इसलिए वास्तविक दस्तावेज कोड के उत्पादन के बाद लिखे जाते हैं और पुनर्संशोधित। कोडिंग से पहले, हमारे पास आम तौर पर एक त्वरित (कभी-कभी इतनी जल्दी नहीं) डिजाइन चरण होता है जहां हम नैपकिन / mspaint / visio पर कक्षाएं छोड़ते हैं और मैं हमेशा लोगों को याद दिलाता हूं कि यह चरण एक ब्लूप्रिंट नहीं बल्कि पालन करने के लिए एक पथ का उत्पादन करता है और जैसा कि वे कोडिंग करते हैं। जो कुछ भी समझ में नहीं आता है उसे बदला जाना चाहिए। यहां तक ​​कि इन अनुस्मारक के साथ, नए लोग मूल डिजाइन में फिट कोड को वापस करने की कोशिश करते हैं, भले ही यह उनके लिए कितना भी अप्राकृतिक हो। यह आमतौर पर कोड समीक्षा में सतहों।

डांग, मैंने बहुत कुछ लिखा। उसके लिए माफ़ करना।


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

हां, आपने बहुत कुछ लिखा, लेकिन यह अच्छी बात थी। सच में मजा आया :)।
राडू मुरझिया

11

मैं कहूंगा कि "डिजाइन डेड-एंड" घटना चंचल तरीकों के लिए ऑर्थोगोनल है। मेरा मतलब है कि झरना करना संभव है, एक (खराब) डिजाइन पर बहुत समय बिताना। फिर इसे लागू करने में बहुत समय व्यतीत करें और अपने आप को मृत अवस्था में पाएं।

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

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

आप डेड-एंड से कैसे बचते हैं?

मैं भविष्य की आवश्यकताओं का अनुमान लगाकर ज्यादातर कहना चाहूंगा। यह कुछ ऐसा है जो आपको समान परियोजनाओं / उत्पादों के साथ अनुभव और परिचितता के साथ मिलता है। यह प्रत्याशा आंशिक रूप से है जो आपको एक अच्छा डिज़ाइन रखने में मदद करता है क्योंकि आप अपने आप से बहुत कुछ पूछते हैं कि "क्या होगा" आपके मौजूदा सिस्टम के बारे में सवाल करता है। मेरे लिए यह महत्वपूर्ण घटक है। जब आप पहले से ही जानते हैं कि OO जैसी तकनीकें आपकी मदद कर रही हैं।

अगर आपके पास डेड-एंड है तो आप क्या करते हैं?

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

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

ओएस दुनिया से कुछ प्रसिद्ध बड़ी आवश्यकताएं जो मेरे दिमाग में आती हैं:

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


वास्तव में विंडोज एनटी के शुरुआती संस्करणों ने "हार्डवेयर एक्सट्रेक्ट लेयर" को लागू किया और DEC Apha के साथ-साथ x86 का भी समर्थन किया। जैसा कि किसी ने कभी भी डीईसी अल्फ़ा आधारित मशीनों को नहीं खरीदा था, यह चुपचाप गिरा दिया गया था। मुझे लगता है कि यह "मशीन स्वतंत्रता" वर्तमान रिलीज में एक शाब्दिक प्रारूप में मौजूद है इसलिए एआरएम पोर्ट इतना कठिन नहीं हो सकता है।
जेम्स एंडरसन

3

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

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

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

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


1
+1 पोस्ट कोड UML का विचार दिखाने के लिए! दिलचस्प रूप से पर्याप्त है, हम कोड के बाद कभी भी आरेख दस्तावेजों को वापस नहीं लेते हैं !
दीपन मेहता १२'११

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

3

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

मैंने प्रत्येक मामले में उसी तरह से संपर्क किया जो अच्छी तरह से काम करता था:

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

लागत:

  • एक ही समय में कोड बेस में 2 कार्यान्वयन के कारण अधिक जटिलता
  • अच्छी सुविधा के मामलों और परीक्षणों को मानते हुए एक पूर्ण रीडिज़ाइन / पुन: कार्यान्वयन की तुलना में प्रति फ़ीचर / बग फिक्स की कुल लागत

लाभ:

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

2

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

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

अब हम उस बाधा से अतीत में हैं, और फिर से नई विशेषताओं में जोड़ रहे हैं।


यह खोजने के लिए एक और बड़ा घर्षण है। ग्राहक से कहने के बाद - कि अब हम वही काम कर रहे हैं - ऐसे फीचर्स का जो नया कुछ भी नहीं है, पहला वर्जन सौंपने के बाद! कितनी बार, और अक्सर (यदि कभी हो) क्या आप ग्राहक को यह बताने का जोखिम उठा सकते हैं? या आप कैसे समझाते हैं?
दीपन मेहता

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

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

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

2

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


2

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

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

मुझे यकीन है कि कुछ इंजीनियर थे जिन्होंने एक उप-डिज़ाइन को मान्यता दी थी जब उन्होंने पहली बार उस सुविधा को जोड़ा था। अगर उन्होंने इसे वापस बदल दिया होता, तो यह लगभग एक सौदे के रूप में नहीं होता।


1

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

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