TCS के लिए प्रोग्राम करना कितना महत्वपूर्ण है?


66

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

मैं सोच सकता हूं कि किसी दिन मुझे अपने काम के लिए कुछ एल्गोरिदम लागू करने पड़ सकते हैं, लेकिन फिर क्या मैं इस पल का इंतजार कर सकता हूं? या कुछ और है?

यह जानना महत्वपूर्ण है कि TCS में कोडिंग कैसे की जाती है (उन क्षेत्रों में जहाँ प्रोग्रामिंग सीधे तौर पर शामिल नहीं है): क्या ऐसे कारण हैं जो एक सीसी सिद्धांतकार (उदाहरण के लिए) कोड को जानने के लिए ला सकते हैं? क्या यह सीखने में बहुत समय बिताना है कि कोड कैसे बनाया जाए? और अगर वहाँ हैं, तो क्या प्रोग्रामिंग भाषा की एक श्रेणी (कार्यात्मक, अनिवार्य, वस्तु-उन्मुख ..) है जो अधिक अनुकूल होगी?


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

6
मैं "गणितज्ञों के साथ अक्सर नहीं करता हूं।" चाहे एक गणितज्ञ एक एल्गोरिथ्म का वर्णन कभी सच प्रोग्राम किया गया है के लिए एक साधारण परीक्षण पूछना है "क्या वास्तव में आप 'एक एक्स को देखते हुए ...' से क्या मतलब है?"
जेफ

4
प्रोग्रामिंग, वह क्या है? प्रमेय मेरे कार्यक्रम हैं। खाना पकाने की प्रक्रिया खाना पकाने की कला से अलग है। क्षमा करें, 20 से अधिक वर्षों में मैं कोई प्रोग्राम कोड नहीं पढ़ सकता। दरअसल, मुझे "पीसी पर गड़बड़" होने का एहसास है। (पहले से ही यह अंकन बीमार बनाता है।) यूक्लिड कार्यक्रम नहीं कर सकता था। फिर भी उन्होंने सदियों तक कार्यक्रम बनाए।
Stasys

6
@StasysJukna: यूक्लिड वास्तव में वास्तव में भद्दा प्रोग्रामर था। उन्होंने न केवल कभी अपने एल्गोरिदम को लागू किया, बल्कि कभी-कभी उन्हें जटिल परीक्षण मामलों में हाथ से भी नहीं दौड़ाया।
जेफ

3
@ J @ ɛ E: हां, यूक्लिड एक भद्दा प्रोग्रामर था, बिल्कुल यही मैं कहना चाहता था। हम, TCS में, कुकिंग बुक्स और कॉकिंग आर्ट में अंतर नहीं करने के लिए ट्रेंड कर रहे हैं। यूक्लिड कर सकता था। मेरा उन लोगों के प्रति बहुत सम्मान है, जो कार्यक्रम कर सकते हैं। लेकिन मुझे नहीं लगता है कि इस सुविधा का अर्थ "टीसीएस में एक कैन" है। यह सिर्फ चोट नहीं होगा।
Stasys

जवाबों:


55

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

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

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

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

वैसे, प्रोग्रामिंग मजेदार भी हो सकती है।


2
@ सुरेश वेंकट: वास्तव में, यदि प्रोग्रामिंग मजेदार है, तो सवाल "प्रोग्रामिंग कितना महत्वपूर्ण है?" बहुत प्रासंगिक नहीं हो सकता है। लेकिन तब मेरे जवाब का अधिकांश हिस्सा अप्रासंगिक हो जाएगा। कितने उदास हैं! :)
त्सुकोशी इतो

मैंने पहले आपके दूसरे तर्क के बारे में नहीं सोचा था, वास्तव में यह एक छोटे कार्यक्रम के साथ एक अनुमान का परीक्षण करने के लिए एक बहुत अच्छा विचार है! जैसा कि प्रोग्रामिंग के लिए मजेदार हो सकता है, इसलिए ऐसा लगता है, लेकिन मुझे अभी तक सभी लंबे सप्ताह के अंत में सीखना =) देखना है।
गोपी

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

