क्यों कुछ प्रोग्रामर सोचते हैं कि सिद्धांत और व्यवहार के बीच एक विपरीत है? [बन्द है]


63

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

इसके विपरीत, कुछ प्रोग्रामर्स के साथ बोलने या ब्लॉग या फ़ोरम पढ़ने के दौरान मुझे अक्सर एक विस्तृत प्रसार राय मिलती है जिसे अधिक या कम रूप में तैयार किया जा सकता है: सिद्धांत और औपचारिक तरीके गणितज्ञों / वैज्ञानिकों के लिए हैं जबकि प्रोग्रामिंग चीजों को करने के बारे में अधिक है

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

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

तो IMO (सही मात्रा में) सिद्धांत चीजों को करने के लिए एक उपकरण है

मेरा सवाल यह है कि कुछ प्रोग्रामर यह क्यों सोचते हैं कि सिद्धांत (औपचारिक तरीकों) और अभ्यास (काम किए जाने वाले) के बीच एक विपरीत है?

क्या सिविल इंजीनियरिंग (भवन निर्माण) की तुलना में सॉफ्टवेयर इंजीनियरिंग (बिल्डिंग सॉफ्टवेयर) को बहुत आसान माना जाता है ?

या क्या ये दोनों अनुशासन वास्तव में अलग हैं (मिशन-क्रिटिकल सॉफ़्टवेयर के अलावा, सॉफ़्टवेयर विफलता बिल्डिंग विफलता की तुलना में बहुत अधिक स्वीकार्य है)?


मैं संक्षेप में बताने की कोशिश करता हूं, जो मैंने अब तक के उत्तरों से समझा है।

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

परिणामस्वरूप, यह निर्धारित करना अधिक कठिन है कि सॉफ्टवेयर इंजीनियरिंग में डिजाइन / सिद्धांत की सही मात्रा क्या उचित है (बहुत कम -> गन्दा कोड, बहुत अधिक -> मैं कभी भी समाप्त नहीं हो सकता) क्योंकि कोई सामान्य नियम नहीं है और केवल (बहुत सारे) अनुभव मदद कर सकते हैं।

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


9
नहीं, 90% प्रोग्रामर हैं;)
जेके।

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

65
सिद्धांत रूप में सिद्धांत और व्यवहार में कोई अंतर नहीं है, लेकिन व्यवहार में है।
जोरिस टिमरमन्स

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

44
सिद्धांत आधुनिक भाषाओं और एल्गोरिदम के बारे में है। अभ्यास आपके पहले दिन काम पर आ रहा है और एक कैश रजिस्टर पर चलने वाले पॉइंट ऑफ सेल सॉफ्टवेयर में एक मामूली सुविधा को जोड़ने का काम दिया जा रहा है, जो उन सॉफ्टवेयरों का उपयोग करता है जिन्हें BASIC से K & R C में उन लोगों द्वारा परिवर्तित किया गया था जिन्हें C नहीं पता था। , एक विक्रेता से एक छोटी गाड़ी संकलक का उपयोग कर, जो दिवालिया हो गया और शुक्रवार को नवीनतम पर काम करने की उम्मीद है।
रोबोट

जवाबों:


61

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

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


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

2
"... जबकि सॉफ्टवेयर इंजीनियरिंग में अव्यवहारिक रखने के लिए समान रूप से मजबूत बल नहीं है ..." मुझे लगता है कि आपका मतलब है कि अब ऐसा कोई बल नहीं है। वापस दिन में, कमजोर प्रोसेसर, कम मेमोरी और कम / कोई भंडारण द्वारा उत्पन्न सीमाएं इस तरह के बल के रूप में काम करती हैं।
19

1
@ पत्थर: मुझे ऐसा नहीं लगता। चुस्त हार्डवेयर, अच्छे और बुरे इंजीनियरिंग को समान रूप से सीमित करता है।
माइकल बोर्गवर्ड

आपके उदाहरण प्रोग्रामिंग का सिद्धांत नहीं हैं। सॉफ्टवेयर पर बाधाओं का इस्तेमाल प्रौद्योगिकियों और लेखकों की गणितीय क्षमता के साथ करना है।
पॉल नाथन

5
यूएमएल के बारे में निश्चित रूप से कुछ "सैद्धांतिक" है ... इसकी उपयोगिता!
ऑब्सक्योररोबॉट

