एक समीक्षक के रूप में मुझे क्या करना चाहिए जब कोड "बुरा" होना चाहिए?


18

मैं एक बुरी तरह से डिजाइन की गई परियोजना पर काम करता हूं, जहां कुछ महीने पहले अनिवार्य कोड समीक्षाएं पेश की गई हैं।

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

इस विशेष समीक्षा के संबंध में मुझे कैसे व्यवहार करना चाहिए? क्या अखंडता बनाए रखने और रचनात्मक बने रहने के लिए मेरे लिए कोई रास्ता है?

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


1
क्या डेवलपर ने दस्तावेज़ ऐसा क्यों किया है और हो सकता है कि उसने इश्यू ट्रैकर पर मुख्य समस्या के लिए एक समस्या भी लिखी हो?
ल्यूक फ्रेंकेन

धीरे-धीरे, और नहीं।
लाल

4
क्या तकनीकी ऋण के बारे में कुछ करने के लिए आपके संगठन के भीतर कोई भूख है?
रॉबर्ट हार्वे

5
अगर पर्यावरण को देखते हुए कोड गलत नहीं है तो मैं कोड पर हमला नहीं करूंगा। ज्यादातर के बाद से आप लिखा था कि आप इस समय वास्तविक सुधार संभव नहीं देखते हैं। यह सुधार के अवसर के बिना संघर्ष पैदा करेगा। मैं पहले कदम के रूप में बेहतर दस्तावेज़ बनाना सिखाऊंगा। दूसरा उन्हें स्पष्ट मुद्दों को लिखने के लिए एक प्रक्रिया बनाएँ। इसके परिणामस्वरूप 2 चीजें होंगी: इस मुद्दे पर दस्तावेज़ीकरण ताकि अगले काम तेजी से हो सके। और इसके अलावा आपको संभावित रूप से तय किए जाने के लिए ठोस मुद्दों की एक सूची मिलती है। मुझे GitHub का उल्लेख पसंद है क्योंकि आप देखते हैं कि अगर वे इसे टैग करते हैं तो यह कितनी बार reoccurs है।
ल्यूक फ्रेंकेन

जवाबों:


25

सरल:

1. अपने तकनीकी ऋण का दस्तावेज

आपने एक ऐसे कोड की पहचान की है जो काम करता है लेकिन इसके साथ कुछ तकनीकी समस्याएं हैं। यह तकनीकी ऋण है । अन्य प्रकार के ऋण की तरह यह समय के साथ खराब हो जाता है अगर इससे निपटा नहीं जाता है।

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

2. धीरे-धीरे अपने कर्ज का भुगतान करें

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

एक बार जब आप एक ऐसे बिंदु पर पहुँच जाते हैं, जहाँ आपके पास एक तकनीकी कमी नहीं होती है, तो आप एक स्वस्थ कोडबेस पर जाते हैं :)


5

एक साइड नोट के रूप में: एक नई नौकरी की तलाश करें। यह कोई भी बेहतर नहीं मिलेगा।

आपके द्वारा समीक्षा किए जा रहे कोड के लक्ष्य हैं:

  • एक सुविधा को जहाज करने के लिए, जिसे आवश्यकताओं के अनुसार काम करना चाहिए।

  • तकनीकी ऋण की वृद्धि को कम करने के लिए।

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

दूसरा लक्ष्य वह है जिस पर आपका प्रश्न केंद्रित है। एक तरफ, नए कोड से तकनीकी ऋण में वृद्धि की उम्मीद नहीं है। दूसरी ओर, समीक्षा का दायरा स्वयं कोड है, लेकिन पूरे कोडबेस के संदर्भ में। वहाँ से, आप, एक समीक्षक के रूप में, मूल लेखक से दो दृष्टिकोणों की अपेक्षा कर सकते हैं:

  • बाहर का कोड मेरी गलती नहीं है। मैं सिर्फ फीचर लागू करता हूं और पूरे कोडबेस की परवाह नहीं करता।

    इस परिप्रेक्ष्य में, कोड कोडबेस के दोषों की नकल करेगा, और इसलिए अनिवार्य रूप से तकनीकी ऋण में वृद्धि होगी : अधिक बुरा कोड हमेशा बदतर होता है।

    हालांकि यह दीर्घकालिक रूप से एक मान्य अल्पकालिक दृष्टिकोण है, इसके परिणामस्वरूप देरी और कम उत्पादकता बढ़ जाती है, और अंततः विकास प्रक्रिया इतनी महंगी और जोखिम भरी हो जाती है कि उत्पाद विकसित होना बंद हो जाएगा।

  • नया कोड लिखना एक विरासत को फिर से दर्शाने का एक अवसर है।

    इस परिप्रेक्ष्य में, नए पर विरासत कोड के दोषों का प्रभाव सीमित हो सकता है। इसके अलावा, तकनीकी ऋण को कम किया जा सकता है, या कम से कम कोड वृद्धि के अनुपात में नहीं बढ़ाया जा सकता है।

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

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

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

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

