क्या प्रोग्रामर कभी-कभी जानबूझकर उलझे हुए कोड पर काम करते हैं? [बन्द है]


26

स्टैकओवरफ़्लो पर यह बहुत बार लगता है, कि लोग (प्रोग्रामर विशेष रूप से) एक समस्या का समाधान जटिल करने के लिए करते हैं, जहां समाधान बहुत अधिक जटिल है फिर मूल समस्या? Im किसी भी तरह से एक विशेषज्ञ नहीं है, लेकिन बहुत बार मैं सबसे सरल समाधान के साथ जाने की कोशिश करता हूं जो काम करता है (और जाहिर है कि यह काम नहीं करता है), लेकिन मुझे लगता है कि लोगों को काम पर सरल समाधान का सुझाव देने के साथ बहुत अच्छी सफलता मिली है MUCH के लिए अधिक जटिल समाधानों की अनदेखी करना?

क्या यह प्रोग्रामर के लिए एक सामान्य बात है ..... या क्या मैं सही सोच में नहीं हूं।


5
1. हाँ, मुझे कभी-कभी लगता है। 2. हाँ, कम से कम कुछ प्रोग्रामर कम से कम कुछ समय के लिए अपने कोड को उलझा देते हैं, कम से कम कुछ समय जानबूझकर। 3. मामले बंद।
जॉब

3
क्या आपने कभी किसी पर चिल्लाया था, "आपको इसके बारे में सोचना चाहिए था!" जब आप कुछ आवश्यकताओं को याद करते हैं जो प्रारंभिक आवश्यकताओं को इकट्ठा करने में नहीं कहा गया था? यही वह है जो कुछ चीजों को आवश्यकता से अधिक जटिल बना सकता है।
जेबी किंग

जवाबों:


18

जाहिर है, कुछ प्रोग्रामर यह दिखाने के लिए उत्सुक हैं कि वे कितने अपमानजनक रूप से जटिल कोड बनाकर स्मार्ट हैं जिन्हें कोई भी समझ नहीं सकता है। अन्य प्रोग्रामर इतने उच्च स्तर पर फायरिंग कर रहे हैं, कि समाधान में जटिलता एक प्राकृतिक विकास है।

मेरे द्वारा देखे गए कुछ सबसे खराब कोड एक ऐसी विधि थी जिसमें 2000 से अधिक लाइनों के कोड थे। कोई शक नहीं कि यह कोड जटिल था, लेकिन यह बहुत खराब भी था।

मुझे लगता है कि एक अच्छा प्रोग्रामर अत्यधिक जटिल कोड से बचता है। इसमें एक डिजाइन पैटर्न को एक समाधान में फिट होने के लिए मजबूर करने के प्रलोभन से बचना शामिल है जिसे वास्तव में इसकी आवश्यकता नहीं है। इसमें गॉड-ऑब्जेक्ट्स, मैजिक बटन, प्रीमेच्योर ऑप्टिमाइज़ेशन, समय से पहले सामान्यीकरण, और अन्य विरोधी पैटर्न से परहेज करना भी शामिल है।

मैं लगातार समाधान कर रहा हूं और अपने समाधानों को सरल बनाने के अवसरों की तलाश कर रहा हूं क्योंकि जटिलता वृद्धि एक कार्बनिक चीज है। कई अन्य जैविक चीजों की तरह, इसे छंटनी और छंटनी चाहिए अगर हम चाहते हैं कि यह प्रयोग करने योग्य बना रहे। मुझे अत्यधिक जटिल समाधानों के साथ बातचीत करने से नफरत है क्योंकि बढ़ी हुई जटिलता के साथ कोड को तोड़ने की संभावना बढ़ जाती है।

मुझे लगता है कि पठनीयता कोड रखरखाव का सबसे महत्वपूर्ण तत्व है, और अत्यधिक जटिल समाधान लगभग हमेशा पठनीयता को कम करते हैं, और रखरखाव की लागत में वृद्धि करते हैं।


32

मैंने बहुत सारे कोड देखे हैं जो होने की तुलना में अधिक जटिल थे और लगभग हमेशा इन तीन कारणों से:

1) समय से पहले सामान्यीकरण या भविष्य की जरूरतों का अनुमान लगाने की कोशिश के कारण अधिक इंजीनियर, जो कभी उत्पन्न नहीं हुआ

2) डेवलपर (ओं) को एक नए डिजाइन पैटर्न या तकनीक के साथ सीखना / प्रयोग करना चाहते थे, जो पहले इस्तेमाल नहीं किए गए थे और जब यह ओवरकिल था तब भी इसे जूता कर दिया था। वे ऐसा इसलिए करते हैं क्योंकि इससे उनका काम और अधिक दिलचस्प हो जाता है और उन्हें कुछ नया सीखने को मिलता है।

3) फीचर्स और बग फिक्स को जोड़ा गया था, लेकिन मौजूदा कोड को इसके साथ समय पर सही ढंग से रिफैक्ट नहीं किया गया था। यह केवल एक छोटे टुकड़े का दोहराव हो सकता है या एक विधि पर किसी अन्य ध्वज वाद से निपट सकता है, लेकिन यह सब जोड़ता है। प्रभावी रूप से, हैक्स जोड़े जाते हैं और सभी कोड की बदबू के कारण सब कुछ जटिल होने में अधिक समय नहीं लगता है। यह सबसे आम है और आमतौर पर सिर्फ बेहतर या समय के दबाव को नहीं जानने के कारण।


मैं # 2 का दोषी हूं, मुझे डर है। अनुभव (और परिपक्वता?) के साथ मैं अब अपने आप को बचाना चाहता हूं ... और घर पर प्रयोग के बजाय :)
Matthieu M.

मैं देखता हूं कि लोग हर समय 1 करते हैं, वे खुद के लिए 5 गुना काम करते हैं
सहयोगी

11

यह बिल्कुल सामान्य बात है। जैसा कि अधिकांश किताबें कहती हैं, एक अच्छा डेवलपर जानता है कि इसे कैसे सरल रखा जाए। यह सिर्फ एक नई तकनीक या आपके द्वारा पाए गए "शांत" ढांचे के साथ कुछ जटिल करने के लिए बहुत आसान है, इसलिए आप समस्याओं के परिप्रेक्ष्य से सोचने के बजाय, इसका उपयोग करने के तरीकों की तलाश करना शुरू करते हैं।

जैसा कि मार्टिन फाउलर ने कहा, जो लोग एक नई तकनीक सीखते हैं, उनके पास एक छोटी अवधि का मुद्दा होता है जहां इसके "प्रौद्योगिकी" संचालित समाधान होते हैं।


4
-1: जैसा कि ज्यादातर किताबें कहती हैं, एक अच्छा डेवलपर जानता है कि इसे कैसे सरल रखा जाए। - आप इस बारे में बिल्कुल सही हैं। लेकिन फिर आपने निहित किया कि नई तकनीक का दुरुपयोग कोड को ओवरकंप्लीकेट करने का सबसे बड़ा कारण है। तुम उसके बारे में गलत हो। मेरा विश्वास करो, वहाँ बहुत अधिक कोड है कि वहाँ नई तकनीक के दुरुपयोग के साथ कुछ नहीं करना है।
जिम जी।

मैंने वास्तव में कहां से कहा कि इसका "कोड ओवरकम्प्लिकेटिंग का सबसे बड़ा कारण" है? यह निश्चित रूप से एक मुद्दा है, "अरे, मैंने सिर्फ पैटर्न एक्स सीखा है, जहां मैं आवेदन कर सकता हूं कि" - पैटर्निटस। तुम सच में मेरे मुंह के लिए शब्द वहाँ जिम।
मार्टिन ब्लोर

4
"मैंने इस पत्र को सामान्य से अधिक लंबा कर दिया है, केवल इसलिए कि मुझे इसे छोटा करने का समय नहीं मिला है।" - Blaise पास्कल यहाँ भी लागू होता है। "जटिल" अक्सर भीड़, आलसी या अक्षम कोडिंग का संकेत है।
बिल

@ बिल के बारे में दिलचस्प बात यह है कि यह व्यापार के दृष्टिकोण से अधिक जटिल कोड के लिए एक अच्छा तर्क है - अगर आपको किसी चीज़ को लागू करने के लिए एक निश्चित राशि का भुगतान किया जाता है और इसे कम करने या इसे कम करने के लिए अतिरिक्त समय लगता है, जब तक कि आप ऐसा नहीं कर सकते। सही पहली बार (कौन कर सकता है?) अनिवार्य रूप से आपके पहले से काम करने वाले कोड को कम जटिल बनाने के लिए एक दंड है।
माइकल

