हम सॉफ्टवेयर के डिजाइन को अधिक प्रभावी ढंग से क्यों नहीं पकड़ सकते? [बन्द है]


14

इंजीनियरों के रूप में, हम सभी कलाकृतियों (इमारतों, कार्यक्रमों, सर्किट, अणुओं ...) को "डिजाइन" करते हैं। यह एक गतिविधि (डिज़ाइन-टू-वर्ब) है जो किसी प्रकार का परिणाम (डिज़ाइन-ए-संज्ञा) पैदा करता है।

मुझे लगता है कि हम सभी इस बात से सहमत हैं कि डिजाइन-ए-संज्ञा कलाकृतियों की तुलना में एक अलग इकाई है।

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

मुझे लगता है कि सॉफ़्टवेयर के लिए एक डिज़ाइन है:

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

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

ऐसा क्यों है कि सॉफ्टवेयर के निर्माण के 50+ वर्षों के बाद, हमारे पास इसे व्यक्त करने के नियमित तरीके क्यों नहीं हैं? (स्पष्ट उदाहरणों के साथ मुझे विरोधाभासी महसूस कराएं

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

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

[मेरे अपने विचार हैं जो ऊपर दिए गए बुलेटप्रूफ दृश्य को दर्शाते हैं, लेकिन मैं अन्य लोगों के उत्तरों में दिलचस्पी लेता हूं ... और अपनी योजना को लागू करने के लिए कठिन है [[और शायद यही वास्तविक समस्या है: -]]]

EDIT 2011/1/3: एक उत्तर-सूत्र संकेत देता है कि "दस्तावेज़ीकरण" (संभवतः विशेष रूप से औपचारिक रूप से पाठात्मक नहीं) पर्याप्त हो सकता है। मुझे लगता है कि मुझे स्पष्ट करना चाहिए कि मुझे इस पर विश्वास नहीं है। 80 के दशक में शुरू होने वाले दृश्य पर CASE टूल दिखाई दिए, लेकिन शुरुआती टूल ने जो कुछ भी आकर्षित किया, उसके आरेखों के लिए केवल पिक्सेल पर कब्जा कर लिया; जबकि उपकरण यकीनन व्यावसायिक रूप से सफल थे, वे वास्तव में बहुत मददगार नहीं थे। एक प्रमुख अंतर्दृष्टि यह थी कि यदि अतिरिक्त "डिज़ाइन" कलाकृतियाँ औपचारिक रूप से व्याख्या योग्य नहीं हैं, तो आपको कोई गंभीर उपकरण सहायता नहीं मिल सकती है। मेरा मानना ​​है कि समान अंतर्दृष्टि डिजाइन कैप्चर के किसी भी दीर्घकालिक उपयोगी रूप पर लागू होती है: यदि इसे एक औपचारिक संरचना नहीं मिली है, तो यह किसी भी वास्तविक उपयोग की नहीं होगी। पाठ दस्तावेज़ बहुत इस परीक्षण में विफल।


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

मात्रा "यह कितनी अच्छी तरह से करता है"
स्टीवन ए। लोव

जब मैं सिस्टम का निर्माण करता हूं, तो मुझे बहुत सारी "नॉनफंक्शनल" आवश्यकताएं पूरी होती हैं: इस भाषा में कोडित , उस डेटाबेस का उपयोग करता है , 100 मी औसत प्रतिक्रिया समय के साथ 1E10 रिकॉर्ड संभालता है, ... आप इन्हें विनिर्देश से बाहर नहीं छोड़ सकते। (बिना किसी आवश्यकता के हमेशा के लिए लूप किसी भी कार्यात्मक कल्पना के लिए एक पर्याप्त कार्यक्रम है)। "डिज़ाइन" कैप्चर के बारे में मेरा पूरा कहना एक और गैर-जरूरी आवश्यकता को संभालने के लिए है: "मेंटेनेबल"।
इरा बैक्सटर

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

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

जवाबों:


8

मुझे लगता है कि कई कारण हैं कि हम अभी भी इस पर अच्छे नहीं हैं।

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

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

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

  4. इसलिए; यदि आपके पास सॉफ्टवेयर का सफल और सटीक मॉडल है, तो वह मॉडल सॉफ्टवेयर के समकक्ष होगा । कौन सा किसा पूरे प्रयास को व्यर्थ कर देता है, जो बदले में 1 अंक ऊपर की ओर corroborates करता है: सॉफ्टवेयर को मॉडलिंग करना बहुत कम उपयोगी है जो पहले सोचा था। इसके बजाय कोड से सॉफ़्टवेयर के बारे में डेटा निकालना बेहतर है। यूएमएल मॉडल बनाने से कोड वास्तव में कैसा दिखता है, यह यूएमएल मॉडल बनाने की तुलना में अधिक ज्ञानवर्धक है और उस सैद्धांतिक मॉडल को लागू करने की कोशिश कर रहा है।


2
अपने अंतिम बिंदु से सहमत न हों। हां, यह सॉफ़्टवेयर के बराबर होगा, लेकिन वास्तविक सॉफ़्टवेयर को रीफ़ैक्टर करने की तुलना में किसी मॉडल को फिर से डिज़ाइन करना अभी भी आसान है जब (यदि नहीं) तो आपको पता चला कि कुछ भी ऐसा नहीं है। मैं डिजाइनिंग कदम के महत्व को कम नहीं आंकूंगा।
जॉरिस मेस

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

@ लेन्नर्ट: टिप के लिए thx
जोरिस मेय्स

2
@ लेनार्ट: आपके और जॉब के बीच का अंतर यह है कि आप इस बात से सहमत हैं कि किसी प्रकार व्यक्त किया गया विनिर्देश आवश्यक हो सकता है, हालांकि मुझे नहीं पता कि आपके वर्तमान में प्रोग्राम योग्य अमूर्त का सेट ऐसा कैसे करता है। लेकिन कल्पना करें कि मुझे सिग्नल प्रोसेसिंग प्रोग्राम की आवश्यकता है जो मूल आवृत्तियों को निकालता है। ध्यान दें कि मैंने सुझाव नहीं दिया कि कैसे। आप एक फास्ट फूरियर ट्रांसफॉर्म का उपयोग करने का निर्णय ले सकते हैं , और मुझे निश्चित रूप से एफएफटी बिट्स को लागू करने वाले कोड पर पैरों के निशान मिलेंगे। लेकिन यह तथ्य कहां है कि आपने एफएफटी का उपयोग करने का फैसला स्पष्ट रूप से दर्ज किया है? मेरा मानना ​​है कि आपको इसकी आवश्यकता तब तक है जब तक कि आपके पाठक सर्वज्ञ न हों।
इरा बैक्सटर

1
@ इरा बैक्सटर: "एफएफटी के साथ सिग्नल प्रोसेसिंग को लागू करने के लिए हमने कैसे चुना"? स्रोत कोड में टिप्पणियां हैं, आप जानते हैं। और मैं इसे README फाइल में भी लिख सकता हूं। विनिर्देशन की स्पष्ट अभिव्यक्ति कोड है। "हमने इसे एफएफटी लागू करने के लिए चुना" जैसी पाठ लाइनें स्पष्ट नहीं हैं, न ही आपके मूल पद के अर्थ में डिजाइन। यह कार्यान्वयन का प्रलेखन है। आपको लगता है कि एक तर्कशील मोड में समाप्त हो गया है, लेकिन मुझे समझ में नहीं आता कि आप किसके खिलाफ बहस करने की कोशिश कर रहे हैं।
लेन्नर्ट रेगेब्र

5

आपको सॉफ्टवेयर ट्रैसेबिलिटी साहित्य की समीक्षा करने में रुचि हो सकती है। किसी विशेष क्रम में नहीं:

  • CUBRANIC, D., MURPHY, GC, SINGER, J., और BOOTH KELLOGG, S. Hipikat: सॉफ्टवेयर डेवलपमेंट के लिए एक प्रोजेक्ट मेमोरी। सॉफ्टवेयर इंजीनियरिंग 31, 6 (2005), 446-65 पर लेनदेन।
  • TANG, A., BABAR, MA, GORTON, I., और HAN, J. आर्किटेक्चर डिजाइन औचित्य के उपयोग और प्रलेखन का सर्वेक्षण। सॉफ्टवेयर आर्किटेक्चर (2005) पर 5 वें कार्यकारी IEEE / IFIP सम्मेलन के प्रोक में।
  • RAMESH, B., POWERS, T., STUBBS, C., और EDWARDS, M. आवश्यकताओं को लागू करने का स्थान: एक केस स्टडी। आवश्यकताओं इंजीनियरिंग में Int'l Symp के प्रोक में (यॉर्क, 1995)।
  • होरनर, जे।, और एटीवुड, एमई डिजाइन औचित्य: औचित्य और बाधाओं। मानव-कंप्यूटर इंटरैक्शन पर 4 वें नॉर्डिक सम्मेलन के प्रोक में: बदलती भूमिकाएं (ओस्लो, नॉर्वे, 2006)।
  • CLELAND-HUANG, J., SETTIMI, R., ROMANOVA, E., BERENBACH, B., और CLARK, S. स्वचालित ट्रेसीबिलिटी के लिए सर्वोत्तम अभ्यास। कंप्यूटर 40, 6 (जून 2007), 27–35।
  • ASUNCION, H., FRANÇOIS, F., और टेलर, आर.एन. एंड-टू-एंड इंडस्ट्रियल सॉफ्टवेयर ट्रैसेबिलिटी टूल। यूरोपीय सॉफ्टवेयर एंग कॉन्फ की 6 वीं संयुक्त बैठक और सॉफ्टवेयर इंजीनियरिंग (ईएसईसी / एफएसई) (डबरोवनिक, 2007) की नींव पर ACM SIGSOFT Int'l Symc की प्रोक।

ध्यान दें कि यह सिर्फ हिमशैल का टिप है, और मुझे यकीन है कि मैंने कुछ महत्वपूर्ण कागजात छोड़ दिए हैं।

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

संयोग से, आर्कम भी आपके डीएमएस कार्य से संबंधित है।


1
इसके लिए +1। RT सब कुछ नहीं है, लेकिन यह वास्तव में इस समस्या को हल करने के लिए कई सकारात्मक कदमों में से एक है, बजाय इसके लिए वही पुराने बहाने बनाने की।
Aaronaught

2

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

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

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

डिजाइन का वर्णन करने के लिए ( संरचित डिजाइन की तरह ) (HIPO चार्ट) या एकीकृत कार्यक्रम डिजाइन , डिजाइन पैटर्न , ...

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


यदि आपकी कंपनी को ऐसा करने का एक अच्छा तरीका मिल जाता है, तो प्रोग्रामर बाकी सभी को बहुत जल्दी बता देंगे। :-)
लेनार्ट रेगेब्रुक

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

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

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

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

