नकारात्मक कोड क्या है?


340

मैं डगलस मैक्लेरो पर विकिपीडिया लेख पढ़ रहा था और एक उद्धरण पाया जिसमें उल्लेख है

"प्रोग्रामिंग का वास्तविक नायक वह है जो नकारात्मक कोड लिखता है।"

इसका क्या मतलब है?


15
मेरे सबसे उत्पादक दिनों में से एक कोड की 1000 लाइनों को फेंक रहा था। - केन थॉम्पसन
राडू पोपट

जवाबों:


501

इसका मतलब है कि अतिरेक को दूर करके या अधिक संक्षिप्त निर्माण का उपयोग करके, कोड की लाइनों को कम करना।

उदाहरण के लिए मूल Apple लिसा डेवलपर टीम के इस प्रसिद्ध उपाख्यान को देखें :

जब लिसा टीम 1982 में अपने सॉफ़्टवेयर को अंतिम रूप देने के लिए जोर दे रही थी, तो परियोजना प्रबंधकों ने प्रोग्रामर को कोड के लाइनों की संख्या पर साप्ताहिक रूप रिपोर्टिंग प्रस्तुत करने की आवश्यकता शुरू कर दी। बिल एटकिंसन ने सोचा कि मूर्खतापूर्ण था। उस सप्ताह के लिए जिसमें उसने क्विकड्रॉ के क्षेत्र गणना रूटीन को छह गुना तेज और 2000 लाइनों को छोटा करने के लिए फिर से लिखा था, उसने फॉर्म पर "-2000" डाला। कुछ और हफ्तों के बाद प्रबंधकों ने उन्हें फॉर्म भरने के लिए कहना बंद कर दिया, और उन्होंने ख़ुशी से अनुपालन किया।


257
पूर्णता हासिल की जाती है, न कि जब जोड़ने के लिए और कुछ नहीं होता है, लेकिन जब लेने के लिए कुछ भी नहीं बचता है - एंटोनी डी सेंट-
एक्सुप्री

7
क्या #LOC कोड गुणवत्ता का एक अच्छा उपाय है? मैं किसी भी C या C ++ कोड को 'छोटा कर सकता हूं' और लाइन काउंट को काफी कम कर सकता है लेकिन इसे बनाए रखने के लिए एक बुरा सपना होगा।
JBRWilkinson

8
@systempuntout - और उसके बाद आइंस्टीन का "(एक वैज्ञानिक सिद्धांत) जितना संभव हो उतना सरल होना चाहिए, लेकिन कोई सरल नहीं"
जोनाथन डे

32
कुछ भी तेजी से नहीं चलता है, या अधिक विश्वसनीय है, या कम रखरखाव की आवश्यकता है, जो कोड नहीं है। "जब संदेह में, इसे बाहर निकलना!"
TMN

4
@JBRWilkinson: मैं कहूंगा कि कोड संक्षिप्तता के संबंध में एक "मीठा स्थान" है। आम तौर पर, छोटा बेहतर होता है, लेकिन एक बिंदु आता है जब कोड बहुत अधिक विकसित हो सकता है और किसी अन्य प्रोग्रामर को समझने में आसान नहीं होगा।
गॉर्डन

131

कोड की लाइनों द्वारा प्रोग्रामर उत्पादकता को मापने की तर्ज पर बिल गेट्स का उद्धरण है, जैसे वजन द्वारा विमान निर्माण की प्रगति को मापना।

मैं जोड़ना चाहूंगा कि LOC मीट्रिक ने अत्यधिक लंबी-घुमावदार भाषाओं के उपयोग को प्रोत्साहित किया है और कोटा को पूरा करने के लिए जानबूझकर पहिया को फिर से मजबूत किया है।


30
हाँ, यह किसी भी प्रकार की मीट्रिक के साथ समस्या है। जैसे ही आप लोगों के प्रदर्शन का न्याय करने के लिए उनका उपयोग करते हैं, वे संख्याओं को गेमिंग करना शुरू कर देंगे।

5
क्या किसी ने कभी LOC को प्रदर्शन मीट्रिक के रूप में उपयोग किया है? मैंने केवल इसे "हम यहां के बारे में कैसे बात कर रहे हैं?"
माइकल बोर्गवर्ड्ट

5
@ माइकल: हाँ। दुर्भाग्य से हाँ।
माइकल पेट्रोत्ता

4
क्या हम उसी बिल जी के बारे में बात कर रहे हैं जिसके पास एक कंपनी है जो कि रूपक द्वारा 10000 GTON जेट का उत्पादन करती है? :)
डैनियल मूसमेडर

