Wednesday, April 30, 2008

Teach Yourself Programming in 10 Years By Peter Norvig

सबको इतनी जल्दी क्यों है
किसी किताबो की दुकान में जाइए और आप देखेंगे की " ७ दिनों में जावा  कैसे सीखे " और साथ ही साथ इससे मिलती हुई कई किताबे जो कुछ दिनों में विजुअल बेसिक  , विन्डोज़ और इंटरनेट सिखाने का दावा करती हैं । मैंने amazon.com पे पॉवर सर्च किया और 2४८ रिजल्ट पाया -
pubdate: after 1992 and title: days and (title: learn or title: teach yourself)
पहली ७८ किताबे कंप्यूटर से संबंधित थी(७९ क्रमांक पे "३० दिनों में बंगाली सीखे थी ")। मैंने अपने सर्च में दिनों की जगह घंटो का उपयोग किया तो लगभग समान उत्तर पाया : २५३ और किताबे , जिसमे ७७ कंप्यूटर की और उसके बाद Teach Yourself Grammar and Style in 24 Hours ७८ वे क्रमांक पे थी। उपर की २०० किताबो में , ९६% कंप्यूटर की किताबे थी।
इसका यह निष्कर्ष निकालता है की या तो लोग बहुत जल्दी कंप्यूटर सीखना चाहते हैं, या कंप्यूटर सीखना बाकि चीजो से आसान है। वहा कोई किताब ऐसी नही थी जो बीथोवन और क्वांटम भौतिकी को कुछ दिनों में सिखाने का दावा करती हो।
आइये विश्लेषण करे की ऐसे टाइटल "३ दिन में पास्कल सीखे "का क्या मतलब हो सकता है -
सीखना - ३ दिनों में आपके पास अच्छे प्रोग्राम लिखने का समय नही होगा, और अपनी सफलता या असफलता से सीखने का भी। आपके पास एक अनुभवी प्रोग्रामर के साथ काम करने और वैसे माहौल में काम करने का भी समय नही होगा.संक्षेप में , आपके पास अधिक सीखने का समय ही नही होगा । इसका मतलब की वो आपको उपरी बातें बता सकती है न की गूढ़ बातें । जैसा की अलेक्सेंदेर पोप ने कहा है की कम ज्ञान खतरनाक होता है ।

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

१० सालों में प्रोग्राम्मिंग सीखे
सोध्कर्ताओ का ये मानना है की किसी भी वृहद् क्षेत्र जैसे संगीत रचना ,चित्रकारी , दूरदर्शी ऑपरेशन ,पियानो बजाना , तैरना ,टेनिस और टोपोलॉजी में सोध करने में महारत हासिल करने में आपको कम से कम १० साल का समय लगता है । इसका कोई भी आसन तरीका नही है । यह तक की मोजार्ट .जो की ४ वर्ष की उम्र में संगीत की रचना कर लेते थे , उन्हें १३ और साल लगे क्लासिक संगीत बनने में । दूसरे क्षेत्र की बात करें तो , बीटल्स  ने पहला चर्चित गाना एड  सुलिवन शो  में १९६४ में बनाया था । जबकि वो लिवेर्पूल और हम्बेर्ग जैसे क्लब के लिए १९५७ से ही गाने बनाते थे । उन्हें पहली वास्तविक सफलता १९६७ में अपने गाने सार्जेंट पेप्पेर्स से मिली । समुअल जॉन्सन सोचते हैं की इसे १० साल से भी ज्यादा समय लगता है "किसी भी विभाग में महारत हासिल करने में १ जन्म का समय लगता है , इससे कम समय में ये नही हो सकता "। और Chaucer (1300-1400) का कहना है की "जिंदगी बहुत छोटी हैं , कलात्मकता सीखना बहुत लंबा काम है "। हिप्पोक्रेट का मानना है "जिंदगी बहुत छोटी हैं , कलात्मकता सीखना बहुत लंबा काम है, मौके आते हैं ,प्रयोग का भरोसा नही ,फ़ैसला मुश्किल है "। यद्यपि लैटिन में ars का मतलब कला या हस्तकला दोनों हो सकता है , मूल ग्रीक शब्द techne का मतलब सिर्फ योग्यता है कला नहीं |


प्रोग्रामिंग में सफलता की मेरी विधि -
प्रोग्राम्मिंग में रूचि लें , कुछ इसलिए कीजिये क्योंकि आपको इसमे मजा आ रहा है । इस बात का निश्चय कीजिये की आपको इसमे मजा आता रहे ताकि आप अगले १० वर्ष इसको जरी रखें ।
- दूसरे प्रोग्रामर्स से पूछे । ये किसी भी किताब या ट्रेनिंग से ज्यादा जरूरी है ।
- प्रोग्राम। सीखने का सबसे अच्छा तरीक है किसी चीज को करके सीखना । तकनीकी रूप में कहे " किसी भी क्षेत्र में , किसी व्यक्ति के कार्यक्षमता का सर्वोच्चा स्तर उसके अनुभव के कारण अपने आप नही आता है , बल्कि बहुत योग्य व्यक्ति भी अपनी क्षमता का स्तर मेहनत करके ही बढ़ा सकता है ।" (p. 366) सबसे प्रभावी रूप से सीखने के लिए जरूरत है अच्छी तरह से निर्धारित किए हुए काम की जिसकी कठिनता का स्तर भी उसके हिसाब से ही हो , सूचनात्मक उत्तर , बार बार दोहराने का मौका और गलतिया सुधारना ही है। इस सन्दर्भ में निमंलिखित किताब में अच्छा विवरण दिया है - Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life

