2008-10-10 13 views
13

आप वास्तव में खराब सिस्टम पर कैसे सुधार करना शुरू कर देंगे?वास्तव में खराब सिस्टम में सुधार

यूनिट परीक्षण बनाने और पुन: सक्रिय करने की सलाह देने से पहले मुझे बताएं कि मेरा क्या मतलब है। मैं उन तकनीकों का उपयोग कर सकता था लेकिन यह इस मामले में व्यर्थ होगा।

असल में सिस्टम इतनी टूटी हुई है कि ऐसा करने की ज़रूरत नहीं है।

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

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

तो आप इस प्रणाली में सुधार करने के लिए कैसे काम करना शुरू कर देंगे? आप किस रणनीति का पालन करेंगे?

कुछ अतिरिक्त चीजें: मैं इस पर काम कर रहे एक-पुरुष-सेना हूं, इसलिए पर्याप्त पुरुषों को किराए पर लेने और सिस्टम को फिर से डिजाइन करने/रीफैक्टर करने का स्वीकार्य उत्तर नहीं है। और कुछ हफ्तों या महीनों में मुझे वास्तव में कुछ दृश्य प्रगति दिखाना चाहिए, इसलिए यह कुछ वर्षों में खुद को रिफैक्टरिंग करने का विकल्प नहीं है।

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

अतिरिक्त जानकारी:

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

अद्यतन:

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

+0

शुभकामनाएँ! एक टूटी हुई प्रणाली पर काम करने के बारे में मुझे एक चीज है - मैं जो भी करता हूं उससे कुछ भी इससे भी बदतर हो सकता है इससे पहले कि मैंने शुरू किया था। :) –

+0

+1 - यह स्थिति इतनी भयानक है! या यह बेहद भयानक है? – Drew

उत्तर

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

लेदर, कुल्ला, दोहराना! :)

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

विशेष मुद्दों तुम उल्लेख को संबोधित करते:

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

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

+0

उत्तर के लिए धन्यवाद। मेरी योजना पहले कम फांसी वाले फलों के लिए जाना था, समस्या यह है कि मुझे बस एक नहीं मिला। शायद मुझे कड़ी मेहनत करनी चाहिए ... – Zizzencs

+0

फल देखने वाले की आंखों में हो सकता है। मैं भाग्यशाली बी/सी था मेरी प्रणाली कुछ थी।नेट Winforms ऐप, तो मेरा प्रारंभिक कम फांसी फल UI संगठन को ठीक कर रहा था और संभावित शून्य संदर्भों के बारे में सैकड़ों चेतावनियां। –

1

आप उस निर्देशिका को खोलते हैं जिसमें Windows Explorer के साथ इस सिस्टम को शामिल किया गया है। फिर, Ctrl-A दबाएं और फिर Shift-Delete दबाएं। यह आपके मामले में सुधार की तरह लगता है।

गंभीरता से हालांकि: उस काउंटर की तरह लगता है कि इसे थ्रेड-सुरक्षा समस्याएं मिली हैं। मैं बढ़ते कार्यों के चारों ओर एक ताला लगा दूंगा।

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

शुभकामनाएँ, और स्रोत आपके साथ हो सकता है।

1

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

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

निराशा और प्रश्नों सहित किसी भी प्रकार की रिपोजिटरी में जाने के बाद अपनी प्रगति को दस्तावेज करें, ताकि जब अगले गरीब schmuck जो इस परियोजना को प्राप्त करे, वह नहीं होगा :)।

एक बार जब आप पहला भाग प्राप्त कर लेते हैं, तो अगले पर जाएं। कुंजी बढ़ती प्रगति के शीर्ष पर निर्माण करना है, यही कारण है कि आपको पहले सबसे कठिन भाग से शुरू नहीं करना चाहिए; नैतिकता प्राप्त करना बहुत आसान होगा।

जोएल को फिर से लिखने/पुनर्रचना पर लेख की एक जोड़ी है:

http://www.joelonsoftware.com/articles/fog0000000069.html

http://www.joelonsoftware.com/articles/fog0000000348.html

+0

उत्तर के लिए धन्यवाद। आप इस प्रक्रिया पर सही हैं, मैंने इसे पहले किया है। लेकिन इस प्रणाली में मैं पहले खींचने के लिए हैंडल नहीं ढूंढ सकता। – Zizzencs

0

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

2

यह एक पूरी किताब है कि मूल रूप से कहेंगे इकाई परीक्षण और refactor है, लेकिन यह कैसे

http://ecx.images-amazon.com/images/I/51RCXGPXQ8L._SL500_AA240_.jpg

http://www.amazon.com/Working-Effectively-Legacy-Robert-Martin/dp/0131177052

+0

हम्म, धन्यवाद, मेरे अमेज़ॅन इच्छा सूची में। इसे अगले आदेश के साथ मिल जाएगा :-) – Zizzencs

