लेगसी — यह सिर्फ पुराना कोड नहीं है। यह एक काम करने वाला सिस्टम है जो व्यवसाय के लिए पैसे लाता है लेकिन विकास को धीमा कर देता है। मोबाइल डेवलपमेंट में, लेगसी Objective-C में लिखा जा सकता है, पुरानी लाइब्रेरीज़ या आर्किटेक्चरल पैटर्न का उपयोग कर सकता है। CAST Software (2024) की रिपोर्ट के अनुसार, एंटरप्राइज़ प्रोजेक्ट्स में कोड की एक पंक्ति की औसत आयु 14 वर्ष से अधिक है। लेगसी के साथ काम करने की रणनीति यह निर्धारित करती है कि यह एक बाधा बनेगा या एक प्रबंधनीय संपत्ति बना रहेगा।
मुख्य बातें
लेगसी — कोड या सिस्टम जो प्रोडक्शन में चलता रहता है लेकिन अब आधुनिक गुणवत्ता मानकों को पूरा नहीं करता। लेगसी किसी पुरानी भाषा (जैसे, Objective-C Swift के बजाय) में लिखा जा सकता है, असमर्थित लाइब्रेरीज़ या आर्किटेक्चरल पैटर्न का उपयोग कर सकता है जिन्हें लंबे समय से एंटी-पैटर्न माना जाता है।
लेगसी की मुख्य विशेषता परीक्षणों की अनुपस्थिति है। Michael Feathers (2004) की परिभाषा के अनुसार, लेगसी कोड बिना परीक्षणों वाला कोड है। यदि आप सुरक्षित रूप से व्यवहार नहीं बदल सकते, तो सिस्टम उम्र की परवाह किए बिना लेगसी स्थिति में है। बिना यूनिट टेस्ट वाला नया कोड पहले दिन से लेगसी है।
लेगसी जरूरी नहीं कि बुरा हो। Java 8 में एक अच्छी तरह से डिज़ाइन किया गया सिस्टम, कोरूटीन के साथ Kotlin में अव्यवस्थित कोड की तुलना में अधिक विश्वसनीय और समझने योग्य हो सकता है। कोड की आयु गुणवत्ता का संकेतक नहीं है — मायने यह रखता है कि सिस्टम को कितनी आसानी से बदला और विस्तारित किया जा सकता है।
हर सफल सिस्टम समय के साथ लेगसी बन जाता है। यह एक प्राकृतिक प्रक्रिया है: तकनीकें कोड के फिर से लिखे जाने की तुलना में तेज़ी से विकसित होती हैं। 5 साल पहले Swift 2 में लिखा गया ऐप आज लेगसी है, भले ही यह निर्माण के समय आधुनिक था।
लेगसी का व्यावसायिक मूल्य अक्सर कम आंका जाता है। सिस्टम विश्वसनीय रूप से काम करता है, लेन-देन प्रोसेस करता है, डेटा स्टोर करता है — फिर से लिखने में जोखिम होते हैं। Standish Group (2024) के अनुसार, पूर्ण पुनर्लेखन परियोजनाओं का 35% विफलता में समाप्त होता है। आर्थिक रूप से लेगसी से छुटकारा पाना नहीं, बल्कि इसके साथ काम करना सीखना उचित है।
सबसे अच्छी रणनीतियाँ — क्रमिक माइग्रेशन, नए इंटरफ़ेस के पीछे पुराने कोड को एनकैप्सुलेट करना और स्वचालित परीक्षण। लेगसी तभी समस्या बनती है जब यह पूर्वानुमानित लागत पर बदले जाने योग्य नहीं रह जाता।
स्वचालित परीक्षणों की कमी — मुख्य संकेतक। यदि एक पंक्ति बदलने के बाद डेवलपर परीक्षण नहीं चला सकता और पुष्टि नहीं कर सकता कि कुछ नहीं टूटा — तो आप लेगसी का सामना कर रहे हैं। एक अतिरिक्त संकेत: डिप्लॉय प्रक्रिया में घंटों लगते हैं और मैन्युअल कदमों की आवश्यकता होती है।
दस्तावेज़ीकरण कोड से मेल नहीं खाता — एक और मार्कर। आर्किटेक्चरल आरेख पुराने हैं, टिप्पणियाँ उस व्यवहार का वर्णन करती हैं जो पहले ही बदल चुका है। नए डेवलपर के लिए सीखने का समय एक महीने से अधिक — उच्च जटिलता और कम रखरखाव क्षमता का संकेत।
अतिरिक्त संकेत: स्पष्ट सीमाओं के बिना मोनोलिथिक आर्किटेक्चर, मुख्य सत्यापन विधि के रूप में मैन्युअल परीक्षण, लंबी CI पाइपलाइन (30 मिनट से अधिक), बिना वर्तमान संस्करणों वाली लाइब्रेरीज़ का उपयोग, और संबंधित मॉड्यूल को तोड़े बिना निर्भरताओं को अपडेट करने में असमर्थता।
नाज़ुक कोड की घटना — एक जगह बदलाव तीन अन्य को तोड़ देता है। यह टाइट कपलिंग का परिणाम है, जब मॉड्यूल एक-दूसरे के बारे में बहुत अधिक जानते हैं। कपलिंग जितनी अधिक होगी, सिस्टम उतनी ही तेज़ी से लेगसी श्रेणी में आता है।
गति में कमी — मुख्य जोखिम। एक साधारण सुविधा जोड़ने में कोड का अध्ययन करने में घंटों और परीक्षण में दिन लगते हैं। Stripe (2024) के अनुसार, डेवलपर अपना 33% समय तकनीकी ऋण को दूर करने में बिताते हैं, जो सीधे प्रोजेक्ट में लेगसी मॉड्यूल की उपस्थिति से संबंधित है।
विशेषज्ञता का रिसाव — मूल कोड के लेखक कंपनी छोड़ देते हैं और दस्तावेज़ीकरण अधूरा है। नए डेवलपर अपरिचित मॉड्यूल को छूने से डरते हैं, जिससे जमे हुए कोड का प्रभाव होता है: मॉड्यूल विकसित नहीं होता लेकिन काम करता रहता है। ऐसे सिस्टम का बस फैक्टर गंभीर रूप से कम होता है।
सुरक्षा — पुरानी लाइब्रेरीज़ में ज्ञात कमज़ोरियाँ होती हैं। Java प्रोजेक्ट्स में OpenSSL 1.0.2 या Jackson के पुराने संस्करणों का उपयोग सुरक्षा घटनाओं का सीधा रास्ता है जो व्यवसाय को प्रतिष्ठा और ग्राहकों की कीमत चुका सकता है।
टीम का डिमोटिवेशन — सुधार की रणनीति के बिना लेगसी के साथ काम करने से डेवलपर संतुष्टि कम हो जाती है। टीम को उत्पाद पर गर्व नहीं रहता, कर्मचारी टर्नओवर बढ़ता है, जो सिस्टम विकास को और धीमा कर देता है।
Characterization tests — लेगसी कोड में किसी भी बदलाव से पहले पहला कदम। ज्ञात इनपुट डेटा पर कोड चलाएँ और अपेक्षित आउटपुट रिकॉर्ड करें। ये परीक्षण वर्तमान व्यवहार को एक विनिर्देश के रूप में कैप्चर करते हैं। Golden master testing — एक प्रकार जहाँ आउटपुट की तुलना एक संदर्भ फ़ाइल से की जाती है।
Seam विश्लेषण — उन बिंदुओं को ढूँढना जहाँ व्यवहार बदले बिना कपलिंग तोड़ी जा सकती है। Michael Feathers कई प्रकार के seams की पहचान करते हैं: preprocessor seam, object seam, link seam। Object seam सबसे आम है: एक इंटरफ़ेस के माध्यम से वास्तविक ऑब्जेक्ट को टेस्ट स्टब से बदलना।
Sprout method और Sprout class — पुराने कोड के अंदर नहीं, बल्कि उसके बगल में नया कोड जोड़ने की तकनीकें। मौजूदा मेथड को संशोधित करने के बजाय, वांछित लॉजिक के साथ एक नई मेथड बनाएँ और इसे पुरानी से कॉल करें। इससे काम कर रहे कोड को तोड़ने का जोखिम कम हो जाता है।
class LegacyPaymentProcessor {
def process(payment) {
// पुराने कोड की 200 पंक्तियाँ जिन्हें नहीं छूना चाहिए
logPayment(payment) // sprout विधि
}
def logPayment(payment) {
// पुराने कोड के बगल में जोड़ा गया नया कोड
}
}
Strangler Fig पैटर्न — लेगसी माइग्रेशन के लिए अनुशंसित दृष्टिकोण। एक नया मॉड्यूल समानांतर में बनाया जाता है, ट्रैफ़िक धीरे-धीरे पुराने से नए पर स्विच किया जाता है। पुराना मॉड्यूल स्वाभाविक रूप से खत्म हो जाता है जब वह अनुरोध प्राप्त करना बंद कर देता है। पैटर्न जोखिमों को कम करता है और समस्याओं के मामले में वापस रोलबैक की अनुमति देता है।
Branch by Abstraction — एक तकनीक जहाँ पुराने और नए कार्यान्वयन के ऊपर एक एब्स्ट्रक्शन बनाया जाता है। क्लाइंट कोड एब्स्ट्रक्शन पर स्विच हो जाता है, और पुराना कार्यान्वयन धीरे-धीरे बदल दिया जाता है। उदाहरण: एकीकृत NetworkService प्रोटोकॉल के माध्यम से AFNetworking से Alamofire पर नेटवर्किंग लेयर को बदलना।
चरणबद्ध माइग्रेशन — संक्रमण को छोटे चरणों में तोड़ना: पुराने मॉड्यूल को एनकैप्सुलेट करें → परीक्षण लिखें → नया मॉड्यूल बनाएँ → समानांतर में चलाएँ → पुराना मॉड्यूल हटाएँ। प्रत्येक चरण एक स्थिर सिस्टम स्थिति के साथ समाप्त होता है, जो किसी भी क्षण डिप्लॉयमेंट की अनुमति देता है।
अक्सर पूछे जाने वाले प्रश्न
पूर्ण पुनर्लेखन सबसे जोखिम भरा विकल्प है। केवल 25% प्रोजेक्ट Big Rewrite समय पर सफल होते हैं। Strangler Fig पैटर्न लागू करना बेहतर है: उत्पाद को रोके बिना धीरे-धीरे मॉड्यूल बदलें। प्रत्येक पुनरावृत्ति व्यावसायिक मूल्य लाती है, और जोखिम समय पर वितरित होते हैं।
characterization tests से शुरू करें: ज्ञात डेटा पर मॉड्यूल चलाएँ, परिणाम रिकॉर्ड करें। Golden master testing व्यवहार को कैप्चर करने का एक सरल तरीका है। हर बार जब आप कोड की एक पंक्ति को छूते हैं तो परीक्षण जोड़ें। 6 महीने में आपके पास एक ढाँचा होगा जो प्रतिगमन से बचाता है।
यदि सिस्टम स्थिर है, बार-बार बदलावों की आवश्यकता नहीं है और अन्य मॉड्यूल के विकास की गति को प्रभावित नहीं करता — इसे छोड़ दें। अगर टूटा नहीं है, तो मत सुधारो — कम बदलाव आवृत्ति वाले पृथक लेगसी मॉड्यूल के लिए एक उचित दृष्टिकोण। कोड को तभी छुएँ जब उसमें व्यावसायिक बदलाव करने की आवश्यकता हो।
सेमैंटिक वर्जनिंग का उपयोग करें और चरणों में अपडेट करें: patch → minor → major। प्रत्येक लाइब्रेरी के लिए संगतता परीक्षण लिखें। Dependabot या Renovate अपडेट के लिए PR बनाने को स्वचालित करते हैं। यदि कोई लाइब्रेरी डिप्रीकेटेड है, तो एब्स्ट्रक्शन के माध्यम से उसके प्रतिस्थापन की योजना बनाएँ।
तकनीकी ऋण स्थगित सुधारों की लागत का आकलन करने के लिए एक रूपक है। लेगसी एक विशिष्ट सिस्टम या कोड है जो पहले ही पुराना हो चुका है। तकनीकी ऋण एक महीने में जमा हो सकता है, लेगसी को समय चाहिए। हर तकनीकी ऋण लेगसी नहीं बनता, लेकिन हर लेगसी में तकनीकी ऋण होता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें