बेहतर उत्पादकता पाने के लिए बेवकूफ होना?


112

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

if(xxx) {
    doSomething();
}

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

मेरा मानना ​​है कि कोड के दृष्टिकोण से, यह काफी अच्छा विचार है - मेरा कोड कभी भी पर्याप्त लंबा नहीं है, और यह विभिन्न संस्थाओं, जैसे कक्षाओं, विधियों और कक्षाओं और वस्तुओं के बीच संबंधों के अर्थों को समझने में काफी आसान है।

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

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

मैं अक्सर अपने परिणामों से बहुत असंतुष्ट महसूस करता हूं - अच्छा कोड जो केवल ए कर सकता है वह खराब कोड से भी बदतर है जो ए, बी, सी और डी कर सकता है।

क्या इस दृष्टिकोण के परिणामस्वरूप किसी सॉफ्टवेयर प्रोजेक्ट के लिए सकारात्मक शुद्ध लाभ प्राप्त होता है, या यह समय की बर्बादी है?


141
मैं अपने ठोस देख सकते हैं और आप YAGNI और KISS rasie करेंगे
जे।

16
एकदम सर पे निशाना।
रॉबर्ट एस।

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

4
शायद यह सिर्फ मेरे लिए है, लेकिन मैं "बेवकूफ" पर विचार करूंगा कि मेरे मुवक्किल / नियोक्ता को कुछ खर्च करने के लिए पैसे खर्च करने होंगे जो उन्होंने अनुरोध नहीं किया है: एस
थॉमस बोनीनी

2
यह वास्तव में जरूरत पड़ने पर भविष्य में किसी फीचर को जोड़ना लगभग कठिन नहीं होने वाला है। अब आप इसे करके कुछ हासिल न करें।
हार्डवेयरगुपी

जवाबों:


153

अच्छा कोड जो केवल A कर सकता है बुरा कोड से भी बदतर है जो A, B, C, D कर सकता है।

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

इसलिए:

अच्छा कोड जो केवल A कर सकता है (लेकिन यह कर रहा है कि एक काम बस और साफ-सुथरा है) बुरे कोड की तुलना में बेहतर है जो A, B, C, D कर सकता है (जिनमें से कुछ की आवश्यकता भविष्य में कभी भी हो सकती है)।


87
+1 के लिए "हम आम तौर पर भविष्य की भविष्यवाणी करने में बहुत खराब हैं" उपयोगकर्ता सबसे अधिक संभावना ई :) के लिए पूछेगा
माइकेल पिसाकोस्की

1
+1 अधिक सहमत नहीं हो सका। मैंने हाल ही में एक कंपनी में एक कार्य अवधि समाप्त की है, और मैं इस सबसे महत्वपूर्ण सबक पर विचार करूंगा जो मैंने सीखा है।
विप्रकोज़न

4
@ मिशेल, क्या यह भविष्यवाणी है? ;-)
Péter Török

10
यहां तक ​​कि अगर वे आपसे डी के लिए पूछते हैं, तो उनके पास शायद इसका एक अलग मानसिक मॉडल होगा, और थोड़ा अलग तरह के डी के लिए पूछेंगे, जो आपके सार का समर्थन नहीं करता है ...
क्रिस बर्ट-ब्राउन

"यदि कोई समस्या पूरी तरह से समझ में नहीं आती है, तो यह संभवतः सबसे अच्छा है कि कोई समाधान नहीं दिया जाए" या "नई कार्यक्षमता न जोड़ें जब तक कि एक कार्यान्वयनकर्ता इसके बिना एक वास्तविक आवेदन पूरा नहीं कर सकता।" यहां लागू होता है। वाया en.wikipedia.org/wiki/X_Window_System#Principles
nwahmaet

87

किस्सा समय:

मेरे पास दो डेवलपर्स काम हैं जिन्होंने इस तरह से ओवर-इंजीनियरिंग की ओर झुकाव किया।

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

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

तो नैतिक है, अति-इंजीनियरिंग अतिरिक्त समय खाएगी जो कि उपयोगी चीजें करने में बेहतर खर्च हो सकती है। और न केवल अपना समय, बल्कि उन लोगों का भी जिन्हें आपके कोड के साथ काम करना है।

तो नहीं है।

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


10
+1 जितना संभव हो उतना सरल लेकिन कोई सरल नहीं।
जूलियन