3

क्या आप के लिए कहा जा रहा है अभी क्या करना पर और अधिक व्यावहारिक सलाह के साथ ? क्या आपको कार्यक्षमता लागू करने, या बग ठीक करने के लिए कहा जा रहा है? क्या वे यह भी जानते हैं कि वे क्या करना चाहते हैं?

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

आपको अंततः प्रतिक्रिया करने की आवश्यकता है। इसके आसपास कोई रास्ता नहीं है। यदि आप अपने अंतिम उपयोगकर्ताओं को दिखाई देने वाले रिफैक्टर का एक तरीका ढूंढ सकते हैं, आदर्श होगा, भले ही इसमें "कुछ महीनों" के बजाय 6-9 महीने या एक वर्ष लग जाए। लेकिन तुम नहीं, तो आप एक विकल्प बनाने के लिए हो सकता है यदि:

  • Refactor, और जोखिम अपने प्रयासों
  • , refactor मत हासिल "दृश्यमान" लक्ष्यों के बावजूद के रूप में "पूरा नहीं कुछ भी" देखा जा रहा है, और प्रणाली को एक दिन फिर से भंग करने के लिए और अधिक कठिन बनाते हैं।(शायद आपको बेहतर नौकरी मिलने के बाद, और उम्मीद है कि अगला डेवलपर कभी भी पता नहीं लगा सकता कि आप कहाँ रहते हैं।)

कौन सा सबसे फायदेमंद है आपकी व्यक्तिगत रूप से आपकी कंपनी की संस्कृति पर निर्भर करता है। क्या वे एक दिन अधिक डेवलपर्स किराए पर लेने का फैसला करेंगे, या इस प्रणाली को किसी अन्य उत्पाद के साथ पूरी तरह से बदल देंगे?

इसके विपरीत, यदि "चीजों को ठीक करने" के आपके प्रयास वास्तव में अन्य चीजों को तोड़ते हैं, तो क्या वे अकेले हाथ से निपटने के लिए पूछे जा रहे राक्षस के बारे में समझेंगे?

कोई आसान जवाब नहीं, क्षमा करें। आपको अपनी अनूठी, व्यक्तिगत स्थिति के आधार पर मूल्यांकन करना होगा।

+0

मैं कभी नहीं मानता कि ग्राहक जानता है कि वह क्या चाहता है :-) हालांकि इस मामले में मैं नई कार्यक्षमता को लागू नहीं करता हूं। सबसे महत्वपूर्ण लक्ष्य नई चीजों को तेज़ी से और आसान बनाने के लिए संभव बनाना होगा। – Zizzencs

0

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

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

उम्मीद है कि आप धीरे-धीरे पूरी टीम को फिर से लिखने में सक्षम एक टीम बना सकते हैं।

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

शुभकामनाएं!

0

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

ऐसा करने से, आप वास्तविक कार्य प्रणाली प्राप्त करने की दिशा में अपनी प्रगति को धीमा किए बिना अपने मौजूदा बग (जिन्हें कहीं और मुआवजा दिया जा रहा है) रख सकते हैं।

1

मैं लगभग तीन वर्षों के लिए एक ही विशेषता के साथ एक विरासत प्रणाली के साथ काम कर रहा हूं, और ऐसे शॉर्टकट नहीं हैं जिन्हें मैं जानता हूं।

हमारी विरासत प्रणाली के साथ मुझे सबसे ज्यादा परेशान करता है कि मुझे कुछ बग ठीक करने की अनुमति नहीं है, क्योंकि अगर मैंने उन्हें ठीक किया तो कई अन्य कार्य तोड़ सकते हैं। यह बदसूरत कामकाज या पुराने कार्यों के नए संस्करण बनाने के लिए कहते हैं। पुराने कार्यों को कॉल एक समय में नए (एक परीक्षण के दौरान) के साथ प्रतिस्थापित किया जा सकता है।

मुझे यकीन नहीं है कि आपके कार्य का लक्ष्य क्या है, लेकिन मैं आपको सलाह देता हूं कि जितना संभव हो सके कोड को कम से कम स्पर्श करें। केवल वही करें जो आपको करने की ज़रूरत है।

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

इसके अलावा: सुनिश्चित करें कि आपको भुगतान और पर्याप्त नैतिक समर्थन मिल रहा है। रोते और दांतों का दांत होगा ...

+0

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

+0

Yepp, परिचित लगता है। हालांकि मुझे नहीं लगता कि मैं जितना संभव हो उतना छोटा कोड स्पर्श करने के लिए उत्तर स्वीकार कर सकता हूं और कुछ भी नहीं के लिए पैसा प्राप्त कर सकता हूं। मैं बहुत उत्सुक हो सकता हूं, लेकिन यह मेरा तरीका नहीं है :-) – Zizzencs

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