टूटी हुई खिड़कियों को ठीक नहीं करना कब स्वीकार्य है?


21

टूटी खिड़कियों के संदर्भ में , क्या ऐसे समय होते हैं जब भविष्य की गतिविधि के लिए रिफैक्टरिंग को सबसे अच्छा छोड़ दिया जाता है?

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


6
कभी-कभी, बॉस तय करता है कि टूटी हुई खिड़कियां ठीक नहीं की जाएंगी, क्योंकि वह जानता है कि वह बाद में पूरे घर को ठीक करके बहुत अधिक पैसा कमाएगा।
मौविसील

1
आधार नियम: तकनीकी ऋण एक समय सीमा तक पहुंचने के लिए ठीक है, लेकिन अंततः मुआवजा दिया जाना चाहिए और जल्द ही बेहतर होगा
JF Dion

4
बधाई हो! आपने PHP के "डिज़ाइन दर्शन" का पूरी तरह से वर्णन किया है।
थॉमसएक्स


4
कल कभी नहीं आता ...
एरिक किंग

जवाबों:


25

Refactoring है - और होनी चाहिए - एक सतत प्रक्रिया। यह केवल एक कामकाजी और परीक्षित कार्यान्वयन के साथ आवश्यकताओं को पूरा करने के लिए पर्याप्त नहीं है जो अभी भी थोड़ा अधूरा है।

"इसे काम करो, फिर इसे बेहतर बनाओ"

मुझे याद नहीं है कि मैं उस उद्धरण को कहां पढ़ता हूं, लेकिन यह अच्छी तरह से रिफैक्टरिंग लागू करने की कुंजी है, और मैं इसे अन्यथा करने के लिए अव्यवसायिक के रूप में गिनता हूं।

जब आप खाना पका रहे होते हैं, और अपने भोजन को खाने के बाद अपने बर्तन साफ ​​करते हैं, तो लगातार रिफ्लेक्टिंग फैल को खत्म करने जैसा होता है। टार्गेट किए गए रिफैक्टरिंग एक गंदे रसोईघर को खोजने के समान है, लेकिन केवल एक गंदे गिलास या दो धोने के लिए समय है। क्या आप लगातार गंदी रसोई के साथ रहना चाहेंगे, या क्या आप चीजों को साफ रखना पसंद करेंगे जैसे आप साथ चलते हैं?

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

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

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

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

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


बोली की तरह।
मार्जन वेंमा

1
बहुत से स्थानों पर "दुर्लभ समय" आदर्श है।
ओज

2
अगर केवल PHP "डिजाइनरों" ने उस बोली को मान्यता दी ...
थॉमसएक्स

1
महान उद्धरण, इस बारे में सोचें - क्या आप चाहते हैं कि आपकी कार चित्रकार आपके 1999 टोयोटा की मरम्मत के लिए एक ही तर्क लागू करे - और यदि हां, तो क्या आप $ 1000 की कार पर रोल रॉयस पेंट फिनिश के लिए भुगतान करने के लिए तैयार हैं?
मटनज़

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

11

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

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

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


4
कुछ डेवलपर्स का कहना है कि वे "टूटी हुई खिड़कियों को ठीक कर रहे हैं" जब वे वास्तव में "टाइटैनिक पर डेक कुर्सियों को फिर से व्यवस्थित कर रहे हैं" - वास्तव में, अक्सर डेवलपर्स के लिए "तकनीकी ऋण" और "जिस तरह से मैं नहीं करता हूं" के बीच अंतर बताना मुश्किल लगता है। किया है "
RevBingo

9

व्यावसायिक दृष्टिकोण से, रिफैक्टिंग सट्टा निवेश है - अब समय और प्रयास (धन) का निवेश, इस उम्मीद में कि यह भविष्य में कुछ समय और प्रयास (धन) बचाएगा।

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

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

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

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


4
स्पेलिंग गलतियों के बावजूद +1 :); अधिकांश बार क्लाइंट क्लीन कोड के लिए भुगतान नहीं करता है - वे एक परिणाम के लिए भुगतान कर रहे हैं। यदि आपके पास क्लीन कोड है और कोई परिणाम नहीं है, तो आपको भुगतान नहीं मिलता है और आप बहुत लंबे समय तक रिफैक्टर नहीं करेंगे।
जोंकोंक

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

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

