मैं हमेशा इस तरह से महसूस करने से कैसे बच सकता हूं अगर मैं अपने कार्यक्रम को खरोंच से पूरी तरह से पुनर्निर्माण करता हूं तो मैं इसे बहुत बेहतर करूंगा? [बन्द है]


91

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

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


87
इसका सामान्य, अधिक कार्यक्रम
इवान



43
प्रोग्रामिंग में आपका स्वागत है। यदि आप पुराने कोड को नहीं देखते हैं और "urgh" सोचते हैं तो आपको चिंता करना शुरू कर देना चाहिए क्योंकि इसका मतलब है कि आपने सीखना बंद कर दिया है।
Caltor

9
ईमानदारी से जब मैंने इस सवाल को देखा, तो मुझे हंसी आई - क्योंकि सचमुच हर प्रोग्रामर जो मैंने कभी-न-कभी बोला है, अपने आप में, यह भावना है, लगातार, हर समय। यदि आप एक ऐसे क्षेत्र में जाना चाहते हैं जहाँ आपको लगता है कि आपके द्वारा किए गए अंतिम उत्पाद में कोई दोष नहीं था - प्रोग्रामिंग चुनने के लिए गलत क्षेत्र था।
Zibbobz

जवाबों:


4

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

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

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

यदि आप एक टीम का हिस्सा हैं, तो समीक्षा प्रक्रिया का होना डिजाइन प्रक्रिया के लिए महत्वपूर्ण है। क्या किसी ने आपके कोड की समीक्षा की है ताकि आप सीख सकें कि आपके डिज़ाइन को कैसे बेहतर बनाया जा सकता है।


100

यह एक बहुत ही सामान्य अनुभव है

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

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

"सभी के पास एक योजना है जब तक वे चेहरे पर मुक्का नहीं डालते।"

इसके बारे में क्या करना है

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

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


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

10
@DavidArno क्या मौजूद परीक्षणों के साथ refactoring की बात है? यह एक सिस्टम को अपग्रेड करने और ... 0 मज़े से पहले बैकअप देने जैसा है।
ड्यूज्यूर

3
@ Džuris, :) सच है, अगर आपको चुनौतियाँ पसंद हैं, तो टेस्ट मत लिखिए
डेविड अरनो

6
@ दंड यह एक पैराशूट पहने एक विमान से बाहर कूदने की तरह है!
जॉली जोकर

3
@jamesqf - कि TDD और यूनिट परीक्षण क्या करते हैं - यह एक गलत व्यवहार है - जैसे वे आपको बता सकते हैं कि आपका मॉडल या एल्गोरिथ्म सही तरीके से लागू किया गया है और जब आपने रिफ्लेक्टर किया है तो आपने कुछ भी नहीं तोड़ा है। वे आपको यह नहीं बता सकते कि आपका मॉडल वास्तव में उपयोगी है। यह एक वैज्ञानिक वातावरण में उतना ही सच है जितना कि किसी अन्य में।
एंट पी

46

Refactoring जानें - धीरे-धीरे कोड में सुधार करने की कला । हम सभी हर समय सीखते हैं, इसलिए यह महसूस करना बहुत सामान्य है कि आपने जो कोड खुद लिखा है, उसे बेहतर तरीके से लिखा जा सकता है।

लेकिन आपको खरोंच से शुरू किए बिना इन सुधारों को लागू करने के लिए मौजूदा कोड को बदलने में सक्षम होना चाहिए।


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

रिफैक्टरिंग के बारे में जानने के लिए मेरी राय में सबसे अच्छा शुरुआती बिंदु है: रिफैक्टिंग नई सुविधाओं के बारे में है
वाइल्डकार्ड

9

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

उस आनंदित मामले में भी, आप नई भाषा की विशेषताओं को सीख सकते हैं जिसने बेहतर डिजाइन बनाने में मदद की होगी।

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

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

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

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

हालांकि अंत में, स्वीकार करें कि परिवर्तन निरंतर है और "मैं इसे और बेहतर कर सकता था" कहती है। गर्व और खुश रहें कि आपने एक समाधान दिया।


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

3

