क्या कोई कोड लिखे हुए दिनों के लिए एक डिज़ाइन समस्या के बारे में सोचना सामान्य है? [बन्द है]


52

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

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


9
यह समस्या और आपकी व्यक्तिगत विचार प्रक्रिया पर अत्यधिक निर्भर करता है। यदि आप अपनी समय सीमा को पूरा करते हैं, तो इससे कोई फर्क नहीं पड़ता कि आपने कितना समय सोचने और कितनी कोडिंग में बिताया।
यानिस

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

2
बल्कि लगता है कि एक बुरा डिजाइन को लागू करने की तुलना में दिनों के लिए डिजाइन जल्दी
Chani

4
हाँ यही है! और कभी-कभी मैं उस कोड को देखता हूं जो मैंने पहले ही लिखा है और काश मैंने इसे लिखने से पहले डिजाइन के बारे में अधिक सोचा होता :-) :-)
जियोर्जियो

2
कंप्यूटर विज्ञान, विडंबना यह है कि अक्सर कंप्यूटर से स्वतंत्र होता है
रयान काइल

जवाबों:


60

जिस समस्या को आप हल करने का प्रयास कर रहे हैं, उसके आधार पर, डिज़ाइन का चरण सप्ताह और महीनों (यदि वर्ष नहीं) हो सकता है, न कि केवल दिन।

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


1
साल के लिए +1। एक समूह के साथ शामिल था जहां अगले कमरे में एक टीम थी जो 5 साल के लिए एक नई प्रणाली के लिए इकट्ठा होने वाली आवश्यकताओं में शामिल थी, जिसकी कोई दृष्टि नहीं थी। हमने गंभीरता से संदेह जताया कि क्या उन्हें कभी और मिलेगा।
jwenting

8
@jwenting ... यह भी अच्छा नहीं है, उन लोगों को शायद टाइप करना शुरू कर देना चाहिए।
ग्रैडी प्लेयर

8
@ जेंटिंग, हाँ, कि झरना विधि कहा जाता है, और उनमें से हर एक को निकाल दिया जाना चाहिए। यदि आप यह पता नहीं लगा सकते हैं कि आप एक साल में क्या करने की कोशिश कर रहे हैं, तो आप इसे कभी भी बाजार में नहीं ला पाएंगे, इससे पहले कि तकनीक अप्रचलित हो जाए।
रिवलॉक

1
मैं भय क्या होता अगर वे कोड मंथन शुरू कर दिया था, वे कोई तकनीकी जानकारी के साथ सभी व्यापार विश्लेषक थे कैसे जो भी :)
jwenting

24

इसे आमतौर पर "विश्लेषण पक्षाघात" के रूप में जाना जाता है

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

व्यावहारिक प्रोग्रामर विशेष रूप से अध्याय 2 "ट्रेसर बुलेट्स" पर अनुभाग पढ़ने की सिफारिश की


12
यह मानने में आप गलत हैं कि अपना सिस्टम डिजाइन करने में समय बिताना गलत है। कुछ तुच्छ के लिए, दिन लंबे समय की तरह लग सकता है, बड़ी प्रणालियों के लिए जो हजारों या सैकड़ों हज़ारों लाइनों की कोडिंग करेगा, यह बहुत कम समय का है, यहां तक ​​कि कागज पर बुनियादी वास्तुकला भी प्राप्त कर सकता है।
jwenting

3
समय बिताया सोच सीधे मुद्दे की जटिलता से संबंधित है। लेकिन अगर वह "मेरे आईडीई में लिखे गए किसी भी ठोस कोड को प्राप्त नहीं करने के लिए नर्वस है" तो मुझे लगता है कि इसकी शुरुआत करने के लिए उसे सुरक्षित मान लेना चाहिए।
मोरोंस

7
मैं किसी भी तरह से नहीं था "अपने सिस्टम को डिजाइन करने में समय बिताने के लिए गलत"
मोरोन्स

4
@ मॉरन्स: इससे कोई फर्क नहीं पड़ता कि आप क्या कहते हैं, क्या मायने रखता है जो लोग सुनते हैं, और लोगों ने आपको यह कहते हुए सुना है कि ओपी जो कर रहा है वह गलत है।
whatsisname

5
"विश्लेषण पक्षाघात" शब्द का अर्थ है कि एक निर्णय का विश्लेषण करने में अधिक समय खर्च किया जा रहा है। यह वास्तव में एक वास्तविक समस्या है, लेकिन यह मूल स्थिति से बिल्कुल स्पष्ट नहीं है यदि वर्तमान स्थिति में ऐसा है। यदि आप यह सोचने के लिए कुछ दिन बिता रहे हैं कि किसी स्ट्रिंग को उलटने के लिए फ़ंक्शन कैसे लिखना है, तो यह है विश्लेषण पक्षाघात। यदि आप शुरू करने से पहले एक नया सी ++ संकलक लिखने के बारे में सोचने में कुछ दिन बिता रहे हैं, तो कम से कम आप ऐसा कर सकते हैं।
पीटरएलेनवेब

