घर बदलने के लिए जल्दबाज़ी में सामान बाँधते समय कभी-कभी हम सोचते हैं कि फिलहाल सब कुछ जैसे-तैसे डिब्बों में डाल दें और बाद में व्यवस्थित कर लेंगे। उस समय काम जल्दी पूरा हो जाता है, लेकिन नए घर में कोई एक चीज़ ढूँढ़ने के लिए कई डिब्बे खँगालने पड़ते हैं, और सामान व्यवस्थित करने में जितनी देर की जाए, मेहनत उतनी ही बढ़ती जाती है। सॉफ़्टवेयर विकास में भी ठीक ऐसा ही होता है, और इसी को ‘तकनीकी ऋण (Technical Debt)’ कहा जाता है।
सरल शब्दों में, तकनीकी ऋण उस अतिरिक्त लागत को कहते हैं जो तत्काल गति बढ़ाने के लिए बेहतर डिज़ाइन की जगह आसान तरीका चुनने पर बाद में उसे सुधारने और सँवारने में चुकानी पड़ती है। अमेरिकी प्रोग्रामर वार्ड कनिंघम (Ward Cunningham) ने 1992 में एक सम्मेलन में प्रस्तुति देते समय पहली बार इस उपमा का इस्तेमाल किया था। आज यह शब्द केवल डेवलपर ही नहीं, प्रबंधन और योजनाकार भी आम तौर पर इस्तेमाल करते हैं।
इस लेख में तकनीकी ऋण का अर्थ और उसकी उत्पत्ति की पृष्ठभूमि, ऋण जमा होने की प्रक्रिया, उसके विभिन्न प्रकार और उसे सँभालने तथा चुकाने के तरीके सरल ढंग से समझाए गए हैं।
तकनीकी ऋण के सिद्धांत और प्रबंधन
तकनीकी ऋण क्या है?


कनिंघम ने 1992 में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग सम्मेलन OOPSLA में अपने बनाए वित्तीय सॉफ़्टवेयर के विकास का अनुभव साझा करते हुए यह उपमा दी थी। उन्होंने कहा कि पहली बार जारी किया गया कोड कर्ज़ लेने जैसा है। थोड़ा कर्ज़ लेने से विकास की गति बढ़ती है, लेकिन कोड को सुधारकर दोबारा लिखने के ज़रिए उस कर्ज़ को समय पर चुकाना ज़रूरी है।
यह उपमा इतनी व्यापक रूप से इसलिए फैली क्योंकि जो लोग डेवलपर नहीं हैं, वे भी इसे तुरंत समझ सकते हैं। जैसे कर्ज़ पर ब्याज लगता है, वैसे ही जैसे-तैसे लिखे कोड को छोड़ देने पर उसमें हर नई सुविधा जोड़ने में थोड़ा अधिक समय और प्रयास लगता है। कनिंघम ने चेतावनी दी थी कि बिना चुकाया कर्ज़ जमा होता रहे तो पूरा संगठन ब्याज के बोझ तले दबकर ठप हो सकता है।
यहाँ मूलधन स्वयं वह अव्यवस्थित कोड है जिसे अभी सुधारा नहीं गया है, और ब्याज उस कोड के कारण हर बार लगने वाला अतिरिक्त समय और प्रयास है। मूलधन चुकाने का अर्थ कोड को ठीक से दोबारा व्यवस्थित करना है। जब तक मूलधन बाकी रहता है, विकास जारी रहने के दौरान नियमित रूप से ब्याज जुड़ता रहता है।
ऋण कैसे जमा होता है और ब्याज कैसे लगता है?

तकनीकी ऋण कई तरीकों से जमा होता है। रिलीज़ की समय-सीमा पूरी करने के लिए परीक्षण छोड़ देना, मिलते-जुलते कोड को सुधारने के बजाय कॉपी-पेस्ट करना या दस्तावेज़ न बनाना इसके आम उदाहरण हैं। कुछ ऋण किसी की गलती के बिना भी पैदा होते हैं, जैसे शुरुआत में उपयुक्त रहा डिज़ाइन सेवा का विस्तार होने पर अनुपयुक्त हो जाना।
ब्याज ऐसे रूपों में जुड़ता है जो आसानी से दिखाई नहीं देते। एक छोटी-सी सुविधा में बदलाव करने पर भी किसी अनपेक्षित जगह त्रुटि आ जाती है, और नए डेवलपर को उलझे कोड को समझने में कई सप्ताह लग जाते हैं। एक ही काम में लगने वाला समय भी हर साल थोड़ा बढ़ता जाता है, लेकिन रोज़ का बदलाव इतना छोटा होता है कि किसी को आसानी से इसका पता नहीं चलता।
ब्याज डरावना इसलिए है क्योंकि वह चक्रवृद्धि ब्याज की तरह बढ़ता है। जैसे-तैसे लिखे कोड के ऊपर नया कोड जोड़ने पर, नए कोड को भी मजबूरन उसी अव्यवस्थित संरचना के अनुरूप लिखना पड़ता है। अंततः एक जगह अपनाया गया छोटा रास्ता कई जगह घुमावदार रास्तों की ज़रूरत पैदा करता है, और सुधार का दायरा शुरुआत से कई गुना बढ़ जाता है।
जब ब्याज मूलधन से अधिक हो जाता है, तो ऐसी स्थिति आ जाती है जिसमें नई सुविधाएँ बनाने से ज़्यादा समय मौजूदा समस्याओं को रोकने में लगने लगता है।
हर ऋण बुरा नहीं होता: तकनीकी ऋण के प्रकार