1
@ S.Robins हम रीफैक्टरिंग के बारे में बात कर रहे हैं, न कि खराब फैक्टर कोड के बारे में, (मेरे दिमाग में दूसरी समस्या है, पहला है एक अच्छा है)।
जसकॉन

5

यह स्वीकार्य है जब उन्हें ठीक करने से व्यापार को नुकसान, उन्हें ठीक नहीं करने से अधिक होता है।

यह कहाँ हो सकता है स्थिति:

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

और ये स्थितियाँ उत्पन्न होती हैं - व्यावसायिक परिस्थितियाँ अक्सर कृत्रिम समय-सीमाएँ प्राप्त करती हैं, जो उन्हें मिलनी होती हैं जहाँ उनसे बातचीत करने का अवसर बीत चुका होता है, और आवश्यकताएँ होती हैं जिनके पास एक समय घटक होता है - उदाहरण के लिए कानून या कर नियमों में बदलाव जो लागू होते हैं एक विशिष्ट तिथि - मौजूद है।

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

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

और अगर कोई विकल्प हमेशा ठीक नहीं होता है, लेकिन हम इसे कब ठीक करेंगे?

क्योंकि यह लगभग, लगभग, लगभग हमेशा होना चाहिए जब , नहीं करता है, तो


पुन: कृत्रिम समय सीमा; आदर्श दुनिया में, किसी भी सभ्य परियोजना की समय सीमा होनी चाहिए। मैंने उत्पाद टीमों को एक सप्ताह में फिसलने के साथ ठीक होने के बारे में सुना है (एक सप्ताह में कोई बड़ा सौदा सही नहीं है?) - व्यापार प्रोत्साहन को साकार किए बिना - कि यह आपको काले शनिवार , बनाम से पहले डाल रहा था । गलत कदम।
जसकॉन

3

यदि प्रबंधक निर्णय लेते हैं कि वे तकनीकी ऋण का निर्माण करना चाहते हैं । यह एक उचित निर्णय है कि क्या कोई एक, उदाहरण के लिए, बस कुछ प्रारंभिक ग्राहकों के लिए कुछ प्रारंभिक प्रतिक्रिया प्राप्त करने के लिए एक प्रारंभिक प्रोटोटाइप चाहता है।


4
यह बहुत बार होता है, जहां प्रबंधक तकनीकी ऋण को एक तंग समय सीमा तक पूरा करने की अनुमति देते हैं, केवल ऋण का भुगतान जल्द से जल्द करने के बजाय, वे अगली समय सीमा को कम करते हुए देखते हैं और आने वाले काम और पूर्व ऋण के लिए समय निर्धारण के बजाय ऋण को नजरअंदाज कर दिया जाता है और रिलीज के लिए अतिरिक्त नई सुविधाओं से भरे समय की जरूरत होती है। दूसरे शब्दों में, ऋण का भुगतान कभी नहीं किया जाता है, और इससे पहले कि यो को एहसास हो कि परियोजना कितनी गहरी है, नियंत्रण से बाहर सर्पिल समस्या से बचने के लिए कुछ भी करने के लिए बहुत देर हो चुकी है। यह ऋण प्राप्त करने के लिए ठीक है, इसलिए जब तक आप वास्तव में इसे जल्दी से भुगतान करते हैं।
रॉबिंस

2
कुछ प्रबंधकों (विशेष रूप से गैर तकनीकी) को पता नहीं है कि आप तकनीकी ऋण का उल्लेख करते समय क्या बात कर रहे हैं। कुछ लोग यह भी सोचते हैं कि आप उन्हें वास्तविक काम करने के बजाय सिर्फ दूर जाने और सामान के साथ खेलने की कोशिश कर रहे हैं।
जल्दी से जल्दी

यही कारण है कि हमारे संगठन में प्रबंधक नहीं हैं: Open-Org.com;)
डेविड

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

1

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

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