29

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

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


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

2
एक तीन-लाइन हास्केल क्विकॉर्ट? हम्म ... क्या क्विकॉर्ट को ऐसी भाषा में लागू करना भी संभव है, जहां सब कुछ डिजाइन द्वारा अपरिवर्तनीय है?
मेसन व्हीलर

3
@MasonWheeler Google से पहला परिणाम: हास्केल में क्विकॉर्ट
४ock बजे क्रिस

3
@ मेसन: रनटाइम अभी भी ओ (एन लॉग एन) है। इसमें इन-प्लेस क्विकॉर्ट के विपरीत O (n लॉग एन) मेमोरी की भी आवश्यकता होती है, जिसके लिए रिकर्सन के लिए केवल O (लॉग एन) अतिरिक्त मेमोरी की आवश्यकता होती है।
केविन क्लाइन

2
@kevincline इस हद तक कि एक विशिष्ट सॉफ्टवेयर परियोजना अद्वितीय है, मैंने अपने बाथरूम को फिर से तैयार करने में एक अनूठी परियोजना शुरू की। अंतर यह है कि अगर मैं अपना कोड खराब करता हूं, तो मेरे परीक्षण लाल हो जाते हैं, और यदि मैं अपनी वायरिंग को खराब कर देता हूं, तो मेरा घर जल जाता है। बेशक, यह परियोजना भी ओवरटाइम और बजट से अधिक थी, क्योंकि मैं रीमॉडेलिंग समस्याओं को हल करने में अनुभवी नहीं हूं। सॉफ्टवेयर प्रोजेक्ट्स पर मैंने जो मुख्य समस्या देखी है, वह समान है ... ऐसा नहीं है कि सही लोग इन समस्याओं को तेजी से हल नहीं कर सकते हैं, यह है कि सही लोग उपलब्ध नहीं हैं और हमें सही लोगों के लिए बनना होगा उड़ना।
फिलोसोडाद

17

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

पारंपरिक इंजीनियरिंग में

  • आप अपने गणित और विज्ञान को जानते हैं क्योंकि आप जो कुछ भी करते हैं वह उसी पर आधारित है
  • क्षेत्र में "नायक" वे लोग हैं जो नई चीजों का आविष्कार करते हैं, नए विचारों की खोज करते हैं, अकल्पनीय मानी जाने वाली समस्याओं को हल करते हैं

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

इसके अलावा, मैं उन लोगों पर लगातार चकित हूं जो सोचते हैं कि प्रोग्रामिंग जानना काफी है, और उन्हें इस विषय को समझने की आवश्यकता नहीं है कि उनके कार्यक्रम क्या हैं।

क्या अधिक है, आविष्कार को प्रोत्साहित नहीं किया जाता है। यह हतोत्साहित किया जाता है, कम से कम आम-भाजक समूह-विचार विधियों के पक्ष में, "पठनीयता" के रूप में प्रच्छन्न। (कल्पना करें कि यदि वैमानिक या परमाणु इंजीनियरों को ऐसा कुछ भी न करने के लिए प्रोत्साहित किया जाए जो उनके कनिष्ठ साथियों के लिए समझने में कठिन हो।)

वे जो कुछ भी सीखते हैं, जैसे कि वेब ऐप्स को कैसे प्रोग्राम करते हैं, बड़े मूल्य के हैं। तो एक प्लम्बर या इलेक्ट्रीशियन का कौशल है, लेकिन यह इंजीनियरिंग नहीं है।


5
भौतिकी आपको बता सकती है कि कुछ संरचना इसके भार के तहत ढह जाएगी या नहीं। सीएस आपको बताता है कि आप यह नहीं बता सकते कि किसी दिए गए कार्यक्रम को एक निश्चित इनपुट दिया जाएगा या नहीं। IMO औपचारिक तरीके सॉफ्टवेयर की तुलना में सिविल या मैकेनिकल इंजीनियरिंग में बहुत बेहतर हैं क्योंकि सिस्टम कम जटिल और कम गतिशील हैं ...
गाय साइरन

