युनिट 8 / 12

रिफॅक्टरिंग आणि तांत्रिक कर्ज व्यवस्थापन

नफा:

  • रिफॅक्टरिंगपूर्वी वर्तमान वर्तन कॅप्चर करणारे चाचणी सुरक्षा जाळे सेट करण्याची क्षमता
  • एआयला लहान, एक-चरण, वर्तन-संरक्षित परिवर्तनांसाठी विचारण्याची क्षमता आणि प्रत्येक चरण प्रमाणित
  • व्यावसायिक संदर्भात तांत्रिक कर्ज ओळखण्याची आणि प्राधान्य देण्याची क्षमता

रीफॅक्टरिंग म्हणजे कोडची बाह्य वर्तणूक न बदलता त्याची अंतर्गत रचना सुधारणे: ते अधिक वाचनीय, सोपे, अधिक देखरेख करण्यायोग्य बनवणे. दुसरीकडे, तांत्रिक कर्ज, एक द्रुत समाधानासाठी केलेली एक तडजोड आहे आणि कालांतराने "व्याजासह" परतफेड केली जाते — तुम्ही आज कापलेला प्रत्येक कोपरा उद्या मंदी किंवा बग म्हणून परत येईल. कृत्रिम बुद्धिमत्ता एक शक्तिशाली सहाय्यक आहे जो पुनरावृत्ती आणि यांत्रिक रीफॅक्टरिंग कार्यांना गती देतो; परंतु रिफॅक्टरिंगचा एक सुवर्ण नियम आहे आणि केवळ एआय त्याची हमी देऊ शकत नाही: वर्तन बदलू नये.

या युनिटमध्ये, आम्ही AI सह सुरक्षित रिफॅक्टरिंग कसे करावे हे शिकतो: लहान आणि उलट करण्यायोग्य पायऱ्या, चाचण्यांद्वारे संरक्षण करणे, कोडचा वास शोधणे आणि तांत्रिक कर्जाला प्राधान्य देणे. महत्त्वाचा मुद्दा हा आहे: AI चा शब्द नसून उत्तीर्ण झालेल्या चाचण्या आहेत, हे सिद्ध करते की वर्तन संरक्षित आहे.

रिफॅक्टरिंगचा सुवर्ण नियम: वर्तन स्थिर राहते

"मी सुधारत आहे" असे म्हणताना नकळत वर्तन बदलणे हे रिफॅक्टरिंग धोकादायक बनवते. अट सोपी करताना एज केस टाकणे, लूपचे रूपांतर करताना क्रम मोडणे, फंक्शन विभाजित करताना साइड इफेक्ट गहाळ करणे—सर्व "स्वच्छ दिसणारा" परंतु तुटलेला कोड तयार करतात.

म्हणूनच रिफॅक्टरिंगसाठी चाचणी ही एक पूर्व शर्त आहे: बदलण्यापूर्वी, तुमच्याकडे विद्यमान वर्तन कॅप्चर करणाऱ्या चाचण्या असणे आवश्यक आहे. या चाचण्या एक "सुरक्षा जाळी" आहेत; रिफॅक्टरिंग दरम्यान तुम्ही चुकून काही तोडल्यास, ते तुटून तुम्हाला चेतावणी देतील. तुमच्याकडे चाचण्या नसल्यास, आधी अस्तित्वात असलेल्या वर्तनाचे निराकरण करणाऱ्या चाचण्या लिहा (जसे आम्ही युनिट 5 मध्ये शिकलो) — येथूनच AI ला सुरुवात होते.

खबरदारी: टेस्टनेटशिवाय AI-सहाय्यित रिफॅक्टरिंग हे बग्सच्या सर्वात कपटी स्रोतांपैकी एक आहे. "मी वागणूक जपली" असे म्हणणे सोपे आहे; पुरावा असा आहे की बदलापूर्वी आणि नंतर समान चाचण्या उत्तीर्ण होतात.

