एक भौतिक विज्ञानी के रूप में खुद को पढ़ाना, एक बेहतर प्रोग्रामर बनने के लिए [बंद]


17

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

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

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

कंप्यूटर विज्ञान में स्नातक की तरह एक अच्छे, अमूर्त तरीके से कोड करने के लिए मैं खुद को कैसे सिखाऊं?

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


12
एक प्रश्न: आप कैसे जानते हैं कि आपका कोड कुशल है?
मात्सेमन्न

मैंने बहुत से लोगों को पहली OO भाषा के रूप में C ++ नहीं कहने के लिए देखा है। मैं जावा सीख रहा हूं और मुझे यहां मार्क डेक्सटर के वीडियो ट्यूटोरियल मिल गए हैं eclipsetutorial.sourceforge.net/totalbeginner.html , वे बहुत अच्छे हैं और आपको TDD तरीके से सिखाएंगे। इसके अलावा हेड फर्स्ट जावा की जाँच करें कि यह OO तरीके से जावा को कवर करने में बहुत अच्छा है।
गरव

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

1
@DeveloperDon जब CERN के भौतिक विज्ञानी, उदाहरण के लिए, डेटा प्राप्त करते हैं, तो उन्हें लाखों कण टकराव के डेटा मिलते हैं। इस जानकारी को संभालने के लिए आपको एक कंप्यूटर की आवश्यकता है। ठोस राज्य भौतिकी जैसे क्षेत्र पर भी विचार करें जहां आप परमाणुओं के सूक्ष्म अंतःक्रिया से किसी पदार्थ के स्थूल गुणों को समझने की कोशिश करते हैं। ऐसी प्रणाली में एक एकल इलेक्ट्रॉन अरबों नाभिकों और इलेक्ट्रॉनों से प्रतिकर्षण / आकर्षण महसूस करता है - और इस तरह की प्रणाली का सटीक वर्णन करने के लिए आपको एक तेज कंप्यूटर और कुशल एल्गोरिदम (और मूलभूत समीकरणों के लिए कुछ अच्छे अनुमान) की आवश्यकता होती है।
user787267

1
हो सकता है कि आपको अपनी भाषा C / C ++ से बदलकर Python करनी चाहिए ताकि आपके पास अधिक समय हो सके? अजगर अक्सर वैज्ञानिकों द्वारा उपयोग किया जाता है , न्यूमप जैसे मॉड्यूल हैं - पायथन या साइन्सपी के साथ वैज्ञानिक कंप्यूटिंग के लिए पैकेज । यदि आपको पायथन में C / C ++ की गति की आवश्यकता है, तो Cython का उपयोग करें , यह आपको C / C ++ प्रकारों और संरचनाओं का उपयोग करने की अनुमति देता है ताकि आपको C / C ++ के समान गति प्राप्त हो, यह मौजूदा C / C ++ पुस्तकालयों को Cython के साथ एकीकृत करना आसान है।
Czarek Tomczak

जवाबों:


20

ध्यान रखें कि मेरे पास अमूर्त प्रोग्रामिंग के बारे में कई 1000-पृष्ठ कब्रों को पढ़ने का समय नहीं है।

तो क्या आप किसी से पूछ रहे हैं कि वह आपको पाँच कदम की जाँच सूची देगा जो आपको एक कुशल प्रोग्रामर बना देगा? ऐसा होने वाला नहीं है !

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

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

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

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


लिंक के लिए धन्यवाद, मैं इस पर गौर करूंगा। मुझे पता है कि मैं एक सप्ताहांत में कोडिंग गुरु नहीं बनूंगा, हालांकि मैं धीरे-धीरे समय के साथ सुधार करने की उम्मीद करता हूं - खासकर अगर मैं भौतिकी के बाहर प्रेरणा चाहता हूं (जैसा कि मुझे पता है कि बहुत से भौतिक विज्ञानी अच्छे कोडिंग अभ्यासों के लिए कम देखभाल नहीं कर सकते हैं)।
user787267

1
मैं पठनीय गणना के रूप में उपकरण में अजगर
जोड़ूंगा

2
कोड पूरा करने का सुझाव देने के लिए +1। यह वास्तव में सबसे अच्छी बात है कि ऑप प्रश्न में मुद्दे को हल करने के लिए पढ़ सकता है।
JW01

9

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

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

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

लेकिन आपको उस तरह की औपचारिक प्रणाली के लिए जाने की जरूरत नहीं है। स्थानीय प्रोग्रामर मीट-अप समूह (या जहां आपके विश्वविद्यालय का सॉफ्टवेयर इंजीनियरिंग विभाग शुक्रवार को काम करने के बाद जाता है) को ढूंढना एक शानदार जगह है।