6
@GuySirton "CS आपको बताता है कि आप यह नहीं बता सकते कि किसी दिए गए कार्यक्रम को एक निश्चित इनपुट दिया जाएगा या नहीं।" अगर आपको लगता है कि सीएस करता है, मुझे लगता है कि आप सीएस के बारे में उतना नहीं जानते जितना आप सोचते हैं कि आप ...
gregghz

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

3
मैं आपको पठनीयता के बारे में दरार को छोड़कर एक +1 देता हूं। रख-रखाव सॉफ्टवेयर की लागत का 80% है इसलिए पठनीयता कोई छोटी बात नहीं है। इसके अलावा, जब वह एयरोनॉटिकल या न्यूक्लियर इंजीनियर कुछ ऐसा बना रहा होता है, जो अन्य लोगों के लिए निर्मित होता है, तो यह महत्वपूर्ण होता है। सैन्य, सरकार या यहां तक ​​कि बड़े संस्थान एक जादू के आविष्कार से खुश नहीं हैं जिन्हें आविष्कारक के अलावा किसी अन्य व्यक्ति द्वारा दोहराया या समझा नहीं जा सकता है।
थॉमस

2
@ थोमस - व्यवहार्य समाधान जो व्यवहार्य समाधान अक्सर "पठनीयता" के परिवर्तन पर छोड़ दिए जाते हैं, सबपर दिमागों द्वारा, इसका मतलब जरूरी नहीं है कि समाधान उतना सुपाठ्य नहीं है जितना उन्हें होना चाहिए। मैंने इसे होते देखा है। नरक, मैंने खुद को ऐसा करते हुए पकड़ा है।
एरिक रिपेन

13

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

मैं भी, सुरक्षित रूप से और बस एक app में जोड़ सकते हैं। आप आसानी से 10 मंजिला इमारत की नई तीसरी मंजिल (इसे 11 में बनाकर) में टॉस नहीं कर सकते। अगर मैं चाहूं तो मैं हर दिन एक बड़े ऐप में एक नई सुविधा दे सकता हूं।

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


वैसे आप आशा करते हैं कि वे नहीं मरेंगे ... आपके सॉफ्टवेयर पर निर्भर करता है;)
ऋग

3
@ रिग, यही कारण है कि मैंने 'सबसे' और 'आमतौर पर' कहा। कुछ सॉफ्टवेयर बहुत अधिक महत्वपूर्ण है।
कैफ़ीक़ गीन

मुझे लगता है कि यह तेजी से बहुत बुरा दृष्टिकोण बनता जा रहा है, यकीन है कि अधिकांश सॉफ़्टवेयर का कोई सुरक्षा निहितार्थ नहीं है, लेकिन बहुत सारे सॉफ़्टवेयर में पैसा और गोपनीयता शामिल है, ये गलत होने से आप अदालत में भी जा सकते हैं
jk।

11

इस एक पर मेरे साथ रहो। मेरे पास एक बिंदु है।

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

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

मैं उस गरीब, दुर्भाग्यपूर्ण आत्मा, और शायद आप में से बहुत से हैं। मैं आप सभी को फंसाता हूं। आसान रास्ता मत निकालो! :)


3
यदि आपको इसे एक बार करवाना है और इसके बारे में भूलना है तो ठीक है। लेकिन अगर आपको इसे आगे बढ़ाना और बनाए रखना है तो आप परेशानी की तलाश में हैं। आपको इस बात का अहसास होना चाहिए कि कितना सिद्धांत है: बहुत अधिक साधन आपको कभी भी नहीं मिलेंगे, बहुत कम इसका मतलब है कि आप ऐसा करने से पहले इसे 10 बार करने जा रहे हैं। मेरे 2 सेंट।
जियोर्जियो

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

1
@Chad - मैं आपसे सहमत हूँ। यह एक संतुलन है। आपके द्वारा उल्लिखित सभी चीजें "एक वास्तविक समय की कमी" के तहत आती हैं, क्योंकि यह प्रोग्रामिंग करने के लिए कारण है, और अल्पावधि में, यह ठीक है और यहां तक ​​कि लाभप्रद भी है क्योंकि आप ऐसा करने के लिए इंगित करते हैं।
FishBasketGordo

@ एफबीजी: शानदार तरीके से कहा गया।
कुबा ओबर

@ चाड, अच्छी बात है। मार्टिन फाउलर martinfowler.com/bliki/TechnicalDebt.html पर एक समान बिंदु बनाता है । कभी-कभी यह एक सार्थक व्यापार है।
जॉन एम गेंट