अंत में, हाँ यह कभी-कभी टूटी हुई खिड़कियों को छोड़ने के लिए स्वीकार्य है, जैसे कि ऋण के लिए पूछना स्वीकार्य है ... बस याद रखें कि आपको वास्तव में, वास्तव में भविष्य में इसके लिए भुगतान करना होगा। और भविष्य में, इसे करने का समय सबसे अधिक संभावना नहीं होगा कि आपके पास अब जो समय है उससे बहुत अधिक है।


0

आम तौर पर, जब आप सक्षम होते हैं, तो आपको इसे ठीक करना चाहिए, इससे रखरखाव के लिए खर्च होने वाले संभावित समय को रोका जा सकेगा। हालांकि, कुछ बर्बर गैर-चुस्त प्रथा यथास्थिति को तब तक चलने देती है जब तक वह काम कर रही है। कुछ प्रबंधक परिवर्तन के "अप्रत्याशित प्रभावों" से डरते हैं।

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

यदि इसकी कार्यक्षमता से टूट गया है और आप नई सुविधाएँ इस पर निर्भर करते हैं, तो ASAP को भी ठीक करना सबसे अच्छा होगा।


0

अधिकांश प्रोग्रामर अपने नियोक्ता के लिए पैसा बनाने के व्यवसाय में हैं। तो रिफ़ेक्टिंग कब होनी चाहिए: जब यह आपकी फर्म को पैसा देता है। रिफैक्टरिंग का समय अन्य परियोजनाओं पर खर्च नहीं किया जाता है और इस परियोजना पर भविष्य में समय की बचत होती है।

क्या यह लायक है यह ज्यादातर आपके प्रबंधक पर निर्भर है।


1
-1; इस तरह का रवैया ही सॉफ्टवेयर सिस्टम को खराब करने का कारण बनता है क्योंकि रिफैक्टरिंग को "उस समय के रूप में देखा जाता है जिसे नई चीजों पर खर्च किया जा सकता है"।
वेन मोलिना

1
आईएस का समय नई चीजों पर खर्च नहीं करना।
पीटर बी

@Wayne M: चीजें सॉफ्टवेयर इंजीनियर आमतौर पर यह तय करने के लिए नहीं मिलते हैं कि चीजें क्या होती हैं, व्यवसाय और प्रबंधक क्या करते हैं। बेशक, हर कोई जब चाहे तब रिफ्लेक्टर लेना चाहेगा, लेकिन यह वास्तव में वास्तविकता नहीं है ... कम से कम पेशे में मेरे 7 वर्षों के अनुभव।
जेम्स

+1 इस तरह का रवैया वह है जो आपके वेतन का भुगतान करने वाले को मूल्य प्रदान करता है। इसके बिना, आपकी पूरी नौकरी को आउटसोर्स किया जा सकता है।
मार्कजे

0

प्रोग्रामर्स को व्यावसायिक पक्ष को तकनीकी ऋण की सीमा को जानने देना चाहिए, इसलिए वे एक सूचित निर्णय ले सकते हैं। यदि आपके कोड के जोखिम को जल्द ही बाजार में लाने की आवश्यकता है, तो आपके पास ज्यादा विकल्प नहीं हैं। नकदी प्रवाह में कमी से कई तकनीकी फैसले होंगे।

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

यदि आप अपनी टीम के विस्तार के बारे में सोच रहे हैं, तो एक जूनियर डेवलपर को काम पर रखने का यह अच्छा समय हो सकता है। टेस्ट कवरेज इस मामले में एक बड़ा रक्षक होगा। वे दस्तावेज़ीकरण को पढ़ने से अधिक सीखेंगे।


0

क्या इस परिदृश्य में समय सीमा बनाने की खातिर प्रमुख रिफ्लेक्टरिंग को मौजूदा कोड के लिए देना न्यायोचित हो सकता है?

  • अगर कुछ टूट गया है, तो सबसे अधिक संभावना नहीं है। आप आंशिक रूप से काम कर रहे ब्रेक के साथ कार नहीं चलाएंगे? (जब तक कि समय पर कहीं नहीं मिलने का जोखिम दोषपूर्ण ब्रेक के कारण दुर्घटनाग्रस्त होने के जोखिम से अधिक है।) आदर्श समाधान से बहुत दूर है, लेकिन दुर्भाग्य से ऐसा होता है।

