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

यह उपनाम भौतिकी के एक प्रसिद्ध सिद्धांत और प्रोग्रामरों के मज़ाक के मेल से बना।
(1) भौतिक विज्ञानी के नाम पर शब्दों का खेल
हाइज़ेनबग, अनिश्चितता सिद्धांत प्रस्तुत करने वाले जर्मन भौतिक विज्ञानी वर्नर हाइज़ेनबर्ग (Werner Heisenberg) के नाम और कीड़े के अर्थ वाले शब्द बग (bug) को मिलाकर बनाया गया शब्दों का खेल है। इसका उद्देश्य उस प्रेक्षक प्रभाव की याद दिलाना है, जिसमें किसी वस्तु को देखने की कोशिश करते ही वह बदल जाती है।
(2) अभिलेखों में पहली बार उल्लेख
इसका सबसे पुराना ज्ञात उल्लेख 1983 में अमेरिकी कंप्यूटर संस्था एसोसिएशन फ़ॉर कंप्यूटिंग मशीनरी (ACM) के एक प्रकाशन में मिलता है। 1985 में डेटाबेस शोधकर्ता जिम ग्रे (Jim Gray) ने सॉफ़्टवेयर विफलताओं पर लिखे एक शोधपत्र में इस शब्द का इस्तेमाल किया, जिसके कारण कभी-कभी गलती से उन्हें इसका रचयिता मान लिया गया।
(3) इलेक्ट्रॉनिक्स में इसका पुराना समकक्ष
इलेक्ट्रॉनिक्स में ऐसी ही घटना के लिए प्रोब प्रभाव (probe effect) शब्द पहले से मौजूद था। यह वह घटना है जिसमें किसी परिपथ से केवल मापन की प्रोब छुआने भर से उपकरण का व्यवहार बदल जाता है।
हालाँकि, इस नाम की आलोचना भी होती है। आपत्ति यह है कि अनिश्चितता सिद्धांत और प्रेक्षक प्रभाव अलग-अलग अवधारणाएँ हैं, लेकिन यह उपनाम दोनों को एक जैसा मानकर मिला देता है। इसलिए हाइज़ेनबग को सटीक वैज्ञानिक शब्द के बजाय सॉफ़्टवेयर विकास के कामकाज में इस्तेमाल होने वाली एक चतुर अनौपचारिक अभिव्यक्ति मानना बेहतर है।
हाइज़ेनबग क्यों छिप जाता है

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

हाइज़ेनबग के साथ इस्तेमाल होने वाले बग उपनाम

हाइज़ेनबग का इस्तेमाल व्यापक होने के साथ वैज्ञानिकों के नाम पर बग के कई अन्य उपनाम भी बने।
- बोरबग (Bohrbug): भौतिक विज्ञानी नील्स बोर के परमाणु मॉडल की तरह निश्चित नियमों का पालन करने वाला बग, जो समान परिस्थितियों में हमेशा एक ही तरह से दिखाई देता है। इसे दोबारा उत्पन्न करना आसान होता है, इसलिए इसे पकड़ना अपेक्षाकृत सरल है।
- मैंडलबग (Mandelbug): ऐसा बग जिसका कारण इतना जटिल होता है कि उसका व्यवहार अव्यवस्थित दिखाई देता है। इसका नाम फ़्रैक्टल का अध्ययन करने वाले गणितज्ञ बेनोआ मैंडलब्रॉट के नाम से आया है।
- श्रॉडिनबग (Schrödinbug): ऐसा बग जो वास्तव में समस्या पैदा करना तब शुरू करता है, जब कोड पढ़ रहा डेवलपर यह पहचान लेता है कि उस कोड को शुरू से ही काम नहीं करना चाहिए था।
- हिग्स-बग्सॉन (Higgs-bugson): ऐसा बग जिसके अभिलेखों और उपयोगकर्ताओं की शिकायतों से स्पष्ट रूप से मौजूद होने की संभावना दिखती है, लेकिन विकास परिवेश में जिसे दोबारा उत्पन्न करना कठिन होता है।
इनमें से अधिकांश उपनाम मज़ाक के रूप में शुरू हुए थे, लेकिन ये इस आधार पर बग को संक्षेप में अलग-अलग नाम देने में उपयोगी हैं कि उसे दोबारा उत्पन्न किया जा सकता है या नहीं और उसका कारण कितना जटिल है।
हाइज़ेनबग को पकड़ने के तरीके

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