लाभ:
- त्रुटि संदेश, स्टैक ट्रेस और सबसे छोटे पुनरुत्पादन उदाहरण के साथ एआई में बग का प्रभावी ढंग से वर्णन करने की क्षमता
- परिकल्पना करके और चरण दर चरण इसे सीमित करके मूल कारण खोजने के लिए एआई के साथ एक व्यवस्थित डिबगिंग प्रवाह चलाने की क्षमता
- यह सत्यापित करने की क्षमता कि एआई द्वारा सुझाए गए सुधार ने वास्तव में पुनरुत्पादन और प्रतिगमन परीक्षण द्वारा समस्या को ठीक कर दिया है
डिबगिंग यह पता लगाने और उसे ठीक करने का कार्य है कि कोई प्रोग्राम अपेक्षा से भिन्न व्यवहार क्यों कर रहा है, और इसमें अधिकांश इंजीनियरों का बहुत अधिक समय लगता है। अच्छा डिबगिंग अनुमान लगाने के खेल पर आधारित नहीं है, बल्कि व्यवस्थित रूप से सीमित करने पर आधारित है: लक्षण को स्पष्ट करें, परिकल्पना करें, परिकल्पना का परीक्षण करें, मूल कारण तक पहुंचें। इस चक्र में AI एक बहुत शक्तिशाली भागीदार है; लेकिन तभी जब आप उसे सही जानकारी देंगे. यह कहना कि "कोड काम नहीं करता है, इसे ठीक करें" एआई को अनुमान लगाने और व्यापक सुझाव देने के लिए मजबूर करता है। इसे पूर्ण त्रुटि संदेश, स्टैक ट्रेस और सबसे छोटा पुनरुत्पादन नमूना दें, और साथ में आप मूल कारण ढूंढ लेंगे।
इस इकाई में हम देखेंगे कि एआई में बग का प्रभावी ढंग से वर्णन कैसे किया जाए, चरण दर चरण परिकल्पनाओं को संक्षिप्त किया जाए और प्रतिगमन परीक्षण के माध्यम से सत्यापित किया जाए कि प्रस्तावित समाधान वास्तव में समस्या का समाधान करता है। याद रखें: बग को "ठीक करना" और "बग के लक्षण को दबाना" दो अलग-अलग चीजें हैं; मूल कारण खोजे बिना किया गया सुधार त्रुटि को दूसरी जगह ले जाता है।
अवधारणाएँ: स्टैक ट्रेस: एक डंप जो दर्शाता है कि त्रुटि के समय कौन से फ़ंक्शन किस क्रम में कॉल किए गए थे। न्यूनतम रिप्रो: सबसे सरल, सबसे छोटा कोड/इनपुट जो त्रुटि को ट्रिगर करता है। मूल कारण: समस्या का वास्तविक स्रोत, लक्षण नहीं। प्रतिगमन परीक्षण: परीक्षण जो यह सुनिश्चित करता है कि वही त्रुटि दोबारा न हो।
एआई को एक बग का वर्णन करना
एआई द्वारा मूल कारण ढूंढने की संभावना आपके द्वारा प्रदान की गई जानकारी की गुणवत्ता पर सीधे आनुपातिक है। एक अच्छे त्रुटि विवरण में शामिल हैं: आपने क्या करने का प्रयास किया, आप क्या उम्मीद कर रहे थे, क्या हुआ, सटीक त्रुटि पाठ और स्टैक ट्रेस, शामिल कोड, वातावरण (भाषा/संस्करण/ओएस), और त्रुटि उत्पन्न करने वाला सबसे छोटा नमूना।
- लक्षण स्पष्ट करें. "अपेक्षित एक्स, वास्तविक वाई" प्रारूप में।
- पूर्ण त्रुटि पाठ और स्टैक ट्रेस चिपकाएँ। इसे छोटा मत करो, इसे सेंसर करो, लेकिन संरचना को मत तोड़ो।
- सबसे छोटा पुनरुत्पादन दें. न्यूनतम इनपुट और कोड जो त्रुटि को ट्रिगर करता है।
- पर्यावरण निर्दिष्ट करें. भाषा संस्करण, लाइब्रेरी संस्करण, रनटाइम वातावरण।
प्रभावी त्रुटि विवरण प्रॉम्प्ट: "मैं एक बग डीबग कर रहा हूं। सूचना: - मैं क्या करने का प्रयास कर रहा हूं: [एक्स] - अपेक्षित व्यवहार: [वाई] - वास्तविक व्यवहार: [जेड] - पूर्ण त्रुटि संदेश और स्टैक ट्रेस: [पेस्ट] - पर्यावरण: [भाषा/संस्करण, लाइब्रेरी/संस्करण] - न्यूनतम कोड शामिल: [कोड] मुझे सीधा समाधान न दें। सबसे पहले संभावना के क्रम में 3 सबसे संभावित मूल कारणों की सूची बनाएं और मुझे बताएं कि प्रत्येक के लिए कौन सा सत्यापन करना है।"
परिकल्पना द्वारा प्रवाह को संकुचित करना
व्यवस्थित डिबगिंग एक-एक करके संभावनाओं को ख़त्म करने की कला है। परिकल्पना उत्पन्न करने और प्रत्येक परिकल्पना का परीक्षण करने के लिए प्रयोग को डिजाइन करने के लिए एआई का उपयोग करें; फिर प्रयोग चलाएँ और परिणाम लौटाएँ। यह चक्र यादृच्छिक परिवर्तन करने और रुकने की आदत, जिसे "शॉटगन डिबगिंग" कहा जाता है, से कहीं अधिक तेज़ है।
बाइनरी खोज (द्विभाजन) सहायक संकेत: "यह त्रुटि कल नहीं थी, यह आज है। मैं यह पता लगाना चाहता हूं कि पिछले 20 परिवर्तनों में से कौन सा परिवर्तन द्विभाजित के साथ त्रुटि लेकर आया। मुझे चरण-दर-चरण योजना दें: मुझे किस बिंदु पर परीक्षण करना चाहिए, परिणाम के आधार पर मुझे किस आधे भाग पर जाना चाहिए। मुझे यह भी बताएं कि प्रत्येक चरण में वास्तव में क्या जांचना है।"
लॉग प्रविष्टि रणनीति संकेत: "मुझे त्रुटि नहीं मिल रही है क्योंकि मैं इस फ़ंक्शन में मध्यवर्ती मान नहीं देख सकता। मुझे बताएं कि मुझे किन बिंदुओं पर लॉग लाइनें जोड़ने की ज़रूरत है जो कौन से चर को प्रिंट करती हैं। प्रत्येक लॉग के लिए 'मैं इस लॉग से क्या सीखूंगा' स्पष्टीकरण जोड़ें। उन चेतावनियों को भी निर्दिष्ट करें जो मुझे गोपनीय डेटा लॉग करने से रोकेंगी।"
युक्ति: यदि आप किसी त्रुटि का समाधान नहीं कर सकते हैं, तो अधिकांश समय समस्या कहीं न कहीं है जिसे आपने गलत तरीके से मान लिया है। एआई से पूछें "मेरी कौन सी धारणा गलत हो सकती है?" पूछने से तुम्हारा अंधापन टूट जायेगा। सबसे कठिन गलतियाँ उस स्थान पर छिपी होती हैं जहाँ आप कहते हैं "मुझे यकीन है कि यह सही काम कर रहा है"।
कमजोर संकेत/मजबूत संकेत
कमजोर:"मेरा कोड एक त्रुटि देता है, इसे ठीक करें: [कोड की 200 पंक्तियाँ]"(परिणाम: एआई को नहीं पता कि यह कौन सी त्रुटि है, क्या अपेक्षित है; यह अनुमान के आधार पर सामान्य सुझाव देता है, उनमें से अधिकांश बेकार हैं।) मजबूत:"मुझे NullPointerException मिलता है। अपेक्षित: उपयोगकर्ता सूची वापस की जानी चाहिए। वास्तविक: getUsers() को कॉल करने पर विस्फोट होता है। स्टैक ट्रेस: [पेस्ट]। पर्यावरण: जावा 17. न्यूनतम दोहराव: ऐसा तब होता है जब उपयोगकर्ता सूची खाली होती है, लेकिन तब नहीं जब यह भरी होती है। संबंधित 15 पंक्तियाँ: [कोड]। मूल कारण बताएं और खाली सूची क्यों ट्रिगर होती है, फिर एक समाधान सुझाएं।"
शक्तिशाली संकेत त्रुटि को संदर्भ में रखता है: किस मामले में यह होता है (खाली सूची), किस मामले में यह नहीं होता है (पूरी सूची)। यह एकल सुराग ("खाली होने पर होता है") लगभग सीधे मूल कारण की ओर इशारा करता है। चूंकि यह जानकारी कमजोर प्रॉम्प्ट में उपलब्ध नहीं है, इसलिए एआई अंधा अनुमान लगाता है।
फिक्स का सत्यापन
एक सुधार तभी वास्तविक समाधान होता है जब वह तीन चीजें करता है:
नियंत्रण
प्रश्न
सत्यापन कैसे करें
क्या त्रुटि दूर हो गई?
क्या वही प्रविष्टि अब भी काम करती है?
मिनिमम रिप्रो फिर से चलाएँ
कोई नई त्रुटियाँ नहीं?
क्या और कुछ टूटा हुआ है?
संपूर्ण परीक्षण सुइट चलाएँ
क्या इसकी पुनरावृत्ति नहीं होगी?
क्या वही त्रुटि दोबारा होगी?
इस परिदृश्य के लिए प्रतिगमन परीक्षण जोड़ें
मूल कारण का पता लगाए बिना किए गए सुधार अक्सर लक्षण को दबा देते हैं। उदाहरण के लिए, "शून्य होने पर छोड़ें" के साथ एक शून्य त्रुटि पर प्रकाश डालने से वास्तविक कारण पता चलता है, "डेटा शून्य क्यों आ रहा है?" अदृश्य, और त्रुटि अन्यत्र पुनः घटित होती है।
मिनी मामले
केस 1 - लक्षण दमन जाल। एक टीम कभी-कभार होने वाली अशक्त त्रुटि को ट्राई-कैच से शांत कर देती है; त्रुटि गायब हो जाती है लेकिन 2 सप्ताह के बाद डेटा गायब दिखाई देता है। वास्तविक कारण यह है कि कोई सेवा टाइमआउट पर शून्य हो जाती है। जब आप एआई से पूछते हैं "यह शून्य क्यों हो रहा है?", तो मूल कारण सामने आता है; वास्तविक सुधार में 1 घंटा लगता है लेकिन यह स्थायी है।
केस 2 - न्यूनतम रेप्रो पावर। कोई डेवलपर उस बग को ठीक नहीं कर सकता जो कहता है कि "यह कभी-कभार क्रैश हो जाता है।" यह एआई के सुझाव के साथ त्रुटि को सबसे छोटे इनपुट तक कम कर देता है: समस्या केवल तुर्की वर्ण (एन्कोडिंग त्रुटि) वाले फ़ाइल नामों के साथ होती है। जब अनिश्चितता की 300 रेखाएँ निश्चित रेप्रो की 5 रेखाओं तक कम हो जाती हैं, तो समाधान स्पष्ट हो जाता है।
केस 3 - एंटी-रिग्रेशन परीक्षण। AI दिनांक गणना त्रुटि को ठीक करता है। इंजीनियर इससे संतुष्ट नहीं है; ग़लत परिदृश्य (माह के अंत, 31 जनवरी + 1 माह) के लिए एक प्रतिगमन परीक्षण जोड़ता है। जब 4 महीने बाद कोई अन्य परिवर्तन उसी क्षेत्र को छूता है, तो परीक्षण लाल हो जाता है और बग उत्पादन तक पहुंचने से पहले ही पकड़ लिया जाता है।
सामान्य गलतियाँ
- इसका मतलब है "यह काम नहीं कर रहा है, इसे ठीक करें"। त्रुटि पाठ, अपेक्षा और रिप्रो के बिना, एआई अनुमान लगाता है।
- स्टैक ट्रेस नहीं दे रहा. स्टैक ट्रेस अक्सर मूल कारण को सीधे इंगित करता है।
- यादृच्छिक परिवर्तन करते रहें. परिकल्पना स्थापित किए बिना प्रयोग समय बर्बाद करते हैं।
- लक्षण को दबाना और मूल कारण को अनदेखा करना। त्रुटि का पुनर्जन्म कहीं और होता है।
- प्रतिगमन परीक्षण के साथ समाधान सुरक्षित नहीं किया जा रहा है। वही त्रुटि भविष्य में चुपचाप वापस आती है।
सारांश
प्रभावी डिबगिंग व्यवस्थित संकुचन है, अनुमान लगाना नहीं। एआई को पूर्ण त्रुटि पाठ, स्टैक ट्रेस, न्यूनतम पुनरुत्पादन और पर्यावरण की जानकारी देने से मूल कारण खोजने की संभावना तेजी से बढ़ जाती है। परिकल्पना उत्पन्न करने और प्रत्येक परिकल्पना का परीक्षण करने के लिए प्रयोग को डिजाइन करने के लिए एआई का उपयोग करें; आप प्रयोग चलाएँ. किसी सुधार को "पूरा" तभी मानें जब आप देखें कि बग चला गया है, कोई नया बग नहीं आया है, और यह प्रतिगमन परीक्षण द्वारा संरक्षित है।
आवेदन कार्य
वास्तविक या कृत्रिम त्रुटि पर विचार करें. सबसे पहले त्रुटि को सबसे छोटे पुनरुत्पादन तक कम करें (किस इनपुट में यह होता है, जिसमें यह नहीं होता है)। प्रभावी बग रेसिपी प्रॉम्प्ट का उपयोग करते हुए, एआई से 3 मूल कारण परिकल्पनाओं और प्रत्येक के लिए एक सत्यापन चरण के लिए पूछें। एक-एक करके परिकल्पनाओं का परीक्षण करके मूल कारण ढूंढें, इसे ठीक करें, फिर इस परिदृश्य के लिए एक प्रतिगमन परीक्षण लिखें और चलाएं ताकि यह दिखाया जा सके कि बग दूर हो गया है और परीक्षण सुरक्षा प्रदान करता है।
चेकलिस्ट
- [ ] मैंने लक्षण को "अपेक्षित बनाम साकार" के रूप में स्पष्ट किया।
- [ ] मैंने एआई को पूरा त्रुटि पाठ और स्टैक ट्रेस दिया।
- [ ] मैंने त्रुटि को न्यूनतमतम पुनरुत्पादन तक कम कर दिया।
- [ ] एक-एक करके परिकल्पनाओं का परीक्षण करके, मुझे मूल कारण मिल गया।
- [ ] लक्षण को दबाने के बजाय, मैंने मूल कारण को ठीक किया।
- [ ] मैंने उसी त्रुटि के लिए एक प्रतिगमन परीक्षण जोड़ा और चलाया।