MentorNet बहुत दिलचस्प लग रहा है - मैं इस पर गौर करूंगा। क्या यह भौतिकविद् से सॉफ्टवेयर इंजीनियर के लिए एक कठिन संक्रमण था?
user787267

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

5

सॉफ्टवेयर के लिए कोई रॉयल रोड

प्राचीन समय में, यूक्लिड से आपके छात्र राजा टॉलेमी द्वारा आपके जैसे प्रश्न पूछे गए थे। उनकी प्रतिक्रिया: "ज्यामिति के लिए कोई शाही सड़क नहीं है।"

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

वे आपके लक्ष्य से कम हैं:

"मुझे वास्तविक भौतिकी पर समय बिताने की आवश्यकता है"

कॉन्सर्ट पियानोवादक या वन मैन बैंड?

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

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

यदि प्रोग्रामर के दृष्टिकोण से मेरा काम अच्छा है तो मैं कैसे आकलन करूं?

यदि आप बार को हाई सेट करना चाहते हैं, तो यहां शुरू करें:

प्रैक्टिस में सॉफ्टवेयर आर्किटेक्चर, लेन बास, पॉल क्लेमेंट्स, रिक कज़मैन

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

http://msdn.microsoft.com/en-us/library/ee658094.aspx

http://www.sei.cmu.edu/reports/95tr021.pdf

आपका लक्ष्य बनाम सी और सी ++

फोरट्रान की तरह, ये कठिन और पुरानी भाषाएं हैं। C / C ++ के सकारात्मक संकेतकों में शामिल हैं:

  • हार्डवेयर, एम्बेडेड सिस्टम के साथ अनुप्रयोग।
  • मौजूदा परियोजना जिसे आप एक प्रारंभिक बिंदु के रूप में चाहते हैं।

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

मतलाब का उपयोग करने पर विचार करें

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

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


4

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

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

उसके बाद अपनी भाषा के मूल में जो उपलब्ध है, जैसे C ++ cppreference.com के लिए उपयोग करें । मैं आपको कोनिग एंड मो द्वारा स्कॉट मेयर्स और त्वरित सी ++ द्वारा प्रभावी सी ++ श्रृंखला को पढ़ने के लिए भी दृढ़ता से सलाह दूंगा। कम से कम C ++ के लिए यह आपको भाषा पक्ष में एक ठोस आधार देगा।

समानांतर में आपको अपने उपकरणों को अच्छी तरह से जानने की कोशिश करनी चाहिए। यह संभावना नहीं है कि आप लिनक्स के तहत अपना कोड विकसित करेंगे, इसलिए यह जानने की कोशिश करें कि आपके कंपाइलर (कम से कम जीसीसी और क्लैंग) से अधिक डायग्नोस्टिक्स (चेतावनी) कैसे प्राप्त करें। Cppcheck या clang के स्कैन-बिल्ड जैसे स्थैतिक विश्लेषण टूल के बारे में भी जानें । इन उपकरणों को अपनी विकास प्रक्रिया का एक अभिन्न हिस्सा बनाने का तरीका जानें, जैसे कि उन्हें अपने बिल्ड सेटअप में एकीकृत करके (हाँ, आपको कम से कम GNU मेक का उपयोग करना चाहिए, या GNU ऑटोटूलस / cmake / ... जैसे कुछ बेहतर करना चाहिए)। आपको अपने टूलसेट में प्रोफाइलिंग टूल भी जोड़ना चाहिए। C ++ के लिए, मैं आपको दृढ़ता से सब कुछ सीखने की सलाह दूंगा जो आप वेलग्रिंड के बारे में जान सकते हैं जो बहुत कम स्तर पर प्रोफ़ाइल कर सकता है (यह आपको संसाधन लीक खोजने में भी मदद कर सकता है)।

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

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


लिंक के लिए धन्यवाद! मैं निश्चित रूप से इस पर गौर करूंगा (लेकिन मुझे नहीं लगता कि मेरे पास कई किताबें पढ़ने का समय है - हालांकि मैंने हाई स्कूल में त्वरित C ​​++ वापस पढ़ा है)। मैं एक यूनिक्स वातावरण में काम कर रहा हूं (मैं अपने संपादक के रूप में विम का उपयोग कर रहा हूं और इसे पसंद कर रहा हूं), और मैं बड़े पैमाने पर मेक और वेलग्रिंड का उपयोग करता हूं। मैंने gcc और -Wall में -ponic ऑप्शन को भी ट्रिगर किया है क्योंकि यह काफी मदद करता है। शायद मुझे यह उल्लेख करना चाहिए कि मैं विश्वविद्यालय के सुपर कंप्यूटर पर उच्च प्रदर्शन कंप्यूटिंग (समानांतर प्रोग्रामिंग के लिए एमपीआई पुस्तकालय के साथ) करता हूं।
user787267