- यदि आप चाहे , ४ साल आप अपने कॉलेज में व्यतीत करे , अध्यन में । इससे आपको नौकरी मिलेगी जिसके लिए आपको डिग्री की जरूरत होती है। और इससे आपको उस क्षेत्र का गहन ज्ञान होगा। लेकिन अगर आप को विद्यालय जाना पसंद नही तो आप अपनी नौकरी के समय सब सीख सकते हैं । पर किसी भी हालत में सिर्फ़ किताब पढ़ना पर्याप्त नही है । "कंप्यूटर विज्ञान की पढ़ाई किसी व्यक्ति को अच्छा प्रोग्राम्मर नही बना सकती जैसे की पेंट और रंगो की पढ़ाई किसी को अच्छा चित्रकार नही बना सकती "- ये एरिक रेमंड का कहना है जो की The New Hacker Dictionary के लेखक हैं । एक बहुत ही अच्छा प्रोग्रम्म्मेर जिसे मैंने नौकरी दी उसके पास सिर्फ़ हाई स्कूल की डिग्री थी . और उसने बहुत महान सॉफ्टवेर  बनाये (xemacs mozilla) । उसका अपना न्यूज़ ग्रुप और रात्रि क्लब (डीएनए लौंज ) है।
-दूसरे प्रोग्रामर के साथ प्रोजेक्ट्स पे काम करें । कुछ प्रोजेक्ट्स पे आप सबसे अच्छे प्रोग्रामर हों सकते हैं, कुछ के लिए सबसे बुरे। जिसपे आप सबसे अच्छे हो , आप अपनी लीड करने की क्षमता को परखते हैं । और अपनी दूरदर्शिता से दूसरो को काम करने के लिए प्रेरित करते हैं । जिसमे आप सबसे बुरे प्रोग्रामर हैं , उसमे आप देखे की जो अच्छे हैं वो कैसे काम करते हैं , और आप सीखते हैं की वो क्या नही करना पसंद करते हैं ।
- दूसरो के लिखे हुए प्रोग्राम को समझे। ये देखे की उसे समझना और जब ओरिजनल प्रोग्रामर न हो तो उसकी गलतियाँ दूर करना कैसे सम्भव है । इस बरे में सोचे की आपके प्रोग्राम को कैसे अच्छे से डिजाईन किया जा सकता है ताकि जो लोग बाद में उसपे काम करे उन्हें आसानी हो ।
- कम से कम आधा दर्जन प्रोग्रम्मिंग भासाए सीखिए । जावा और सी++ सीखो जिसमे क्लास अब्स्त्रक्सन  होता
है . लिस्प सीखिए जिसमे सिंतेक्टिक  अब्स्त्रक्सन होता है । प्रोलोग या सी ++ टेम्पलेट  सीखिए जिसमे दिक्लेरेतिव  इस्पेसिफिकेसन  होता है । Icon या scheme सीखिए जिसमे coroutines होते हैं । या Sisal जिसमे parallelism है .
-याद रखिये की कंप्यूटर विज्ञान में कंप्यूटर आता है । ये जानिए की एक निर्देश का पालन करने, हार्ड डिस्क से एक वर्ड लेने में या हार्ड डिस्क में दूसरी जगह पे जाने में कंप्यूटर को कितना समय लगता है ।
- किसी भी कंप्यूटर भाषा के मानकीकरण में भाग लीजिये . इससे आपको ये पता चलेगा की बाकि लोग क्या महसूस करते हैं । और शायद ये भी की वो ऐसा क्यों सोचते हैं ।
सब सोचने के बाद , किताब से कोई कितना सीख सकता है ये तर्कसंगत नही लगता । मेरे पहले बच्चे के जन्म के पहले मैंने सभी "हाउ टू " किताबे पढी और अब भी मैं उन चीजो में बच्चे जैसा ही महसूस करता हूँ । ३० महीने बाद , मेरे दूसरे बच्चे के जन्म के बाद क्या मुझे उन किताबो को फ़िर दोहराना होगा । नही मैं अपने व्यक्तिगत अनुभव पे भरो सा करता हूँ जो मुझे हजारो पन्नों से ज्यादा तर्कसंगत लगता है ।

फ्रेड ब्रुक ने No Silver Bullets नामक निबंध में ३ हिस्से में ये बताया है की एक अच्छे सॉफ्टवेर डिजाइनर को कैसे पाया जा सकता है -
- अच्छे डिजाइनर को जल्दी से जल्दी पहचाने
-उसके कॅरिअर को उस दिशा में बढ़ने के लिए एक निर्देश देने वाले को रखे ।
-अच्छे डिजाइनर को एक दूसरे के साथ बात करने और नई चीजे बनाने का मौका दे।

ये माना जाता है की कुछ लोगो में एक बढ़िया प्रोग्रामर बनने के सरे गुण पहले से मौजूद होते हैं .

तो जाइये और एक जावा की किताब खरीदिये , संभव है की आप इससे कुछ सीख जायेंगे । लेकिन इससे आपकी जिंदगी नही बदलेगी या २४ घंटे , दिन या महीने में आपकी प्रोग्राम्मिंग क्षमता में कोई बदलाव नही होगा।