हालाँकि, यदि आप वर्किंग कोड को री-फैक्टरिंग के बारे में बात कर रहे हैं, तो मैं निम्नलिखित पर विचार करूंगा:

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

  • यदि पुन: फैक्टरिंग का व्यवसाय की लाभप्रदता पर नकारात्मक प्रभाव पड़ेगा तो इसे फिर से निर्धारित किया जाना चाहिए।

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

  • आपको हमेशा कुछ करने का बेहतर तरीका मिलेगा। यह एक प्राकृतिक प्रक्रिया है और एक रेखा खींचने में सक्षम होना बहुत महत्वपूर्ण है।


नीचे के मतों पर कुछ प्रतिक्रिया प्राप्त करना अच्छा
रहेगा

2
इतने सारे माइनस वोटों से सहमत, ऐसा लग रहा है कि किसी का बस एक बुरा दिन था, और नीचे वोटों के एक झुंड के माध्यम से घुसा।
सैम गोल्डबर्ग

-1

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

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

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


डाउन वोट का क्या कारण है? कुछ कहा यहाँ सही नहीं है? या सिर्फ प्रतिशोधी संपादक?
सैम गोल्डबर्ग

-1

अगर इसका सच टूट गया है तो इसे ठीक किया जाना चाहिए।

लेकिन क्या यह वास्तव में टूट गया है? क्या आप सुनिश्चित हैं कि आप टूटे हुए के साथ "सुंदर नहीं" की बराबरी नहीं कर रहे हैं।

आपके द्वारा री-फैक्टर वर्किंग कोड से पहले आपको "सनक वैल्यू" गणना लागू करने की आवश्यकता है क्योंकि आपको शैली पसंद नहीं है, या, क्योंकि आपको लगता है कि यह भविष्य में समस्या पैदा करेगा।

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

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

पुन: फैक्टरिंग कोड जो उत्पादन में चला गया है। और भी परीक्षण किया जाना है, साथ ही उपयोगकर्ताओं को एक रोल आउट, और, कुछ देने का जोखिम जो काम नहीं करता है और साथ ही साथ पुरानी रिलीज भी। आपको इसे सही ठहराने और आगे बढ़ने से पहले इसे बड़े बॉस के साथ साफ करना होगा।

री-फैक्टरिंग कोड जो थोड़ी देर के लिए उत्पादन में होता है और कई रिलीज और बग फिक्स के माध्यम से होता है। जब तक आप जानते हैं कि सॉफ्टवेयर काम करना बंद करने वाला है, तब तक वहां मत जाओ!


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

2
कोड जो परीक्षण किया गया है और बिना किसी बकाया बग रिपोर्ट के उत्पादन में काम कर रहा है। इसे राज्य में लाने के लिए बहुत समय और पैसा लगाया गया था। सुंदर कोड सिर्फ इतना है - सुंदर कोड।
जेम्स एंडरसन

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

@Wayne M: वाह, वेन आपको वास्तव में कोई पता नहीं है। यदि आप कभी भी इसे पीएम को बनाते हैं तो आपके डेवलपर्स आपसे प्यार करेंगे, लेकिन आपका करियर संभवत: लंबा नहीं होगा। आपको किसी बिंदु पर रेखा खींचनी होगी। मुझे लगता है कि यह वह है जो आपके सपनों से सहमत नहीं होने वाले हर किसी को नीचा दिखा रहा है?
जेम्स

1
@WayneM - तो आप एक "दोष" जुटाएंगे क्योंकि आप उस तरह से कोड को पसंद नहीं करते हैं। किसी काम को करने के लिए कोड लिखा जाता है - अगर वह नौकरी करता है तो उसका काम। रख-रखाव की लागत अधिक हो सकती है, लेकिन इसका फिर से लिखना सस्ता होगा।
जेम्स एंडरसन

-2

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

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


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