मैं हमेशा इस तरह से महसूस करने से कैसे बच सकता हूं अगर मैं अपने कार्यक्रम को खरोंच से पूरी तरह से पुनर्निर्माण करता हूं तो मैं इसे बहुत बेहतर करूंगा?

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

लेकिन आश्चर्यचकित न हों, यदि एन वर्षों के बाद आप इस कोड पर वापस आते हैं, और "क्या गड़बड़ है" सोचें।


3
या, आप अपने बॉस को प्रोटोटाइप दिखाते हैं, वह कहता है 'ब्रिलिएंट, यही करेंगे।' आपको किसी अन्य प्रोजेक्ट पर ले जाता है और आपका प्रोटोटाइप उत्पादन हो जाता है।
रयानफाएस्कॉटलैंड

2
यह सलाह इतनी आम है कि इसके बारे में एक कहावत है। "एक को फेंक दो"। और उस सलाह का इतना दुरुपयोग किया गया है कि इसके बारे में एक कहावत है: "यदि आप एक को फेंकने के लिए निर्माण करते हैं, तो आप शायद दो को फेंक देंगे।"
एरिक लिपर्ट

2
@ EricLippert मेरा अनुभव विपरीत दिशा में भयानक रहा है - अगर हम एक को फेंकने के लिए बनाते हैं, तो यह अनिवार्य रूप से ग्राहक को भेज दिया जाता है।
जॉन

2
@Jon: हाँ, ऐसा हो सकता है, विशेष रूप से तब जब प्रबंधन की गलतियाँ "उपयोगकर्ता इंटरफ़ेस की तरह दिखता है कि यह काम करता है" वास्तव में वहाँ कोई भी कोड होने के साथ। उन्होंने कहा, मेरा अनुभव हमेशा से रहा है, क्योंकि मेरे एक सहकर्मी कहते थे "हमारे पास इसे दो बार गलत बनाने के लिए पर्याप्त समय है लेकिन इसे एक बार सही तरीके से बनाने के लिए पर्याप्त समय नहीं है"। :-)
एरिक लिपर्ट

@EricLippert यही कारण है कि पिछले जीयूआई का निर्माण करने का कारण है, और एक प्रोटोटाइप के लिए जीयूआई का निर्माण नहीं है;)
B 29овић

3

इस मंत्र को याद रखें:

पूर्ण ही अच्छे का शत्रु है

सही समाधान हमेशा नहीं है आदर्श समाधान। आदर्श समाधान एक जो स्थिति "पर्याप्त" काम के कम से कम राशि के साथ प्राप्त होता है।

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

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

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


3

मैंने पहले से चीजों की योजना बनाने की कोशिश की है, लेकिन जब तक मैं कुछ कोड को बाहर करना शुरू नहीं करता, तब तक मैं वास्तव में सब कुछ नहीं देख सकता।

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

क्या आपने फुर्तीले आंदोलन के बारे में सुना है? यह सोचने का एक तरीका है जहां हम "एक योजना का अनुसरण करने" (अन्य चीजों के अलावा) के विपरीत "परिवर्तन की प्रतिक्रिया" को महत्व देते हैं। यहाँ घोषणापत्र (यह एक त्वरित पढ़ने के लिए है)। आप बिग डिज़ाइन अप फ्रंट (BDUF) और क्या नुकसान हैं के बारे में भी पढ़ सकते हैं।

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

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

मुझे लगता है कि हम सभी सहमत हैं कि numpyसफल वैज्ञानिक कंप्यूटिंग सॉफ्टवेयर है। उनके इंटरफेस छोटे, सुपर प्रयोग करने योग्य हैं, और सब कुछ एक साथ अच्छी तरह से खेलते हैं। ध्यान दें कि numpyसंदर्भ गाइड स्पष्ट रूप से TDD: https://docs.scipy.org/doc/numpy-1.15.1/reference/testing.html की अनुशंसा करता है । मैंने SAR (सिंथेटिक एपर्चर रडार) इमेजिंग सॉफ्टवेयर के लिए अतीत में TDD का उपयोग किया है: और मैं यह भी दावा कर सकता हूं कि यह उस विशेष डोमेन के लिए बहुत अच्छा काम करता है।

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