मुझे यह भी उल्लेख करना चाहिए कि पायथन वास्तव में एक विकल्प नहीं है क्योंकि मेरे कोड को बहुत तेज होने की आवश्यकता है - हालांकि मुझे यह उदाहरण के लिए साजिश रचने के लिए पसंद है। मैंने मतलूब का भी खूब इस्तेमाल किया है।
user787267

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

@ user787267 यह अब जरूरी नहीं है कि पायथन धीमी गति से प्रदर्शन करता है - उदाहरण के लिए youtube.com/watch?v=Iw9-GckD-gQ पर एक नज़र डालें । कुंजी यह है कि आप पायथन का उपयोग कार्यशील कोड लिखने के लिए कर सकते हैं, जिसे तब आप 1 से तेज कर सकते हैं) साइपी / स्पीडी 2 का उपयोग करके) साइथन या शेडस्किन का उपयोग करके, और 3) केवल कोर एल्गोरिथ्म को C / C ++ या FORTRAN मॉड्यूल में डाल सकते हैं यदि आपको वास्तव में अंतिम 5% सुधार की आवश्यकता है। यह भी याद रखें, जब आप कोडिंग पर समय व्यतीत करते हैं, तो कोड पहले से ही नहीं चलता है, इसलिए हो सकता है कि यह आधे समय में लिखे गए 80% -परफॉर्मेंस कोड के लिए अधिक कुशल हो
Tobias Kienzler

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

4

यदि प्रोग्रामर के दृष्टिकोण से मेरा काम अच्छा है तो मैं कैसे आकलन करूं?

  • क्या यह सही है? क्या यह सभी मामलों में सही परिणाम देता है?

  • क्या अन्य लोग आपके कोड को आसानी से पढ़ और समझ सकते हैं?

  • जब आपका पर्यवेक्षक कहता है "महान, अब इसे भी एक्स करें ..." क्या आपको बहुत सारे कोड को फिर से लिखना है?

  • जब आप एक कार्यक्रम लिख चुके होते हैं, तो क्या यह एक ऐसा उपकरण बन जाता है, जिसे आप बार-बार इस्तेमाल कर सकते हैं, या क्या यह एक बार इस्तेमाल होता है और इसे किसी तरह का फेंक दिया जाता है?

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


3

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

कुछ अच्छे सॉफ़्टवेयर डेवलपर अपने कोड की समीक्षा करें और इसे एक साथ ऑप्टिमाइज़ करें। यह आपको बहुत अधिक अनुभव देगा और आपको अच्छे अभ्यास सिखाएगा। अन्य लोगों द्वारा लिखे गए स्रोत कोड की भी समीक्षा करें। Sourceforge या github पर ओपन सोर्स प्रोजेक्ट्स की खोज करें और उनका सोर्स कोड पढ़ें।

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


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

दुर्भाग्य से उद्योग को उन कौशलों की आवश्यकता होती है जो आप आमतौर पर अकादमिक विकास में हासिल नहीं करते हैं। सामान जो आप अपने अकादमिक शोध के दौरान लिखेंगे, वह आमतौर पर वाणिज्यिक एप्लिकेशन के स्रोत कोड के 5% से कम होता है।
आंद्रेज बोबाक

3

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

अपने स्वयं के कोड का आलोचनात्मक होना बेहतर होने के सर्वोत्तम तरीकों में से एक है। हमेशा अपने आप से पूछें:

  • क्या इसे बदलना आसान होगा?
  • क्या यह आसानी से परीक्षण योग्य है?
  • क्या मैं इसे सरल कर सकता हूं? क्या मैं इसे आसानी से समझ सकता हूं जब मैं इसे 3 महीने में फिर से देखूंगा?

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

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

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


2