10

यह पूरी तरह से सामान्य है। हालाँकि यदि आप "टेस्ट फर्स्ट" या टीडीडी दृष्टिकोण लेते हैं, तो यह कम सामान्य है और इससे आपको अपने विचारों को बेहतर बनाने में मदद मिल सकती है।


5

आदतें आम तौर पर चीजों के लिए परीक्षण और त्रुटि दृष्टिकोण का परिणाम है और जो हमें वांछित परिणाम देता है और जो नहीं करता है उसे जारी रखने का परिणाम है। हम जो पसंद करते हैं और जिसे नापसंद करते हैं उससे बचना भी खेल में आता है। यह एक बिंदु तक काम करता है क्योंकि अंततः, हम कुछ ऐसा काम करेंगे जो हमें किराए का भुगतान प्राप्त करने के लिए पसंद नहीं है।

यह निर्भर करता है कि आप इसे और आपके कारणों के लिए क्या ले जाते हैं। यहाँ कुछ है:

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

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

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


4

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

यह एक प्राकृतिक घटना है और एक डेवलपर के लिए उसके दिमाग के समय और बीच में अवरोधन करने के लिए अच्छा है।


4

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


4

मेरे विचार में, तीन दृष्टिकोण हैं, प्रत्येक एक विशिष्ट कोडिंग स्थिति के लिए अनुकूल है

  1. मैंने एक समान समस्या देखी है, इसलिए मुझे पैटर्न लागू करने का बहुत अच्छा विचार है, और इसका समाधान कैसे व्यवहार करना चाहिए और इसका जवाब देना चाहिए।

    => इच्छित समाधानों से शुरू होकर कोड तक काम करने वाले BDD / TDD का उपयोग करें। (ठीक है, कभी-कभी मैं धोखा देता हूं और थोड़ा कोड लिखता हूं और फिर परीक्षण - एक नेस्टेड 2 का - 2.> 1. दृष्टिकोण)।

  2. मुझे लागू करने के लिए पैटर्न का अच्छा विचार है, लेकिन मुझे यकीन नहीं है कि समाधान कैसा दिखना चाहिए।

    => प्रोटोटाइप यह देखने के लिए कि किस प्रकार की दिलचस्प चीजें पॉप आउट होती हैं। 1. जब मैं यह पता लगाता हूं कि कौन सी दिलचस्प चीजें वांछित हैं।

  3. मुझे यकीन नहीं है कि क्या पैटर्न लागू करने के लिए।

    => इसके बारे में सोचें कि समस्या और समस्या के विभिन्न तरीके कोड को कैसे प्रभावित करते हैं। उस अभ्यास के परिणाम के आधार पर 2) या 1) पर जाएं।

दूसरे शब्दों में, उत्तर इंजीनियर का पसंदीदा है: यह निर्भर करता है।


3

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


2

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

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

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


1

जैसा कि सत्चेल पैगे ने कहा, "कभी-कभी मैं बैठता है और सोचता हूं, और कभी-कभी मैं बस बैठता है।"

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

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


1

कार्यक्रम = एल्गोरिथम + डेटा संरचना

IMHO, डिजाइन (समस्या को हल करना) पूरी तरह से नियमों की प्रक्रिया करता है। कार्यान्वयन (तकनीकी समस्या) विवरण स्वाभाविक रूप से अनुसरण करते हैं और हल करते हैं।


मुझे वास्तव में वह सरलीकृत समीकरण पसंद है। +1
किम जोंग वू

1

यहाँ मेरा विचार मामला है।

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

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

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

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


0

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


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

@ Stargazer712: मैं पूरी तरह से सहमत हूं। इसलिए मैंने कहा कि आपको कम से कम नैपकिन विचार की आवश्यकता है कि आप क्या करने जा रहे हैं। हालांकि, जिस तरह से यह सवाल पूछा गया था कि मैं सबसे जोखिम भरा / उपन्यास / दिलचस्प विशेषताओं के प्रोटोटाइप को धमाके करने की कोशिश करने से पहले औपचारिक या नौकरशाही बैठकों के दिनों या हफ्तों को चित्रित कर रहा था।
dsimcha

0

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

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


0

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


2
और पर्याप्त विवरणों पर ध्यान केंद्रित न करना आपको कहीं न कहीं ले जा सकता है जो कहीं नहीं है।
डुबोना

@ डंक मैंने तीन शब्दों का उपयोग किया: समय से पहले, हर, विवरण पर ध्यान केंद्रित करने के बारे में एकल। मैंने कीबोर्ड को तुरंत पाउंड करने के लिए नहीं कहा, ड्रिफ्ट मैन को प्राप्त करें।
सैयद अकील आशिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.