2008-08-29 22 views
12

मुझे यकीन है कि आप वहां मौजूद हैं, आप एक ऐसे प्रोजेक्ट पर जाते हैं जहां एक क्रैकी पुराना कोड बेस है जो उद्देश्य के लिए मुश्किल से फिट नहीं है और आपको इसे पहले से ही स्क्रैच या मरम्मत से फिर से लिखने का निर्णय लेना है मौजूद।पुनर्लेखन या मरम्मत?

परंपरागत ज्ञान यह सुझाव देता है कि आपको कभी भी स्क्रैच से पुनः लिखने का प्रयास नहीं करना चाहिए क्योंकि विफलता का जोखिम बहुत अधिक है। तो इस समस्या का सामना करते समय आपने क्या किया, आपने निर्णय कैसे लिया और यह कैसे निकला?

उत्तर

8

यह वास्तव में कितना बुरा यह है पर निर्भर करता है।

यदि यह एक छोटी सी प्रणाली है, और आप इसे पूरी तरह से समझते हैं, तो एक पुनर्लेख पागल नहीं है।

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

बिंदुओं पर विचार करने के लिए:

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

मैं एक समय में एक नया संस्करण जारी करने में सक्षम होने के बिना एक बड़ी प्रणाली के लिए एक विशाल पुनर्लेखन परियोजना को लेने में संकोच करता हूं।

0

यह बहुत काले और सफेद नहीं है ... यह वास्तव में कारकों में से एक बहुत पर निर्भर करता है (और अधिक महत्वपूर्ण जा रहा है "क्या व्यक्ति का भुगतान करता है आप आप क्या करना चाहते")

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

1

रिएक्टर तक वास्तव में बहुत खराब होने के कारण बहुत सारे कामकाज को लागू करना पड़ता है।

Joel has a lot to say on this...

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

+0

केवल बुरे और बहुत बुरे के बीच विभाजित लाइन कहां है? –

4

जोएल स्पॉल्स्की के निबंध Things You Should Never Do देखें। संक्षेप में, जब आप फिर से लिखते हैं तो आप अपने वर्तमान कोड को जिस तरह से काम करने की ज़रूरत होती है, उसे बनाने के लिए सीखे गए सभी पाठों को खो देते हैं।

यह भी देखें: Big Ball of Mud

9

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

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

जैवडोक या डॉक्सिजन जैसे उपकरण, यदि पहले से उपयोग में नहीं हैं, तो कोड दस्तावेज़ और समझ में सुधार करने में भी मदद कर सकते हैं।

एक पूर्ण पुन: लिखने के खिलाफ तर्क एक बहुत मजबूत है। मूल परियोजना के समय सीमा में कोडित किए गए "छोटी छोटीड़े" और व्यवहारों के उन टन में फिर से ठीक से पीछे हट जाएगा।

2

मेरी पिछली नौकरियों में से एक में पुनर्लेखन का एक कारण मूल कोड आधार पर काम करने के लिए पर्याप्त अनुभव वाले डेवलपर्स को ढूंढने में असमर्थता थी।

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

मैं नहीं सुना है यह अभी तक कैसे बाहर काम किया :)

मुझे लगता है कि लोगों को, क्योंकि यह सतह पर अधिक मज़ा लगता पुनर्लेखन के लिए जाने के लिए एक प्रवृत्ति है।

हमें खरोंच से पुनर्निर्माण मिलना है!

हम इसे सही करेंगे इस बार!

आदि

2

यह जटिल कुछ भी सफल होने के लिए की एक फिर से लिखने के लिए दुर्लभ है। यह आकर्षक है, लेकिन कम प्रतिशत रणनीति है।

यूनिट परीक्षणों के तहत विरासत कोड प्राप्त करें और इसे दोबारा दोहराएं, और/या उपयुक्त होने पर इसके छोटे हिस्सों को पूरी तरह से प्रतिस्थापित करें।

2

बाली और बेलचम द्वारा Brownfield Application Development in .NET पर एक नई पुस्तक आ रही है। पहला अध्याय नि: शुल्क है, और अधिकतर मंच अज्ञेय परिप्रेक्ष्य से इन मुद्दों के बारे में बात करता है।

1

आपकी स्थिति के आधार पर, आप में एक और विकल्प है: लाइसेंस-लाइसेंस तीसरे पक्ष कोड।

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

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

0

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

1

मरम्मत, या अधिक महत्वपूर्ण बात, रिफैक्टर। दोनों क्योंकि Joel said so और यह भी क्योंकि, यदि यह आपका कोड है, तो आपने शायद इस कोड को अंतिम बार स्पर्श करने के बाद से एक टन और अधिक चीज़ें सीखी हैं। यदि आपने इसे .NET 1.1 में लिखा है, तो आप इसे 3.5 एसपी 1 में अपग्रेड कर सकते हैं। आपको सभी पुरानी टिप्पणी कोड में जाना और शुद्ध करना है। जब आप पहली बार इस कोड को लिखते हैं तो आप डेवलपर के रूप में 100x बेहतर होते हैं।

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

संबंधित मुद्दे