पेरेटो नियम के बाद, एक प्रोग्रामर अपने समय का केवल 20% वास्तव में उपयोगी चीजों के लिए खर्च करता है।
मैं अपना 80% समय डिबगिंग में बिताता हूं, सब कुछ काम करने के लिए छोटी चीजें तय करता हूं।
क्या डिबगिंग में कम समय बिताने का एक तरीका है?
पेरेटो नियम के बाद, एक प्रोग्रामर अपने समय का केवल 20% वास्तव में उपयोगी चीजों के लिए खर्च करता है।
मैं अपना 80% समय डिबगिंग में बिताता हूं, सब कुछ काम करने के लिए छोटी चीजें तय करता हूं।
क्या डिबगिंग में कम समय बिताने का एक तरीका है?
जवाबों:
कोड में Agda या Coq । एक बार जब आपका कोड संकलित हो जाएगा, तो यह काम करेगा। यदि यह बहुत कट्टर है, तो कमजोर प्रकार की प्रणाली वाली भाषा चुनें, जैसे, हास्केल या एफ #।
लेकिन फिर भी, ज्यादातर मामलों में आप कोडिंग पर अपने समय का 20% और परीक्षण और डिबगिंग पर 80% अधिक उत्पादक खर्च करेंगे। एक सप्ताह का 100% एक घंटे के 20% से बहुत अधिक है। यदि डिबगिंग वह है जो आपको काम करने की आवश्यकता है, तो डिबगिंग की तुलना में समय की बर्बादी नहीं होती है और आपको इस अनुपात को "सुधारने" से परेशान नहीं होना चाहिए।
इकाई का परीक्षण।
मैंने इकाई परीक्षण लागू करने के बाद पाया कि मैंने जो कोड लिखा था वह बेहतर संरचित हो गया। तब बग से बचना और स्पॉट करना आसान था। मैंने डिबगिंग में कम समय बिताया, लेकिन लेखन इकाई परीक्षण के साथ अधिक समय।
मुझे यह भी लगता है कि यूनिट परीक्षणों में लगाए गए समय में निवेश की बेहतर वापसी होती है, फिर डिबगिंग होती है। डिबगिंग सत्र के बाद मैंने सिर्फ कोड तय किया। वही बग हफ्तों बाद दिखाई दे सकता है और मुझे फिर से डिबग करना होगा। अगर मैं एक यूनिट टेस्ट लिखता हूं, तो बग को एक यूनिट टेस्ट के रूप में प्रलेखित किया जाता है और बाद में रिग्रेशन टेस्ट के रूप में कार्य करता है। यदि बग फिर से प्रकट होता है तो यूनिट परीक्षण मुझे यह पता चलता है।
a + b
से कोड के टुकड़े को भी इकाई परीक्षण नहीं कर सकते (जब तक कि आपका परीक्षण आपके अंकगणित डेटा प्रकार की पूरी श्रृंखला को कवर नहीं करता है)।
यूनिट परीक्षण उम्मीद के मुताबिक मदद करेगा यदि आप बग का परिचय देते हैं तो वे आपके उत्पादन कोड से पहले टूट जाएंगे - अच्छी तरह से लिखित इकाई परीक्षण आपको यह भी बताएंगे कि वास्तव में क्या टूट गया।
यह आपको सबसे अधिक मिलेगा, लेकिन 99.999% परियोजनाओं के लिए आपको समय-समय पर चीजों को डिबग करना होगा। सबसे अच्छी बात यह है कि मुझे यहाँ 4 चीजें करनी हैं:
मेरा 80% डिबग है। मैं साधारण कीड़े को ठीक कर रहा हूं और सभी काम करने की कोशिश कर रहा हूं।
इकाई परीक्षण लिखने से शुरू करें, और यथासंभव उच्च कवरेज के लिए प्रयास करें। किसी ने टीडीडी का उल्लेख किया है, लेकिन मैं बीडीडी के साथ जाऊंगा ।
अंत में, आप संभवतः जटिल बगों को डिबग करने पर 80% खर्च करेंगे।
कम समय डिबगिंग कैसे खर्च करें? कम कोड लिखें।
गंभीरता से, जब तक आप कोड लिखते हैं, आपको इसे डीबग करना होगा। यूनिट परीक्षण आदि बेहद मदद करते हैं, लेकिन यह मत सोचो कि आप कभी भी इसकी आवश्यकता को पूरी तरह से हटा देंगे।
कोड लिखना शुरू करने से पहले क्या और क्यों समझें। फिर लगातार एक कार्यप्रणाली का उपयोग करें। आप जिस पद्धति का चयन करते हैं, वह लगभग उतनी महत्वपूर्ण नहीं है, जितनी बार-बार इस्तेमाल की जाने वाली पद्धति। यदि आप लगातार अच्छे परिणाम चाहते हैं, तो आपको लगातार अच्छा काम करने की आवश्यकता है और इन परिणामों को प्राप्त करने के लिए "अपने पागलपन के लिए एक विधि" होना पहला कदम है। जैसा कि आप उन मुद्दों की पहचान करते हैं जो आप अपनी कार्यप्रणाली को आवश्यकतानुसार समायोजित कर सकते हैं और समय के साथ आप अपनी विकास प्रक्रिया में सुधार करेंगे, और उम्मीद है कि कम बग और अधिक नए, सार्थक विकास।
इससे पहले कि आप इसे संकलित करें, अपने कोड को सावधानीपूर्वक पढ़ें। वाक्य रचना और कार्यक्षमता के लिए एक बहुत ही सावधानीपूर्वक पढ़ा गया। यह आश्चर्यजनक रूप से सूचनात्मक हो सकता है, और एक अच्छा संकेतक भी है यदि कोड का एक भाग बहुत जटिल है।
अधिकांश उत्तर इस बात पर केंद्रित लगते हैं कि आपको किस तरह की समस्याओं को कम करना है और आपको मूल्यवान है। हालांकि, डिबगिंग हमेशा आवश्यक होगी, इसलिए डीबगिंग में तेज़ होने के तरीकों पर ध्यान देना उपयोगी है।
अपने संस्करण नियंत्रण सॉफ़्टवेयर का उपयोग करने का तरीका जानें।
आपके द्वारा उपयोग की जाने वाली प्रोग्रामिंग भाषा की अपनी समझ में सुधार करें।
तार्किक बनो
इकाई परीक्षण के लिए टिप्पणियों को जोड़ना लेकिन यह वास्तव में केवल अच्छा है यदि आपका कोड इसे समर्थन करने के लिए अलग किया गया है (उदाहरण के लिए MVC)। यदि आप MVC (या समान) (विरासत परियोजना) को लागू नहीं कर सकते हैं, तो यूनिट परीक्षण आपके UI के लिए बिल्कुल भी काम नहीं करते हैं। मैं तब स्वचालित UI परीक्षण (Microsoft कोडेड UI परीक्षण, WaitN) जोड़ूंगा क्योंकि यह आपके कोड के उस हिस्से में त्रुटियों को कम करेगा।
मैं अत्यधिक स्थैतिक विश्लेषण टूल (उदाहरण के लिए FxCop / Microsoft कोड विश्लेषण, Resharper, MSC के लिए जस्टकोड) चलाने की भी सिफारिश करूंगा। ये सभी प्रकार की सामान्य कोडिंग समस्याएं पा सकते हैं जो मूर्खतापूर्ण डिबगिंग कार्यों को कम कर सकते हैं और डिबगिंग व्यवसाय तर्क पर अधिक ध्यान केंद्रित कर सकते हैं।
इसे काम करो, फिर इसे तेज़ करो, फिर इसे सुंदर बनाओ। अधिकांश बग जल्दी अनुकूलन या कोड की तर्ज पर फिर से फैक्टरिंग से आते हैं जो पूरी तरह से ठीक थे। यदि आप ऑब्जेक्ट ओरिएंटेशन के साथ जाते हैं तो अपने आप को दोहराएं नहीं, इसे सरल रखें और हमेशा वैल्यू रेंज की स्वच्छता जांच करें खासकर यदि आपके तरीके अभी भी बाधाओं पर काम करेंगे। यह आपको कम गलतियाँ करने में मदद नहीं करेगा, लेकिन यह आपको कीड़े को तेज़ी से पहचानने में मदद करेगा और इसलिए डिबगिंग में कम समय लगता है।
मुझे हाल ही में इस समस्या के बारे में बहुत सोचा गया है - इसका सरल उत्तर है डॉन नॉर्मन की द डिज़ाइन ऑफ़ एवरीडे थिंग्स; कोड लिखें जैसे आप एक उत्पाद डिजाइन करेंगे।
विरोधाभास के लिए, अच्छा डिजाइन त्रुटि को कम करता है। इसका मतलब है, कुछ चीजें, जिनमें से अधिकांश आप पहले से ही करते हैं (हालांकि आपको शायद पता नहीं है कि क्यों )।
-नाम सहजता से काम करता है। इसे औपचारिक रूप से खर्च के रूप में जाना जाता है। यही है, एक बटन दबाया जा सकता है, एक लीवर को स्विच किया जा सकता है, खींचे जाने के लिए एक हैंडल आदि।
-बड़ा कोड लिखना मुश्किल। खराब इनपुट के लिए जाँच करें और बाद में के बजाय त्रुटियों को जल्द ही फेंक दें, उपयुक्त होने पर ऐप का उपयोग करें, आदि। इन्हें लॉकआउट फ़ंक्शन कहा जाता है।
जहां उचित है वहां अमूर्तता का उपयोग करें। अल्पकालिक स्मृति कमजोर है।
-डजेशन स्पष्ट रूप से महत्वपूर्ण है, लेकिन यह सुनिश्चित करने के लिए कम से कम प्रभावी है कि कोड का उपयोग ठीक से किया जाए। संक्षेप में, अच्छी तरह से डिज़ाइन किए गए उत्पादों को किसी भी दस्तावेज की आवश्यकता नहीं है। (इसे देखने का सबसे स्पष्ट तरीका बुरे उदाहरणों को देख रहा है: अर्थात्, हैंडल वाले दरवाजे जिन्हें आप पुश करने वाले हैं।)
-उन्नत परीक्षण। ये वास्तव में त्रुटियों को रोकते नहीं हैं, इसलिए यह स्पष्ट करते हैं कि कीड़े कहाँ हैं, और पवित्रता प्रदान करते हैं।
मुझे यकीन है कि मैं कई और सिद्धांतों को याद कर रहा हूं, लेकिन यह है कि त्रुटि के लिए डिजाइनिंग पर पढ़ें।
जब मैं ऊपर दिए गए यूनिट परीक्षण का पूरी तरह से समर्थन करता हूं, तो टीडीडी या बीडीडी का बहुत महत्व होगा क्योंकि आपको समस्या और समाधान के बारे में पहले सोचने की जरूरत है।
लेकिन व्यक्तिगत रूप से मेरे लिए, कुछ मिनटों के लिए बस चुपचाप बैठना और समस्या के बारे में सोचना और इसे कैसे और किसी भी दृष्टिकोण से संपर्क करना है और प्रत्येक दृष्टिकोण के साथ विपक्ष, मेरे गुणवत्ता कोड के लिए चमत्कार करता है और अव्यवस्था के बारे में मेरे दिमाग को साफ करने में मदद करता है।
कभी-कभी कागज के एक टुकड़े पर एक त्वरित स्क्रिबल आपको पहेली के बड़े जुड़े टुकड़ों को देखने में मदद करता है।
मैं सबसे खराब कोड लिखता हूं जब मैं सिर्फ सिर में डुबकी लगाता हूं और कीबोर्ड को पाउंड करता हूं। थोड़ा सा विचार और चिंतन अंतर की दुनिया बना देता है।
पुनश्च। मेरा मतलब है 5 शायद दस मिनट, घंटे नहीं एक विशाल कल्पना लिख रहा है।
कुछ अच्छे जवाब पहले से ही, बस कुछ और भोजन के लिए हालांकि दूसरों को क्या कहा है के लिए जोड़ने में।
अपनी गलतियों से सीखो। बार-बार वही बनाते नहीं रहते।
प्रोग्रामिंग करते समय किनारे के मामलों को कवर करना सुनिश्चित करें - वे ऐसे स्थान हैं जहां अक्सर बग होते हैं।
आवश्यकता पर ध्यान दें। यहां तक कि अगर यह काम करता है, लेकिन क्या आवश्यकता निर्दिष्ट नहीं करता है, तो यह एक बग है।
अपवाद लॉग वास्तविक मदद हो सकता है जब कुछ गलत हो जाता है अब से छह महीने। अपवादों को रिकॉर्ड करने की आदत डालें।
मेरे दो शीर्ष विचार 1 हैं) बेहतर कोड लिखें जो कि जब आप कुछ अप्रत्याशित करते हैं तो असफल हो जाएंगे 2) डिबगिंग में बेहतर बनें
मेरा कोड के साथ लिटरेड है
if(value!=null) throw new NotImplementedException();
if(obj.v>0) throw new Exception(); //sometimes i dont write NotImplementedException
if(value=="thing") throw ...;
जब भी मैं कोड के उस टुकड़े को निष्पादित करता हूं, तो अपवाद को फेंक दिया जाता है, जो डिबगर को रोकने का कारण बनता है जो मुझे नई सुविधाओं में कोड देता है या शर्तों से बचने के बजाय फिर जो हो रहा है उसके बारे में उलझन में है / बग है
कॉल स्टैक, ब्रेकपॉइंट्स (शर्तों के साथ) के आसपास डिबगिंग मेस में बेहतर बनने के लिए, तत्काल विंडो (जिसे शीघ्र या उत्तर विंडो के रूप में भी जाना जाता है), 'वॉच' वेरिएबल्स और जो भी हो।