3
समस्या को हल करने वाले वर्ग पर नथ के नोट्स में अनुमानों और कोड के बीच परस्पर क्रिया का अद्भुत उदाहरण है (समस्या 1 देखें): www-cs-facademy.stanford.edu/~knuth/papers/cs1055.pdf (मैं विशेष रूप से किसी की छवि को पसंद करता हूं प्रिंटआउट के ढेर पर कक्षा में भागते हुए)
सुरेश वेंकट

47

मुझे लगता है कि इस पर डोरॉन ज़िलबर्गर का हवाला देते हुए:

राय 37 : प्रोग्रामिंग और भी अधिक मजेदार है, और, इससे भी महत्वपूर्ण बात यह है कि अगर ज्यादा, अंतर्दृष्टि और समझ नहीं है।

राय पढ़ें, यह रत्नों से भरा है (btw वह जानबूझकर उत्तेजक हो जाता है)। उदाहरण के लिए, "किसी चीज़ को समझने का सबसे अच्छा तरीका यह है कि उसे पढ़ाया जाए। लेकिन इससे भी बेहतर यह है कि इसे मनुष्यों को पढ़ाया जाए, इसे कंप्यूटर पर पढ़ाया जाए"।

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

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


10
"फ़ंक्शनल प्रोग्रामिंग एल्गोरिदम डिज़ाइन और रनिंग टाइम के मुद्दों को अस्पष्ट करता है और तर्क और शब्दार्थ मुद्दों पर ज़ोर देता है"। लड़ाई के शब्द :)
सुरेश वेंकट

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


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

3
@ साशिकोइकोलॉव: जब भी मैं एक स्नातक डेटा संरचना वर्ग पढ़ाता हूं, मैं वास्तव में चाहता हूं कि मैं यह मान सकता हूं कि हर किसी को कुछ नया प्रोग्रामिंग अनुभव था। हठ को समझाने के लिए तीन 90 मिनट के व्याख्यान खर्च करने के बजाय, मैं बस यह कह सकता था "अरे, क्या आपने देखा कि आपकी डेटा संरचना पहले से ही ऐसा है?"
जेफ

33

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

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

यदि आप अब प्रोग्राम करना नहीं सीखते हैं, तो यह काफी संभावना है कि जब आपको अंततः एक प्रोग्राम लिखने की आवश्यकता होती है, तो आपके पास सीखने के लिए समय नहीं होगा, और इसलिए आप वास्तव में इसे नहीं लिख सकते हैं, और अंत में कम प्रभावी नहीं हो सकते हैं अनुसंधान। आपके लिए ऐसा करने के लिए एक स्नातक छात्र या स्नातक होने के दौरान बहुत कठिन नहीं है, कई बार ऐसा होता है जब यह बहुत आसान और कम समय लेने वाला होता है बजाय इसके कि आप उन्हें समस्या बताएं।

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


2
मुझे आपके तीसरे पैराग्राफ में सच्चाई दिखाई देती है :)।
गोपी

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

2
ऋषि के उदय के साथ, गणितज्ञ / मैपल / मैटलैब शैली के गणितीय पुस्तकालयों के तुरंत उपलब्ध होने के दौरान अजगर जैसी अच्छी, लोकप्रिय भाषा के साथ काम करना संभव है।
एंड्रेस सलामोन

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

4
@ एंटोनियोवैलेरियोमीसीली-बारोन: मुझे कम से कम टाइप थ्योरी, भाषा डिजाइन, औपचारिक शब्दार्थ और प्रोग्रामिंग भाषा सिद्धांत (PLT) के लिए असहमत होना होगा: C ++ उन क्षेत्रों के लिए सीखने की भाषा नहीं है; टीटी और औपचारिक शब्दार्थ लगभग कार्यात्मक रूप से प्रोग्रामिंग से संबंधित हैं, जबकि पीएल समुदाय अधिक विविध है, लेकिन भाषाओं को C ++ से अधिक सुरुचिपूर्ण पसंद करता है। हास्केल सबसे उन्नत प्रकार की प्रणाली के साथ "मुख्यधारा" भाषा है, इसके बाद स्काला (कम उन्नत, थोड़ी अधिक मुख्यधारा) है। सी ++ में दिलचस्प विशेषताएं हैं, लेकिन आधुनिक स्वाद के लिए बहुत कम स्तर है।
Blaisorblade

33

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