33
"एक डिजाइनर जानता है कि उसने पूर्णता तब हासिल की है जब जोड़ने के लिए कुछ भी नहीं बचा है, लेकिन जब दूर ले जाने के लिए कुछ नहीं बचा है।" एंटोनी डे सेंट-
एक्सुपरी

प्लेग की तरह दोहराव से बचें और आप बहुत गलत नहीं होंगे।
केविन

@ बरख ... मैं एक ही उद्धरण का उपयोग करने जा रहा था: पी
माइकल ब्राउन

6
मैं इसे इस तरह रखूँगा: कोड की प्रत्येक पंक्ति में एक उच्च लागत है जो इसके साथ जुड़ी हुई है। इसलिए, कोड को कम करके लागत को कम करें। अनावश्यक कोड हटाना उतना ही उत्पादक (शायद अधिक उत्पादक) है जितना कि नया कोड लिखना।
क्रिस्टोफर जॉनसन

26

ठोस और KISS / YAGNI सिद्धांतों के पास ध्रुवीय विपरीत हैं। एक आपको बताएगा कि यदि doSomething () को नौकरी के अभिन्न अंग के रूप में उचित नहीं ठहराया जा सकता है जो कॉल करता है वह कर रहा है, यह एक अलग वर्ग में होना चाहिए जो शिथिल युग्मित और इंजेक्शन है। दूसरा आपको बताएगा कि अगर यह एक जगह है, तो डोसोमेटिंग का उपयोग किया जाता है, यहां तक ​​कि इसे एक विधि में निकालने से ओवरकिल हो सकता है।

यह वही है जो अच्छे प्रोग्रामर को सोने में उनके वजन के लायक बनाता है। "उचित" संरचना एक केस-बाय-केस आधार है, जिसमें वर्तमान कोडबेस, कार्यक्रम के भविष्य के मार्ग और कार्यक्रम के पीछे व्यवसाय की जरूरतों के ज्ञान की आवश्यकता होती है।

मैं इस सरल तीन-चरण पद्धति का पालन करना पसंद करता हूं।

  • पहली पास पर, यह काम करते हैं।
  • दूसरे पास पर, इसे साफ करें।
  • तीसरे पास पर, इसे SOLID करें।

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

उदाहरण: आपको कंसोल को टेक्स्ट की एक सरल रेखा लिखने की आवश्यकता है। पहली बार ऐसा होता है, Console.WriteLine () बस ठीक है। फिर आप नई आवश्यकताओं के बाद भी आउटपुट कोड में एक ही लाइन लिखने के लिए इस कोड पर वापस आते हैं। इस सरल उदाहरण में, बहुत अधिक दोहरावदार "कॉपी / पेस्ट" कोड (या शायद वहां नहीं है) नहीं हो सकता है, लेकिन आप अभी भी कुछ बुनियादी सफाई कर सकते हैं, हो सकता है कि गहरे व्यापार तर्क में आईओ संचालन को रोकने के लिए एक या दो तरीके निकालें। । उसके बाद, आप वापस आते हैं जब ग्राहक एक निगरानी सर्वर के लिए नामित पाइप के समान पाठ आउटपुट चाहता है। अब, यह आउटपुट दिनचर्या एक बड़ी बात है; आप एक ही पाठ को तीन तरीकों से प्रसारित कर रहे हैं। यह एक एल्गोरिथ्म का पाठ्यपुस्तक उदाहरण है जो एक समग्र पैटर्न से लाभान्वित होगा; लिखें () विधि के साथ एक सरल IWriter इंटरफ़ेस विकसित करें, ConsoleWriter, FileWriter और NamedPipeWriter क्लासेस बनाने के लिए उस इंटरफ़ेस को लागू करें, और एक "MultiWriter" कम्पोजिट क्लास बनाने के लिए एक बार, फिर अपनी क्लास पर एक IWriter निर्भरता को उजागर करें, तीन वास्तविक लेखकों के साथ MultiWriter कंपोज़िट सेट करें और इसे प्लग इन करें। अब, यह बहुत अच्छा है; इस बिंदु से, जब भी आवश्यकताएं यह निर्धारित करती हैं कि आउटपुट कहीं भी नया होना चाहिए, तो आप बस एक नया IWriter बनाएं और इसे MultiWriter में प्लग करें, किसी भी मौजूदा काम कोड को छूने की आवश्यकता नहीं है।


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

2
@Wayne M - यह निश्चित रूप से जलप्रपात SDLC या कम समय के परिदृश्यों में हो सकता है। उन मामलों में, समय सीमा के अनुसार मूल ऐनक के अनुसार काम करवाना, जो मूल्यवान है, कोड की स्थिरता नहीं है। यदि आप स्रोत कोड की गुणवत्ता को महत्व देना चाहते हैं, तो आपको केवल रिफैक्टरिंग के लिए समय निर्धारित करना चाहिए। बहुत कुछ अगर आप लिखित जानकारी के उत्पादन से जुड़े किसी अन्य काम में सामग्री की गुणवत्ता को महत्व देते हैं, तो आप प्रूफिंग और संपादन के लिए समय का निर्माण करते हैं।
कीथ्स

आपकी प्रारंभिक पंक्ति भ्रामक है - आप कहते हैं कि वे विरोध कर रहे हैं, तो उन्हें एक साथ इस्तेमाल करने का सबसे अच्छा तरीका बताएं। मुझे नहीं पता कि मुझे खराब लाइन के लिए डाउनवोट होना चाहिए या अच्छी सलाह के लिए अपवोट करना चाहिए।
सीन मैकमिलन

1
मुझे नहीं लगता कि मैंने खुद का खंडन किया। वे निकट-ध्रुवीय विरोधी हैं; एक या दूसरे के लिए धार्मिक पालन अनिवार्य रूप से दूसरे की अस्वीकृति का मतलब होगा। इसका मतलब यह नहीं है कि वे परस्पर अनन्य हैं, हालांकि; आपको या तो कार्यप्रणाली के लिए 100% का चयन करने की आवश्यकता नहीं है। यह शेष उत्तर की बात थी; जब आप ऐसा करते हैं तो प्रत्येक सिद्धांत के निष्कर्ष से देना और लेना एक संतुलन कैसे बनाते हैं?
कीथ्स

वास्तव में अच्छी प्रक्रिया: काम करता है, साफ, ठोस। मुझे आश्चर्य है कि अगर इस का एक संग्रह "पहले हैक किए गए प्रोटोटाइप के बिना कुछ भी कोशिश और इंजीनियर नहीं है"।
स्टीव बेनेट

17

अच्छा कोड जो केवल A कर सकता है बुरा कोड से भी बदतर है जो A, B, C, D कर सकता है।

1) एक कोड है जो केवल वही करना है जो करना चाहिए।

अगर मुझे ऐसा लगता है कि यह कोड का टुकड़ा निकटतम भविष्य में बड़ा होने की संभावना है, तो मैं एब्सट्रैक्ट को जोड़ने, इस कार्यक्षमता को कहीं और स्थानांतरित करने के बारे में सोचूंगा।

2) यदि आप A, B, C और D करने के लिए अपने कोड की योजना बनाते हैं, तो ग्राहक अंततः आपसे E के लिए पूछेगा।

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

मैं आपको एक अच्छी पुस्तक पढ़ने का सुझाव देता हूं: द प्रोगैमैटिक प्रोग्रामर । यह आपके दिमाग को खोल देगा और आपको सिखाएगा कि आपको क्या करना चाहिए और आपको क्या नहीं करना चाहिए।

इसके अलावा कोड कंप्लीट एक उपयोगी संसाधन से भरा एक बेहतरीन संसाधन है जिसे हर डेवलपर (केवल प्रोग्रामर को) को पढ़ना चाहिए।


12

बहुत समय मुझे एक सरल कोड लिखने की आवश्यकता है, मैं भविष्य के बारे में सोचता हूं

शायद यहाँ समस्या है।

शुरुआती चरणों में, आपको पता नहीं है कि अंतिम उत्पाद क्या होगा। या यदि आपके पास है, तो यह गलत है। पक्का। यह एक 14 साल के लड़के की तरह है जिसने कुछ दिन पहले प्रोग्रामर्स से पूछा था। यदि वह अपने भविष्य के करियर के लिए, वेब ऐप्स के बीच चयन करें और मुझे याद नहीं है तो और क्या है: यह स्पष्ट है कि कुछ वर्षों में, चीजें वह पसंद करेगा, वह अन्य डोमेन, आदि द्वारा रुचि रखेगा।

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

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

याद रखें: बड़ा कोडबेस का अर्थ है अधिक रखरखाव। जब आप इससे बच सकें तो अधिक कोड न लिखें।

आपका दृष्टिकोण अन्य पक्षों पर भी हानिकारक है:

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

  • डिबगिंग करते समय, छोटे स्टैक ट्रेस करना आसान नहीं होता है, या क्या आप यह जानने के लिए दर्जनों लाइनों को पढ़ना पसंद करते हैं कि क्या कहा जा रहा है?

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


"दर्जनों अर्ध-खाली वर्गों" का अतिरिक्त नुकसान है कि यह समझने के लिए पर्याप्त सामग्री नहीं है कि ये कक्षाएं किस लिए अच्छी हैं।
gnasher729

5

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


3

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


3

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

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

दुखद सच यह है कि अक्सर बेवकूफ / अंधेरे पक्ष रास्ता है जिस तरह से आपको चलना है, आपको बस हल्के से चलना सुनिश्चित करना है। मुझे धीरे-धीरे और दुःख हुआ कि प्रोग्रामर जो सॉफ्टवेयर लिखने का सही तरीका समझते हैं , अर्थात, SOLID का अनुसरण करते हुए, डिज़ाइन पैटर्न का उपयोग करते हुए, SoC का पालन करते हैं, आदि क्लूलेस हैक्स की तुलना में बहुत कम सामान्य हैं जो ifबग को ठीक करने के लिए एक स्टेटमेंट लिखेंगे , और जब कभी-कभी सोचने के बजाय उस कथन पर अधिक बग उत्पन्न होते हैं "शायद ऐसा करने का एक बेहतर तरीका है" और कोड को ठीक से एक्स्टेंसिबल होने के लिए फिर से भरना।


3
ifएक बहुत अधिक तुलना में आसान बनाए रखने के लिए है IAbstractBugFixerएक से IAbstractBugFixerFactory। जब, और, IF, आपको दूसरा जोड़ने के लिए मिलता है if, तो यह रिफलेक्टर करने का समय है। आर्किटेक्चर चरण के दौरान डिज़ाइन पैटर्न और SOLID बहुत महत्वपूर्ण हैं, लेकिन तब नहीं जब उत्पाद पहले से ही चल रहा हो और एक शैली में लिखा हो, जिस पर सभी टीम के सदस्य सहमत हों।
कोडर

@ कोडर मान लें कि वास्तुकला किसी भी समय नहीं बदल सकता है। यह कर सकता है और करता है।
रिकी क्लार्कसन

1
वेन एम, मैं आपके काम की स्थितियों के साथ सहानुभूति रख सकता हूं। फोर्स के साथ रहें। :)
जेनिफर एस

3

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

मैं आपकी स्थिति को देखूंगा और ये प्रश्न पूछूंगा:

  1. क्या यह कोड सामान है जो मिशन क्रिटिकल है, और अगर मैं फिर से कोड करूं तो क्या यह अधिक स्थिर होगा? सर्जरी में बोलते हुए, क्या यह रीफ़ेक्टिंग जीवन भर है, या यह केवल वैकल्पिक और कॉस्मेटिक है?

  2. क्या मैं ऐसे रिफलेक्टरिंग कोड पर विचार कर रहा हूं जिसे हम 6 महीने में बदलने जा रहे हैं?

  3. क्या मैं भविष्य के डेवलपर्स के लिए डिजाइन और मेरे तर्क के दस्तावेजीकरण में उतना ही समय लेने के लिए तैयार हूं जितना कि मैं रिफैक्टरिंग करने में खर्च करने के लिए हूं?

  4. भविष्य की विशेषताओं को जोड़ने के लिए मेरे सुरुचिपूर्ण डिजाइन के बारे में, क्या यह कोड में है कि उपयोगकर्ता हर सप्ताह परिवर्तन का अनुरोध करते हैं, या क्या यह पहली बार है जब मैंने इसे इस साल छुआ है?