2

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

मेरी टीम के हर एक व्यक्ति के पास इंजीनियरिंग की डिग्री है ... ज्यादातर ईई या सीई। इंजीनियरिंग आपको पाठ्यक्रम के भाग के रूप में डिजाइन करना सिखाती है।

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


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

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

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

1
मैं कहूंगा कि हमारे दस्तावेज़ 95% अप टू डेट हैं। यहाँ और वहाँ कुछ चीजें दरार के माध्यम से फिसलती हैं।
पेमदास

2

मुझे दो समस्याएं दिखाई देती हैं।

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

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

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

कुछ गणितीय उपकरण हमारे पास हैं, जैसे कि औपचारिक तरीके, बहुत ही अस्पष्ट हैं।

मैप-कम प्रोग्रामिंग में गणित का एक अच्छा उदाहरण है। मुख्य विचार यह है: जब आपके पास एक साहचर्य, बाइनरी ऑपरेशन होता है तो आप इसके निष्पादन को बहुत आसानी से वितरित कर सकते हैं। एक बाइनरी ऑपरेशन दो मापदंडों के साथ एक फ़ंक्शन है, समरूपता का तात्पर्य है कि (a + b) + c = a + (b + c)

a1 + a2 + ... + a99 + b1 + b2 + ... + b99 + c1 + c2 + ... + c99 है

(a1 + a2 + ... + a99) + (b1 + b2 + ... + b99) + (c1 + c2 + ... + c99) जहां विभिन्न स्थानों पर As, Bs और Cs को तुच्छ रूप से जोड़ा जा सकता है, उनके परिणाम एकत्र किए गए और कुछ ही समय में सामने आया।

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

गणितीय सार के बिना सॉफ्टवेयर डिजाइन, ज्यामिति सीखने के लिए कभी परेशान किए बिना वास्तुकला करने की कोशिश करने जैसा है।

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

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