9

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

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

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


"सॉफ्टवेयर विकास में एक बिंदु आता है जहां मूल्य से परे डिजाइन की लागत बढ़ जाती है।": मैंने स्पष्ट रूप से "सही मात्रा में सिद्धांत" लिखा है। मुझे पता है कि ओवर इंजीनियरिंग उत्पादकता में वृद्धि नहीं करता है।
जियोर्जियो

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

5
क्षमा करें, मुझे टाइपो को इंगित करना है: मुझे नहीं लगता कि सिविल इंजीनियर एक लानत का निर्माण करते हैं। ;-)
जियोर्जियो

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

1
@RexKerr: आपने उनका आधा बयान काट दिया: "... जो आवश्यक सुरक्षा मानकों को पूरा करता है"
रेयान

7

मैं यह भी कहना चाहता हूं कि कई अन्य उत्कृष्ट प्रतिक्रियाओं के अलावा, मानव जाति आसानी से "सिविल इंजीनियरिंग" के बराबर कर रही है, क्योंकि मिस्रियों का समय आसानी से है इसलिए हमारे पास सामान्य सिद्धांत को सिद्ध करने के लिए बहुत समय है कि चीजों को कैसे करना चाहिए सामाप्त करो। हम लगभग 70 वर्षों से सॉफ़्टवेयर का निर्माण कर रहे हैं या (जो आप पहले "सॉफ़्टवेयर" पर निर्भर करते हैं); मेरा मतलब है कि हमारे पास उसी तरह के अनुभव के शरीर को विकसित करने के लिए समान समय नहीं है।


6

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

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

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


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

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

1
@ जियोर्जियो, या बिल के अनुसार ...
कैफ़ीक

5

अंतर मुख्य रूप से ज्ञात आवश्यकताओं के कारण है:

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

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

हम पुस्तकालयों का उपयोग उस तरह की चीज़ों के लिए करते हैं जहाँ तक संभव हो।


1
+1 के लिए "जब 'सिद्धांत' के बारे में बात की जाती है, तो इसका मतलब आमतौर पर कंप्यूटर विज्ञान का सिद्धांत पक्ष होता है"।
यहोशू ड्रेक

5

वास्तव में सॉफ्टवेयर इंजीनियरिंग के कुछ स्तर हैं जो इस बात पर निर्भर करते हैं कि आप जो सॉफ्टवेयर बना रहे हैं।

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

नासा के लिए काम करने वाले मेरे सहकर्मियों में से एक ने पहले अपनी सॉफ्टवेयर इंजीनियरिंग प्रक्रिया को औचित्य के सैकड़ों पृष्ठ लिखने और कोड की एक पंक्ति लिखने के लिए सैकड़ों घंटे की बैठकों के रूप में वर्णित किया!

मुझे गलत न समझें क्योंकि जब मैं ऐसा कहता हूं तो मैं असम्मानित करने की कोशिश नहीं करता हूं, लेकिन उस समय, संसाधनों, और अरबों डॉलर की लागत के बाद भी अंतरिक्ष यान अभी भी उड़ रहा है।

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

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

योग करने के लिए, Premature optimization is the root of all evil या जैसा कि मेरे बॉस हमेशा कहते हैंShipping is a feature!


3
"शिपिंग एक विशेषता है" के लिए +1! एक बार मैंने एक समान वाक्य सुना: "पूर्णता मौजूद नहीं है। सॉफ्टवेयर के इस टुकड़े का यह फायदा है कि यह मौजूद है।" बेशक यह थोड़ा मजाक है। मिशन-क्रिटिकल सॉफ़्टवेयर के बारे में: एक बिना किसी अपवाद के एक रॉकेट क्रैश हो सकता है।
जियोर्जियो

this software has the advantage that it exists... मैंने नहीं सुना था कि एक अभी तक लेकिन यह महान सॉफ्टवेयर उद्धरण की मेरी सूची में जा रहा है। मुझे यह पसंद है
अल्बर्ट लैंग

@ जिओर्जियो: JSF और MISRA C को लिखा जाता है ताकि कोई अपवाद न हो। अपवाद और रॉकेट मिक्स नहीं होते हैं।
कोडर

5

