"बैंडेज" फिक्स कितने आम हैं? [बन्द है]


18

इस परिदृश्य की कल्पना करें:

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

अब आप दो चीजों में से एक कर सकते हैं: आप या तो कोड की जांच तब तक करेंगे जब तक आपको वास्तविक कारण नहीं मिल जाता; या आप एक बन्दे पर थप्पड़ मारते हैं ifयदि स्टेटमेंट की जाँच करके कि यह विशेष इनपुट है - यदि यह है, तो अपेक्षित मान लौटाएँ।

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

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

जवाबों:


19

समय / समय सीमा के दबाव एक कारण हैं।

यदि आप एक तंग समय सीमा के खिलाफ हैं और आपने अपने बॉस को अपनी गर्दन को साँस लेते हुए पाया है (संभवतः शाब्दिक रूप से!) तो ऐसा करने और यह सोचकर कि "मैं वापस आऊंगा और इसे बाद में ठीक करूंगा" बहुत ही लुभावना है और हो सकता है कि केवल एक ही चीज हो क्या कर सकते हैं।

बेशक कई बार आप वास्तव में वापस जाते हैं और इसे ठीक से ठीक करते हैं, लेकिन बहुत कम और दूर हैं क्योंकि आपके पास एक नई समस्या है जिसे कल ठीक करने की आवश्यकता है।


10

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

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


अरे इतना सच, इतना सच। मैंने स्वीकार करने की तुलना में अधिक पट्टियाँ लागू की हैं और उनमें से अधिकांश को बाद में तय नहीं किया गया है।
कोरिन

कभी-कभी कोड के अंतिम रिलीज में वास्तविक फिक्स की तुलना में अधिक पट्टियाँ होती हैं। यहां तक ​​कि कुछ प्रोग्रामर्स ने उस पट्टियों को अन्य परियोजनाओं में कॉपी करना शुरू कर दिया।
प्रणाम

7

समय

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


कल (रविवार। मैं रविवार को काम करता हूं, जो आपको उस सप्ताह के प्रकार के बारे में बताना चाहिए, जिसका मैं यहां सामना कर रहा हूं।) मैंने स्ट्रिंग "NaN" को SQL स्टेटमेंट में "0" से बदलने से ठीक पहले लिखा है। सर्वर को प्रस्तुत किया। मुझे नहीं पता कि यह उस बिंदु पर NaN क्यों है, और मुझे दिलचस्पी है, लेकिन मेरे पास इसका शिकार करने का समय नहीं है।
डैन रे

5

हम उन्हें असाधारण रूप से करते हैं।


विकास के दौरान सुधार के लिए, हम यह सुनिश्चित कर रहे हैं कि मूल कारण को जाने बिना कोई सुधार नहीं किया जाता है। तथापि:

  • मूल रूप से मूल कारण की खोज में बहुत लंबा या स्टाल लगना शुरू हो जाएगा और एक कठिन समय सीमा है,
  • मूल कारण को ठीक करने के लिए असाधारण रूप से कोड परिवर्तन संभवत: संभव नहीं हैं (परिवर्तन बहुत लंबा और समय सीमा समाप्त हो जाएगा)

उन मामलों में हम "पट्टी" को ठीक करते हैं। हम मूल कारण को संबोधित करने के लिए आंतरिक दोष खोलते हैं। हां, अधिक बार नहीं इन आंतरिक दोषों को बहुत कम प्राथमिकता के साथ इलाज किया जाता है।


रखरखाव की धारा में सुधार के लिए, हम यह सुनिश्चित कर रहे हैं कि मूल कारण को जाने बिना कोई सुधार नहीं किया जाता है। तथापि:

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

उन मामलों में, हम पहले "बैंडेज" के लिए चुनते हैं अस्थायी फिक्स और एक बार ग्राहक खुश होने के बाद हम उचित फिक्स पर काम करते हैं और उसके बाद ही दोष का समाधान किया जाता है।


4

बहुविकल्पी।

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

सबसे पहले, "पट्टी" फिक्स की आवृत्ति के बारे में :

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

दूसरा, मेरी सलाह:

यदि बग एक विकास टीम के अपने स्रोत कोड में होता है:

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

यदि बग किसी अन्य टीम के स्रोत कोड में होता है:

  • अपने बग को ठीक करने के लिए उस टीम को पुश करें।
  • हमेशा उस बग को अन्य टीम के दोष ट्रैकिंग सिस्टम के साथ दर्ज करें

यदि बग किसी अन्य कंपनी (या कंपनी के उत्पाद) में नहीं होता है:

  • इस स्थिति में, डक्ट-टेप फ़िक्सेस (या डेटा-चालित वर्कअराउंड ) बग को ठीक करने का एकमात्र तरीका हो सकता है।
  • यदि यह खुला स्रोत है, तो उस बग को कुछ (संभवतः सार्वजनिक रूप से) दोष ट्रैकिंग सिस्टम के साथ फ़ाइल करें , ताकि कोई उस पर गौर कर सके।

2

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


2

मैं कहूंगा कि यह बहुत आम है।

जोएल स्पोलस्की की ब्लॉग पोस्ट देखें: डक्ट टेप प्रोग्रामर

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

अकादमिक दुनिया और वास्तविक दुनिया के बीच एक अंतर है, जहां सॉफ्टवेयर को वास्तव में समय और व्यावसायिक संदर्भों के तहत जहाज करने की आवश्यकता होती है।

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


1

अधिक संदर्भ के बिना यह कहना मुश्किल है - आपके उदाहरण में, यदि सही विवरण नहीं है तो क्यों जोड़ रहा है? कहीं ऐसा तो नहीं कि कोड का कुछ अन्य ब्लॉक माना जाता है, जो उस इनपुट से निपटने वाला है?

कितनी बार बैंडेज फिक्स का उपयोग किया जाता है यह कई चीजों पर निर्भर करता है जैसे कि कोड कितना जटिल है, क्या कोड से सबसे ज्यादा परिचित व्यक्ति उपलब्ध है (क्रेग के 20 वर्षीय COBOL दिनचर्या के लिए जिम्मेदार व्यक्ति ने कंपनी को सालों पहले छोड़ दिया हो सकता है) ) और शामिल समय।

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


ifक्योंकि अगर त्रुटिपूर्ण छोटा सा अफसर समारोह बयान सही नहीं है।
जोश के

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

1

ऐसे मामले हैं जहां उस तरह का फिक्स वास्तव में ठीक है और शायद आदर्श (जहां तक ​​डिबग करने में लगने वाले समय की बात है)।

एक परिदृश्य की कल्पना करें जहां आपको 20 डीएलएल मिले हैं जो आपके मुख्य निष्पादन योग्य के लिए कुछ प्रकार के मॉड्यूल के रूप में कार्य करने वाले हैं, लेकिन चलाने के लिए मुख्य निष्पादन योग्य से कुछ जानकारी की भी आवश्यकता होती है।

यदि आप कभी भी मुख्य निष्पादन योग्य के बाहर उन DLL का उपयोग करना चाहते हैं, तो आपको मुख्य निष्पादन योग्य से कुछ रिटर्न मान को ठगना होगा। ए) यह इस संदर्भ में मौजूद नहीं है और बी। आप नहीं चाहते हैं कि यह इस संदर्भ में मौजूद है।

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

ifमैं किसी और के फंक्शन में अंदर जाने के बजाय , मैं फंक्शन के {$ifdef}आस-पास रखूँगा - इस तरह से कोई इसे किसी ऐसी चीज़ के साथ भ्रमित नहीं करता है जो वहाँ होनी चाहिए।

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