कोड की समीक्षाओं के साथ बॉय स्काउट नियम और अवसरवादी पुनर्संरचना


55

मैं बॉय स्काउट नियम में एक महान विश्वासकर्ता हूं :

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

अवसरवादी रिफैक्टिंग के संबंधित विचार में भी मैं एक महान आस्तिक हूँ :

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

विशेष रूप से दर्शाते लेख से निम्नलिखित अंश पर ध्यान दें:

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

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

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

(१) ज्यादातर बार आपको केवल यह एहसास होता है कि आप अपने असाइनमेंट के बीच में क्या और कैसे रिफ्लेक्टर करना चाहते हैं। जैसा कि मार्टिन फाउलर कहते हैं:

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

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

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

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

इस स्थिति का मैं कैसे उपाय कर सकता हूं इस पर कोई विचार?


40
मैं एक ऐसी जगह पर काम करने में असहज महसूस your manager doesn't want you to "waste your time" on refactoring
करूंगा

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

2
@ t0x1n मुझे नहीं लगता कि किसी भी अलग के रूप में
डेन्थ

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

6
बुलेट 1 दावा नहीं करता है कि आवागमन को अलग करना असंभव है। इसका तात्पर्य यह है कि आप नहीं जानते कि यह कैसे करना है, या आपका VCS इसे कठिन बनाता है। मैं यह हर समय करता हूं, यहां तक ​​कि एक भी प्रतिबद्ध और तथ्य के बाद इसे विभाजित करना।
बेकार

जवाबों:


18

ठीक है, इसलिए अब यहां और चीजें हैं जो एक टिप्पणी के लिए उपयुक्त हैं।

tl; डॉ

आप क्या करना चाहते हैं के बारे में आपका अंतर्ज्ञान (जैसा कि आप जाते हैं उसे फिर से भरना) सही है।

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

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


वर्कफ़्लो / कार्यालय राजनीति मुद्दे

मैं अनिवार्य रूप से GlenH7 के रूप में एक ही सिफारिश करूँगा कि आप दो कमिट बनाएँ - एक केवल रिफ्लेक्टरिंग के साथ (और डेन्स्ट्रैबली या स्पष्ट रूप से) कोई कार्यात्मक परिवर्तन नहीं, और एक प्रश्न में कार्यात्मक परिवर्तन के साथ।

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


वीसीएस जारी करता है

अपने कार्य स्रोत में किए गए परिवर्तनों को कई कमिट में विभाजित करना एक चुनौती नहीं होनी चाहिए। आपने यह नहीं कहा कि आप क्या उपयोग कर रहे हैं, लेकिन संभव वर्कफ़्लोज़ हैं:

  1. यदि आप गिट का उपयोग कर रहे हैं, तो आपके पास इसके लिए उत्कृष्ट उपकरण हैं

    • आप git add -iकमांड लाइन से इंटरैक्टिव स्टेजिंग के लिए उपयोग कर सकते हैं
    • आप git guiस्टेज पर व्यक्तिगत हक्स और लाइन्स का उपयोग और चयन कर सकते हैं (यह कुछ वीसीएस से संबंधित जीयूआई टूल हैं जो मैं वास्तव में कमांड लाइन को पसंद करता हूं, अन्य एक अच्छा 3-तरफा मर्ज संपादक है)
    • आप बहुत सारे छोटे-छोटे काम कर सकते हैं (व्यक्तिगत परिवर्तन, या कई स्थानों पर बग के एक ही वर्ग को ठीक करना) और फिर उन्हें फिर से व्यवस्थित करना, उन्हें मर्ज करना या उनके साथ विभाजन करना rebase -i
  2. यदि आप git का उपयोग नहीं कर रहे हैं, तो आपके VCS में अभी भी इस प्रकार की टूलिंग हो सकती है, लेकिन मैं यह जाने बिना सलाह नहीं दे सकता कि आप किस प्रणाली का उपयोग करते हैं

    आपने उल्लेख किया कि आप TFS का उपयोग कर रहे हैं - जो मुझे विश्वास है कि TFS2013 के बाद से संगत है। यह काम करने के लिए रेपो के एक स्थानीय गिट क्लोन का उपयोग करने के साथ प्रयोग करने लायक हो सकता है। यदि यह अक्षम है या आपके लिए काम नहीं करता है, तो आप अभी भी स्रोत को स्थानीय गिट रेपो में आयात कर सकते हैं, वहां काम कर सकते हैं और इसका उपयोग कर सकते हैं। अपने अंतिम आवागमन का निर्यात करें।

  3. आप इसे किसी भी वीसीएस में मैन्युअल रूप से कर सकते हैं यदि आपके पास बुनियादी उपकरण जैसे diffऔर हैं patch। यह अधिक दर्दनाक है, लेकिन निश्चित रूप से संभव है। मूल वर्कफ़्लो होगा:

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