यहाँ बहुत अच्छे उत्तर हैं, लेकिन मुझे लगता है कि कंप्यूटर साइंस और सिविल इंजीनियरिंग के बीच तुलना त्रुटिपूर्ण है।

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

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

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

टीएल; डीआर : थ्योरी और प्रैक्टिस सॉफ्टवेयर इंजीनियरिंग में अलग-अलग हैं जैसे वे हर जगह हैं। उचित सादृश्य है सॉफ्टवेयर इंजीनियरिंग: सिविल इंजीनियरिंग :: कंप्यूटर विज्ञान: भौतिकी। लेकिन व्यवहार में, यह उससे कहीं अधिक जटिल है :)


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

2
ज़रूर, लेकिन आपको अपने पुल के हर घटक के लिए एक लहर समीकरण प्राप्त करने की आवश्यकता नहीं है और फिर समझाएं कि वे कैसे बातचीत करते हैं।
ऑबस्क्योररॉट

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

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

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

3

तो मेरा सवाल यह है कि कुछ प्रोग्रामर यह क्यों सोचते हैं कि सिद्धांत (औपचारिक तरीकों) और अभ्यास (काम किए जाने वाले) के बीच एक विपरीत है?

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

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

क्या सिविल इंजीनियरिंग (भवन निर्माण) की तुलना में सॉफ्टवेयर इंजीनियरिंग (बिल्डिंग सॉफ्टवेयर) को बहुत आसान माना जाता है?

मुझे यकीन नहीं है कि "आसान" सही शब्द है। ठोस सबूतों की कमी से यह धारणा बन सकती है कि कोई काम नहीं किया जा रहा है। या, इसी तरह, वह मौजूदा काम आसानी से बदल जाता है।

या क्या ये दोनों अनुशासन वास्तव में अलग हैं (मिशन-क्रिटिकल सॉफ़्टवेयर के अलावा, सॉफ़्टवेयर विफलता बिल्डिंग विफलता की तुलना में बहुत अधिक स्वीकार्य है)?

पारंपरिक इंजीनियरिंग और सॉफ्टवेयर इंजीनियरिंग मेरे द्वारा पहले ही बताए गए कारणों से बहुत अलग हैं।


1

आपकी धारणा यहां गलत हो सकती है, या इसमें ऐसे लोगों से कई संसाधन शामिल हैं जिन्होंने पर्याप्त रूप से जटिल सॉफ़्टवेयर नहीं लिखा है।

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

उस ने कहा, जब ज्यादातर प्रोग्रामर की बात आती है , जब कुछ लिखने का कार्य उन्हें डिजाइन ("गणित" जैसा कि आप डालते हैं) पहले से ही आर्किटेक्ट / लीड / आदि द्वारा किया गया है। लिखने के कार्य से पहले यह उन्हें हो जाता है। तो यह सामने के स्तर से उस तरह से दिखाई दे सकता है।


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

1

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

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

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


1

मुझे भी ऐसा ही लगता है। आप मानक ब्लॉकों, मानक शक्ति कंक्रीट, मानक स्टील से बाहर एक बड़ी इमारत का निर्माण करते हैं। आप मानक पुस्तकालयों में से एक बड़ा ऐप बनाते हैं।

आप कोशिश नहीं करते हैं और गणितीय रूप से एक बड़े ऐप को उसी तरह से सही साबित करते हैं, जिस तरह से आप कोशिश नहीं करते हैं और एक 100 मंजिला इमारत के लिए तरंग लिखते हैं


तो क्या सॉफ्टवेयर 100 मंजिला इमारत के परिमित तत्व विश्लेषण के बराबर है? थर्मल / क्रैश में कितने ऊंची इमारतों में कीड़े हैं? :-)
गाइ सीरटन

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

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

@GuySirton - मुझे लगता है कि कठिनाई यह है कि आप अन्य चीजों पर भरोसा करते हैं। नासा उड़ान एविओनिक्स का एक बहुत विस्तृत स्तर तक परीक्षण कर सकता है (हालांकि अभी भी यह सही साबित नहीं हुआ है) क्योंकि वे ओएस और हार्डवेयर भी बनाते हैं। टूलकिट और काम के साथ एक सामान्य ओएस पर लिखना एक पुल के निर्माण की तरह है जहां आपको स्टील या कंक्रीट के विवरण को जानने की अनुमति नहीं है।
मार्टिन बेकेट