37
स्पेस शटल के ऑनबोर्ड कंप्यूटरों के लिए कोड लिखने वाले एक प्रोग्रामर ने मुझे बताया कि उन्हें सॉफ्टवेयर के वजन के लिए खाता था! सॉफ्टवेयर वास्तविक था (इसके लिए पैसे का भुगतान किया गया था); यह शटल पर था; शटल पर लोड की गई हर चीज के वजन का हिसाब होना चाहिए। कोड के वजन से प्रोग्रामर उत्पादकता को मापने का पहला उदाहरण। (शून्य की अनुमति नहीं थी, इसलिए उन्होंने 0.00001 ग्राम निर्दिष्ट किया और सभी संतोषजनक था।)
मार्क ल्यूटन

118

जब मैं हाई स्कूल में था - और हां, हमारे पास 70 के दशक में कंप्यूटर थे, हालांकि हमें पत्थर के चाकू का उपयोग करके उन्हें जानवरों की खाल से बाहर करना पड़ा - गणित के शिक्षकों में से एक ने एक प्रोग्रामिंग प्रतियोगिता चलाई। नियम यह थे कि जीतने वाला कार्यक्रम वही होगा जो सही आउटपुट का उत्पादन करता है, और जिसमें कोड टाइम रन टाइम का सबसे छोटा उत्पाद था। यानी, यदि आपका प्रोग्राम लिया गया है, तो कोड की 100 पंक्तियां कहें और 5 सेकंड के लिए दौड़े, आपका स्कोर 500 था। यदि किसी और ने कोड की 90 पंक्तियां लिखीं और 6 सेकंड के लिए भागा, तो उसका स्कोर 540 था। गोल्फ की तरह कम स्कोर की जीत।

इसने मुझे एक शानदार स्कोरिंग प्रणाली के रूप में मारा, जो निर्णायक और प्रदर्शन दोनों को पुरस्कृत करता है।

लेकिन तकनीकी रूप से जीतने के मानदंडों को पूरा करने वाली प्रविष्टि को अयोग्य घोषित कर दिया गया था। यह समस्या 100 से कम की सभी अभाज्य संख्याओं की सूची को प्रिंट करने की थी। अयोग्य प्रविष्टि कुछ इस तरह से हुई (अधिकांश छात्र तब बैकसीक का उपयोग कर रहे थे):

100 print "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,"
110 print "67, 71, 73, 79, 83, 87, 89, 91, 97"

उस प्रविष्टि को लिखने वाले छात्र ने बताया कि न केवल यह छोटा और बहुत कुशल था, बल्कि एल्गोरिथ्म प्रोग्रामिंग के न्यूनतम ज्ञान के साथ किसी के लिए भी स्पष्ट होना चाहिए, जिससे कार्यक्रम अत्यधिक बनाए रखा जा सके।


10
अधिक प्रमाण है कि कोड की पंक्तियों की गिनती एक बहुत बड़ा मीट्रिक है :-)

44
यह बुनियादी कार्यक्रम शानदार है! यह बजाय परेशान करने वाला है कि शिक्षक ने कार्यक्रम को अयोग्य घोषित कर दिया। आखिरकार, लुकअप टेबल (जो कार्यक्रम कुछ हद तक समान है) निश्चित रूप से वास्तविक दुनिया की प्रोग्रामिंग में पाई जा सकती है।
नॉटिस स्काईटॉवर

6
एक बुद्धिमान शिक्षक ने इस बुनियादी कार्यक्रम को स्वीकार कर लिया होगा और इसका उपयोग एसआरएस के अधिकार के महत्व को उजागर करने के लिए किया। मुझे एक बेसबॉल कोच की याद दिलाता है, जो अपनी टीम से इतना निराश हो गया है कि उन्हें यह दिखाने के लिए कि कैसे खेलना है, उसने बल्ला उठाया, एक पंक्ति में तीन प्रहार किए और आउट नहीं होने के लिए, वह अपनी टीम से चिल्लाया "देख! यह है कि तुम कैसे आधार हो!" ***** खेल रहे हैं। अब बल्ले को लें और ठीक से खेलें! "। साथ ही मुझे उस व्यक्ति की याद दिलाता है जिसने "रचनाकार ने देखा और शरमा गया" लिखा और 'शराब' पर निबंध प्रतियोगिता जीती।
नव

3
@Nav: मुझे इसी तरह की कहानी की याद दिलाता है जो उसी तरह से शुरू होती है। फिर कोच हवा में एक गेंद फेंकता है, झूलता है और छूट जाता है। वह उसे फिर से हवा में फेंकता है, झूलता है और याद करता है। वह इसे तीसरी बार हवा में फेंकता है, झूलता है और याद करता है। फिर वह टीम से कहता है, "देखो, तुम कैसे पिच कर रहे हो!" (मुझे नहीं पता कि इस कहानी का सॉफ्टवेयर विकास के साथ क्या संबंध हो सकता है।)
Jay

13
अगर मैं इसके लिए अयोग्य घोषित किया गया तो मैं बहुत परेशान होऊंगा। एक नियतात्मक समस्या एक नियतात्मक समाधान के योग्य है, है ना? जब मैं एक 'हैलो वर्ल्ड' ऐप लिखता हूं, तो मैं यह जांचने के लिए इसे कोड नहीं करता कि क्या मैं 'हैलो' को सही तरीके से वर्तनी कर रहा हूं।
किर्क ब्रॉडहर्स्ट

34

यह जीभ में गाल है। यदि यह आपकी औसत लागत वाली लाइन के अनुसार $ N खर्च करता है, तो निश्चित रूप से "नकारात्मक रेखाएं" कोडित करना एक विजेता है।

इसका मतलब है, व्यावहारिक सलाह के रूप में, वह छोटा कोड जो काम को पूरा करता है, बड़े कोड की तुलना में बहुत बेहतर है जो समान कार्य करता है, अन्य सभी चीजें समान हैं।


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

2
वास्तव में, IME, मुख्यता / पठनीयता के लिए अनुकूलन वास्तव में एलओसी बढ़ा सकता है , क्योंकि कोड को फिर से लिखना यह अधिक स्व-दस्तावेजीकरण करने के लिए इसे और अधिक क्रिया करने के लिए भी प्रेरित करता है।

1
@Visage: "... अन्य सभी चीजें समान हो रही हैं"।
इरा बैक्सटर

मुद्दा यह है, मुझे लगता है, कि संक्षिप्त कोड और क्रिया कोड के बीच अन्य सभी चीजें समान नहीं हो सकती हैं।
टॉमस नारोस

कोड की औसत लाइन की लागत $ N का कारण है क्योंकि आप पहली बार अपना समय लेखन Xलाइनें खर्च करते हैं। फिर, कई पुनरावृत्तियों पर, Yलाइनों द्वारा अंतिम उत्पाद को कम करना । इसलिए, (X-Y)शेष लाइनें बहुत महंगी लग रही हैं क्योंकि रिफ्लेक्टिंग के नरसंहार ने सभी cruft को काट दिया है।

27

कम कोड में समान कार्यक्रम लिखना हर किसी के लिए एक लक्ष्य है।

यदि किसी प्रोग्राम को कोड करने के लिए 200 LOC लिया जाता है, और मैं इसे 150 में लिखता हूं, तो मैंने -50 LOC लिखा। इसलिए मैंने नकारात्मक कोड लिखा।


3
इसके अलावा, कम LOC लिखने का मतलब है कि आप कम त्रुटियां कर सकते हैं और उन्हें आसानी से
जान सकते हैं-

3
हास्केल और अन्य भाषाओं के लिए सच नहीं है जो यादृच्छिक शोर से संकुचित हो सकते हैं। :)
मैके

1
निश्चित रूप से, मेरी बात "कम्प्रेसिंग कोड" नहीं थी, लेकिन कुशल एल्गोरिदम लिखना जो कम एलओसी में थिन करते हैं :) आपकी टिप्पणी के लिए +1।
LucaB

9

थिलो का उत्तर संभवतः ऐतिहासिक रूप से सबसे सटीक है, लेकिन "नकारात्मक कोड" रूपक में प्रदर्शन और मेमोरी का उपयोग भी शामिल हो सकता है - किसी चीज के निष्पादन या आवंटन को पुरस्कृत करने के लिए पुरस्कृत प्रयास जब तक कि वास्तव में इसकी आवश्यकता न हो।

यह "शिथिलता का भुगतान करता है" मानसिकता ऐसी जीभ-इन-गाल स्वयंसिद्धता उत्पन्न करती है जैसे कि "कुछ भी करने से हमेशा कुछ नहीं होता है", "सबसे तेज़ कोड वह कोड है जो कभी निष्पादित नहीं होता है", और "यदि आप इसे लंबे समय तक रख सकते हैं," आपको कभी भी ऐसा नहीं करना होगा "(वास्तव में आवश्यक होने तक महंगे ऑपरेशनों को स्थगित करने का उल्लेख करते हुए)

नकारात्मक कोड को साकार करने की एक तकनीक समस्या की प्रारंभिक मान्यताओं और परिभाषाओं को चुनौती देना है। यदि आप समस्या / इनपुट डोमेन को फिर से परिभाषित कर सकते हैं जैसे कि "चिपचिपा मुद्दा # 3" स्पष्ट रूप से असंभव है, तो आपको चिपचिपा मुद्दे # 3 से निपटने के लिए समय या कोड खर्च करने की आवश्यकता नहीं है। आपने डिज़ाइन को अनुकूलित करके कोड को समाप्त कर दिया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.