यहां तक ​​कि सटीक घातीय समय एल्गोरिदम के दायरे में, एक प्रेरणा एल्गोरिदम का निर्माण कर रही है जो वास्तव में काम कर सकती है। एसएटी सॉल्वर इसका विहित उदाहरण हैं।

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


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

हो सकता है: लेकिन वह धागा लंबे समय तक मर चुका है :)
सुरेश वेंकट

वास्तव में, मैंने तारीख को नहीं देखा, यह मेरे द्वारा प्राप्त अंतिम समाचार पत्र में था, "पिछले हफ्तों से सबसे बड़ी हिट" =)।
गोपी

18

तीन अंक:

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

एल(एक्स,Y)बीएल(Y,सी)

3) जब आप "प्रोग्राम टू" कहते हैं, तो क्या आपका मतलब " लीनियर प्रोग्राम " या " सेमीफाइनल प्रोग्राम " से भी है? :)


2
कोई भी मुझे नहीं पता है कि "प्रोग्राम टू" के लिए "टू लीनियर प्रोग्राम" या "सेमीफाइनल प्रोग्राम" का उपयोग किया जाता है। आप इसके बजाय "एक रैखिक कार्यक्रम का निर्माण / हल करने के लिए" कहेंगे।
पीटर शोर

2
@PeterShor प्वाइंट 3 गंभीर नहीं था
एलेसेंड्रो कॉसेंटिनो

3
और निश्चित रूप से, आपको रैखिक कार्यक्रम और अर्ध-अनिश्चित कार्यक्रम ... दोनों उपयोगी कौशल भी सीखना चाहिए
पीटर शोर

3
बिंदु 2 के लिए +1, मुझे वास्तव में थोड़ा OCaml सिखाया गया था जब मैं एक अंडरग्रेजुएट था, भले ही मैंने केवल एक वर्ष के लिए इसका इस्तेमाल किया था, मैंने अपने प्रमाणों के प्रकारों की जांच करने की आदत डाल ली।
गोपी

4
मैं गतिशील कार्यक्रम !
जेफ़

16

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

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

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


"यदि आप भाग्यशाली हैं, तो आपको उन पाठ्यक्रमों को सिखाना होगा जो आपके विशेषज्ञता के क्षेत्र से काफी दूर हैं।" क्या वह भाग्यशाली है ...?
Tsuyoshi Ito

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

@TsuyoshiIto: हाँ!
जेफ

13

प्रोग्रामिंग विभिन्न अवधारणाओं की अपनी समझ को बेहतर बनाने का एक अच्छा तरीका है, लेकिन यह एक खतरनाक समय सिंक भी है।

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

प्रोग्रामिंग भाषा सीखने के लिए: "उनमें से सभी" मेरा (जीभ-इन-गाल) उत्तर है।


2
प्रोग्रामिंग के खिलाफ एक तर्क अंतिम :)।
गोपी

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

6
प्रमेय सिद्ध करना भी विभिन्न अवधारणाओं की आपकी समझ को बेहतर बनाने का एक अच्छा तरीका है, लेकिन यह एक खतरनाक समय सिंक भी है।
जेफ़

@ J @ ɛ E, मेरी राय को प्रतिस्थापन द्वारा संरक्षित किया गया है [pseudocode-> कागज पर प्रमाण, कोड-> एक प्रमाण सहायक में प्रमाण]।
रादु GRIGore

12

मुझे पार्टी में देरी हो रही है, और ये सभी शानदार जवाब हैं, लेकिन मेरे पास एक और कारण है:

दृश्य।

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


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

@PeterShor: क्योंकि आप C ++ का उपयोग नहीं करते हैं! (बस मजाक कर रहे हैं)
Tsuyoshi इतो

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

@ जॉन ... आप सही कह रहे हैं, मुझे नहीं लगता कि आप ऐसा कर सकते थे।
पीटर शोर

7

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


त्सुयोशी इटो ने अपने जवाब में एक समान तर्क लिखा (दूसरा बिंदु :))।
गोपी

उफ़ तुम सही हो - मुझे यह याद आया।
लेव Reyzin

5

यहां किसी ने भी व्यावहारिक मुद्दों को संबोधित नहीं किया है कि टीसीएस का अध्ययन करने वाले किसी व्यक्ति को प्रोग्रामिंग क्यों सीखनी चाहिए।

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

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

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