मैं हमेशा इस तरह से महसूस करने से कैसे बच सकता हूं अगर मैं अपने कार्यक्रम को खरोंच से पूरी तरह से पुनर्निर्माण करता हूं तो मैं इसे बहुत बेहतर करूंगा?

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

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

HTH।


2

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

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

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


1

यहां अन्य उत्कृष्ट उत्तरों को जोड़ने के लिए, एक चीज जो मुझे मददगार लगती है, वह है यह जानना कि आप कहां पाना चाहते हैं

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

इसमें लंबा समय लग सकता है, लेकिन अधिकांश चरणों में कोड में सुधार होगा, और अंतिम परिणाम इसके लायक होगा।

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


1

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

चूंकि सॉफ्टवेयर विकास वास्तव में केवल 90 के दशक में मुख्यधारा बन गया, इसलिए यह लगभग 30 साल पुराना है। हमने सीखा है कि यह एक सामाजिक विज्ञान के रूप में एक इंजीनियरिंग अनुशासन नहीं है, और हमने केवल शुरुआत की है।

हां, आप टीडीडी, रीफैक्टरिंग, फंक्शनल प्रोग्रामिंग, रिपॉजिटरी पैटर्न, इवेंट सोर्सिंग, एमवी कुछ, जावा स्क्रिप्ट (<यह करें, यह पागल है), मॉडल बाइंडिंग, नो एसक्लल, कंटेनर, एजाइल, एसक्यूएल (<- कोशिश करेंगे) यह शक्तिशाली है)।

कोई एक तय नहीं है। यहां तक ​​कि विशेषज्ञ अभी भी तिनके पर लोभी हैं।

आपका स्वागत है, और चेतावनी दी है, यह एक अकेला स्थान है; लेकिन बिल्कुल आकर्षक।


1

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

आपका अनुभव लंबे समय तक मेरा था, लेकिन हाल ही में (पिछले कुछ वर्षों में), मैं अधिक कोड का उत्पादन कर रहा हूं जिससे मुझे ऐसा महसूस नहीं होता कि मुझे सब कुछ फेंकने की आवश्यकता है। यहाँ मोटे तौर पर मैंने क्या किया है:

  1. कोड के किसी विशेष ब्लॉक को कौन सी धारणाएं बना रहा है, इसके बारे में स्पष्ट रहें। यदि वे मिले नहीं हैं, तो त्रुटियों को फेंक दें। बाकी सॉफ्टवेयर क्या कर रहा है, इसके बारे में विवरण के आधार पर, अलगाव के बारे में सोचें । (बाकी सॉफ्टवेयर क्या प्रभाव डाल रहा है, आप किन मान्यताओं को लागू करते हैं और आप किन मामलों का समर्थन करते हैं, लेकिन यह इस बात को प्रभावित नहीं करता है कि जब आप किसी धारणा का उल्लंघन करते हैं तो क्या आप एक त्रुटि फेंकते हैं।)
  2. निम्नलिखित नियमों और प्रतिमानों और प्रथाओं पर विश्वास करना बंद करें, अच्छे कोड का उत्पादन होगा। स्पष्ट और सीधा नहीं है कि मानसिकता और प्रथाओं को दूर फेंक दें। यह एक बहुत बड़ा था। ओओ और टीडीडी को आमतौर पर ऐसे तरीकों से पढ़ाया जाता है जो व्यावहारिक विचारों के आधार पर नहीं होता है, सार सिद्धांतों के एक सेट के रूप में आपको लेखन कोड का पालन करना चाहिए। लेकिन यह वास्तव में अच्छे कोड के विकास के लिए पूरी तरह से अनपेक्षित है। यदि आप OO या TDD का उपयोग करते हैं, तो इसे आपके द्वारा समझी जाने वाली समस्याओं के समाधान के रूप में उपयोग किया जाना चाहिए । दूसरे शब्दों में, उनका उपयोग केवल तब किया जाना चाहिए जब आप किसी समस्या को देखते हैं और सोचते हैं, "ठीक है, यह पूर्ण समझ में आता है और एक अच्छे समाधान के रूप में बेहद स्पष्ट है।" पहले नहीं।
  3. जब मैं कोड लिख रहा हूं, तो दो प्रश्नों पर ध्यान दें:
    • क्या मैं सुविधाओं और पुस्तकालयों का उपयोग कर रहा हूं जिस तरह से वे डिजाइन किए गए थे ? इसमें उन समस्याओं के प्रकारों का उपयोग करना शामिल है जिन्हें हल करने का इरादा था, या कम से कम बहुत समान हैं।
    • क्या यह सरल है ? क्या मेरे सहकर्मी और खुद बाद में तर्क का आसानी से पालन कर पाएंगे? क्या ऐसी चीजें हैं जो कोड से तुरंत स्पष्ट नहीं हैं?