10

मुझे नहीं लगता कि यह सभी प्रोग्रामर के लिए सामान्य है, लेकिन मैंने निश्चित रूप से कई प्रोग्रामर को ऐसा करते देखा है।

मुझे लगता है कि कुछ लोगों का मानना ​​है कि कुछ लोग वास्तव में कुछ सरल 'बहुत आसान' बनाते हुए देखते हैं, और यह उनके कौशल का अच्छा प्रदर्शन नहीं है। इसलिए, उन्हें एक बड़ा, जटिल समाधान करना होगा जो यह कहने का एक तरीका है कि 'देखो मैं क्या कर सकता हूं!', भले ही यह हाथ में समस्या का सबसे अच्छा समाधान न हो।


1
मैं इसे कैसे देखता हूँ। IE अगर यह बहुत आसान है तो यह उपयोग करने लायक नहीं है?

@ मर्कफ मुझे समझ में नहीं आता है। किसी समाधान की सहजता का उसके प्रभाव से क्या लेना-देना है?
GSto

मैं उनकी टिप्पणी पर यह कहते हुए टिप्पणी कर रहा था कि "हाँ मैं सहमत हूँ" जो कभी-कभी प्रोग्रामर सोचते हैं कि "ओह अगर यह बहुत सरल है, तो यह बहुत अच्छा नहीं है"।

7

मैंने देखा है कि प्रोग्रामर अक्सर एक कार्य को पूरा करने के लिए कोड की कई पंक्तियों को लिखते हैं जो उन्हें नहीं पता था कि पहले से ही भाषा में बनाया गया था। यह बिल्कुल जानबूझकर नहीं है, लेकिन निश्चित रूप से रोका जा सकता है।


