गहन प्रोग्रामिंग ज्ञान विकसित करने पर


136

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

आप सोच सकते हैं कि foreachलूप का उपयोग करने के लिए , जिस संग्रह पर आप अधिक ध्यान दे रहे हैं, उसे लागू करना चाहिए IEnumerableया IEnumerable<T>। लेकिन जैसा कि यह पता चला है, यह वास्तव में एक आवश्यकता नहीं है। यह आवश्यक है कि संग्रह के प्रकार के पास एक सार्वजनिक विधि होनी चाहिए जिसे कहा जाता है GetEnumerator, और उसे कुछ प्रकार को वापस करना होगा जिसमें एक सार्वजनिक संपत्ति प्राप्तकर्ता कहा जाता है Currentऔर एक सार्वजनिक विधि है MoveNextजो एक रिटर्न देती है bool। यदि कंपाइलर यह निर्धारित कर सकता है कि उन सभी आवश्यकताओं को पूरा किया गया है तो उन तरीकों का उपयोग करने के लिए कोड उत्पन्न होता है। केवल अगर वे आवश्यकताएं पूरी नहीं होती हैं, तो हम यह देखने के लिए जांच करते हैं कि क्या वस्तु लागू होती है IEnumerableया नहीं IEnumerable<T>

यह जानने के लिए अच्छा सामान है। मैं समझ सकता हूं कि एरिक यह क्यों जानता है; वह संकलक टीम पर है, इसलिए उसे जानना होगा। लेकिन उन लोगों के बारे में जो ऐसे गहन ज्ञान का प्रदर्शन करते हैं जो अंदरूनी नहीं हैं?

केवल इस तरह के सामान के बारे में पता लगाने के लिए केवल नश्वर (जो सी # संकलक टीम पर नहीं हैं) कैसे करते हैं?

विशेष रूप से, क्या ऐसे तरीके हैं जो इन लोगों को इस तरह के ज्ञान को व्यवस्थित रूप से जड़ने के लिए उपयोग करते हैं, इसे तलाशते हैं और इसे आंतरिक करते हैं (इसे अपना बनाते हैं)?


10
मुझे लगता है कि यह विशेष रूप से है जहां खुला स्रोत सॉफ्टवेयर चमकता है। सभी तरह से नीचे ढांचे / प्रणाली / पुस्तकालयों में कदम रखने में सक्षम होना अच्छा है। जब मैं WinForms के साथ काम कर रहा था, तब मैंने Qt के साथ काम करने के दौरान फ्रेम इंटर्नल के बारे में बेहतर तरीके से समझा।
विटर पाय जुएल

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

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

10
"मैं समझ सकता हूं कि एरिक यह क्यों जानता है; वह कंपाइलर टीम पर है, इसलिए उसे जानना होगा।" - संभावना है कि वह यह जानता है क्योंकि उसने सोचा था कि यह पहली जगह में है । मुझे संदेह है कि उसे यह पता लगाना था कि यह इस तरह से काम करता है :)
एलेक्स दस कगार

10
@ एलेक्स: मैंने वास्तव में केवल C # पर काम किया है क्योंकि हमने वास्तव में C # 3 के कार्यान्वयन का निर्माण शुरू कर दिया है। "foreach" विनिर्देश छह साल पहले लिखा गया था। मैं अभी भी हर दिन भाषा के बारे में पागल ऐतिहासिक चीजों का पता लगाता हूं। उदाहरण के लिए, मैंने आज सीखा कि प्रतिनिधियों के लिए, ((ए + बी) + सी) - (ए + सी) = ए + बी + सी, लेकिन ((ए + बी) + सी) - (बी + सी) = ए । अजीब!
एरिक लिपर्ट

जवाबों:


167

सबसे पहले, इस तरह के शब्दों के लिए धन्यवाद।

यदि आप C # का गहन ज्ञान प्राप्त करना चाहते हैं, तो निस्संदेह यह है कि भाषा विनिर्देश, दस साल के डिजाइन नोट, स्रोत कोड, बग डेटाबेस और एंडर्स, मैड्स, स्कॉट और पीटर हॉल के नीचे स्थित होने का एक फायदा है। मैं निश्चित रूप से भाग्यशाली हूं, इसके बारे में कोई सवाल नहीं है।

हालांकि, उन फायदों के बिना भी विषय का गहन ज्ञान प्राप्त करना अभी भी संभव है।

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

जाहिर है StackOverflow और अन्य सार्वजनिक क्यू एंड ए मंचों की तरह बात के लिए एक firehose से पीने की तरह हैं। इसके बाद, मैंने comp.lang.javascript और हमारे आंतरिक Microsoft "JS User" मंचों को धार्मिक रूप से पढ़ा और मेरे प्रबंधक की सलाह का पालन किया: जब मैंने एक प्रश्न देखा जो उस भाषा के शब्दार्थ के बारे में था जिसका उत्तर मुझे नहीं पता था, तो मैंने इसे बनाया। मेरे व्यवसाय का पता लगाने के लिए।

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

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


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

6
शायद आप गलत समझ रहे हैं कि वह क्या कह रहा है। प्रति-सहजता से, वह चीजों को सीखने के लिए सवाल नहीं पूछ रहा था, वह सवालों के जवाब दे रहा था ।
झटके

65

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


1
एक बहुत अच्छा बिंदु। मुझे अक्सर लगता है कि लंबे समय तक शोध में लगे रहने के बाद मुझे ऐसे सवाल मिलते हैं जिनका जवाब अब मैं उन चीजों के कारण दे सकता हूं जो मैंने पहले दिन में सीखी थीं।
मैथ्यू पढ़ो

47

योगासन भजन:

"यदि आप कुछ सीखना चाहते हैं, तो इसके बारे में पढ़ें; यदि आप कुछ समझना चाहते हैं, तो इसके बारे में लिखें; यदि आप कुछ बनाना चाहते हैं, तो इसे प्रोग्राम करें ।"

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

उदाहरण के लिए, यदि आप भौतिकी सीखना चाहते हैं, तो भौतिकी इंजन लिखें। यदि आप शतरंज सीखना चाहते हैं, तो शतरंज का खेल तैयार करें। यदि आप गहन C # ज्ञान सीखना चाहते हैं, तो C # कंपाइलर (या कोई अन्य टूल) लिखें।


2
प्रोग्रामिंग भी सबसे असंदिग्ध तरीके से (निश्चित रूप से लोगों द्वारा पढ़ा जाना) लिखने का एक मामूली प्रयास है।
vpit3833

4
वह उद्धरण वास्तव में गहरा लग रहा था जब तक कि मैं शतरंज का उदाहरण नहीं पढ़ता। दुर्भाग्य से एक शतरंज एअर इंडिया की प्रोग्रामिंग आपको एक बेहतर शतरंज खिलाड़ी नहीं बनाएगी (यह मूल रूप से मिन-मैक्स पेड़ की खोज है)। अभी भी +1
बूगी

1
@bughi शायद आप नियमों में महारत हासिल कर सकते हैं: D
Julio Rodrigues

@bughi, 'प्रोग्राम इट' बहुत व्यापक शब्द है जो हमेशा लेखन कोड से संबंधित नहीं है !! जरा सोच कर देखिए।
नितेश वर्मा

25

जहाँ तक मुझे पता है, इसे सीखने के तरीके हैं:

  • एरिक लिपर्ट जैसे किसी व्यक्ति से इसके बारे में पढ़ें
  • अनुभव करें और फिर समस्याओं को पहले हल करें।

दूसरा तरीका ज्यादा समय ले सकता है लेकिन शायद गहरी समझ में आएगा (लेकिन हमेशा नहीं)।


17
अथवा दोनों। [15 वर्ण]
माइकल के

23

मैं कहूंगा कि निम्नलिखित कार्य करें:

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

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

30 दिनों की प्रकार की पुस्तकों में सीखी एक्स के बजाय एक भाषा पर उन्नत पुस्तकें पढ़ें (उदाहरण के लिए SQl सर्वर के लिए इसमें प्रदर्शन ट्यूनिंग और डेटाबेस इंटर्नल्स के बारे में पढ़ना शामिल होगा)।

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

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

क्षेत्र के जाने माने विशेषज्ञों से कुछ अच्छे तकनीकी ब्लॉग खोजें और उन्हें पढ़ें।

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


एक अच्छा जवाब। लेकिन मैं यह सोचकर हैरान रह गया कि ज्ञान को बनाए रखने और डॉट्स को जोड़ने में मैं कैसे बेहतर हो सकता हूं?

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

9

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


3
अच्छा उत्तर - उदाहरण के लिए, लिंक सी # विनिर्देश की धारा 15.8.4 में कार्यान्वयन को शामिल किया गया है foreach, और एरिक लिपर्ट के उद्धृत ब्लॉग पोस्ट में वर्णित व्यवहार को बाहर निकालता है। अगर कोई भी कभी भी खुद को ऐसा सोचता हुआ पाता है, "मुझे आश्चर्य है कि वास्तव में फॉर्चून कैसे काम करता है .." यह एक अच्छी जगह होगी।
कार्सन63000

6

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


5
मैंने वास्तव में BitConverterकक्षाओं के साथ ऐसा किया , और IsLittleEndianसिस्टम-विशिष्ट ध्वज की खोज की ।
रॉबर्ट हार्वे

जबरदस्त हंसी। +1 isLittleEndian के लिए
रूडी

4

मैंने C ++ में उस तरह के ज्ञान को comp.lang.c++.moderatedएक दो साल तक लटकाकर विकसित किया , भले ही मैं वास्तव में उस बिंदु पर उस कोड में कड़ी मेहनत नहीं कर रहा था। मुझे यकीन नहीं है कि मैं कैसे कह सकता हूं कि मैं गुरु हूं।

मुझे लगता है कि दो प्रकार के ज्ञान हैं जो एक प्रोग्रामिंग भाषा के बारे में उठा सकते हैं:

  1. भाषा के बारे में सामान्य ज्ञान, और नुकसान से बचने के बारे में जानना।
  2. यह जानते हुए कि समस्याओं को प्रभावी ढंग से कैसे हल किया जाए।

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


4

गहन ज्ञान और प्रोग्रामिंग विशेषज्ञता का अर्थ है सभी अमूर्त स्तरों पर सहज होना। अर्थात

  • पुस्तकालयों और एपीआई
  • भाषा शब्दार्थ
  • संकलक अनुकूलन
  • संकलक इंटर्न और कोड पीढ़ी
  • रनटाइम और कचरा कलेक्टर व्यवहार
  • वास्तुकला और निर्देश सेट मुद्दों

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

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


3

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

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


1
मुझे नहीं लगता कि सी # भाषा विनिर्देश "स्किमिंग" जैसी कोई चीज है।
रॉबर्ट हार्वे

@RobertHarvey: आप उन सभी औपचारिक भाषाओं को कवर कर सकते हैं, जिन्हें आप पहले से जानते हैं, जैसे ऑपरेटर पूर्ववर्तीता और घोषणा सिंटैक्स, और अनपेक्षित लेकिन उपयोगी विवरणों पर ध्यान केंद्रित करते हैं, जैसे C # foreach या Java enfor constructors का सटीक व्यवहार।
केविन क्लाइन

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