1
@MartinBeckett, और गुरुत्वाकर्षण का गुणांक घंटे से घंटे में बेतरतीब ढंग से बदलता है ... जैसे कि जब आपका सिस्टम व्यवस्थापक किसी को बिना बताए किसी सर्वर को अपग्रेड करने का फैसला करता है क्योंकि "यह पारदर्शी होगा"।
CaffGeek

1

मैं एक मैकेनिकल और मैन्युफैक्चरिंग इंजीनियर था, इससे पहले कि मैं कुछ 20 साल पहले पता चलता था कि मेरे एप्टीट्यूड सॉफ्टवेयर में हैं। मैं उन कई तत्वों के प्रति सहानुभूति रखता हूं, जिन्हें आपने रखा है।

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

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

कोई तर्क नहीं - ऐसी परियोजनाएं हैं जिन्हें 17 सॉफ्टवेयर आर्किटेक्ट्स की एक समिति के साथ शुरू करने की आवश्यकता है। सच में वे लगभग 20 कैरेट हीरे के रूप में दुर्लभ हैं।


1

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

अब, मुझे भी लगता है कि यह इस बात पर निर्भर करता है कि आप "सिद्धांत" से क्या मतलब है। क्या हम डिजाइन पैटर्न, या लेम्मा पंप कर रहे हैं? क्योंकि एक अच्छा सॉफ्टवेयर इंजीनियर होने के लिए डिजाइन पैटर्न की अच्छी ठोस समझ होना बहुत महत्वपूर्ण है। हालाँकि, जब एक बड़े सॉफ्टवेयर सिस्टम को आर्किटेक्चर करना, P / NP समस्याओं के बारे में सिद्धांत करना उपयोगी नहीं है। उस अर्थ में, मेरा मानना ​​है कि सॉफ्टवेयर इंजीनियरिंग और सैद्धांतिक कंप्यूटर विज्ञान के बीच एक बहुत ही विपरीत है।

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

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

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


1
मुझे हमारे उत्तरों में कुछ समानताएँ दिखाई देती हैं, लेकिन आपके विचार स्पष्ट रूप से मौलिक हैं और कुछ अंतर हैं। मैं इस बात से सहमत नहीं हूं कि पी / एनपी को समझना उपयोगी नहीं है। आपको जटिलता सिद्धांत का गहराई से अध्ययन करने की आवश्यकता नहीं है, लेकिन एक काम करने वाला सॉफ्टवेयर इंजीनियर किसी भी दिए गए टुकड़े के O (n) का अनुमान लगाने और वैकल्पिक समाधानों की लागत के बारे में बुद्धिमान बातें कहने में सक्षम होना चाहिए। एक बिंदु जो आपने लगभग बनाया था, लेकिन ऐसा नहीं था, यह सिद्धांत अक्सर पुस्तकालयों में समझाया जाता है। यह एक अच्छा विचार है।
१२:४२ पर ऑब्स्क्योररोबॉट

"अगर कोई हल करता है ... हम जो बहुत ही भयानक नई प्रगति के लिए रुक रहे हैं, तो समस्या है।": ठीक है, दुर्भाग्य से सिद्धांत ने साबित कर दिया है कि यह अकारण है (कोई कार्यक्रम मौजूद नहीं है जो इसे तय कर सकता है) इसलिए मुझे नहीं लगता कि कोई भी रुकने की समस्या को हल करने के लिए शोध प्रयास खर्च किए जा रहे हैं।
जियोर्जियो

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

इसलिए, जहां तक ​​मुझे पता है, और मुझे सही करें अगर मैं गलत हूं, तो मुझे लगता है कि गणना के बारे में अभी भी हमारे पास बहुत सारी खोज है। जैसा कि इस सूत्र में कई बार उल्लेख किया गया है, कंप्यूटर विज्ञान अभी भी बहुत युवा है; टर्निंग मशीन और वॉन न्यूमैन वास्तुकला से बहुत कुछ हो सकता है।
जर्सन