अब आपके पास दो बदलाव हैं, आपके परिवर्तनों के साथ उचित रूप से विभाजन किया गया है।

ध्यान दें कि इस पैच प्रबंधन को आसान बनाने के लिए शायद उपकरण हैं - मैं सिर्फ उनका उपयोग नहीं करता क्योंकि यह मेरे लिए है।


मुझे यकीन नहीं है कि मैं अनुसरण करता हूं - क्या बुलेट 3.3 विभिन्न फ़ाइलों में रीफैक्टरिंग और कार्यात्मक परिवर्तन मानती है? किसी भी दर पर, वे नहीं करते हैं। शायद लाइनों से अलग होना अधिक मायने रखता है, लेकिन मुझे नहीं लगता कि हमारे पास हमारे सीवीएस (टीएफएस) में इसके लिए टूलिंग है। किसी भी दर पर, यह कई (अधिकांश?) रिफैक्टोरिंग के लिए काम नहीं करेगा, जहां कार्यात्मक परिवर्तन रिफैक्ट किए गए परिवर्तन पर भरोसा करते हैं। उदाहरण के लिए मान लीजिए कि मैं रीफैक्टर विधि फू (जिसे मुझे अपने कार्यात्मक के भाग के रूप में उपयोग करने की आवश्यकता है) को 3 के बजाय 3 पैरामीटर लेने की आवश्यकता है। अब एमी कार्यात्मक कोड रिफ्लेक्टर कोड पर निर्भर करता है, यहां तक ​​कि लाइन से विभाजित करने से भी मदद नहीं मिलेगी।
t0x1n

1
दी गई वर्कफ़्लोज़ में एक ही फ़ाइल में अलग-अलग लाइनें ठीक हैं। और यह देखते हुए कि दोनों कमिट क्रमिक होंगे , यह दूसरे (कार्यात्मक) के लिए पहले पर निर्भर होने के लिए पूरी तरह से ठीक है। ओह, और TFS2013 कथित रूप से गिट का समर्थन करते हैं।
बेकार

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

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

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

29

मैं मान रहा हूं कि आपकी कंपनी में परिवर्तन अनुरोध बड़े और औपचारिक हैं। यदि नहीं, तो बस कई छोटे-छोटे कामों में बदलाव (जहाँ संभव हो) करें (जैसे कि आप करने वाले हैं)।

इस स्थिति का मैं कैसे उपाय कर सकता हूं इस पर कोई विचार?

आप जो कर रहे हैं उसे जारी रखें?

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

कम दहनशील होने में क्या मदद मिल सकती है। कोड समीक्षाएं जुझारू नहीं होनी चाहिए "आपने ऐसा क्यों किया?", उन्हें सहयोगी होना चाहिए "हे दोस्तों, जबकि मैं यहाँ था मैंने यह सब सामान तय किया!"। उस संस्कृति को बदलने के लिए कार्य करना (यदि संभव हो तो आपके लीड / मैनेजर के साथ) एक उच्च कार्यप्रणाली विकास टीम बनाने के लिए कठिन है, लेकिन बहुत महत्वपूर्ण है।

आप अपने सहकर्मियों के साथ इन विचारों के महत्व को आगे बढ़ाने के लिए (अपने लीड / मैनेजर के साथ संभव हो तो) काम भी कर सकते हैं। इसे आप से पूछें "आप लोग गुणवत्ता की परवाह क्यों नहीं करते?" इसके बजाय उनसे पूछें कि "आप हमेशा इन बेकार चीजों को क्यों कर रहे हैं?"।


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