ब्रिटिश सॉफ़्टवेयर डेवलपर मार्टिन फ़ाउलर (Martin Fowler) ने 2009 में ‘तकनीकी ऋण के चार खानों’ का ढाँचा प्रस्तुत किया, जिसमें तकनीकी ऋण को दो मानदंडों के आधार पर बाँटा गया। पहला यह कि ऋण जानबूझकर लिया गया या अनजाने में, और दूसरा यह कि उसे सोच-समझकर लिया गया या लापरवाही से।
(1) सोच-समझकर और जानबूझकर लिया गया ऋण
यह ऐसा ऋण है जिसे परिणाम जानते हुए चुना जाता है, जैसे ‘अभी रिलीज़ को प्राथमिकता दें, इसलिए फिलहाल ऐसे ही करें और बाद में सुधार लें।’ यह एक रणनीतिक निर्णय हो सकता है जो व्यवसाय के लिए बेहद ज़रूरी अवसर का लाभ उठाने में मदद करे।
(2) लापरवाही से और जानबूझकर लिया गया ऋण
इसमें ‘डिज़ाइन के लिए समय नहीं है’ कहकर जानकारी होते हुए भी काम जैसे-तैसे निपटा दिया जाता है। यह सबसे ख़तरनाक रूप है।
(3) अनजाने में लिया गया ऋण
यह अनुभव की कमी से पैदा होने वाला ऋण है, या ऐसा ऋण जिसकी समझ काम पूरा होने के बाद आती है कि ‘अच्छा, इसे ऐसे करना चाहिए था।’ सीखने की प्रक्रिया में इस तरह के ऋण से बचना भी कठिन होता है।
ध्यान देने वाली बात यह है कि जानबूझकर लिया गया ऋण भी उसे चुकाने की योजना न होने पर जल्द ही लापरवाही वाला ऋण बन जाता है। विकास के काम में यह बहुत आम है कि जिस कोड को ‘बाद में सुधार लेंगे’ कहा गया था, वह कई साल तक वैसा ही पड़ा रहता है।
इस तरह तकनीकी ऋण ऐसी चीज़ नहीं है जिससे हर हाल में बचना चाहिए। बैंक के कर्ज़ की तरह उसका प्रबंधन करना चाहिए और तय करना चाहिए कि कब कितना ऋण लेना है और उसे कैसे चुकाना है।
तकनीकी ऋण सँभालने और चुकाने के तरीके

ऋण चुकाने का सबसे प्रमुख तरीका रिफ़ैक्टरिंग (Refactoring) है। रिफ़ैक्टरिंग का अर्थ है प्रोग्राम के काम को यथावत रखते हुए केवल कोड की संरचना को इस तरह सँवारना कि उसे पढ़ना और बदलना आसान हो जाए। बाहर से कोई बदलाव न दिखने के कारण इसके परिणाम आसानी से नज़र नहीं आते, इसलिए डेवलपर और प्रबंधन, दोनों का ऋण की लागत को समझना सबसे ज़रूरी है।
(1) ऋण दर्ज करना
बाद में सुधारे जाने वाले हिस्सों को कामों की सूची में लिख देने से वे भुलाए नहीं जाते और एक नज़र में यह भी दिख जाता है कि कितना ऋण जमा हो चुका है।
(2) नियमित रूप से थोड़ा-थोड़ा चुकाना
विकास के समय का कुछ हिस्सा तय करके हर बार थोड़ा-थोड़ा सुधार किया जाए, तो ब्याज को बढ़ने से रोका जा सकता है।
(3) परीक्षण से सुरक्षा का इंतज़ाम करना
स्वचालित परीक्षण तैयार होने पर कोड बदलते समय तुरंत जाँचा जा सकता है कि कहीं कोई दूसरा हिस्सा तो नहीं बिगड़ा। इससे ऋण चुकाने का बोझ कम होता है।
(4) ऋण बहुत अधिक हो तो नए सिरे से बनाना
यदि ऋण इतना जमा हो गया हो कि सुधारने की लागत नए सिरे से बनाने की लागत से अधिक हो जाए, तो पुराने सिस्टम को चरणबद्ध ढंग से नए सिस्टम से बदलना भी एक तरीका है। हालाँकि, इसमें लागत और जोखिम अधिक होते हैं, इसलिए निर्णय सोच-समझकर लेना चाहिए।
तकनीकी ऋण, कर्ज़ के परिचित विचार के ज़रिए, सॉफ़्टवेयर विकास की उस वास्तविकता को सामने लाता है जिसमें गति और गुणवत्ता के बीच हमेशा संतुलन ढूँढ़ना पड़ता है। कर्ज़ लेने से भी बड़ी समस्या यह भूल जाना है कि कर्ज़ लिया गया है। वहीं, अच्छी तरह सँभाला गया ऋण तेज़ विकास का आधार बन सकता है।
यह याद रखना कि आज बचाया गया समय कल ब्याज के रूप में लौटता है, स्वस्थ सॉफ़्टवेयर की दिशा में पहला कदम है।