बार जहां YAGNI और KISS दिन जीत रहे हैं, लेकिन वहाँ दिनों जहां एक मूलभूत परिवर्तन आप crappiness करने के लिए नीचे सर्पिल उतरना होगा। जब तक आप जो चाहते हैं, उसके मूल्यांकन में आप वास्तविक हैं, लेकिन जब तक आपको अपना काम बनाए रखने के लिए दूसरों को क्या करना होगा, आप बेहतर तरीके से यह निर्धारित कर पाएंगे कि कौन सी स्थिति है। ओह, और यह मत भूलना कि आपने क्या किया, और क्यों किया। यह उन लोगों को बचाएगा जो आपके पीछे आते हैं, लेकिन खुद भी जब आपको बाद में वापस आना होता है।


3

Stroustrups के दूसरे संस्करण में 'C ++ प्रोग्रामिंग लैंग्वेज', (मेरे पास पेज उपलब्ध नहीं है) मैंने पढ़ा

अनायास जगह में कोड न जोड़ें।

और मैं सलाह के बाद अच्छा हुआ। बेशक ट्रेडऑफ़ हैं, और आपको एक संतुलन ढूंढना होगा, लेकिन बड़े स्पैगेटी मेस की तुलना में छोटे टुकड़े बेहतर परीक्षण योग्य हैं।

मैंने अक्सर अनुभव किया, कि एक मामले से दो मामलों में अंतर करते समय, यदि आप 2 के बारे में एन-केस के रूप में सोचते हैं, तो आप कई नई संभावनाओं के लिए एक दरवाजा खोलते हैं, जिसके बारे में आपने नहीं सोचा होगा।

लेकिन फिर आपको YAGNI से सवाल पूछना होगा: क्या यह इसके लायक है? क्या यह वास्तव में उपयोगी होगा? अनुभवी होने का मतलब है, कि आप शायद ही कभी गलत होंगे, और शुरुआती के रूप में अधिक बार गलत होंगे।

आपको एक पैटर्न को पहचानने और यह पता लगाने के लिए पर्याप्त महत्वपूर्ण होना चाहिए कि क्या आपका कोड बनाए रखना कठिन है, बहुत अधिक अमूर्त होने के कारण, या बनाए रखने के लिए कठिन है, क्योंकि सब कुछ जगह में हल हो गया है।

समाधान यह या वह नहीं है, लेकिन इसके बारे में सोचना है। :)


2

"अच्छा कोड जो केवल A कर सकता है वह बुरे कोड से भी बदतर है जो A, B, C और D कर सकता है।"

यह उत्पाद विकास में कुछ समझ बना सकता है; लेकिन अधिकांश आईटी पेशेवर उत्पाद के विकास के बजाय 'प्रोजेक्ट' में काम करते हैं।

'आईटी प्रोजेक्ट्स' में, यदि आप एक अच्छा डेटासेटनेट प्रोग्राम करते हैं, तो यह प्रोजेक्ट के लाइफ टाइम के लिए सुचारू रूप से कार्य करेगा - जो कि 5 या 10 साल से अधिक समय तक नहीं चल सकता है, तब तक व्यापार परिदृश्य अप्रचलित हो सकता है और एक नया प्रोजेक्ट / ईआरपी उत्पाद ने इसे बदल दिया होगा। इस 5/10 वर्ष के जीवन काल के दौरान, जब तक कि आपके कोड में हर्ट दोष न हों, कोई भी यह नोटिस नहीं करेगा कि यह अस्तित्व है और आपके सर्वोत्तम विचारों की खूबियों पर किसी का ध्यान नहीं गया है! (जब तक आप अपने खुद के तुरही को दांव लगाने में अच्छे नहीं हैं!)

बहुत से लोगों को 'विंडोज सीटीएल + ऑल्ट + डेल' प्रोग्राम करने का मौका नहीं मिलता है और उन कुछ को मौका मिलता है कि वे अपने कोड की भविष्य की क्षमता का एहसास नहीं कर सकते हैं!


1

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


1

यह मजेदार है कि लोग चीजों को करने के सही तरीके / गलत तरीके के बारे में कैसे बात करते हैं। उसी समय प्रोग्रामिंग का कार्य अभी भी कठिन रूप से कठिन है, और बड़े जटिल सिस्टम को लिखने के लिए कोई अच्छा समाधान नहीं देता है।

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


