Uber ने एक राइटअप प्रकाशित किया कि कैसे उन्होंने अपने Java monorepo में 75,000+ टेस्ट क्लास और 1.25 मिलियन लाइनों के टेस्ट कोड को JUnit 4 से JUnit 5 में माइग्रेट किया, और किसी भी बिल्डर टीम के लिए जो वर्तमान में AI-सहायता प्राप्त रिफैक्टरिंग पर विचार कर रही है, मुख्य विवरण यह है कि Uber ने ट्रांसफॉर्मेशन के लिए जनरेटिव AI का उपयोग नहीं करने का स्पष्ट निर्णय लिया। उनका बताया तर्क, राइटअप में उद्धृत: इस पैमाने पर संगति के लिए नियतात्मक ट्रांसफॉर्मेशन टूलिंग महत्वपूर्ण थी, और LLM-आधारित दृष्टिकोण कस्टम टेस्ट पैटर्न में असंगत परिणाम उत्पन्न करते थे। इसके बजाय, टीम ने OpenRewrite पर बनाया, ओपन-सोर्स सिमेंटिक कोड ट्रांसफॉर्मेशन फ्रेमवर्क जो कच्चे टेक्स्ट के बजाय हानिरहित सिमेंटिक पेड़ों पर काम करता है, Uber-विशिष्ट बेस क्लास और टेस्ट रनर को लक्षित करने वाली कस्टम रेसिपी के साथ। उन्होंने इसे एक एकीकृत-निष्पादन संगतता परत (JUnit Platform जो Vintage और Jupiter इंजन एक साथ चला रहा है, ताकि आंशिक रूप से माइग्रेट किए गए रेपो काम करते रहें), आंशिक माइग्रेशन को रोकने के लिए पूर्व शर्त जांच, और Shepherd नामक एक आंतरिक ऑर्केस्ट्रेशन सिस्टम के साथ जोड़ा जिसने हजारों Bazel लक्ष्यों में समानांतर रूप से ट्रांसफॉर्मेशन फैनआउट किया और प्रत्येक को CI के माध्यम से मान्य किया।
विकल्प के पीछे की तकनीकी वास्तविकता LLM-बनाम-नहीं फ्रेमिंग के सुझाव से अधिक दिलचस्प है। Uber पैमाने पर, सबसे महत्वपूर्ण विफलता मोड मूक असंगति है: एक ट्रांसफॉर्मेशन जो 99.5% फाइलों पर काम करता है और चुपचाप 0.5% को विकृत करता है, 375 टूटे हुए टेस्ट क्लास बनाता है, जिनमें से प्रत्येक का निदान और हाथ से ठीक करना होता है। OpenRewrite रेसिपी नियतात्मक हैं; एक ही इनपुट AST और एक ही रेसिपी दिए जाने पर, आपको हर रन में एक ही आउटपुट मिलता है, और ट्रांसफॉर्मेशन को टाइप किए गए सिमेंटिक पेड़ पर कंपोजेबल विज़िटर के रूप में व्यक्त किया जा सकता है। LLM-आधारित कोड ट्रांसफॉर्मेशन, इसके विपरीत, टोकन स्तर पर गैर-नियतात्मक है और विशेष रूप से दुर्लभ पैटर्नों के साथ संघर्ष करता है जो उसने प्रशिक्षण डेटा में अक्सर नहीं देखे हैं, जो वास्तव में वहीं है जहां Uber के कस्टम टेस्ट रनर और बेस-क्लास पदानुक्रम रहते हैं। InfoQ का लेख नोट करता है कि शुरुआती Shepherd रन ने बिल्ड और टेस्ट विफलताओं को सतह पर लाया जो ट्रांसफॉर्मेशन तर्क में अपडेट को सूचित करती थी; यह वह पुनरावृत्ति लूप है जो आप वास्तव में नियतात्मक टूलिंग के साथ चला सकते हैं क्योंकि विफलताएं प्रजनन योग्य हैं। एक LLM के साथ, आप एक ही प्रॉम्प्ट को फिर से चलाते हैं और थोड़ी अलग गलती मिलती है, जो पैमाने पर निदान करना बहुत कठिन है।
AI-कोडिंग-उपकरण कथा के लिए व्यापक निहितार्थ के बारे में सटीक होना उचित है। Uber यह नहीं कह रहा है कि LLM कोड ट्रांसफॉर्मेशन नहीं कर सकते; वे कह रहे हैं कि समस्या के इस विशिष्ट वर्ग के लिए (उच्च मात्रा, यांत्रिक-लेकिन-पैटर्न-समृद्ध, सटीकता-महत्वपूर्ण), नियतात्मक टूलिंग जीती। यह उससे मेल खाता है जो सीमावर्ती लैब्स स्वयं आंतरिक रूप से करते हैं: Google, Meta, और Microsoft पर बड़े पैमाने पर कोडबेस पुनर्लेखन वर्षों से नियतात्मक रिफैक्टरिंग टूल्स (पुनर्लेखन इंजन, jscodeshift, gofmt-शैली ट्रांसफॉर्म, Comby, OpenRewrite) के साथ किए जा रहे हैं, LLM का उपयोग चुनिंदा रूप से उन पैटर्नों की लंबी पूंछ के लिए किया जाता है जिन्हें नियतात्मक रेसिपी व्यक्त नहीं कर सकतीं। टेक प्रेस में «AI कोड रिफैक्टरिंग की जगह लेता है» का फ्रेमिंग इसे उल्टा समझता है: पैमाने पर AI सहायता रेसिपी-लेखन और एज-केस-हैंडलिंग में है, बल्क ट्रांसफॉर्मेशन पास में नहीं। एक बार के माइग्रेशन के लिए अर्थशास्त्र भी निर्धारिकता का पक्ष लेता है: एक रेसिपी लिखना एक निश्चित लागत है जो 75,000 फाइलों में परिशोधित होती है, जबकि 75,000 फाइलों पर एक LLM चलाना एक चर लागत है जो रैखिक रूप से स्केल करती है और आउटपुट उत्पन्न करती है जिसे आपको अभी भी सत्यापित करना होगा।
बिल्डर टीमों के लिए, क्रियाशील निष्कर्ष अपने रिफैक्टरिंग कार्यों के बारे में तीन बकेट में सोचना है। पहला, परिमित अच्छी तरह से परिभाषित नियमों के साथ यांत्रिक पैटर्न ट्रांसफॉर्मेशन: API नाम बदलना, इंपोर्ट अपडेट, एनोटेशन स्वैप, JUnit संस्करण माइग्रेशन। ये नियतात्मक AST उपकरणों के हैं, बस, और Uber का राइटअप यह कैसा दिखता है पैमाने पर इसका सबसे स्पष्ट हालिया केस स्टडी है। दूसरा, निर्णय कॉल के साथ सिमेंटिक रिफैक्टरिंग: एक एब्स्ट्रैक्शन निकालना, स्पष्टता के लिए नाम बदलना, नियंत्रण प्रवाह को पुनर्गठित करना। यहीं पर AI-सहायता प्राप्त कोडिंग उपकरण अपनी रोटी कमाते हैं, क्योंकि संपादन स्थानीय हैं, समीक्षा योग्य हैं, और LLM का लचीलापन वहां मदद करता है जहां कठोर रेसिपी टूट जाती हैं। तीसरा, एम्बेडेड रिफैक्टरिंग के साथ बग-फिक्सिंग या फीचर कार्य: यह एजेंटिक-कोडिंग-टूल्स का स्वीट स्पॉट है, जहां मॉडल आसपास के संदर्भ को पढ़ सकता है और अनुकूलित कर सकता है। बचने के लिए गलती एक बकेट से एक उपकरण का उपयोग दूसरे के काम के लिए करना है। OpenRewrite पर 1.25M लाइन यांत्रिक माइग्रेशन शिप करने का Uber का विकल्प, एक नियतात्मक CI लूप और समानांतर ऑर्केस्ट्रेशन के साथ, बकेट एक के लिए सही उत्तर है, और यह अगली बार ध्यान में रखने योग्य है जब कोई एक मिलियन-लाइन रिफैक्टर पर Claude या GPT फेंकने का प्रस्ताव करता है।
