क्या सॉफ्टवेयर डिजाइन विनिर्देश की आवश्यकता अधिक अभिव्यंजक प्रोग्रामिंग भाषाओं के विकास के साथ कम हो गई?


16

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

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

मैं इस निष्कर्ष पर कैसे आया? यहाँ कुछ तर्क दिए गए हैं:

प्रतिपुष्टि

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

प्रतिक्रिया के बिना त्रुटियों को पहचानना और ठीक करना कठिन है।

जैसे ही आप कोड लिखते हैं, आपको बहुत सी प्रतिक्रियाएँ मिलती हैं, उदाहरण के लिए:

  • संकलक से त्रुटियां और चेतावनी
  • स्थिर कोड विश्लेषण के परिणाम
  • यूनिट परीक्षण

त्रुटियों को जल्दी से पहचाना और ठीक किया जा सकता है।

संगति

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

पुनर्रचना

पाठ्य विवरणों या आरेखों को रिफैक्ट करते समय कोड को रीफ़ैक्‍ट करने के लिए शक्तिशाली उपकरण और तकनीकें होती हैं, आमतौर पर कठिन और त्रुटि प्रवण होती हैं।


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

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


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

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

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

2
अनुशंसित पढ़ना: बीट्स द एअर्स
रॉबर्ट हार्वे

1
मैंने एक परियोजना पर पूर्ण यूएमएल डिजाइन के साथ काम किया है। जिसे हम कोड से जनरेट करते हैं। मैं इस नतीजे पर पहुंचा कि मैं इसे फिर कभी नहीं करना चाहता था। यह एक था बहुत कठिन यूएमएल को बदलने के लिए यह कोड को बदलने के लिए किया गया है कि; और एक बड़ा यूएमएल मॉडल बहुत से स्रोत कोड के रूप में कम से कम अनिर्दिष्ट है। "उत्पन्न" कोड को पढ़ना मुश्किल था और जनरेटर ने कोड में "मार्कर" छोड़ दिया।
निक केइली

जवाबों:


9

मैं इस आधार पर सवाल करता हूं कि भाषाएं अधिक से अधिक अभिव्यंजक हैं। आज के ASP.NET कोड के साथ c # में, मैं उसी स्तर के बारे में लिखता हूं जैसा मैंने किया था जब मैंने Visual Basic में ASP कोड लिखा था। हम अभी भी c ++ का उपयोग करते हैं। जावास्क्रिप्ट में फीचर जोड़े गए हैं लेकिन कुल मिलाकर भाषा नहीं बदली है। SQL के साथ भी।

मुझे लगता है कि ये अन्य बदलाव अधिक महत्वपूर्ण हैं:

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

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

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

  4. SOA के डेटा अनुबंध। बहुत ज्यादा सब कुछ इन दिनों SOA है। आप सभी की जरूरत है एक WSDL है। डेटा ट्रांसफर स्वरूपों को परिभाषित करने और दस्तावेजीकरण करने के दिन समाप्त हो गए हैं। अधिक Restful और सूक्ष्म सेवाओं की ओर वर्तमान कदम इस प्रवृत्ति को जारी रखता है।

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

  6. बहुत, स्थापित पुस्तकालयों का बहुत अधिक उपयोग। .NET CLR शेल्फ से एक टन की कार्यक्षमता प्रदान करता है, इसलिए इसे कैशिंग सत्र डेटा के लिए एक योजना, कहने की आवश्यकता नहीं है। थर्ड पार्टी लाइब्रेरी जैसे jQuery UI या बूटस्ट्रैप एक निश्चित तरीके से काम करने के लिए कोड लिखने के लिए मानक स्थापित करते हैं। आपको इन दस्तावेज़ों की आवश्यकता नहीं है; टीमों को सिर्फ उनका उपयोग करने में सक्षम होना चाहिए।

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

  8. बेहतर- और अधिक लगातार शिक्षित इंजीनियर। इन दिनों आप ऐसे इंजीनियरों को नियुक्त कर सकते हैं जो सर्वोत्तम प्रथाओं को समझते हैं (उम्मीद है) और बस उन्हें लागू करेंगे बिना किसी डिज़ाइन दस्तावेज़ के कि उन्हें क्या करना है।

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

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


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