एमवीसी, या लॉगिंग फ्रेमवर्क, या हर जगह एक ओआरएम का उपयोग करने के लिए न तो आप और न ही आपके सहयोगी कोड की हजारों-हजारों लाइनों से गुजरने में सक्षम हैं। वास्तव में, इसके लिए कई महीनों की आवश्यकता होगी: एमवीसी को शुरू करने की कल्पना करना; इसमें कितना समय लगेगा? या उन स्थितियों में ORM के बारे में क्या है जहाँ SQL क्वेरीज़ को कोड के अंदर समवर्ती (SQL इंजेक्शन के लिए सामयिक स्थानों के साथ) उत्पन्न किया गया था, कोई भी समझ नहीं सका?

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

  • अनुरोधों के उपचार का पुराना तरीका,

  • MVC रास्ता,

  • पुराने लॉगिंग तंत्र,

  • लॉगिंग फ्रेमवर्क,

  • मक्खी पर निर्मित SQL प्रश्नों के साथ डेटाबेस तक सीधी पहुंच,

  • ORM।

एक परियोजना पर मैं काम कर रहा था, वहाँ चार (!) लॉगिंग चौखटे के साथ-साथ उपयोग किए गए थे (प्लस मैनुअल लॉगिंग)। इसका कारण यह है कि हर बार जब कोई सामान को लॉग इन करना चाहता था, तो ऐसा करने के लिए कोई सामान्य दृष्टिकोण नहीं था, इसलिए एक नया ढांचा सीखने के बजाय (जो सभी मामलों में केवल 5% कोडबेस में उपयोग किया गया था), एक बस एक और एक जोड़ देगा पहले से जानते हैं। गंदगी की कल्पना करो।

एक बेहतर तरीका यह होगा कि एक बार में एक चरण में कोडबेस को रिफलेक्टर किया जाए। एक बार फिर लॉगिंग का उदाहरण लेते हुए, रीफैक्टरिंग में निम्नलिखित छोटे चरण शामिल होंगे:

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

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

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

  • नई सुविधा में नए रिफैक्ट किए गए तरीकों का उपयोग करें।

  • लॉगिंग फ्रेमवर्क में माइग्रेट करें: केवल प्रभावित कोड समर्पित लाइब्रेरी के भीतर का कोड है।


1
आखिरी पैराग्राफ तक शानदार जवाब। चाहे आप इसका इरादा रखते हों या नहीं, आप यह आरोप लगा रहे हैं कि नए कोड के लिए अच्छी प्रथाओं का उपयोग नहीं किया जाना चाहिए। -1
रबरडक

2
@RubberDuck: यह नहीं है अच्छा व्यवहार के बारे में है, यह कोड लिखने के बारे में है मौलिक शेष codebase से अलग। मैं वह डेवलपर रहा हूं और मैंने जो किया है उसके परिणाम देखे हैं: बुरे कोड के बीच बहुत बेहतर कोड होने से केवल चीजें खराब होती हैं; क्या बेहतर बनाता है कि छोटे रीफैक्टरिंग चरणों के माध्यम से कोडबेस को बेहतर बनाया जाए। मैं कुछ ही मिनटों में अपने उत्तर में एक उदाहरण जोड़ूंगा।
आर्सेनी मूरज़ेंको

अगर मैं कर सकता मैं फिर से DV। संपादन इसे बदतर बनाता है। कुछ नया करने के लिए चार अलग-अलग तरीकों का होना बुरा है, लेकिन उस आदमी की गलती है जो दूसरे लॉगिंग ढांचे को जोड़ता है। रेत में एक रेखा खींचना और सड़े हुए कोड के आगे साफ कोड रखना बुरा नहीं है।
रबरडक

@ रबरडक: यह दूसरी लॉगिंग ढाँचे को जोड़ने के बारे में नहीं है , बल्कि पहला है। जो दूसरा लॉगिंग फ्रेमवर्क जोड़ता है, वह सिर्फ इसलिए करता है क्योंकि पहले वाले का उपयोग केवल एक छोटी सी सुविधा पर किया जाता है; अगर मैं सलाह के रूप में कोडबेस को फिर से तैयार किया गया था, तो ऐसा नहीं होगा।
आर्सेनी मूरज़ेंको

मुझे लगता है कि आप और मैं सहमत हैं, लेकिन आपके उत्तर एक तरह से पढ़ते हैं जो सुधार को हतोत्साहित करते हैं। मैं बस उस पर सवार नहीं हो सकता।
रबरडक

3

यदि आप अपनी विकास प्रक्रिया के भाग के रूप में कोड समीक्षा कर रहे हैं; फिर आपको उन नियमों को सेट करना होगा जिनके खिलाफ आप जिस कोड की समीक्षा कर रहे हैं, उसे 'जज' करते हैं।

यह आपकी 'की गई परिभाषा' में जाना चाहिए और एक स्टाइल गाइड, कोडबेस या स्टेटिक विश्लेषण के लिए आर्किटेक्चर डॉक्यूमेंट, कानूनी आवश्यकताओं की जांच, कंपनी जो भी निर्णय लेती है, वह 'कोड क्वालिटी' के लिए उसकी आवश्यकताएं हो सकती हैं।

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

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


3

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

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

दूसरे शब्दों में, कुंजी को नियमित रूप से परियोजनाओं की शुरुआत की ओर छोटे बदलावों का सुझाव देना है, बजाय अंत में बड़े बदलावों का सुझाव देते हुए शॉट डाउन करना।


2

उन जगहों पर जहां मैं कोड समीक्षा कर रहा हूं, मैं कोड सबमिट करना स्वीकार करूंगा और ठीक करूंगा, अगर यह कम से कम कुछ रिफैक्ट करने की प्रतिबद्धता के साथ आता है। एक कहानी के रूप में एक दायर बग के रूप में हो, या एक (कुछ) refactoring के साथ एक और समीक्षा भेजने का वादा किया।

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

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