13
@ t0x1n - मुझे मत देखो। मैंने उन लोगों के सामने सही काम करने का करियर बनाया है, जो चूसने के लिए जिद्दी हैं। शायद उतना लाभदायक न हो जितना कि अगर मैं लोगों को खुश कर सकता था, लेकिन मुझे अच्छी नींद आती है।
तेलस्तीन

ईमानदार होने के लिए धन्यवाद। यह वास्तव में चिंतन करने के लिए कुछ है।
t0x1n

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

1
@ सीनरी सहमत - लेकिन मैं उन सामान्य परिस्थितियों के बारे में बात कर रहा हूँ जहाँ परीक्षण मौजूद हैं, बग
बैश का

14

मुझे आपकी स्थिति के लिए बहुत सहानुभूति है, लेकिन कुछ ठोस सुझाव हैं। अगर और कुछ नहीं, तो शायद मैं आपको समझा दूंगा कि स्थिति जितनी खराब है, यह बदतर हो सकती है। यह हमेशा बदतर हो सकता है। :-)

पहले, मुझे लगता है कि आपकी संस्कृति के साथ आपकी (कम से कम) दो समस्याएं हैं, न कि सिर्फ एक। एक समस्या रिफैक्टिंग के लिए दृष्टिकोण है, लेकिन कोड की समीक्षा एक अलग समस्या की तरह लगती है। मैं अपने विचारों को अलग करने की कोशिश करूँगा।

कोड समीक्षा

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

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

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

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

  1. आप जिस टूल का उपयोग करते हैं, वह कुछ खास तरीकों से कोड समीक्षाओं को केंद्रित करता है। यह एक समस्या हो सकती है। समीक्षा बोर्ड आपको अच्छा, रंगीन लाइन-बाय-लाइन अलग-अलग देता है और आपको टिप्पणियों को एक पंक्ति में संलग्न करने देता है। यह अधिकांश डेवलपर्स उन सभी लाइनों को अनदेखा करता है जो बदल नहीं गए थे। छोटे, पृथक परिवर्तनों के लिए यह ठीक है। यह बड़े परिवर्तनों, नए कोड के बड़े हिस्से या कोड के लिए अच्छा नहीं है, जिसमें नई कार्यक्षमता के 10 लाइनों के साथ मिश्रित नाम के 500 उदाहरण हैं।
  2. भले ही हम एक पुराने, बीमार कोड आधार में थे, जिनकी पहले कभी समीक्षा नहीं की गई थी, फिर भी एक समीक्षक के लिए "इंपोलिट" बन गया, जो कि एक स्पष्ट रेखा को इंगित करने के लिए एक परिवर्तन रेखा नहीं थी। "मुझे परेशान मत करो, यह एक महत्वपूर्ण चेक-इन है और बग को ठीक करने के लिए मेरे पास समय नहीं है।"
  3. "आसान" समीक्षक के लिए खरीदारी करें। कुछ लोग 3 मिनट के लिए 2000 परिवर्तित लाइनों के साथ 10-फ़ाइल की समीक्षा देखेंगे और "शिप इट!" पर क्लिक करें। हर कोई जल्दी से सीखता है कि वे लोग कौन हैं। यदि आप वास्तव में अपने कोड की समीक्षा नहीं करना चाहते हैं, तो इसे "आसान" समीक्षक को भेजें। आप चेक-इन को धीमा नहीं करेंगे। आप उसके कोड के लिए "आसान" समीक्षक बनकर एहसान वापस कर सकते हैं।
  4. यदि आप कोड समीक्षाओं से घृणा करते हैं, तो समीक्षा बोर्ड से प्राप्त ईमेलों को अनदेखा करें। अपने टीम के सदस्यों से फॉलो-अप को अनदेखा करें। हफते के लिए। जब तक आप अपनी कतार में 3 दर्जन खुली समीक्षा करते हैं और आपका नाम समूह की बैठकों में कुछ ही बार आता है। फिर एक "आसान" समीक्षक बनें और दोपहर के भोजन से पहले अपनी सभी समीक्षाओं को साफ़ करें।
  5. अपने कोड को "हार्ड" समीक्षक को भेजने से बचें। (डेवलपर का प्रकार जो इस तरह से एक प्रश्न पूछेगा या उत्तर देगा।) हर कोई जल्दी से सीखता है कि "कठिन" समीक्षक कौन हैं, जैसे वे आसान सीखते हैं। यदि कोड समीक्षाएं समय की बर्बादी (™) हैं, तो आपके द्वारा कोड किए गए कोड के बारे में विस्तृत प्रतिक्रिया पढ़ना समय की बर्बादी (™) और अपमान है।
  6. जब कोड समीक्षाएं दर्दनाक होती हैं, तो लोग उन्हें बंद कर देते हैं और अधिक कोड लिखते रहते हैं। आपको कम कोड समीक्षाएं मिलती हैं, लेकिन हर एक BIG है। आपको अधिक, छोटे कोड समीक्षाओं की आवश्यकता है, जिसका अर्थ है कि टीम को यह पता लगाने की आवश्यकता है कि उन्हें यथासंभव दर्दनाक कैसे बनाया जाए।

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