@ जारसेन: यह सच है कि कंप्यूटर विज्ञान बहुत छोटा है, लेकिन अब तक जो भी कंप्यूटर बनाया गया है वह केवल ट्यूरिंग-कम्प्यूटेबल सामान ही कर सकता है। जहां तक ​​मुझे पता है (बहुत कम वास्तव में) क्वांटम कंप्यूटर भी अधिक नहीं कर सकते हैं (वे कुछ समस्याओं को अधिक तेज़ी से हल कर सकते हैं, लेकिन वे अधिक समस्याओं को हल करने में सक्षम नहीं होंगे)। तो, हाँ, जो जानता है कि क्या आविष्कार किया जा सकता है, लेकिन पिछले 70 वर्षों के दौरान कल्पना की गई कोई भी कंप्यूटिंग औपचारिकता ट्यूरिंग मशीन से अधिक नहीं कर सकती है।
जियोर्जियो

1

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

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


0

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

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

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

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


0

दांव कम हैं, काम आसान है, और प्रबंधन शायद ही कभी अच्छे डिजाइन में मूल्य देखता है। सिस्टम अस्थिरता, रखरखाव और अखंडता एक "आईटी" समस्या है - एक "व्यवसाय" समस्या नहीं। सभी अधिकारियों में एक बात समान है। वे या तो 95% पैसे पर केंद्रित हैं, या वे किसी ऐसे व्यक्ति को रिपोर्ट करते हैं जो है।

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

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

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

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


0

सबसे पहले, मैं इस सवाल से प्यार करता हूं। मैंने तीन 1000 शब्दों के उत्तर की तरह लिखा है और जब तक मैं उनके अंत तक नहीं पहुँचता, वे सभी बुरी तरह से गलत थे।

मुझे लगता है कि दो के रूप में तुलना करने के प्रयास के साथ समस्या यह है कि प्रोग्रामिंग एक मॉडलिंग प्रक्रिया है जो आप के रूप में सार या कसकर कंक्रीट से बंधी हो सकती है।

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

उदाहरण के लिए, MVC पैटर्न, एक आदर्श फिट है, उस संदर्भ में बहुत कुछ करना है। एक डेस्कटॉप एप्लिकेशन आमतौर पर एक भाषा और एक भाषा में ही डील करता है, कॉन्फिग फाइल की गिनती के लिए नहीं।

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

जाहिर है आप MVC जैसे एक लोकप्रिय और अच्छी तरह से माना पैटर्न का उपयोग नहीं कर सकते हैं विशेष रूप से वेब पर सामने के चिंताओं को संभालने के लिए जिस तरह से आप इसे एक डेस्कटॉप ऐप संदर्भ में संभाल सकते हैं। वास्तव में, मैं तर्क दूंगा कि आपको एमवीसी को उपयोगी बनाने के बारे में पता होना चाहिए, लेकिन इसे विशेष रूप से सटीक या थोक तरीके से लागू करने का प्रयास भी नहीं करना चाहिए। वेब ऐप का प्रतिमान इस मायने में अनूठा है कि सभी लुक-ऑन-मी सामान उपयोगकर्ता के ब्राउज़र द्वारा संभाले जाते हैं और सभी डेटा / मॉडल-ईश सामान आमतौर पर सर्वर पर कहीं न कहीं होते हैं। लेकिन यह नियंत्रक को कहां छोड़ता है? सर्वर पर सभी या सामने के छोर पर सभी? किसी न किसी को तो ऐसा ही करना पड़ता है। या शायद MVC परिदृश्य के लिए 100% सबसे अच्छा फिट नहीं है। .NET बैक एंड सामान के लिए एक बुरा फिट नहीं है। विशिष्ट UI विजेट के संदर्भ में भयानक नहीं है।

एक घर का निर्माण एक समस्या हल करती है। हालाँकि, विशिष्ट प्रोग्रामिंग समस्याएँ, अक्सर समस्याओं को सुलझाने में शामिल होती हैं और कभी-कभी समाधान बाहरी समस्या को फिर से परिभाषित करने के लिए होता है। वास्तविकता विशेष रूप से दुर्भाग्य से उस विचार पर उत्सुक नहीं है।


0

ग्लेन वेंडरबर्ग सॉफ्टवेयर इंजीनियरिंग और अधिक पारंपरिक इंजीनियरिंग विषयों के बीच अंतर पर एक महान दृष्टिकोण प्रस्तुत करता है: http://www.youtube.com/watch?v=NP9AIUT9nos

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

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

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

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