स्टेप बाय स्टेप: सुरक्षित रिफॅक्टरिंग फ्लो

  1. सुरक्षा जाळी बसवा. तुम्ही रिफॅक्टर कराल त्या कोडचे वर्तमान वर्तन कॅप्चर करणाऱ्या चाचण्या होऊ द्या; नसल्यास, प्रथम त्यांना लिहा (आणि ते पहा).
  2. वासाचे नाव सांगा. आपण काय सुधारत आहात आणि का? "हे फंक्शन 3 गोष्टी करते", "त्याच तर्काची 4 ठिकाणी पुनरावृत्ती होते", "नावे दिशाभूल करतात".
  3. लहान, एक-चरण पावले विचारा. AI ला एकाच परिवर्तनासाठी विचारा (उदा. फक्त “हे फंक्शन अर्ध्यामध्ये विभाजित करा”), संपूर्ण फाईल पुन्हा लिहू नका.
  4. चाचण्या चालवा. प्रत्येक पायरीनंतर. जर ते हिरवे असेल तर सुरू ठेवा, जर ते लाल असेल तर ते परत घ्या.
  5. फरक वाचा. ओळ दर ओळीने पुष्टी करा की बदल खरोखरच वर्तन-संरक्षण करणारा आहे; एआय ही "फक्त रचना" आहे असे म्हणताना तर्क वितर्क असू शकतात.
  6. लहान तुकड्यांमध्ये एकत्र करा. एक-वेळचे मोठे रिफॅक्टरिंग पीआर दोन्ही धोकादायक आणि अपरिक्षण करण्यायोग्य आहेत.

तीन मिनी केसेस

केस 1 — 220-लाइन फंक्शन सुरक्षितपणे विभाजित. एका टीममध्ये 220-लाइन ऑर्डर प्रोसेसिंग फंक्शन होते. पहिल्या 14 चाचण्या लिहिल्या गेल्या (AI च्या मदतीने) ज्यांनी वर्तमान वर्तन कॅप्चर केले, त्या सर्व उत्तीर्ण झाल्या. मग फंक्शन 5 लहान फंक्शन्समध्ये विभागले गेले AI द्वारे चरणबद्ध; प्रत्येक टप्प्यानंतर चाचण्या घेण्यात आल्या. एका टप्प्यात दोन चाचण्या मोडल्या गेल्या - एआयने एज केसमध्ये रिटर्न चुकवला होता. चाचण्यांनी हे त्वरित पकडले आणि त्याचे निराकरण केले. नेटवर्कशिवाय, त्रुटी उत्पादनापर्यंत सर्व मार्गाने जाऊ शकली असती.

केस 2 - टेस्टनेटशिवाय आपत्ती. दुसऱ्या विकसकाने तारीख गणना मॉड्यूल "साफ" केले ज्यात AI सह कोणत्याही चाचण्या नाहीत. कोड अधिक चांगला दिसत होता, परंतु तो लीप वर्ष चुकीच्या पद्धतीने मोजत होता; दोन आठवड्यांनंतर ग्राहकाच्या तक्रारीसह बग बाहेर आला. रिफॅक्टरिंगपासून वाचलेल्या वेळेपेक्षा हानी खूप जास्त आहे. धडा: चाचणीशिवाय रिफॅक्टरिंग हा जुगार आहे.

प्रकरण 3 - तांत्रिक कर्ज प्राधान्य. एका संघाने AI ला 30 किंवा त्यापेक्षा जास्त "सुधारण्यायोग्य" गुणांचा अनुशेष दिला आणि प्रत्येकाने "परिवर्तन वारंवारता × धोका × प्रयत्न" अक्षावर गुण मिळवले. परिणामी सारणीमध्ये, क्वचितच स्पर्श केला जाणारा एक कुरूप मॉड्यूल प्रत्यक्षात कमी प्राधान्य होता, तर वारंवार बदलणारे मध्यम-जटिल मॉड्यूल उच्च प्राधान्य होते. संघाने आपली ऊर्जा योग्य ठिकाणी निर्देशित केली.

चार कॉपी करण्यायोग्य टेम्पलेट्स

कोड वास ओळखणे आणि प्राधान्य देणे:

या कोडमध्ये रिफॅक्टरिंग उमेदवार "गंध" सूचीबद्ध करा: दीर्घ कार्य, पुनरावृत्ती (DRYViolation), दिशाभूल करणारे नाव, खोल नेस्टेड स्थिती, लपविलेले दुष्परिणाम, जादूचा क्रमांक. प्रत्येकासाठी: स्थान, समस्या का, सुचवलेली छोटी पायरी, अंदाजे धोका (कमी/मध्यम/उच्च). अद्याप कोड बदलू नका, फक्त योजना करा.{{code}}