पुनर्रचना

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

लेकिन कोड को फिर से तैयार करने की सख्त जरूरत थी। कैसे आगे बढ़ा जाए?

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

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

1
" बदतर हो सकता है। बारिश हो सकती है '। " जब मैंने आपके अंतिम पैराग्राफ (दूसरा बिंदु # 4) को पढ़ा तो मैं सोच रहा था: उन्हें अधिक समीक्षा, कोडर समीक्षा की आवश्यकता है। और कुछ परावर्तन, जैसे: "yourSalary = 0"

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

13

आप दोनों क्यों नहीं करते, लेकिन अलग-अलग तरीकों से?

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

लेकिन अगर आपको कई चकाचौंध वाले मुद्दे दिखाई देते हैं, तो दो विकल्प हैं जिनका आप अनुसरण कर सकते हैं।

  1. यदि कोड की समीक्षा अन्यथा ठीक थी, तो जिस हिस्से की आपने समीक्षा की थी उसे प्रतिबद्ध होने दें और फिर दूसरे चेक-इन के तहत कोड को फिर से भरें।

  2. यदि कोड की समीक्षा में ऐसे मुद्दे थे, जिनमें सुधार की आवश्यकता थी, तो डेवलपर से रिस्पेक्टर की सिफारिशों के आधार पर रिफ्लेक्टर के लिए अनुरोध करें।


मैं आपके जवाब से इकट्ठा करता हूं कि आप स्ट्रांग कोड ओनरशिप में विश्वास करते हैं। मैं आपको फाउलर के विचारों को पढ़ने के लिए प्रोत्साहित करता हूं कि यह एक बुरा विचार क्यों है: martinfowler.com/bliki/CodeOwnersp.html । अपने बिंदुओं को विशेष रूप से संबोधित करने के लिए: (1) एक मिथक है क्योंकि रिफ्लेक्टरिंग तब होती है जब आप अपना बदलाव कर रहे होते हैं - अलग-अलग, स्वच्छ, असंबंधित फैशन में नहीं, क्योंकि अलग-अलग सीआर की आवश्यकता होती है। (२) अधिकांश देवों के साथ ऐसा कभी नहीं होगा। कभी नहीं । अधिकांश देवता इन बातों की परवाह नहीं करते हैं, किसी अन्य व्यक्ति से आने पर बहुत कम जो उनके प्रबंधक नहीं हैं। उनके पास अपनी चीजें हैं जो वे करना चाहते हैं।
t0x1n

8
@ t0x1n: यदि आपके प्रबंधक रीफैक्टरिंग की परवाह नहीं करते हैं, और आपके साथी डेवलपर्स ने रिफैक्टिंग की परवाह नहीं की है ... तो वह कंपनी धीरे-धीरे डूब रही है। भाग जाओ! :)
लॉग

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

2
@ t0x1n - मुझे मजबूत कोड स्वामित्व के बारे में कुछ भी कहना याद नहीं है। मेरा उत्तर एक समीक्षक के रूप में आपकी भूमिका को शुद्ध रखने के लिए था। यदि एक समीक्षक परिवर्तन का परिचय देता है तो वे अब केवल एक समीक्षक नहीं हैं।