1
यह सभी प्रगति नहीं है: मुख्य हॉपर आगे था, संयोग से, संकलक के आविष्कार के साथ। लेकिन हम अभी भी फ्लो चार्ट सिखाते हैं, कोडांतरक कोड (और कई अन्य अप्रचलित प्रथाओं) पर एक अमूर्तता। शायद इसलिए क्योंकि हम भूल गए हैं कि क्यों?
ctrl-alt-delor

6

मैं नहीं के लिए बहस करूंगा ।

साधारण कारण के लिए

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

कभी भी "आदर्श" नहीं माना जाता था, क्योंकि 1990 के दशक से चरम प्रोग्रामिंग मौजूद है । और जैसा कि आप कहते हैं:

आदर्श मामले में कोड के अलावा सॉफ़्टवेयर डिज़ाइन का कोई विवरण नहीं होना चाहिए।

सदियों पहले तर्क दिया गया था। उदाहरण के लिए 1992 से यह पौराणिक लेख: सॉफ्टवेयर डिजाइन क्या है

उपरोक्त दिखाता है कि आपके पास जटिल भाषा या आईडीई की आवश्यकता के बिना अत्यधिक विकासवादी वास्तुकला और पुनरावृत्ति दृष्टिकोण के साथ "चरम" प्रक्रिया हो सकती है।

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


6

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

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

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

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


3

मुझे लगता है कि आप पहली जगह में डिज़ाइन दस्तावेज़ रखने के उद्देश्य को भूल जाते हैं!

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

दस्तावेज़ों को रखने की कोई आवश्यकता नहीं है जो सभी विवरणों में सिस्टम सिस्टम के सटीक व्यवहार का वर्णन करते हैं , क्योंकि वास्तव में स्रोत कोड स्वयं इस उद्देश्य को पूरा करता है।

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


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

@FrankPuffer का आरेख 100,000 एलओसी है।
RubberDuck

1
@RubberDuck यह मेरे लिए होता है कि कोड से विभिन्न उपयोगी आरेख उत्पन्न करने की क्षमता (या उसकी कमी) किसी भाषा की अभिव्यंजना का मापक हो सकती है। ऐसा कोई चित्र नहीं है जिसे आप आकर्षित कर सकते हैं जिसे किसी प्रकार की भाषा में व्यक्त नहीं किया जा सकता है। सवाल यह है कि क्या यह भाषा उसी तरह की जानकारी दे सकती है जो आसानी से लिखी या पढ़ी जा सकती है।
जिमीजैम

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

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

1

आदर्श मामले में कोड के अलावा सॉफ़्टवेयर डिज़ाइन का कोई विवरण नहीं होना चाहिए।

यह आप की तुलना में आगे है। यहां तक ​​कि आश्रित प्रकार की चीजें (जो, जैसा कि मैं इसे समझता हूं, सैद्धांतिक रूप से काफी आशाजनक हैं) कई साल बाहर हैं।

औपचारिक सत्यापन काफी कठिन है, और इस कारण से औपचारिक सत्यापन का आमतौर पर इस्तेमाल होने वाला एकमात्र स्थान क्रिप्टोग्राफी लाइब्रेरी है।

यूनिट परीक्षण

यदि संपत्ति परीक्षण मुख्यधारा में नहीं आया है, तो मुझे नहीं लगता कि यह लंबे समय तक व्यावहारिक होगा।

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

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

संभवत: इस समय एक प्रलेखन परीक्षण उपकरण का उपयोग करना आसान है।

इस काम को करने के लिए एक पूर्व शर्त है: कोड को पढ़ने और समझने में काफी आसान होना चाहिए।

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

अंत में, मेरे अनुभव में, बेहतर भाषाएं और टूलींग कम बग के साथ सॉफ्टवेयर का नेतृत्व नहीं करते हैं, बल्कि बड़ी परियोजनाएं हैं। वास्तव में ऐसा कोई प्रशंसनीय तरीका pandocनहीं है जो 1970 में लिखा गया हो।

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