एक-चरण, वर्तन-संरक्षण करणारे परिवर्तन:

फक्त हे करा: {{एकल रूपांतरण, उदा. या फंक्शनला 3 लहान नावाच्या फंक्शन्समध्ये विभाजित करा}}. दृश्यमान वर्तन, स्वाक्षरी आणि परतावा मूल्ये बदला. 1 वाक्यात लिहा की तुम्ही बदललेली प्रत्येक गोष्ट वर्तन टिकवून ठेवते.{{code}}

रिफॅक्टरच्या आधी सेफ्टी नेट (कॅरेक्टरायझेशन टेस्टिंग):

या कार्याचे वर्तमान वर्तन कॅप्चर करणाऱ्या चाचण्या लिहा (बरोबर किंवा नाही); रिफॅक्टरिंग दरम्यान वर्तन बदलल्यास पकडणे हे लक्ष्य आहे. टिपिकल + एज एंट्री समाविष्ट करा. फंक्शनच्या वर्तमान आउटपुटवर आधारित अपेक्षा लिहा.{{function}}

तांत्रिक कर्ज रेकॉर्ड (अनुशेष) निर्मिती:

वासांची खालील यादी प्राधान्यक्रमाच्या सारणीमध्ये घाला: पदार्थ, प्रभावित क्षेत्र, बदलाची वारंवारता (माझे माहिती: {{...}}), जोखीम, अंदाजे प्रयत्न, शिफारस केलेले प्राधान्य. उच्च प्रभाव + कमी प्रयत्न शीर्षस्थानी ठेवा. {{smell_list}}

कमकुवत प्रॉम्प्ट / मजबूत प्रॉम्प्ट

कमकुवत: "हा कोड साफ करा आणि तो अधिक चांगला बनवा."
सशक्त: "हे 90-लाइन फंक्शनचे बाह्य वर्तन आणि स्वाक्षरी न बदलता एका जबाबदारीसह 3 लहान फंक्शन्समध्ये विभाजित करा. साइड इफेक्ट्स (DB लिहितो) सध्याच्या क्रमाने ठेवा. माझ्याकडे चाचण्या आहेत, वर्तन समान राहिले पाहिजे. फरक द्या आणि प्रत्येक विभाजन वर्तन-संरक्षण का आहे हे एका वाक्यात स्पष्ट करा. [कोड]"

शक्तिशाली आवृत्ती; यासाठी एकच विशिष्ट परिवर्तन आवश्यक आहे, स्पष्टपणे वर्तन आणि स्वाक्षरीचे बंधन लादते आणि समर्थनाची मागणी करते. "अधिक चांगले करा" सारख्या अस्पष्ट विनंत्या अनियंत्रित आणि धोकादायक बदलांना कारणीभूत ठरतात.

रिफॅक्टरिंग प्रकार

AI विश्वसनीयता

पूर्वतयारी

नाव बदला

उच्च

व्याप्ती योग्य आहे का?

कार्य विभागणी

मध्यम-उच्च

टेस्टनेट आवश्यक आहे

पुनरावृत्ती शेअर करत आहे

मध्यम

वर्तनातील फरक लपलेला असू शकतो

अल्गोरिदम/रचना बदल

कमी

विस्तृत चाचणी + मानवी प्रमाणीकरण

आर्किटेक्चरल पुनर्रचना

कमी

मानवी नेतृत्वाखालील, एआय-समर्थित

तांत्रिक कर्जाचे व्यवस्थापन करणे, ते रीसेट न करणे

तांत्रिक कर्ज सर्व वाईट नाही; कधीकधी जाणीवपूर्वक कर्ज घेणे (डिलिव्हरी पूर्ण करण्यासाठी) हा योग्य निर्णय असतो. कर्ज काढून टाकणे हे उद्दिष्ट नसून ते दृश्यमान आणि व्यवस्थापित करणे हे आहे. AI कर्ज शोधण्यात आणि प्राधान्य देण्यात वेगवान आहे, परंतु "कोणते कर्ज भरावे आणि कोणते सोडले पाहिजे" हे ठरवण्यासाठी व्यवसाय संदर्भ आवश्यक आहे: हे मॉड्यूल किती वेळा बदलते, किती लोकांवर त्याचा परिणाम होतो, धोका काय आहे? कोड बेस आणि उत्पादनाची माहिती असलेल्या टीमने हा निर्णय घेतला आहे; एआय फक्त पर्याय स्पष्ट करते.