3
@ GlenH7 शायद यहाँ कुछ गलतफहमी थी - मैं समीक्षक नहीं हूँ। मैं सिर्फ कोडिंग कर रहा हूं जो मुझे चाहिए, और कोड में चलाएं मैं इस प्रक्रिया में सुधार कर सकता हूं। मेरे समीक्षक तब शिकायत करते हैं जब मैं करता हूं।
t0x1n

7

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

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

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

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


बहुत बढ़िया अंक। दुर्भाग्य से मुझे पूरी तरह से संदेह है कि मैं "सिस्टम" को बदल पाऊंगा। कभी-कभी समीक्षक अलग-अलग समय क्षेत्रों और भौगोलिक स्थानों से होते हैं, इसलिए ऐसे मामलों के लिए यह परवाह किए बिना उड़ान नहीं भरेगा।
t0x1n

6

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

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

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


1
आप मूल्यांकन के खेल को जीतना चाहते हैं जब आप महसूस करते हैं कि यह आपको वेतन वृद्धि, बोनस और स्टॉक विकल्पों के साथ पुरस्कृत करता है :)
t0x1n

2
नहीं, आप सिद्धांतों @ t0x1n के लिए धन का व्यापार कर रहे हैं। इतना ही आसान। आपके पास तीन विकल्प हैं: सिस्टम को ठीक करने के लिए काम करें, सिस्टम को स्वीकार करें, सिस्टम को छोड़ दें। विकल्प 1 और 3 आत्मा के लिए अच्छे हैं।
सीन पेरी

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

1
मेह, आत्माएं
ओवररेटेड हैं

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

5

कभी-कभी, refactoring एक बुरी चीज है। उन कारणों के लिए नहीं जो आपके कोड समीक्षक दे रहे हैं, हालांकि; ऐसा लगता है कि वे वास्तव में कोड की गुणवत्ता के बारे में परवाह नहीं करते हैं, और आप देखभाल करते हैं, जो भयानक है। लेकिन ऐसे दो कारण हैं जो आपको रिफैक्ट करने से रोकना चाहिए : 1. आप स्वचालित परीक्षणों (इकाई परीक्षण या जो कुछ भी) या 2. आपके द्वारा किए गए परिवर्तनों का परीक्षण नहीं कर सकते हैं और आप कुछ कोड में बदलाव कर रहे हैं जो आपको बहुत समझ में नहीं आते हैं कुंआ; यानी, आपके पास यह जानने के लिए डोमेन विशिष्ट ज्ञान नहीं है कि आपको क्या बदलाव करने चाहिए

1. जब आप स्वचालित परीक्षणों के साथ आपके द्वारा किए गए परिवर्तनों का परीक्षण नहीं कर सकते, तो रिफैक्टर न करें।

आपके कोड की समीक्षा करने वाले व्यक्ति को यह सुनिश्चित करने में सक्षम होना चाहिए कि आपके द्वारा किए गए परिवर्तनों से कुछ भी नहीं हुआ जो काम करता था। यह काम करने वाले कोड को अकेले छोड़ने का सबसे बड़ा कारण है। हां, यह निश्चित रूप से बेहतर होगा कि फ़ंक्शंस के एक समूह में 1000 लाइन लंबा फ़ंक्शन (जो वास्तव में एक घृणित है!), लेकिन अगर आप अपने परीक्षणों को स्वचालित नहीं कर सकते हैं, तो दूसरों को यह समझाने के लिए वास्तव में कठिन हो सकता है कि आपने सब कुछ किया। सही। मैंने पहले भी यह गलती जरूर की है।

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

आपके पास नहीं है डोमेन-विशिष्ट ज्ञान की आवश्यकता है कि कोड के refactor टुकड़े मत करो।