मैंने प्रोग्रामर्स को देखा है जिन्होंने हर स्ट्रिंग कॉपी के लिए लूप लिखा है। कभी भी मानक लाइब्रेरी फ़ंक्शन के लिए कॉल का उपयोग नहीं किया गया। (
व्हाट्सएप बिगड़ा

7

यह उस पर निर्भर करता है जिसे आप "सरल" कहते हैं। कुछ लोग अत्यधिक परिष्कृत कोड को अधिक "जटिल" के रूप में देखते हैं क्योंकि अधिक कोड है, और कई कॉल ग्राफ़ हैं। हालाँकि, यह कोड अधिक "सरल" है, जिसमें इसके बदलाव करना बहुत आसान है।

मुझे अक्सर लगता है कि एक बड़ा कार्य "सरल" दिखता है जब तक आपको बदलाव करने की आवश्यकता नहीं होती है, तब तक यह तेजी से जटिल हो जाता है।

दूसरे शब्दों में, सरल कई मामलों में देखने वाले की नजर में है।


2
+1: बहुत सारे प्रोग्रामर इसके बारे में नहीं सोचते
Luca

5

समस्या यह है कि यदि आप या तो सरल समाधानों को स्पष्ट रूप से नहीं देख सकते हैं (यह वह जगह है जहां सहकर्मियों के साथ चर्चा चल रही है) या यदि आप बहुत जल्दी सामान्य करते हैं।

दूसरे शब्दों में, आप उन्नत पुस्तकालय कार्यों में सरल लूप बनाते हैं क्योंकि आपको लगता है कि आपको अपनी अगली परियोजना के लिए वैसे भी इसकी आवश्यकता होगी (सिवाय इसके कि आप इस सटीक रूप में नहीं होंगे)। इसे बहुत लंबे समय तक करें और आपके पास एक बहुत ही सरल कोर के साथ एक बेहद जटिल अनुप्रयोग है।

आपको यह भी पता चल सकता है कि आपके पास बहुत मजबूत कोड होना चाहिए, और सभी मजबूती डिफ़ॉल्ट रूप से इसे जटिल बनाती है। मुझे नहीं लगता कि हालांकि यह आपकी समस्या है, हालांकि।


4

कुछ मामलों में यह साफ / सरल समाधान के साथ आने की जटिलता हो सकती है।

वह उद्धरण है जिसे मैं याद नहीं कर सकता या पा सकता हूं जो अकेले कुछ हो जाता है "कोड पूरी नहीं होती है एक बार जब आप सभी को लिखने की ज़रूरत होती है, लेकिन केवल एक बार पूरी करने के लिए आपके पास निकालने के लिए कुछ भी नहीं बचा है"

स्पष्टता की कमी लोगों को सभी अतिरिक्त को दूर करने की क्षमता में बाधा होगी।


4
एक अन्य प्रासंगिक उद्धरण है, "मैंने एक छोटा पत्र लिखा होगा लेकिन समय नहीं था।"
user16764

3
"Il semble que la perfection soit atteinte non quand il n'y a plus rien à ajouter, mais quand il n'y a plus rien à retrancher।" (ऐसा लगता है, पूर्णता तब प्राप्त होती है जब जोड़ने के लिए और कुछ नहीं होता है लेकिन जब। हटाने के लिए और कुछ नहीं है। ”) - फ्रांसीसी पायलट, कवि और इंजीनियर एंटोनी मैरी रोजर विकोमटे डी सेंट-एक्सुप्री, 1939 (पुस्तक टेरे देस होम्स ( विंड, सैंड एंड स्टार्स ) से)।
जोर्ग डब्ल्यू मित्तग

धन्यवाद, ऐसा प्रतीत होता है कि मैं कभी भी सही उत्पत्ति नहीं जानता था।
स्टीफन बेली

3

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


3
आउच! मैं आपको एक +1 देने वाला था, लेकिन तब मैंने आपकी राजनीति के लिए सादृश्य देखा, और यह सबसे कमज़ोर था। // यह सच है - राजनीति में बहुत अधिक गतिरोध, व्यर्थ गति, हाथ लहराते हुए और विशेष रुचियां हैं, और परिणामस्वरूप, बिल अधूरा हो सकता है। लेकिन ओवरकम्प्लीकेशन ओफिसक्यूशन, बर्बाद मोशन, हैंड वेविंग और विशेष रुचियों का उपोत्पाद है। मूल कारण नहीं।
जिम जी।

कारण जो भी हो, देश की कई समस्याओं का बहुत ही सरल समाधान है लेकिन राजनेता उन्हें जरूरत से ज्यादा कठिन बनाने के लिए चुनते हैं। हम मानते हैं कि यह या तो धन, शक्ति या वोटों के कारण है लेकिन मेरा यह भी मानना ​​है कि यह काफी हद तक क्षमताओं के बारे में है। जिस स्थिति में मेरा सादृश्य ठोस स्तर पर है।
डंक

1
@JimG। हाँ, मैं आपसे सहमत हूँ ... यह मुझे लगता है कि राजनीतिक समाधानों के साथ कई समस्याएं राजनेता हैं जो दावा करते हैं कि वास्तव में जटिल समस्या का एक आसान समाधान है (उनका!) जो वास्तव में एक आसान समाधान नहीं है।
माइकल

2

व्यक्तिगत रूप से, मैंने कभी जानबूझकर सॉफ़्टवेयर के टुकड़े को अधिक जटिल बनाने की कोशिश नहीं की। हालांकि, मैंने कुछ खत्म कर दिया है और सोचा है "वाह, यह बहुत जटिल है" और इसे वापस ले लिया और वापस ले लिया। कुछ लोग इसे देख सकते हैं और सोचते हैं कि यह काम करता है और यह काफी अच्छा है और इसे रिफलेक्टर नहीं करता है।


1

एक बुद्धिमान व्यक्ति पर आरोप है कि आपने कहा कि चीजों को जितना संभव हो उतना सरल रखना चाहिए, लेकिन कोई सरल नहीं। वही कोड पर लागू हो सकता है। कभी-कभी आपको एक ऐसी तकनीक का उपयोग करना पड़ता है जो कुछ जटिल (पुनरावृत्ति एक अच्छा उदाहरण हो सकता है, यह अक्सर जूनियर प्रोग्रामर को डराता है)।

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

मुझे नहीं लगता कि अधिकांश डेवलपर्स जानबूझकर कोड कॉम्प्लेक्स बनाने के लिए तैयार हो गए हैं (हालांकि आपको यह अजीब दिखावा है जो अपने कौशल को साबित करने के लिए कुछ तकनीक का उपयोग करेंगे), मुझे लगता है कि कोड को बस उसी तरह से मिलता है अगर यह आक्रामक रूप से बनाए नहीं रखा जाता है और फिर से बनाया जाता है ।


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

... इससे प्रमोशन / बैलेंसिंग नियमों में बहुत आसानी होती। एक नॉन-प्रमोशनल अहस्ताक्षरित शॉर्ट को एक प्रमोशनल इंट में जोड़ा गया, एक गैर-प्रमोशनल अहस्ताक्षरित शॉर्ट उत्पन्न करेगा, चाहे shortजितना बड़ा हो या न हो int। एक प्रोमोशनल को एक प्रमोशनल में unsigned shortजोड़ा intजाता है int। एक ही आकार की हस्ताक्षरित और अहस्ताक्षरित चीजों को जोड़ना, या विभिन्न आकारों की गैर-प्रचारक चीजों को जोड़ना एक त्रुटि होगी। सामने की ओर जटिलता का एक छोटा सा जोड़ें, और अजीब कोने के मामले नीचे की ओर गायब हो जाते हैं।
सुपरकैट

1

एक और कारण जो अभी तक नहीं उठाया गया है, वह यह है कि लोग इन समाधानों का समर्थन करने के लिए आपको बाद में अपनी सेवाओं की आवश्यकता होगी, यह सुनिश्चित करने के लिए वितरित समाधानों को अधूरा कर सकते हैं। दूसरे शब्दों में: नौकरी की सुरक्षा के लिए।


यह सुनिश्चित नहीं किया गया कि इसे क्यों अस्वीकृत किया गया है, मैं एक व्यक्ति द्वारा कोडित की गई बहुत बड़ी परियोजनाओं में आया हूं, जिसने अपना ढांचा तैयार किया, और इस परियोजना पर पूरी तरह से काम करने के लिए प्रति घंटा भुगतान किया गया। यदि नियोक्ता ने उसे बंद कर दिया, तो पूरी उत्पाद लाइन खराब हो जाएगी। किसी अन्य डेवलपर को कोड को अच्छी तरह से समझने में महीनों लग जाते थे, जबकि "ऑल-नोइंग" कोडर को स्पेगेटी की अपनी गड़बड़ी को अपडेट करने में कुछ मिनट लगते थे।
एसएसएच यह

0

शायद एक क्लासिक गलती की समस्या?

30. डेवलपर सोना चढ़ाना।

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

  • स्टीव मैककोनेल, रैपिड डेवलपमेंट।

0

हां कभी-कभी हम खुद का मनोरंजन करने के लिए कोड को अधिक जटिल करते हैं। अधिकतर, हालांकि यह धारणा कि कोड अधिक जटिल हो रहा है, परियोजना में एक अज्ञानी या जूनियर प्रतिभागी से आता है।


1
-1 वरिष्ठ डेवलपर्स जो कनिष्ठ डेवलपर्स पर समस्याओं को स्पष्ट रूप से दोष देते हैं वे शायद अपने स्वयं के काम या दूसरों के काम के लिए प्रेरणाओं को नहीं समझते हैं। यदि जूनियर डेवलपर्स के पास आपके कोड के बाद एक कठिन समय है, तो आईटी आईएस बहुत जटिल है।
ब्रैंडन

मैं कहूंगा कि अगर एक जूनियर डेवलपर को कोड को समझना असंभव लगता है, तो यह एक कोड गंध है और यह वास्तव में हो सकता है कि कोड बहुत जटिल है, हालांकि आप यहां ब्रश को व्यापक करने के लिए बहुत दूर तक उपयोग कर रहे हैं। यह कोड गंध वास्तव में सिर्फ इसलिए हो सकता है क्योंकि Jr डेवलपर को एक उन्नत तकनीक को समझने में मदद की आवश्यकता है, न कि यह कि तकनीक को ही दोष देना है।
पी। रो

-1

हाँ ... और मैंने कई बार कीमत चुकाई है।

मेरे वाइटबोर्ड में अब बहुत ऊपर के तारांकन में एक वक्तव्य है जो पढ़ता है

"अगर यह आसान नहीं है, यह सही नहीं है"

... और हर बार जब मैं व्हाइटबोर्ड पर कुछ प्रोटोटाइप कर रहा होता हूं तो यह हमेशा मेरा ध्यान आकर्षित करता है।

यह वास्तव में मेरे लिए काम करता है क्योंकि मेरे जटिल डिजाइन बहुत अधिक सरल हो जाते हैं जो क्लीनर कोड में तब्दील हो जाते हैं।

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