1
ज्यादातर मामलों में, आपके पास रिफैक्टरिंग के लिए कुछ विशेष समय कभी नहीं होगा - यही शायद इन सभी के लिए मुख्य कारण है "हम इसे फिर से लागू किए बिना इसे लागू नहीं कर सकते हैं" ;-) आप या तो इसे शुरू से ही सही तरीके से करते हैं। , या आप इसे हर समय गलत तरीके से करते हैं।
एंड्री एगिबालोव 14

@ loki2302: याद रखें कि नया कोड लिखना हमेशा आसान होता है। बेवकूफ कोड को प्रोटोटाइप करते समय आप दो बार तेज होंगे, जिसके बाद आपकी उत्पादकता लगभग आधे समय तक शून्य हो जाएगी। तो अंत में आप अभी भी उतने ही तेज होंगे जैसे प्रोग्रामर सही तरीके से डिजाइन करने की कोशिश कर रहे हैं ..
AareP

1

समय से पहले सामान्यीकृत डिजाइनों को देखने के बाद, जो बाद में आई वास्तविक आवश्यकताओं के अनुकूल नहीं थे, मैंने मेरे लिए एक नियम तैयार किया:

काल्पनिक आवश्यकताओं के लिए केवल काल्पनिक कोड लिखते हैं।

वह यह है: आपको अच्छी तरह से उन परिवर्तनों के बारे में सोचने की सलाह दी जाती है जो बाद में हो सकते हैं। लेकिन केवल इन अंतर्दृष्टि का उपयोग कोड के लिए एक डिज़ाइन चुनने के लिए किया जा सकता है जिसे आसानी से बदला और बदला जा सकता है यदि वे आवश्यकताएं वास्तव में सामने आती हैं। आप अपने सिर (काल्पनिक कोड) में कुछ कोड भी लिख सकते हैं, जिसे आप उस स्थिति में लिखना चाहते हैं, लेकिन कोई वास्तविक कोड न लिखें!


0

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

कई प्रोग्रामर ने पाया है कि अमूर्त लगभग अपने दम पर उभरता है, जब वे अपने कोड को DRY करते हैं। डिज़ाइन पैटर्न और सर्वश्रेष्ठ अभ्यास आपको बस ऐसा करने के अवसर खोजने में मदद करते हैं, लेकिन खुद को लक्ष्य बनाने के लायक नहीं हैं।


0

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

मेरा मानना ​​है कि एक प्रोग्रामर हमेशा एक बेहतर स्थिति में तय करता है कि एक स्वयंसिद्ध की तुलना में कैसे अमूर्त किया जाए।

बाकी कीथ द्वारा पहले ही कहा जा चुका है


मुझे लगता है कि कोड लिखने के बारे में आत्म-सुरक्षा प्राप्त करने का एक तरीका एक लिनक्स सिस्टम पर जड़ के रूप में कोडिंग है। यदि आप विली-नीली, बूम टाइप करते हैं, तो आपको बस वीएम को फिर से जोड़ना होगा। सभी प्रकार की अच्छी आदतों को वास्तविक रूप से सिखाता है। सुनिश्चित करें कि आपका बॉक्स वास्तविक इंटरनेट में रहता है, और सुनिश्चित करें कि आप लॉग को देखते हैं। (ssh, http) वो भी असली मज़ा हैं!
क्रिस्टोफर महान सेप

मेरा संस्करण है: उन सिद्धांतों को अनदेखा करें जिन्हें आप नहीं समझते हैं। यदि आप उनका उपयोग करने का निर्णय लेते हैं, तो आप उन लोगों से अधिक गंभीरता से व्यवहार नहीं करेंगे, जो आप व्यायाम करेंगे।
सबॉफ

0

अपने आप से पूछें कि एक अच्छे डिजाइन के क्या फायदे हैं:

  • समझने में आसान
  • आसान बनाए रखता है
  • पोर्टेबल
  • लंबे समय तक उपयोगी रहता है
  • नई सुविधाओं को जोड़ने के लिए आसान

अब, अपने आप से पूछें कि क्या अमूर्तता की उन सभी परतों को जोड़ने से वास्तव में ऊपर वर्णित किसी भी बिंदु को जोड़ दिया जाएगा। यदि ऐसा नहीं होता है, तो आप इसे गलत कर रहे हैं ।

यदि आप इस तरह कोड की 3 पंक्तियों को जोड़कर एक नई सुविधाओं को जोड़ने में सक्षम हैं:

if (condition()) {
  doSomething()
}

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

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

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

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