मेरे द्वारा काम करने की जगह पर बहुत सारे केमिकल इंजीनियरिंग-भारी कोड हैं। कोड आधार रासायनिक इंजीनियरों के लिए सामान्य मुहावरों का उपयोग करता है। कभी भी ऐसे बदलाव न करें जो किसी क्षेत्र के लिए मुहावरेदार हों। यह एक महान विचार की तरह लग सकता है जिसका नाम बदलकर चर कहा जाता xहै molarConcentration, लेकिन क्या लगता है? में सभी रसायन शास्त्र ग्रंथों, दाढ़ एकाग्रता एक साथ प्रस्तुत किया जाता है x। इसका नाम बदलने से यह जानना कठिन हो जाता है कि वास्तव में उस क्षेत्र के लोगों के लिए कोड में क्या चल रहा है।

मुहावरेदार चर का नाम बदलने के बजाय, केवल यह बताते हुए टिप्पणियां डालें कि वे क्या हैं। यदि वे मुहावरेदार नहीं हैं , तो कृपया उनका नाम बदलें। मत छोड़ो i, j, k, x, y, आदि के आसपास चल जब बेहतर नामों काम करेंगे।

संक्षिप्तीकरण के लिए अंगूठे का नियम: यदि, जब लोग बात कर रहे हैं, तो वे एक संक्षिप्त नाम का उपयोग करते हैं, कोड में उस संक्षिप्त नाम का उपयोग करना ठीक है। काम पर कोड आधार से उदाहरण:

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


यह आपकी स्थिति में वास्तव में लागू नहीं हो सकता है, लेकिन इस मुद्दे पर मेरे विचार हैं।


धन्यवाद कोडी। "आपके कोड समीक्षकों को परेशान होने का कोई (वैध) बहाना नहीं होगा" के बारे में - उनका बहाना पहले से ही नाजायज है, क्योंकि वे शुद्धता, पठनीयता, या इस तरह की किसी भी चीज़ के बजाय परिवर्तनों पर जाने की बढ़ती कठिनाई से परेशान हैं।
t0x1n

2

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

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

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

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

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

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

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


सीआर जुदाई के बारे में, मैंने अपनी पोस्ट और कई अन्य टिप्पणियों में बताया है कि मुझे यह असंभव क्यों लगता है।
t0x1n

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

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

@ EricKing मुझे लगता है कि मैं ऐसा कर सकता था। हालाँकि: (1) मुझे बदसूरत कोड के साथ काम करना होगा और जब तक मैं उन कार्यात्मक बदलावों के साथ काम नहीं करना चाहता, तब तक नोट करता रहूँगा जो दोनों बेकार हैं और वास्तव में मेरी कार्यात्मक प्रगति को धीमा कर देते हैं (2) एक बार जब मैं अपने कार्यात्मक परिवर्तन प्रस्तुत करता हूं और रिफैक्टरिंग के लिए मेरे नोट्स पर फिर से विचार करें, यह केवल पहला पुनरावृत्ति होगा और रिफैक्टरिंग को पूरा करने में अधिक समय लग सकता है, जैसा कि आपने सुझाव दिया था कि मुझे अपने प्रबंधकों को समझाने में कठिन समय होगा, यह देखकर कि मेरा काम पहले से ही "किया हुआ" है।
t0x1n

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

2

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

कहानी का नैतिक पहलू है? मुझे नही पता। मुझे लगता है कि यह कभी-कभी आप अपने अलावा किसी को खुश नहीं कर सकते। मैं समय (अपनी आँखों में) बर्बाद नहीं कर रहा था - साफ किया गया कोड पढ़ना और समझना आसान था । यह सिर्फ इतना है कि दूसरों द्वारा उपयोग किए जाने वाले आदिम परिवर्तन नियंत्रण उपकरण उन पर कुछ अतिरिक्त एक-शॉट काम करते हैं। उपकरण भी आदिम थे अंतरिक्ष की अनदेखी / tabbing और reflowed टिप्पणियाँ।


हाँ, मुझे रिक्ति के लिए भी नियुक्त किया गया है, साथ ही तुच्छ सामान जैसे कि अनावश्यक कास्टिंग आदि जो कुछ भी मेरे बदलाव से पूरी तरह से अनिवार्य नहीं है, वह है "शोर"।
t0x1n

2

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

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