मेरा कोड अब अधिक "प्रक्रियात्मक" है, जिसके द्वारा मेरा मतलब है कि यह किन क्रियाओं द्वारा आयोजित किया जाता है बजाय इसके कि यह डेटा संरचनाओं का उपयोग करता है। मैं उन भाषाओं में वस्तुओं का उपयोग करता हूं जहां स्टैंडअलोन फ़ंक्शन को मक्खी पर प्रतिस्थापित नहीं किया जा सकता है (C # और जावा फ्लाई पर फ़ंक्शन को प्रतिस्थापित नहीं कर सकता है, पायथन कर सकते हैं)। मेरे पास अब अधिक उपयोगिता वाले कार्यों को बनाने की प्रवृत्ति है , बस कुछ कष्टप्रद बॉयलरप्लेट को रास्ते से हटा दें ताकि मैं वास्तव में अपने कोड के तर्क को पढ़ सकूं। (जैसे, जब मुझे किसी सूची में आइटम के सभी संयोजनों को संसाधित करने की आवश्यकता होती है, तो मैंने इंडेक्स लूपिंग को एक विस्तार विधि से बाहर निकाल दिया, जो रिटर्न करता हैTupleऐसा इसलिए है कि मूल फ़ंक्शन उन कार्यान्वयन विवरणों के साथ बंद नहीं किया जाएगा।) मैं फ़ंक्शन के मापदंडों के रूप में बहुत अधिक चीजें पास करता हूं, इसके बजाय एक फ़ंक्शन को लाने के लिए किसी अन्य ऑब्जेक्ट तक पहुंच जाता है। (कॉल करने वाला इसके बजाय इसे प्राप्त करता है या बनाता है।) अब मैं और टिप्पणियां छोड़ता हूं जो उन चीजों को समझाते हैं जो कोड को देखने से स्पष्ट नहीं हैं , जो एक विधि के तर्क को आसान बनाता है। मैं केवल सीमित मामलों में परीक्षण लिखता हूं जहां मैं सिर्फ मेरे द्वारा बनाई गई किसी चीज के तर्क के बारे में चिंतित हूं, और मैं मोक्स का उपयोग करने से बचता हूं। (मैं तर्क के अलग टुकड़े के बारे में अधिक इनपुट / आउटपुट परीक्षण करना।) परिणाम कोड है कि नहीं है सही है, लेकिन है कि वास्तव में लगता है ठीक है, 2 या 3 साल बाद भी। यह कोड है कि बदलने के लिए काफी अच्छी तरह से प्रतिक्रिया करता है; पूरी व्यवस्था के टूटने के बिना मामूली चीजों को जोड़ा या हटाया या बदला जा सकता है।

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


0

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

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

मेरे पास बहुत सारी परियोजनाएं हैं, दोनों काम और व्यक्तिगत हैं, जो एक पोर्ट / पुनर्लेखन से लाभान्वित होंगे। मेरे पास करने के लिए अन्य चीजें भी हैं।


0

यह सीखने का एक पूरी तरह से सामान्य हिस्सा है। आपके जाते ही गलतियों का एहसास होता है।

यह है कि आप कैसे बेहतर होते हैं और यह ऐसा कुछ नहीं है जिससे आपको बचना चाहिए।


0

आप खुद को यह जानने के लिए अनुभव दे सकते हैं कि आम तौर पर फिर से लिखने का मोहक अनुत्पादक है। मध्यम जटिलता की कुछ पुरानी, ​​बालों वाली, अशुभ ओपन सोर्स परियोजना खोजें। इसे खरोंच से फिर से लिखने की कोशिश करें और देखें कि आप कैसे करते हैं।

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

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

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