मैं C (C ++ नहीं) सीखने की सलाह देता हूं। K & R की एक प्रति चुनें और इसे आगे-पीछे पढ़ें। सी में आधुनिक भाषाओं की कई फैंसी विशेषताएं नहीं हैं, लेकिन इसमें सरल लेकिन सुरुचिपूर्ण वाक्यविन्यास और शब्दार्थ हैं, जिन्हें आपको संपूर्णता में सीखने में सक्षम होना चाहिए। हालाँकि, जब आप पूरी तरह से भाषा को समझते हैं, तब भी सी। में अच्छे सुरुचिपूर्ण बग-मुक्त कोड लिखने में महारत हासिल करने के लिए अभ्यास करना पड़ता है। फिर भी, यदि आप सी में कोडिंग में महारत हासिल कर सकते हैं, तो आप किसी भी प्रोग्रामिंग भाषा का सामना करने में सक्षम होंगे। इसके अलावा, यह अनुशासन आपको यह सोचने में मदद करेगा कि हार्डवेयर कैसे सोचता है, जो एल्गोरिदम को डिजाइन करते समय फायदेमंद होगा।

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


0

मैं आपको सुझाव दूंगा कि आप अपने पाठ्यक्रम की शुरुआत का इंतजार न करें क्योंकि किसी भी स्तर पर कंप्यूटर विज्ञान में किसी भी सिद्धांत को पूरा करने / सत्यापित करने / हल करने के लिए एक कंप्यूटर के माध्यम से एल्गोरिदम को लागू करना शामिल है, जिसे आपको अपने स्तर पर ESPECIALLY अपने स्तर पर सामना करना होगा।

मुझे पहले ग्रेड 10 (हाई स्कूल) में कार्यक्रम करना था, और मुझे पहले से ही पता था कि कमांड लाइन का उपयोग कैसे करना है और यह वास्तव में मदद करता है (यह आपको यह दिखाने के लिए है कि सीएस में "बुनियादी" प्रोग्रामिंग कौशल कैसे माना जाता है)।

अपने साथियों की विस्मय अच्छी तरह से स्थापित है, क्योंकि छद्मकोड और एल्गोरिदम पहली चीजों में से एक हैं जिन्हें प्रोग्राम करने के लिए सीखना है।

हालाँकि, आप अपने आगामी पाठ्यक्रम में पूरी तरह से खो जाने वाले नहीं हैं क्योंकि आप अपने लाभ के लिए अपने व्यापक गणित कौशल (अपने दम पर) का उपयोग कर सकते हैं ताकि ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग को तेजी से सीखने के लिए एक कार्यात्मक प्रोग्रामिंग भाषा को पकड़ सकें।

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

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

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

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


4
मुझे नहीं पता कि आप मूल प्रश्न का कितना जवाब दे रहे हैं: मैंने "कैसे" नहीं पूछा, लेकिन अधिक "क्या" के लिए।
गोपी

0

एक इंटरैक्टिव प्रूफ सिस्टम के C ++ कार्यान्वयन का एक उदाहरण निम्नलिखित पेपर है: जस्टिन थैलर द्वारा टाइम-ऑप्टिमल इंटरएक्टिव प्रूफ फॉर सर्किट इवैल्यूएशन। यह http://people.seas.harvard.edu/~jthaler/ पर उपलब्ध है । यह सामान्य-उद्देश्य इंटरैक्टिव प्रूफ सिस्टम के व्यावहारिक कार्यान्वयन के लक्ष्य की दिशा में एक कदम प्रतीत होता है।

इसी तरह के कागजात और संबंधित स्रोत कोड ऊपर उल्लिखित वेबसाइट पर दिखाई देते हैं।


3
क्या आप बताएंगे कि यह पेपर किस तरह से संबंधित है अर्थात TCS के लिए प्रोग्राम करना कितना महत्वपूर्ण है ?
स्काउहू

भले ही यह सैद्धांतिक परिणाम का एक उदाहरण था जो प्रोग्रामिंग से लाभान्वित हुआ, यह मूल प्रश्न का उत्तर नहीं देगा?
जेरेमी

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