टीप: तुमचे रिफॅक्टरिंग पीआर वर्तन बदल समाविष्ट असलेल्या PR पासून वेगळे ठेवा. "हे PR हे फक्त एक रिफॅक्टरिंग आहे, वर्तन समान आहे" असे म्हणण्यास सक्षम असल्याने तपास करणे सोपे होते आणि समस्या उद्भवल्यास तुम्हाला कारण त्वरित कमी करण्यास अनुमती देते.

सामान्य चुका

  • टेस्टनेटशिवाय रिफॅक्टरिंग. वर्तन संरक्षित आहे हे सिद्ध करण्यासाठी तुमच्याकडे काहीही शिल्लक नाही.
  • याचा अर्थ "संपूर्ण फाइल साफ करा". मोठे, अनियंत्रित बदल त्रुटी लपवतात आणि तपासले जाऊ शकत नाहीत.
  • तो न वाचता फरक स्वीकारणे. एआयने "फक्त रचना" म्हटल्यावर काही तर्कशास्त्र घसरले असावे.
  • वर्तनात्मक बदलासह गोंधळात टाकणारे रिफॅक्टरिंग. एकाच PR मध्ये दोन्ही केल्याने मूळ कारणाचा मागोवा घेणे अशक्य होते.
  • प्रत्येक वास दूर करण्याचा प्रयत्न करत आहे. कुरुप कोड जे क्वचितच बदलतात ते सहसा कमी प्राधान्य असते; वारंवार बदलणाऱ्या ठिकाणी उर्जेचे वाटप करा.

सारांशात

रिफॅक्टरिंगचा एकमेव नियम असा आहे की वर्तन स्थिर राहते आणि याचा पुरावा म्हणजे चाचण्या. कोड वास, एक-चरण परिवर्तन आणि तांत्रिक कर्जाला प्राधान्य देण्यासाठी AI शक्तिशाली आहे; परंतु तुम्हाला सुरक्षा जाळी सेट करावी लागेल, चाचण्या चालवाव्या लागतील आणि प्रत्येक पायरीनंतर फरक वाचावा लागेल. लहान, उलट करण्यायोग्य पावले घ्या; वर्तन बदलापासून रिफॅक्टरिंग वेगळे करा; आणि व्यवसाय संदर्भ माहित असलेल्या संघाला कोणते कर्ज द्यायचे ते ठरवू द्या.

अर्ज कार्य

तुमच्या कोड बेसमधून तुम्हाला लांब किंवा गुंतागुंतीचे वाटणारे फंक्शन निवडा. प्रथम मुद्रण चाचण्या ज्या "सुरक्षा नेट" टेम्पलेटसह त्याचे वर्तमान वर्तन कॅप्चर करतात आणि ते सर्व उत्तीर्ण होतात का ते पहा. नंतर फंक्शनला "वन-स्टेप, वर्तन-संरक्षणात्मक परिवर्तन" पॅटर्नसह एकाच पद्धतीने रिफॅक्टर करा (उदा. अर्ध्यामध्ये विभाजित करणे) आणि पुन्हा चाचण्या चालवा. चाचणी खंडित झाल्यास, कारण शोधा; जर ते अजिबात खंडित झाले नाही तर, वर्तन खरोखर संरक्षित आहे याची पुष्टी करण्यासाठी ओळीनुसार फरक वाचा.

चेकलिस्ट

  • [ ] मला माहित आहे की रिफॅक्टरिंगने वर्तन बदलू नये आणि ते सिद्ध करण्यासाठी चाचण्या आहेत.
  • [ ] मी एक सुरक्षा जाळी सेट करत आहे जे रिफॅक्टरपूर्वी वर्तमान वर्तन पकडते.
  • मला AI कडून लहान, एक-चरण परिवर्तन हवे आहेत, मोठे एक-ऑफ नाही.
  • प्रत्येक पायरीनंतर मी चाचण्या घेतो आणि फरक वाचतो.
  • [ ] मी रिफॅक्टरिंग PR ला वर्तन बदल PR पासून वेगळे ठेवतो.
  • [] मी व्यावसायिक संदर्भासह तांत्रिक कर्जाला प्राधान्य देतो, आंधळेपणाने शून्य करण्याचा प्रयत्न करत नाही.