क्या सॉफ्टवेयर डेवलपर्स के लिए कम्प्यूटेशनल जटिलता की अवधारणा महत्वपूर्ण है? [बन्द है]


11

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

क्या सॉफ्टवेयर डेवलपर्स के लिए कम्प्यूटेशनल जटिलता की अवधारणा महत्वपूर्ण है? और क्या इसे स्नातक पाठ्यक्रमों में पढ़ाया जाना चाहिए?


1
एक उदाहरण का उपयोग करते हुए प्रश्न की व्याख्या करने के लिए: मेरे पास आए स्नातक को यह नहीं पता कि O(n^2)इसका क्या मतलब है।
मुहम्मद अलकरौरी

1
दिलचस्प संबंधित प्रश्न: प्रोग्रामर.स्टैकएक्सचेंज.
com/q/20832/6184

जवाबों:


12

अधिकांश विश्वविद्यालयों में, मैं मानता हूं (मुझे उम्मीद है!) उस समय और स्मृति जटिलता निश्चित रूप से उनके पाठ्यक्रमों का हिस्सा है।

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

इसके विपरीत, मेरा मानना ​​है कि प्रत्येक डेवलपर को उन डेटा संरचनाओं और एल्गोरिदम के समय / स्थान की जटिलता के बारे में पता होना चाहिए जो वे उपयोग करते हैं।


8

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


6

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

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

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

तो हाँ, अवधारणाएँ महत्वपूर्ण हैं (हालांकि तब कम है जब संसाधन और समय पर्याप्त हैं लेकिन डेटा नहीं है)। लेकिन हालांकि अवधारणाएं महत्वपूर्ण हैं, उनमें से औपचारिककरण अक्सर इतना महत्वपूर्ण नहीं होता है - और किसी को यह याद रखने की आवश्यकता है कि धारणा और शब्दावली स्वयं अवधारणाओं के समान नहीं हैं।

संपादित करें:

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

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

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


दिलचस्प वैकल्पिक दृश्य। क्या आप बता सकते हैं कि आप अवधारणाओं को कैसे पेश करेंगे? या आप उन्हें कैसे समझ पाए? यह आवश्यक समझ प्राप्त करने के लिए एक वैकल्पिक तरीके की ओर इशारा कर सकता है।
मुहम्मद अलकरौरी

1
@MuhammadAlkarouri मैंने इसे थोड़ा सा संबोधित करने के लिए अपना उत्तर संपादित किया है।
दिमित्री

4

हाँ

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

अपडेट: यह महत्वपूर्ण क्यों है

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

मुद्दा यह है कि गलती से कुछ ऐसा करना आसान है जो परिमाण धीमा करने का आदेश है, या नौकरी पूरी होने से पहले हमेशा स्मृति से बाहर चलेगा। जबकि अधिक मेमोरी वाली तेज़ मशीनें छोटी गलतियों को कम कर सकती हैं, वे अक्सर जटिलता के मुद्दों को कम नहीं कर सकती हैं।


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

यदि कार्यक्रम 2 दिनों में समाप्त होना चाहिए, लेकिन इसके बजाय 2 साल लगेंगे, तो मैं कहूंगा कि वे उस काम को करने में विफल रहे जो उन्हें करने के लिए भुगतान किया गया था।

आपके द्वारा बताई गई समस्या इतनी खराब डेवलपर की समस्या नहीं थी, बल्कि निर्णय लेने की प्रक्रिया में एक समस्या थी, जिसके कारण एक अयोग्य प्रोग्रामर को इस तरह के कार्यक्रम का प्रभारी बना दिया गया।
यम मार्कोविच

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

3

मुझे लगता है कि यह पूछना कि क्या यह "महत्वपूर्ण है या नहीं" बल्कि अस्पष्ट है।

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

क्या प्रोग्रामर्स के लिए यह बेहद जरूरी है कि वे बेहद कुशल कोड या इनोवेटिव इन्फ्रास्ट्रक्चर एल्गोरिदम लिखें। हाँ।

क्या यह प्रोग्रामर के लिए महत्वपूर्ण है जो पारंपरिक वेब एप्लिकेशन विकसित करते हैं? वे इसके बिना प्रबंधन कर सकते हैं या खुले स्रोत की दुनिया में कुशल कार्यान्वयन प्राप्त कर सकते हैं।

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

यह जानना हमेशा अच्छा लगता है, कुछ भी पसंद है, लेकिन यह कई (या यहां तक ​​कि अधिकांश) प्रोग्रामर को बस अपने नियोक्ता की संतुष्टि के लिए अपना काम करने से नहीं रखता है।

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

लेकिन वैसे भी, जब से CompSci करते हैं। कार्यक्रम लोगों को सिखाते हैं कि अच्छे प्रोग्रामर कैसे बनें? उसके लिए आपके पास विशेष प्रशिक्षण कार्यक्रम और व्यावहारिक अनुभव (या तो आपके या आपके साथी प्रोग्रामर जो आपके साथ साझा कर सकते हैं)।


1
दूसरा भाग शायद कम अस्पष्ट है: क्या इसे बीएससी स्तर के छात्रों को पढ़ाया जाना चाहिए?
मुहम्मद अलकरौरी

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