Integrating Structural and Semantic Analysis for Code Smell Refactoring Prediction
यह शोध पत्र जावा प्रोजेक्ट्स में कोड स्मेल रिफैक्टरिंग (code smell refactoring) की भविष्यवाणी करने के लिए एक मशीन लर्निंग फ्रेमवर्क का प्रस्ताव देता है और उसका अनुभवजन्य मूल्यांकन करता है, यह प्रदर्शित करते हुए कि पारंपरिक ऑब्जेक्ट-ओरिएंटेड मेट्रिक्स को सिमेंटिक और सिंटैक्टिक ग्राफ-आधारित एम्बेडिंग के साथ संयोजित करने से विश्वसनीय भविष्यवाणियां प्राप्त होती हैं क्योंकि यह केवल संरचनात्मक मेट्रिक्स द्वारा प्रदान किए जाने वाले संकेतों से परे पूरक संकेतों को कैप्चर करता है।
मूल पेपर CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/) के तहत लाइसेंस किया गया है। नीचे दिए गए पेपर की यह व्याख्या AI से तैयार की गई है। इसे लेखकों ने न तो लिखा है, न इसका समर्थन किया है। तकनीकी सटीकता के लिए मूल पेपर देखें। पूरा डिस्क्लेमर पढ़ें
सॉफ्टवेयर कभी वास्तव में समाप्त नहीं होता। एक ऐसे शहर की तरह जो दशकों में स्वाभाविक रूप से विकसित होता है, एक कंप्यूटर प्रोग्राम भी परिवर्धन, पैच और त्वरित सुधारों की परतें जमा करता जाता है। समय के साथ, यह जैविक विकास संरचनात्मक कमजोरियों का कारण बन सकता है, बिल्कुल एक ऐसी इमारत की तरह जहाँ दीवारों को मजबूत किए बिना एक गलियारे को चौड़ा कर दिया गया हो। सॉफ्टवेयर इंजीनियरिंग की दुनिया में, इन स्थानीय दोषों को "कोड स्मैल्स" (code smells) के रूप में जाना जाता है। ये वे त्रुटियां नहीं हैं जो किसी प्रोग्राम को क्रैश कर दें, बल्कि खराब डिज़ाइन के संकेत हैं जो कोड को समझना, बदलना या बनाए रखना कठिन बना देते हैं। जब डेवलपर्स इन 'स्मैल्स' को देखते हैं, तो वे अक्सर "रिफैक्टरिंग" (refactoring) करते हैं, जो कोड को पुनर्गठित करने की एक सावधानीपूर्ण प्रक्रिया है ताकि सॉफ्टवेयर के वास्तविक कार्य को बदले बिना उसकी संरचना में सुधार किया जा सके। चुनौती यह है कि डेवलपर्स हमेशा पाए गए हर स्मैल को ठीक नहीं करते हैं, और यह भविष्यवाणी करना कठिन है कि किन्हें ठीक किया जाएगा क्योंकि निर्णय अक्सर केवल कोड पर नहीं, बल्कि मानवीय इरादे और संदर्भ पर निर्भर करता है।
मिलानो-बिकोका विश्वविद्यालय के शोधकर्ताओं के एक दल ने यह देखने के लिए एक प्रयास किया कि क्या मशीनें इन मानवीय निर्णयों को सीखने में सक्षम हैं। वे जानना चाहते थे कि क्या एक कंप्यूटर कोड के एक टुकड़े को देख सकता है, एक दोष की पहचान कर सकता है, और सटीक रूपता से अनुमान लगा सकता है कि क्या कोई डेवलपर अंततः इसे साफ करेगा। ऐसा करने के लिए, उन्होंने एक ऐसा सिस्टम बनाया जो कोड को देखने के दो अलग-अलग तरीकों को जोड़ता है। पहला तरीका पारंपरिक है: एक मेथड कितनी लंबी है या वह कितने वेरिएबल्स का उपयोग करती है, जैसी विशेषताओं की गिनती करना। दूसरा तरीका अधिक आधुनिक और जटिल है: कोड को उसके तर्क और व्यवहार के मानचित्र (map) में बदलना, और फिर उस मानचित्र को एक गणितीय प्रतिनिधित्व में अनुवादित करना जिसे कंप्यूटर छिपे हुए पैटर्न के लिए विश्लेषण कर सके। इस संयुक्त जानकारी को मशीन लर्निंग मॉडल्स में फीड करके, शोधकर्ताओं ने परीक्षण किया कि क्या कंप्यूटर उन सूक्ष्म नियमों को सीख सकते हैं जो डेवलपर्स को रिफैक्टरिंग चुनने के लिए निर्देशित करते हैं।
शोधकर्ताओं ने 79 ओपन-सोर्स जावा प्रोजेक्ट्स से डेटा एकत्र किया, जो सॉफ्टवेयर का एक संग्रह है जिसे समय के साथ कई अलग-अलग लोगों द्वारा विकसित और बनाए रखा गया है। उन्होंने इन प्रोजेक्ट्स के इतिहास को स्कैन करने के लिए स्वचालित उपकरणों का उपयोग किया, जिससे हजारों उदाहरणों की पहचान हुई जहाँ कोड स्मैल्स मौजूद थे और ट्रैक किया गया कि किन उन्हें विशिष्ट रिफैक्टरिंग कार्यों के माध्यम से सुधारा गया, जैसे कि एक वेरिएबल का नाम बदलना, एक मेथड को छोटे हिस्से में निकालना, या एक पैरामीटर को बदलना। इसके बाद उन्होंने प्रत्येक कोड के टुकड़े के लिए एक हाइब्रिड डेटासेट बनाया। इस डेटासेट में मानक मापों, जैसे कि एक मेथड में लाइनों की संख्या, के साथ-साथ दो अलग-अलग प्रकार के "एम्बेडिंग्स" (embeddings) शामिल थे। एक प्रकार का एम्बेडिंग कंट्रोल फ्लो को मैप करता था, जो निर्देशों के निष्पादन के क्रम को दर्शाता है। दूसरा, अधिक उन्नत प्रकार का एम्बेडिंग, गहरे सिमेंटिक संबंधों को मैप करता था, जो यह पकड़ता था कि डेटा प्रोग्राम के माध्यम से कैसे चलता है और कोड के विभिन्न हिस्से एक-दूसरे पर कैसे निर्भर हैं, प्रभावी रूप से कोड के व्यवहार का एक समृद्ध, बहु-आयामी चित्रण बनाता था।
परिणामों ने दिखाया कि मशीन लर्निंग मॉडल वास्तव में उच्च विश्वसनीयता के साथ रिफैक्टरिंग की भविष्यवाणी करने में सक्षम हैं। जब मॉडल्स का परीक्षण दस अलग-अलग प्रकार के रिफैक्टरिंग ऑपरेशन्स पर किया गया, तो उन्होंने अक्सर 0.70 से काफी ऊपर और कुछ कार्यों के लिए 0.80 से ऊपर AUC स्कोर प्राप्त किए। यह सुझाव देता है कि वास्तव में कोड में ऐसे पता लगाने योग्य पैटर्न होते हैं जो डेवलपर के सफाई करने के इरादे का संकेत देते हैं। हालाँकि, अध्ययन ने एक महत्वपूर्ण बारीकी को उजागर किया: सभी कोड स्मैल्स समान नहीं होते। मॉडल्स संरचनात्मक परिवर्तनों, जैसे कि एक मेथड में पैरामीटर जोड़ना या वेरिएबल का प्रकार बदलना, की भविष्यवाणी करने में असाधारण रूप से अच्छे थे। ये क्रियाएं अक्सर स्पष्ट, मापने योग्य कारकों जैसे कि एक स्टेटमेंट की लंबाई या गणना की जटिलता द्वारा संचालित होती हैं। इसके विपरीत, मॉडल्स वैचारिक परिवर्तनों, जैसे कि मेथड का नाम बदलने की भविष्यवाणी करने में संघर्ष करते रहे। नाम बदलना अक्सर एक व्यक्तिपरक निर्णय होता है जो इस बात पर आधारित होता है कि एक डेवलपर कोड के उद्देश्य के बारे में कैसे सोचता है, जो एक ऐसा कारक है जिसे केवल संख्याओं या संरचनात्मक मानचित्रों के माध्यम से पकड़ना कठिन है।
शायद सबसे महत्वपूर्ण निष्कर्ष उपयोग किए गए डेटा प्रतिनिधित्व के प्रकार से संबंधित था। शोधकर्ताओं को शुरू में उम्मीद थी कि कोड के निष्पादन प्रवाह (execution flow) के अधिक जटिल मानचित्रों को जोड़ने से भविष्यवाणियों में सुधार होगा। इसके बजाय, उन्होंने पाया कि कोड के प्रवाह का एक विशिष्ट मानचित्र, जो बयानों (statements) के क्रम को ट्रैक करता था, वास्तव में शोर (noise) पैदा करता था जिसने मॉडल्स को भ्रमित कर दिया। जब इस फ्लो मैप को पारंपरिक मापों के साथ जोड़ा गया, तो इसने अक्सर भविष्यवाणियों को बदतर बना दिया, क्योंकि कंप्यूटर अप्रासंगिक विवरणों को अनदेखा करने में संघर्ष करता था। हालाँकि, जब शोधकर्ताओं ने अधिक उन्नत प्रतिनिधित्व पर स्विच किया जो संरचनात्मक निर्भरताओं को कोड के वास्तविक टेक्स्ट और तर्क के साथ जोड़ता था, तो परिणाम नाटकीय रूप रूप से बदल गए। इस समृद्ध प्रतिनिधित्व ने एक पूरक संकेत प्रदान किया जिसका उपयोग मॉडल्स प्रभावी ढंग से कर सकते थे। वास्तव में, कुछ कार्यों के लिए, केवल इस उन्नत प्रतिनिधित्व पर प्रशिक्षित मॉडल्स ने पूर्ण डेटासेट पर प्रशिक्षित मॉडल्स के लगभग बराबर प्रदर्शन किया, जिससे सिद्ध हुआ कि कोड की गहरी संरचनात्मक और सिमेंटिक समझ अपने आप में एक शक्तिशाली भविष्यवक्ता है।
अध्ययन ने कोड से क्या अनुमानित किया जा सकता है, इसकी सीमाओं को भी रेखांकित किया। जबकि मॉडल्स जटिलता से प्रेरित तकनीकी सुधारों की विश्वसनीय रूप से भविष्यवाणी कर सकते थे, वे स्पष्टता के लिए कोड को नाम देने या पुनर्गठित करने के पीछे के मानवीय निर्णयों को आसानी से नहीं देख सके। यह सुझाव देता है कि जहाँ मशीनें तकनीकी रूप से रखरखाव के लिए पात्र कोड की पहचान करने में उत्कृष्ट हो सकती हैं, वहीं रिफैक्टरिंग का अंतिम निर्णय अक्सर डेवलपर के विजन और संदर्भ पर निर्भर करता है जो स्वयं कोड के बाहर मौजूद होता है। शोध का निष्कर्ष है कि स्वचालित सॉफ्टवेयर रखरखाव का भविष्य मानवीय निर्णय को बदलने में नहीं, बल्कि इन भविष्य कहने वाले उपकरणों का उपयोग करके उन संरचनात्मक ऋणों (structural debts) को उजागर करने में है जो सबसे अधिक आवश्यक हैं, जिससे डेवलपर्स को उनके सीमित समय को उन परिवर्तनों पर केंद्रित करने में मदद मिले जो सबसे अधिक मायने रखते हैं। यह समझते हुए कि कौन से संकेत मजबूत हैं और कौन से शोर, हम अपने डिजिटल बुनियादी ढांचे को स्वस्थ और टिकाऊ बनाए रखने में मदद करने के लिए बेहतर उपकरण बना सकते हैं।
अपने क्षेत्र के पेपरों की भीड़ में उलझे हुए हैं?
आपके रिसर्च कीवर्ड से मेल खाने वाले सबसे नए और अलग सोच वाले पेपरों का रोज़ाना Digest पाएँ—तकनीकी सारांश के साथ, आपकी भाषा में।