पुराने बिज़नेस सॉफ़्टवेयर के छिपे जोखिम: सब कुछ एक साथ तोड़े बिना आधुनिकीकरण की आर्किटेक्ट गाइड
वो दस जोखिम जो पुराने बिज़नेस सिस्टम को ख़तरनाक बनाते हैं, उनसे होने वाली रोज़ की परेशानियाँ, संभावना और असर का एक आसान हीट मैप, और strangler fig पैटर्न से लेगेसी सिस्टम को एक-एक हिस्सा करके बदलने का तरीक़ा।
Author
Anichur Rahaman
2 महीने पहले10 min read1 views
पुराना सॉफ़्टवेयर शायद ही कभी एकदम से बैठता है; वह धीरे-धीरे जवाब देता है। हर महीने कोई रिपोर्ट थोड़ा और ज़्यादा समय लेने लगती है। नया पेमेंट तरीक़ा जोड़ने के लिए कहा जाता है कि "कुछ हफ़्ते लगेंगे"। स्टॉक मॉड्यूल समझने वाला इकलौता डेवलपर छुट्टी पर जाता है, और पूरी टीम उसके लौटने की राह देखती रहती है।
समस्या का नाम लिए जाने से बहुत पहले ही मालिक इन लक्षणों को महसूस कर लेते हैं। किसी पुराने बिज़नेस सिस्टम की समीक्षा करते समय एक आर्किटेक्ट के तौर पर मेरा काम है उस धुंधली बेचैनी को ठोस जोखिमों की सूची में बदलना, हर जोखिम को अंक देना, और ऐसा रास्ता सुझाना जिससे कारोबार रुके बिना सिस्टम से बाहर निकला जा सके। यह लेख वही तरीक़ा साझा करता है।
यहाँ आपको मिलेंगे जाँचने लायक दस जोखिम, हर जोखिम से रोज़ होने वाली परेशानियाँ, जोखिम नापने का एक आसान heat map, और आधुनिकीकरण का एक तरीक़ा — strangler fig पैटर्न — जिसमें पूरा सिस्टम दोबारा लिखने का जुआ खेलने के बजाय पुराने सिस्टम का एक-एक हिस्सा धीरे-धीरे बदला जाता है।
"लेगेसी" का असली मतलब
लेगेसी होने का उम्र से कोई लेना-देना नहीं। पाँच साल पुराना सिस्टम भी आधुनिक हो सकता है, अगर उसमें टेस्ट हैं, दस्तावेज़ हैं और वह सपोर्ट वाले सॉफ़्टवेयर पर चलता है। वहीं दो साल पुराना सिस्टम भी लेगेसी हो सकता है, अगर उसे छूने की किसी की हिम्मत न हो। एक काम की परिभाषा:
लेगेसी सॉफ़्टवेयर वह हर सिस्टम है जिस पर बिज़नेस टिका है, लेकिन जिसे सुरक्षित तरीक़े से, जल्दी या किफ़ायत से बदला नहीं जा सकता।
इस नज़र से सवाल यह नहीं कि "सिस्टम कितना पुराना है?" सवाल यह है कि "इसे बदलना कितना जोखिम भरा है, और इसे जैसा है वैसा छोड़ देना कितना?" दोनों की क़ीमत चुकानी पड़ती है।
दस जोखिम
दस साल पुराने कॉमर्स बैक ऑफ़िस का एक आम heat map। अगली मुसीबत ऊपर दाईं ओर वाले ख़ाने से आएगी।
1. सपोर्ट ख़त्म हो चुका runtime या framework
जब प्रोग्रामिंग भाषा के वर्ज़न या framework का सपोर्ट ख़त्म होता है, तो सिक्योरिटी अपडेट आने बंद हो जाते हैं। उसके बाद हर महीने ज्ञात कमज़ोरियों और आपकी सुरक्षा के बीच का फ़ासला बढ़ता जाता है। बाद में अपग्रेड करना भी मुश्किल होता जाता है, क्योंकि लाइब्रेरी आगे बढ़ जाती हैं और आपके वर्ज़न का साथ छोड़ देती हैं।
रोज़ की परेशानी: "वह पेमेंट गेटवे नहीं जुड़ सकता, उसकी लाइब्रेरी को नया PHP चाहिए।"
2. पूरा दारोमदार एक व्यक्ति पर
सिस्टम कैसे चलता है, यह सिर्फ़ एक डेवलपर या एक कॉन्ट्रैक्टर जानता है। कहीं कुछ लिखा नहीं, और उसके जाते ही जानकारी भी चली जाती है। असर के लिहाज़ से यह अक्सर सबसे बड़ा जोखिम होता है — और मालिकों का ध्यान इस पर सबसे आख़िर में जाता है।
रोज़ की परेशानी: रिलीज़, बग फ़िक्स, यहाँ तक कि डेटा का छोटा-सा सुधार भी एक व्यक्ति के समय का इंतज़ार करता है।
3. कोई ऑटोमेटेड टेस्ट नहीं
टेस्ट न हों तो हर बदलाव एक जुआ है, इसलिए टीम कम से कम बदलाव करती है। समस्या की जड़ तक जाने के बजाय ऊपर से पैबंद लगाए जाते हैं, और कोड को बदलना हर साल और मुश्किल होता जाता है।
रोज़ की परेशानी: "इनवॉइस की राउंडिंग ठीक की, अब डिस्काउंट की रिपोर्ट ग़लत आ रही है।"
4. बिना सीमाओं वाला एक साझा डेटाबेस
सैकड़ों टेबल, जिन्हें ऐप का हर हिस्सा पढ़ता और लिखता है — कभी-कभी बाहरी स्क्रिप्ट भी। एक कॉलम बदलते ही कोई ऐसी स्क्रीन टूट सकती है जिसके होने की किसी को याद तक नहीं।
रोज़ की परेशानी: एक मामूली फ़ील्ड बदलने में पूरा हफ़्ता यह खोजने में निकल जाता है कि असर कहाँ-कहाँ पड़ेगा।
5. सुरक्षा का बढ़ता क़र्ज़
पुराने तरीक़े से रखे पासवर्ड, कोड के अंदर लिखी API key, बिना टू-फ़ैक्टर वाला एडमिन पैनल, एरर पेज पर डेटाबेस की जानकारी, लॉगिन पर बार-बार कोशिश की कोई सीमा नहीं। अलग-अलग देखें तो हर चीज़ छोटी लगती है, पर सब मिलकर एक खुला दरवाज़ा हैं।
रोज़ की परेशानी: कोई बड़ा क्लाइंट सिक्योरिटी प्रश्नावली भेजे, तो उसका जवाब देने को कोई तैयार नहीं।
6. बिखरा डेटा, एक ही जानकारी के कई रूप
ग्राहक की जानकारी स्टोर में, CRM में और एक स्प्रेडशीट में; स्टॉक सिस्टम में भी और गोदाम मैनेजर की कॉपी में भी। जब आँकड़े आपस में मेल नहीं खाते, तो लोग किसी पर भी भरोसा नहीं करते।
रोज़ की परेशानी: कौन-सी रिपोर्ट सही है, इसी बहस में मीटिंग का समय ख़त्म।
7. कमज़ोर इंटीग्रेशन
रात में FTP से जाती CSV फ़ाइलें, सप्लायर की वेबसाइट से जानकारी खींचने वाली स्क्रिप्ट, पासवर्ड की मियाद ख़त्म होते ही चुपचाप रुक जाने वाले इंटीग्रेशन। जब तक चलते हैं, चलते हैं — और रुक जाएँ तो कई दिन तक किसी को पता नहीं चलता।
रोज़ की परेशानी: "मंगलवार के बाद से कूरियर स्टेटस अपडेट ही नहीं हुए।"
8. परफ़ॉर्मेंस की दीवार
लूप के अंदर एक-एक रिकॉर्ड खींचने वाली क्वेरी, कोई cache नहीं, पूरी टेबल खंगालकर बनने वाली रिपोर्ट। हज़ार ऑर्डर तक सब ठीक, दस लाख पर पहुँचते ही तकलीफ़।
रोज़ की परेशानी: महीने के आख़िर की रिपोर्ट रात भर चलती है, और उस दौरान स्टोर भी धीमा पड़ जाता है।
9. कम्प्लायंस और ऑडिट में कमियाँ
किसने क़ीमत, सैलरी या स्टॉक बदला, इसका कोई रिकॉर्ड नहीं। ग्राहक माँगे तो उसका निजी डेटा एक्सपोर्ट करने या मिटाने का कोई तरीक़ा नहीं। सहमति का कोई रिकॉर्ड नहीं रखा जाता। कई देशों के डेटा सुरक्षा क़ानूनों में ये सब क़ानूनी ज़िम्मेदारियाँ हैं, कोई अतिरिक्त सुविधा नहीं।
रोज़ की परेशानी: ऑडिटर के एक सवाल का जवाब जुटाने में हफ़्ता लग जाता है।
10. वेंडर का शिकंजा और लाइसेंस की शर्तें
एक बंद सिस्टम, जिसमें आपके डेटा के एक्सपोर्ट पर वेंडर का नियंत्रण है, रिन्यूअल पर दाम बढ़ जाते हैं, या प्रोडक्ट ही बंद कर दिया जाता है। कभी-कभी कॉन्ट्रैक्ट ख़ुद सबसे बड़ा जोखिम होता है।
रोज़ की परेशानी: "हम दूसरा सिस्टम अपनाना चाहते हैं, लेकिन अपना डेटा काम के लायक रूप में निकाल ही नहीं पा रहे।"
एक दोपहर में जोखिमों को अंक दीजिए
शुरुआत के लिए किसी कंसल्टेंट की ज़रूरत नहीं। सिस्टम इस्तेमाल करने वालों और उसे संभालने वालों को साथ बिठाइए, और हर जोखिम को दो पैमानों पर 1 से 5 तक अंक दीजिए:
संभावना: अगले 12 महीनों में इससे कोई असली नुक़सान होने की कितनी संभावना है?
असर: अगर हुआ, तो नुक़सान कितना बड़ा — बिक्री का, डेटा का, क़ानूनी पचड़े का या साख का?
दोनों अंकों को गुणा कीजिए। 15 या उससे ज़्यादा आए तो उसे इसी तिमाही में ठीक करना है। 8 से 14 वाले रोडमैप में जाएँगे। 8 से कम वालों पर बस नज़र रखिए। ऊपर वाला heat map इसी टेबल की तस्वीर है — और आधुनिकीकरण के लिए बोर्ड से बजट मंज़ूर करवाने में मेरी जानकारी में यह सबसे असरदार स्लाइड है।
जोखिम
संभावना (1–5)
असर (1–5)
अंक
कार्रवाई
सपोर्ट ख़त्म runtime
5
5
25
इसी तिमाही
एक व्यक्ति पर निर्भरता
4
5
20
इसी तिमाही
सुरक्षा का क़र्ज़
4
5
20
इसी तिमाही
ऑटोमेटेड टेस्ट नहीं
4
4
16
इसी तिमाही
कमज़ोर इंटीग्रेशन
3
3
9
रोडमैप
वेंडर का शिकंजा
2
4
8
रोडमैप
ऊपर के अंक उदाहरण हैं, कोई पैमाना नहीं। आपकी अपनी चर्चा में अलग अंक आएँगे — और वह चर्चा ही आधा काम है।
पूरा सिस्टम एक बार में दोबारा लिखना क्यों फ़ेल होता है
जोखिम सामने आते ही सबसे लुभावना जवाब होता है: "चलो, इस बार इसे ठीक से नए सिरे से बनाते हैं।" लेकिन पूरा सिस्टम दोबारा लिखने की कोशिशें कामयाब कम और नाकाम ज़्यादा होती हैं, और इसके कारण पहले से अंदाज़ा लगाए जा सकते हैं:
नया सिस्टम बनते-बनते पुराना भी बदलता रहता है, इसलिए निशाना हिलता रहता है।
छिपे नियम खो जाते हैं। दस साल के ख़ास मामले पुराने कोड में ही दबे हैं — किसी टैक्स की राउंडिंग का नियम, किसी थोक ग्राहक की ख़ास छूट। इन्हें कभी किसी ने लिखा ही नहीं।
साल भर या उससे ज़्यादा तक यूज़र के हाथ कुछ नहीं आता, इसलिए फ़ीडबैक देर से मिलता है और बजट उससे पहले ख़त्म हो जाता है।
सिस्टम बदलने का दिन खाई के किनारे खड़े होने जैसा है। कुछ ग़लत हुआ, तो सब ग़लत हो जाता है।
strangler fig पैटर्न: एक बार में एक हिस्सा
strangler fig (बरगद की तरह की एक लता) किसी पेड़ से लिपटकर तब तक बढ़ती है, जब तक अपने दम पर खड़ी न हो जाए। सॉफ़्टवेयर में भी नया सिस्टम पुराने के चारों ओर बढ़ता है, एक-एक काम अपने हाथ में लेता जाता है — जब तक पुराने कोर को बंद न किया जा सके।
एक routing facade पुराने और नए सिस्टम को साथ-साथ चलने देता है। ट्रैफ़िक एक-एक हिस्से के हिसाब से शिफ़्ट होता है।
कदम 1 — आगे एक facade लगाइए (महीने 0–2)
पुराने सिस्टम के आगे एक routing परत लगाइए — कोई API gateway या हल्की-सी proxy। शुरुआत में यह 100% ट्रैफ़िक पुराने सिस्टम को ही भेजती है। साथ-साथ:
ज़रूरी प्रक्रियाओं के लिए characterization test लिखिए, जो दर्ज करें कि पुराना सिस्टम आज क्या करता है — सही हो या ग़लत।
पुराने डेटाबेस में एक event outbox जोड़िए, ताकि हर अहम बदलाव (ऑर्डर बना, स्टॉक हिला) भरोसेमंद तरीक़े से नए मॉड्यूल तक पहुँचे।
जो भी छिपा नियम मिले, उसे लिख लीजिए। यही आगे चलकर कंपनी का सबसे क़ीमती दस्तावेज़ बनेगा।
कदम 2 — एक हिस्सा शिफ़्ट कीजिए (महीने 2–8)
ऐसा हिस्सा चुनिए जो अहम हो और जिसकी सीमाएँ साफ़ हों: कैटलॉग और स्टॉक, या ऑर्डर। नया मॉड्यूल बनाइए या तैयार मॉड्यूल अपनाइए, और वह काम उसकी तरफ़ मोड़ दीजिए।
एक anti-corruption layer पुराने और नए डेटा मॉडल के बीच अनुवाद करती है, ताकि पुराने सिस्टम की सनक नए कोड में न घुसे।
parallel run में एक ही इनपुट दोनों सिस्टम में जाता है और नतीजों की तुलना होती है — जब तक वे पूरी तरह मेल न खा जाएँ।
feature flag से एक बार में एक ब्रांच, एक स्टोर या ग्राहकों का एक समूह नए सिस्टम पर लाइए, तुरंत वापसी का रास्ता खुला रखते हुए।
कदम 3 — पुराने कोर को रिटायर कीजिए (महीना 8 से आगे)
आख़िरी हिस्सा भी शिफ़्ट हो जाए, तो पुराना डेटा सिर्फ़ पढ़े जाने वाले स्टोरेज में आर्काइव कीजिए, बची हुई पुरानी स्क्रीनें बंद कीजिए और पुराना कोड हटा दीजिए। डेटा रखिए, जोखिम विदा कीजिए।
रीफ़ैक्टर, नया प्लेटफ़ॉर्म, बदलना या बंद करना?
पुराने सिस्टम के हर हिस्से के साथ एक जैसा बर्ताव ज़रूरी नहीं। हर हिस्से का रास्ता तीन सवाल तय करते हैं:
ऑर्डर, स्टॉक, खाता-बही और पेरोल जैसे आम काम शायद ही कभी शून्य से बनाने लायक होते हैं।
बंद कीजिए वह, जिसकी अब किसी को ज़रूरत नहीं। यही सबसे सस्ता आधुनिकीकरण है।
बदलिए आम कामों को — ऑर्डर, इन्वेंटरी, अकाउंटिंग, पेरोल, HR — परखे हुए मॉड्यूल से। जर्नल एंट्री कैसे पोस्ट होती है, इसमें आपकी प्रतिस्पर्धी बढ़त शायद ही कभी छिपी होती है।
रीफ़ैक्टर कीजिए वह, जो आपका अपना है और अब भी ठीक-ठाक है: टेस्ट जोड़िए और छोटे-छोटे कदमों में अपग्रेड कीजिए।
नए प्लेटफ़ॉर्म पर ले जाइए वह, जो आपका अपना है पर बिना सपोर्ट वाली तकनीक में फँसा है: facade के पीछे उसके नियम नई तकनीक पर ले जाइए।
असली माइग्रेशन से मिले सबक़
कुछ सबक़ किताबों से नहीं, तजुर्बे से आते हैं:
टेस्ट उसी डेटाबेस पर कीजिए जो production में चलता है। तेज़ in-memory टेस्ट डेटाबेस case-sensitive सर्च, सख़्त टाइप तुलना और constraint के अंतर छिपा सकता है। मैंने जो सबसे बड़े झटके देखे, उनमें से कई सारे टेस्ट पास करके पहली असली रिक्वेस्ट पर ही गिर गए।
हर कार्रवाई का जवाब पढ़ने लायक संदेश हो। माइग्रेशन के दौरान सिर्फ़ "500 Server Error" दिखाना किसी भी अधूरे फ़ीचर से तेज़ी से यूज़र का भरोसा तोड़ता है। सर्विस चलने से पहले ही इनपुट जाँचिए, और गड़बड़ी को ऐसे संदेश में बदलिए जिससे लोग समझ सकें कि आगे क्या करना है।
रेफ़रेंस डेटा एक ही बार डालिए, और इसका रिकॉर्ड रखिए। हर अपडेट पर दोबारा चलने वाली सेटअप स्क्रिप्ट किसी न किसी दिन वह सेटिंग मिटा देती है जिसे किसी ने हाथ से बदला था।
माइग्रेशन से पहले और बाद में परफ़ॉर्मेंस नापिए। "पहले" का आँकड़ा न हो, तो आप साबित नहीं कर पाएँगे कि नया सिस्टम तेज़ है — और कोई न कोई ज़रूर कहेगा कि यह धीमा है।
पहले दिन से ऑडिट ट्रेल रखिए। किसने क्या और कब बदला, यह पता हो तो माइग्रेशन के आधे झगड़े मिनटों में सुलझ जाते हैं।
आधुनिकीकरण की योजना में StoreConsole
StoreConsole अलग-अलग स्वतंत्र मॉड्यूल से बना है — कैटलॉग, इन्वेंटरी, ऑर्डर, डिलीवरी, अकाउंटिंग, HR, पेरोल, CRM और भी बहुत कुछ — जो आपस में सिर्फ़ event के ज़रिए बात करते हैं। इसलिए "बदलने" वाले रास्ते के लिए यह स्वाभाविक पसंद है: facade के पीछे एक मॉड्यूल लगाइए, पुराने सिस्टम के outbox से उसे डेटा दीजिए, और पहला स्थिर हो जाए तो अगले पर बढ़िए। हर मॉड्यूल में एक्टिविटी लॉग, रोल के हिसाब से अनुमतियाँ और टू-फ़ैक्टर साइन-इन मौजूद है, जिससे ऊपर के कई जोखिम पहले दिन से ही घट जाते हैं। नीचे के छोटे वीडियो में रोल, टू-फ़ैक्टर साइन-इन और ऑडिट ट्रेल दिखाए गए हैं।
यूज़र और रोल टूर (0:47): रोल के हिसाब से अनुमतियाँ, टू-फ़ैक्टर साइन-इन और पूरा ऑडिट ट्रेल।
आपके पहले 30 दिन
हफ़्ता 1: जोखिमों पर चर्चा कीजिए और अपना heat map बनाइए।
हफ़्ता 2: सबसे कम ख़र्च वाले ऊँचे अंक के मुद्दे पहले ठीक कीजिए — टू-फ़ैक्टर चालू कीजिए, लीक हुई key बदलिए, एक बैकअप रिस्टोर करके देखिए।
हफ़्ता 3: अपनी तीन सबसे अहम प्रक्रियाओं के लिए characterization test लिखिए।
हफ़्ता 4: तय कीजिए कि सबसे पहले कौन-सा हिस्सा शिफ़्ट होगा, और सफलता नापने के तरीक़े पर सहमति बनाइए।
सार
लेगेसी का मतलब है "हम इसे सुरक्षित तरीक़े से नहीं बदल सकते", न कि "यह पुराना है"।
दस जोखिमों को संभावना और असर पर अंक दीजिए; 15 या उससे ज़्यादा वाले इसी तिमाही ठीक कीजिए।
पूरा सिस्टम एक बार में दोबारा लिखने से बचिए। facade, event outbox और strangler fig पैटर्न अपनाइए।
आम कामों को परखे हुए मॉड्यूल से बदलिए; कस्टम कोड सिर्फ़ वहाँ रखिए जहाँ आप सच में अलग हैं।
production वाले डेटाबेस पर ही टेस्ट कीजिए, और कोई भी स्क्रीन सिर्फ़ एरर दिखाकर न रुके।
अनिचुर रहमान सॉफ़्टवेयर आर्किटेक्ट और StoreConsole के संस्थापक हैं। वे बढ़ते बिज़नेस के लिए कॉमर्स और ERP सिस्टम डिज़ाइन करते हैं — ख़ास ध्यान event-driven आर्किटेक्चर, डेटा की सटीकता और अपने ही सर्वर पर चलने वाले सिस्टम पर।