शामिल विषयों में शामिल हैं:

  • सॉफ्टवेयर परिवर्तन के यांत्रिकी को समझना: सुविधाओं को जोड़ना, कीड़े को ठीक करना, डिजाइन में सुधार करना, प्रदर्शन का अनुकूलन करना
  • टेस्ट हार्नेस में विरासत कोड प्राप्त करना
  • ऐसे परीक्षण लिखना जो आपको नई समस्याओं को पेश करने से बचाते हैं
  • ऐसी तकनीकें जिनका उपयोग किसी भी भाषा या मंच के साथ किया जा सकता है — जावा, C ++, C और C # में उदाहरणों के साथ।
  • कोड परिवर्तन की सही पहचान करना आवश्यक है
  • विरासत प्रणाली के साथ नकल जो वस्तु-उन्मुख नहीं हैं
  • उन अनुप्रयोगों को संभालना जिनमें कोई संरचना नहीं है

इस पुस्तक में चौबीस निर्भरता-ब्रेकिंग तकनीकों की एक सूची भी शामिल है जो आपको अलगाव में प्रोग्राम तत्वों के साथ काम करने और सुरक्षित बदलाव करने में मदद करती हैं।


2

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

यह मानव स्वभाव है। हम वास्तविक समस्याओं से निपटने के लिए उपयोग कर रहे हैं, उन्हें रोकने की कोशिश नहीं कर रहे हैं। हम प्रतिक्रियाशील हैं, सक्रिय नहीं हैं।

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

इस तथ्य के बावजूद कि कई प्रबंधक इसे समझते हैं, उन्हें उत्पादन कोड में परिवर्तन के लिए जवाबदेह ठहराया जाता है। ऐसी राजनीति हैं जो अकेले अच्छी तरह से छोड़ना आसान बनाती हैं। अक्सर समझाने वाले व्यक्ति को वास्तव में आपके प्रबंधक के ऊपर होता है और वह आपके "महान विचारों" को उत्पादन में लाने के लिए संघर्ष नहीं करना चाहता है।

ईमानदार होने के लिए, आपका प्रबंधक हमेशा आश्वस्त नहीं होता है कि आपका उपाय, वास्तव में, जितना आपको लगता है कि वह उतना ही महान है। (साँप का तेल?) वहाँ बिक्री है। यह आपका काम है कि उसे लाभ देखने में मदद करें।

प्रबंधन आपकी प्राथमिकताओं को साझा नहीं करता है। अपनी प्रबंधन टोपी लगाएं और प्रबंधन आंखों से देखें। आपको अधिक संभावना है कि सही कोण मिलेगा। लगातार करे। आपको पहले से नकारात्मक प्रतिक्रिया की अनुमति नहीं देकर आप अधिक परिवर्तन को प्रभावित करेंगे।


1

यदि आप @ GlenH7 के अनुसार, दो अलग-अलग परिवर्तन अनुरोधों में अनुरोधित परिवर्तन और बिना अस्वीकृत रिफ्लेक्टर को विभाजित कर सकते हैं, तो वह सबसे अच्छा है जो आप कर सकते हैं। फिर आप "वह व्यक्ति जो समय बर्बाद करते हैं" नहीं है, लेकिन "वह व्यक्ति जो दो बार मेहनत करता है"।

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

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


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

@ t0x1n: बॉय स्काउट नियम में वे मॉड्यूल शामिल हैं जिन्हें आप छू रहे हैं, ज्यादातर। यह आपको पहली विभाजन रेखा खींचने में मदद कर सकता है। चेतावनी का समर्थन करना एक अच्छा विचार नहीं है, मुझे पता है, लेकिन कंपनी के दृष्टिकोण से, उन्हें नए कोड में दबाने से सही है और उनके सम्मेलनों का पालन करना - ठीक है, शायद मैं अपने तर्क से दूर हो रहा हूं :)
logc

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

@ t0x1n: यह वास्तव में बहुत निराशाजनक लगता है। कृपया ध्यान दें कि मेरा मतलब केवल "स्थिर कोड विश्लेषण" नहीं था, बल्कि अन्य सिफारिशें भी थीं, जो कि नेक्सस के बराबर थीं। बेशक, कोई भी उपकरण 100% शब्दार्थ नहीं पकड़ता है; यह सिर्फ एक सुधारात्मक रणनीति है।
लॉग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.