सबसे पहले, "सुरुचिपूर्ण" एक सापेक्ष शब्द है। अमूर्त आप के लिए सुरुचिपूर्ण लग सकता है, लेकिन एक और सी aficionado के लिए, यह अनावश्यक लग सकता है। वैसे भी, आपके प्रश्न का उत्तर देने के लिए, आपको समीक्षा के लिए अपना कोड पोस्ट करने का प्रयास करना चाहिए http://codereview.stackexchange.com
मुख्य बिंदु से खुदाई, मेरे अपने अनुभव के आधार पर कुछ अवांछित सलाह। यदि आप अपना सारा काम सिर्फ सी के साथ कर सकते हैं, तो आप इसे अमूर्त तरीके से क्यों कोड करना चाहते हैं? इसके द्वारा, क्या आप अपने कोड को पुन: उपयोग करने के लिए दूसरों को सक्षम करना चाहते हैं? यदि आपके पास वास्तव में C ++ पर स्विच करने का ठोस कारण है, तो अमूर्त और C ++ और OO अवधारणाओं को सीखने के लिए जाएं। अन्यथा विचार को गिरा दो। मेरी विनम्र राय में, क्या आपको अपने कोड का उद्देश्य अधिक पठनीय होना चाहिए और आपके वैज्ञानिक परिणाम ओओ अमूर्त देने की तुलना में प्रतिलिपि प्रस्तुत करने योग्य हैं? मैं खुद OOPS और "सुरुचिपूर्ण" गीत सीखने के लिए इस तरह का जुनून था। लेकिन C ++ मास्टर होने में समय लेगा। आपको मेमोरी मैनेजमेंट सीखना होगा क्योंकि C ++ में कचरा संग्रह स्वचालित नहीं है। मेरी सलाह लें क्योंकि मैंने खुद एक रिसर्च लैब के लिए काम किया और C ++ और OO सीखने में बहुत समय गंवा दिया,


1
लेकिन C ++ की तुलना में C अधिक अप्रबंधित है। C ++ में कम से कम RAII है।
बेंजामिन बैनिएर

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

2

सिद्धांत का अध्ययन करने के लिए समय की कमी के अपने उल्लेख को ध्यान में रखते हुए।

यदि आपने कुछ महीनों के बाद अपने पुराने कोड को देखा है और सोचा है कि "किस तरह के बेवकूफ ने उस कोड को लिखा है", तो आप प्रगति कर रहे हैं।

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

MATLAB या पायथन जैसी भाषाओं को आज़माने पर भी विचार करें।


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

+1 के लिए अजगर @ user787267 मैं वास्तव में पकड़ नहीं पा रहा हूं कि उपदेशात्मक सरणी एक बुरी आदत क्यों नहीं है
जेवियर कॉम्बेल

2

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

मैंने अपने CUJ कॉलम "पैटर्न ऑफ़ थिंकिंग - नाम, रूपक, बेहतर प्रोग्रामिंग, और भाषा की राजनीति" में सॉफ्टवेयर में रूपकों और उपमाओं की महत्वपूर्ण और सराहनीय भूमिका का वर्णन किया है। । उदाहरण के लिए, वर्ग वंशानुक्रम की OO अवधारणाएं अक्सर एक परिवार में माता-पिता से संतानों को पारित करने की तुलना में होती हैं। यह एक गलत उपमा है। वर्ग वंशानुक्रम के लिए सही सादृश्यता जीवों का जैविक वर्गीकरण है (उदाहरण के लिए, वर्ग रेडरोज़ एक प्रकार का फूल है, और एक फूल एक प्रकार का पौधा है)।

या उदाहरण के लिए एक पदानुक्रमित राज्य मशीन की सॉफ्टवेयर अवधारणा। यहां एक अच्छा रूपक हाइड्रोजन परमाणु के रूप में एक बाध्य क्वांटम प्रणाली की अवधारणा है। जैसा कि आप याद करते हैं, एक परमाणु के राज्यों को तीन क्वांटम संख्याओं द्वारा गिना जाता है। n, l, m>, बिल्कुल क्योंकि वे "नेस्टेड" (पदानुक्रमित) हैं। यह रूपक आपको दिखाता है कि कैसे समझें कि राज्यों के भीतर घोंसला है (जैसे ऊर्जा की स्थिति में कोणीय गति (एल) के घोंसले) (एन) और इसके अलावा आप तुरंत देखते हैं कि राज्य का घोंसला हमेशा प्रणाली के कुछ समरूपता का प्रतिबिंब है।

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

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


यद्यपि भौतिकी संभावित रूप से रूपकों का एक समृद्ध स्रोत है, लेकिन XP में इरादा एक रूपक ढूंढ रहा है जो साइट पर ग्राहक और अन्य टीम के सदस्यों के साथ संचार की सुविधा प्रदान करता है, इसलिए आमतौर पर ऐसे रूपकों को चुनना होगा जो आमतौर पर अधिक समझ में आते हैं।
पीट किर्कम

2

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

पार्सर और संकलक सामान के लिए एक उत्कृष्ट संसाधन PL101 है: अपनी खुद की प्रोग्रामिंग भाषा बनाएं । मैं अभी भी कार्यात्मक प्रोग्रामिंग के लिए एक अच्छा परिचय नहीं मिला है, लेकिन मैं वास्तव में SICP के बारे में अच्छी बातें सुनता हूं


-5

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

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

हेड फर्स्ट डिज़ाइन पैटर्न पढ़ें, यह एक अच्छी किताब है। यह काफी व्यापक पुस्तक है। यही वह सब है जिसकी आपको आवश्यकता होगी।


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