Teach Yourself Programming in Ten Years

পিটার নরভিগ | অক্টোবর ১৮, ২০১৩
২১ দিনে প্রোগ্রামিং শেখা আসলে সম্ভব না। চমৎকার প্রোগ্রামার হবার জন্য প্রয়োজন প্রচুর সময় নিয়ে স্বেচ্ছাকৃত অনুশীলন। কিভাবে নিজেকে দশ বছর সময়ের মধ্যে একজন চমৎকার প্রোগ্রামারে পরিণত করা যায় সেটা নিয়ে লিখেছেন গুগলের ডিরেক্টর অফ রিসার্চ - পিটার নরভিগ। পিটার নরভিগের অনুমতিক্রমে লেখাটা বাংলায় অনুবাদ করেছেন ইকরাম মাহমুদ।

১ সবার এত্ত তাড়া কেন?

যদি তুমি হেঁটে কোন একটা বই এর দোকানে গিয়ে ঢোকো বইয়ের তাকে তুমি Teach Yourself Java in 7 Days টাইপের একগাদা বই দেখতে পাবে। যেগুলোর প্রত্যেকটা দাবি করবে যে সেই বইটা তোমাকে খুব ভালোভাবে ভিজুয়াল বেসিক, উইন্ডোজ, ইন্টারনেট, ইত্যাদি সব শিখিয়ে দিতে পারবে। এবং শুধু সেখানেই শেষ না, তাদের দাবি সেটা শেখাতে তাদের বড়জোর কয়েক ঘন্টা লাগবে - কিংবা খুব বেশি হলে কয়েকটা দিন। আমি অ্যামাজনে একটা পাওয়ার সার্চ মারলাম নিচের কুয়েরিটা লিখে

pubdate: after 1992 and title: days and
(title: learn or title: teach yourself)

এবং আমার কুয়েরিটার জন্য অ্যামাজন ২৪৮টা বই খুঁজে বের করলো। তার মধ্যে প্রথম ৭৮ টা বই হচ্ছে কম্পিউটারের উপর (৭৯ নাম্বার টা হচ্ছে Learn Bengali in 30 days)। আমি কুয়েরিতে “days” এর বদলে “ hours” লিখেও প্রায় একই সমান রেজাল্ট পেলাম - ২৫৩ টা বই, যাদের মধ্যে ৭৭টা হচ্ছে কম্পিউটারের উপর, আর তারপর ৭৮ নাম্বারটা হচ্ছে Teach Yourself Grammar and Style in 24 Hours। মজার ব্যাপার হচ্ছে, প্রথম ২০০ টা বইয়ের ৯৬% হচ্ছে কম্পিউটারের ওপর।

আমরা এটা থেকে এই উপসংহারে পৌছাতে পারি যে, হয় মানুষজনের ভীষণ তাড়া কম্পিউটার শেখার জন্য অথবা বাকি সবকিছুর সাথে তুলনা করতে গেলে কম্পিউটার হচ্ছে খুবই সহজ একটা জিনিস শেখার জন্য। কোথাও কোন বই এর অস্তিত্ব নেই যেটা বিটোভেন বা কোয়ান্টাম ফিজিক্স শেখাতে পারে কয়েকদিনের মধ্যে। এমনকি কয়েকদিনের মধ্যে কিভাবে কুকুরের চুল কাটা শেখা যায় সেটা নিয়েও কোন বই নেই। ফেলিসন এবং তার বন্ধুরা এই ব্যাপারে মন্তব্য করেছিলো তাদের বইতে। How to Design Programs বইটাতে ওরা লিখেছিলো - “Bad programming is easy. Idiots can learn it in 21 days, even if they are dummies.”

আমরা একটু বিশ্লেষণ করি, Learn C++ in Three Days এরকম একটা বইয়ের নাম থেকে আমরা কি কি বৃত্তান্ত পেতে পারি -

  • Learn: মাত্র তিন দিনে হয়তো তোমার সময়ও হবে না ভালোমতো কয়েকটা প্রোগ্রাম লেখার। তোমার ব্যর্থতা আর সফলতা থেকে শিক্ষা লাভ করার সময় হবার তো প্রশ্নই আসে না। তোমার সময় হবে না একজন অভিজ্ঞ প্রোগ্রামারের সাথে কাজ করার এবং বোঝার যে C++ এর সত্যিকারের পৃথিবীটুকু কেমন বা C++ নিয়ে ইন্ডাস্ট্রিয়াল কাজ করার অভিজ্ঞতাও কেমন। সংক্ষেপে, তোমার সময়ই হবে না কোন কিছু শেখার। তো বইটা শুধু তোমাকে একটা কৃত্তিম আবছা আবছা পরিচয় দিতে পারবে, কিন্তু কোন গভীর জ্ঞান দিতে পারবে না। এবং আমি জানি, তুমি অবশ্যই ছোট বেলা থেকে শুনে এসেছো, “অল্পবিদ্যা ভয়ংকরী”। কথাটা মিথ্যে না।

  • C++: তুমি যদি আগে অন্য কোন ল্যাঙ্গুয়েজে প্রোগ্রামিং করে থাকো তাহলে তিন দিনে তুমি হয়তো কিছু সিনট্যাক্স শিখতে পারবে C++ এর। কিন্তু তুমি কিছুতেই এর চে’ বেশি কিছু শিখতে পারবে না এই ল্যাঙ্গুয়েজটা ব্যবহার করা নিয়ে। ধরো, তুমি যদি আগে Basic এ প্রোগ্রাম লিখে থাকো, তুমি হয়তো শিখবে কিভাবে তোমার Basic এর প্রোগ্রামটাকে C++ এ লেখা যায়। কিন্তু তুমি শিখবে না, কেন C++ ভালো (কিংবা খারাপ)। যদি ব্যাপারটা তাই হয়, তাহলে কি লাভটা হলো বলো? অ্যালান পারলিস বলেছিলো, “A language that doesn’t affect the way you think about programming, is not worth knowing”। একটা লাভ হয়তো, তুমি এক চিমটি C++ শিখবে (যেটা হয়তো খুবই সামান্য জাভাস্ক্রিপ্ট কিংবা ফ্ল্যাশের ফ্লেক্স শেখার মতো হবে) যেটুকু দিয়ে তুমি একটা ছোট্ট কিছু একটা কাজ করতে পারবে (ত্রিভুজের ক্ষেত্রফল বের করা টাইপের) একটা সাদামাটা ইন্টারফেস লিখে। কিন্তু তাহলে তো তুমি প্রোগ্রামিং শিখছো না, তুমি শুধু শিখছো ঠিক ওই নির্দিষ্ট কাজটা কিভাবে করতে হয়।

  • in Three Days: দূর্ভাগ্যজনকভাবে, তিন দিন খুবই কম সময় এবং কোনভাবেই যথেষ্ট নয়। আমি এর পরের সেকশনে এটা নিয়ে আরো বিস্তারিত লিখছি।

২ দশ বছরে প্রোগ্রামিং শেখা

গবেষকরা (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) দেখিয়েছে, কোন কিছুতে এক্সপার্ট হতে প্রায় দশ বছর সময় লাগে। এই কথাটা একটা বিশাল রেঞ্জের ফিল্ডের জন্যই সত্যি - দাবা খেলা, সঙ্গীতচর্চা, টেলিগ্রাফ অপারেশন, ছবি আঁকা, পিয়ানো বাজানো, সাঁতার, টেনিস কিংবা ধরো নিওরোসাইকোলজি এবং টপোলজি নিয়ে রিসার্চ করা। এখানে সাফল্যের চাবি হচ্ছে স্বেচ্ছাকৃত প্র্যাকটিস: তাই বলে সেটা শুধু একই জিনিস বারবার করা না, নিজেকে ক্রমাগত চ্যালেঞ্জের মুখোমুখি করা কঠিন থেকে কঠিনতর কাজ দিয়ে যেগুলো তোমার বর্তমান সামর্থ্যের বাইরে। তারপর সেই ধরণের কাজে অ্যাটেম্পট নেয়া উচিত, নিজের পারফরমেন্স বিশ্লেষণ করে, ভুল শুধরে, কিভাবে আরো ভালোভাবে সেটা করা যায় সেটা ভাবা উচিত। এবং তারপর উচিত পুনরায় এবং পুনরায় এই প্রসেস রিপিট করা। সত্যি কথা, কোথাও কোন সহজ শর্টকাট নেই: এমনকি মোজার্ট, যাকে মাত্র ৪ বছর বয়সে মিউজিকাল প্রডিজি ভাবা হতো, তারও আরো ১৩ বছর লেগেছে তার প্রথম বিশ্বমানের সঙ্গীত রচনা করতে। আবার ধরো, তোমার মনে হতে পারে বিটলস ১৯৬৪ সালে রাতারাতি অনেকগুলো এক নাম্বার হিট নিয়ে এড সালিভানের শোতে উপস্থিত হয়েছিলো । কিন্তু সত্যি কথা কি, তারা আসলে লিভারপুলের ছোট ছোট ক্লাবে পারফর্ম করতো ১৯৫৭ সাল থেকে। যদিও তাদের কিছুটা জনপ্রিয়তা ছিলো তারপরও তাদের প্রথম সফল অ্যালবাম Sgt. Peppers বের হয়েছিলো ঠিক দশ বছর পর ১৯৬৭ সালে। ম্যালকম গ্ল্যাডওয়েল বার্লিন একাডেমি অফ মিউজিক এ ছাত্র-ছাত্রীদের উপর একটা গবেষণার কথা লিখেছে। পুরো ক্লাসটাকে কোয়ালিটির দিক দিয়ে তিন গ্রুপে ভাগ করে সবাইকে আলাদা আলাদা ভাবে জিজ্ঞেস করেছিলো তারা কতটুকু প্র্যাকটিস করেছে। এই হচ্ছে তার মন্তব্য -

এই তিনটা গ্রুপের সবাই প্রায় এক সময় সঙ্গীতচর্চা শুরু করে - প্রায় ৫ বছর বয়সে। প্রথম কয়েক বছরে তাদের সবাই মোটামুটি একই ধরণের প্র্যাকটিস করেছিলো - সপ্তাহে ২ বা ৩ ঘন্টা করে। তারপর ৮ বছর বয়স থেকে সত্যিকারের পার্থক্য তৈরী হতে শুরু করে। যেসব ছাত্র-ছাত্রী তাদের ক্লাসের সেরা গ্রুপে পড়ে তাদের সবাই বাকি সবার চেয়ে অনেক বেশি প্র্যাকটিস করতে শুরু করে এই বয়সে এসে - ৯ বছর বয়সে সপ্তাহে ৬ ঘন্টা করে, ১২ বছর বয়সে সপ্তাহে ৮ ঘন্টা করে, ১৪ বছর বয়সে সপ্তাহে ১৬ ঘন্টা এবং এরপর সংখ্যাটা শুধু বাড়তে থাকে বয়সের সাথে সাথে। আসলে এরপর থেকে ২০ বছর বয়স পর্যন্ত ওদের প্রত্যেকে সপ্তাহে অন্তত ৩০ ঘন্টা করে প্র্যাকটিস করছিলো। তো ২০ বছর বয়সের মধ্যে সবচে’ এলিট পারফর্মারদের প্র্যাকটিসের সময়ের পরিমাণ ছিলো ১০,০০০ ঘন্টার বেশি। সেখানে মোটামুটি ভালো ছাত্রদের প্র্যাকটিস ছিলো ৮,০০০ ঘন্টা আর ভবিষ্যৎ মিউজিক টিচারদের ছিলো মাত্র ৪,০০০ ঘন্টার মতো।

তো হয়তো ১০ বছর নয়, এই ১০,০০০ ঘন্টাই হচ্ছে ম্যাজিক নাম্বার। হেনরি কারটিয়ের ব্রেসন (১৯০৮-২০০৪) বলেছিলো, “Your first 10,000 photographs are your worst,” (কিন্তু সে প্রতি ঘন্টায় একাধিক ছবি তুলতো)। স্যামুয়েন জনসন (১৭০৯-১৭৮৪) এই চিন্তাটাকে আরেকটু দূর নিয়ে গিয়েছিলো এটুকু বলে যে “Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price.” চৌচার (১৩৪০-১৪০০) অভিযোগ করেছিলো এই বলে যে, “the lyf so short, the craft so long to lerne.”। হিপোক্রেটাস বিখ্যাত তার “ars longa, vita brevis” বাণীর জন্য, যেটা আসলে “Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile” এর একটা ছোট্ট অংশ। যেটা বাংলায় অনুবাদ করলে দাঁড়াবে, “জীবন ছোট্ট, শিল্প বড় দীর্ঘ, সুযোগ শুধুই পলায়মান, এক্সপেরিমেন্ট বিশ্বাসঘাতক, মীমাংসা বড়ই কঠিন”।

৩ তুমি তাহলে প্রোগ্রামার হতে চাও

এটা হচ্ছে সফল প্রোগ্রামার হবার জন্য আমার রেসিপি

  • প্রোগ্রামিং এ প্রকৃতভাবে আগ্রহী হও এবং প্রোগ্রামিং কর শুধুমাত্র মজা পাবার জন্য। নিশ্চিত করো যে তুমি ঠিক ততটাই মজা পাচ্ছো ঠিক যতটা মজা পেলে প্রোগ্রামিং এর পেছনে তোমার জীবনের ১০ বছর বা ১০,০০০ ঘন্টা অতিবাহিত করতে পারবে।

  • প্রোগ্রাম লেখো। কোন কিছু শেখার জন্য সবচে’ ভালো উপায় হচ্ছে সেটা করতে করতে শেখা। একটু টেকনিকালি বলতে গেলে, “কোন নির্দিষ্ট এলাকায় পারফর্মেন্সের চূড়ান্তে পৌছানো খুব স্বাভাবিকভাবে অভিজ্ঞতার সাথে সাথেই আসে না। বরং, এমনকি সবচে’ অভিজ্ঞদের জন্যও পারফর্মেন্সের লেভেলের উন্নতি ঘটানো যায় উন্নতি করার ক্রমাগত চেষ্টার মধ্য দিয়ে।” (পৃষ্ঠা ৩৬৬) এবং “কাওকে কিছু শেখানোর সবচে’ ভালো উপায় হচ্ছে তার জন্য তার ক্ষমতা অনুযায়ী কঠিন কোন সুনির্দিষ্ট কাজ দেয়া। তারপর তাকে ফিডব্যাক দেয়া সে কি ঠিকঠাক করছে আর কি ভুল করছে। তাকে পুনরায় একই কাজ সম্পন্ন করে এবং ভুল শুধরে সেটা ভালোভাবে করতে শেখার সুযোগ দেয়া।” (পৃষ্ঠা ২০-২১) এই বইটা হচ্ছে একটা ইন্টারেস্টিং রেফারেন্স এই দৃষ্টিভঙ্গীর - Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life

  • কথা বলো অন্য প্রোগ্রামারদের সাথে; অন্যদের প্রোগ্রাম পড়ো। এটা আরো অনেক বেশি গুরুত্বপূর্ণ শয়ে শয়ে বই পড়া বা কোর্স করার চেয়ে।

  • তুমি যদি চাও চার বছর খরচ করতে পারো বিশ্ববিদ্যালয়ে গিয়ে (অথবা আরো বেশি যদি তুমি মাস্টার্স বা ডক্টরেট করতে চাও)। এটা যেসব চাকরি তোমার ডিগ্রী দেখতে চায় সেরকম জায়গায় তোমাকে চাকরির সুযোগ করে দিবে এবং একই সাথে তোমাকে এই ফিল্ডটাকে আরো গভীরভাবে বোঝার ক্ষমতা দেবে। কিন্তু তুমি যদি প্রথাগত পড়াশুনায় আনন্দ না পাও, তুমি হয়তো একই অভিজ্ঞতাগুলো অর্জন করতে পারো নিজে নিজে আরেকটু বেশি খেটে কিংবা কোথাও কাজ করে। কিন্তু যেভাবেই করো না কেন, শুধু পুঁথিগত বিদ্যা কখনোই খুব যথেষ্ট কিছু হবে না। The New Hacker’s Dictionary এর লেখক এরিক রেমন্ড বলেছেন, “Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter”। আমার নিয়োগ করা সেরা প্রোগ্রামারদের একজনের শুধু মাত্র একটা হাইস্কুল ডিগ্রি ছিলো; কিন্ত তারপরও সে প্রচুর চমৎকার সফ্টওয়্যার বানিয়েছে, তার ভক্তদের নিজস্ব নিউজ গ্রুপ আছে, আর যথেষ্ট স্টক অপশনও উপার্জন করেছে নিজের জন্য একটা আস্ত নাইটক্লাব কেনার জন্য।

  • প্রজেক্টে কাজ করো অন্য প্রোগ্রামারদের সাথে। হয়তো কখনো তুমি নিজেকে খুঁজে পাবে টিমের সেরা প্রোগ্রামার হিসেবে, আর কখনো দেখবে তুমি টিমের সবচে’ বাজে প্রোগ্রামার। যখন তুমি দেখবে তুমি তোমার টিমের সেরা প্রোগ্রামার, নিজের সামর্থ্যকে চ্যালেঞ্জ করো প্রজেক্টটাকে লিড করে, অন্যদেরকে তোমার দূরদর্শিতা দিয়ে অনুপ্রেরণা যুগিয়ে। যখন তুমি জানো তুমি তোমার টিমের সবচে’ বাজে প্রোগ্রামার, সেটা একটা চমৎকার সুযোগ কিভাবে দক্ষ প্রোগ্রামাররা কাজ করে সেটা শেখার। অবশ্য তুমি এটাও শিখবে যে তারা কোন জিনিসগুলো করতে অপছন্দ করে (কারণ সেই কাজগুলো হয়তো তারা তোমাকে দিয়ে করাবে)।

  • অন্যদের করে যাওয়া প্রজেক্ট নিয়ে কাজ করো। বোঝার চেষ্টা করো অন্য কারো লেখা একটা প্রোগ্রাম কিভাবে কাজ করে। বোঝার চেষ্টা করো যে প্রোগ্রামটা লিখেছিলো সে যদি আশেপাশে না থাকে তখন কেমন লাগবে নিজে নিজে ওর প্রোগ্রামটা বুঝতে আর যদি কিছু কাজ না করে সেটা ফিক্স করতে। চিন্তা করো, কিভাবে তুমি তোমার প্রোগ্রামটাকে লিখতে পারো যাতে পরে যারা তোমার প্রোগ্রাম মেইনটেইন করবে তাদের জন্য কাজটা যাতে সহজ হয়।

  • অন্তত আধা ডজন প্রোগ্রামিং ল্যাঙ্গুয়েজ শেখো। অন্তত একটা শেখো যেটা ক্লাস অ্যাবস্ট্রাকশন সাপোর্ট করে (যেমন C++ বা Java)। একইভাবে অন্তত একটা করে ল্যাঙ্গুয়েজ শেখো যেগুলো এই জিনিসগুলো সাপোর্ট করে - ফাংশনাল অ্যাবস্ট্রাকশন(যেমন Lisp বা ML), সিন্থেটিক অ্যাবস্ট্রাশন (যেমন Lisp), ডিক্লেয়ারেটিভ স্পেসিফিকেশন (যেমন Proglog বা C++ এর টেম্প্লেট), কোরুটিন ( যেমন Icon বা Scheme) আর প্যারালিলজম (যেমন Sisal)।

  • ভুলে যেও না কম্পিউটার সায়েন্সের মধ্যে আস্ত একটা কম্পিউটার অন্তর্ভুক্ত আছে। জেনে নাও কতক্ষণ লাগে তোমার কম্পিউটারের একটা ইন্সট্রাকশন চালাতে, একটা ওয়ার্ড মেমরি থেকে ফেচ করতে (ক্যাশ সহ বা ছাড়া), ধারাবাহিকভাবে পাশাপাশি ওয়ার্ডগুলো ডিস্ক থেকে রিড করতে কিংবা নতুন একটা ডিস্ক লোকেশনে ডাটা খুঁজতে। (এখানে উত্তর পাবে)

  • ল্যাঙ্গুয়েজ স্ট্যান্ডার্ডাইজেশন এর সাথে সংপৃক্ত হও। সেটা যেকোন কিছু হতে পারে, ANSI C++ এর কমিটি হতে পারে, অথবা তোমার ব্যক্তিগত সিদ্ধান্ত হতে পারে যে তুমি ইন্ডেন্টেশন লেভেলে দুইটা স্পেস ব্যবহার করবে নাকি চারটা স্পেস ব্যবহার করবে। যেভাবেই হোক না কেন তুমি শিখতে শুরু করবে কোন জিনিসগুলো মানুষ পছন্দ করে একটা ল্যাঙ্গুয়েজে, কত গভীরভাবে তারা সেগুলোর গুরুত্ব অনুভব করে আর এটাও বুঝতে পারবে যে কেন তারা সেভাবে অনুভব করে।

  • একটা ভালো চেতনা তৈরী করো ল্যাঙ্গুয়েজ স্ট্যান্ডার্ডাইজেশন এর ব্যাপারে যেন যত তাড়াতাড়ি সম্ভব এসব স্ট্যান্ডার্ডাইজেশন থেকে মুক্তি লাভ করতে পারো।

এই সবকিছু মাথায় রাখার পর, এটা নিয়ে প্রশ্ন করা যায় যে তুমি কতদূর যেতে পারবে শুধুমাত্র পূঁথিগত বিদ্যা দিয়ে। আমার প্রথম সন্তান জন্মানোর আগে আমি মোটামুটি সব “How To” দিয়ে শুরু হওয়া বইগুলো পড়ে ফেলেছিলাম এবং তারপরও আমার নিজেকে খুব নিতান্তই অনভিজ্ঞ মনে হচ্ছিল, যার কোনই ধারণা নেই কোন কিছু সম্বন্ধে। ৩০ মাস পর, যখন আমার দ্বিতীয় সন্তানের জন্ম হলো, আমি কি আগের বইগুলোতে ফিরে গিয়েছিলাম সবকিছু আবার নেড়েচেড়ে দেখার জন্য? নাহ। বরং, আমি নির্ভর করেছি আমার ব্যক্তিগত অভিজ্ঞতার ওপরে, যেগুলো আমার কাছে আরো অনেক বেশি কাজের আর স্বস্তিদায়ক মনে হয়েছে এক্সপার্টদের লেখা হাজার হাজার পাতার চেয়ে।

ফ্রেড ব্রুকস তার রচনা No Silver Bullet এ অসাধারণ সফটওয়্যার ডিজাইনার খুঁজে বের করার তিন-খন্ড পরিকল্পনার কথা লিখেছে। সে বলেছে -

  • সিস্টেমিকালি সেরা ডিজাইনারদের খুঁজে বের করো যত জলদি সম্ভব।
  • একজন প্রশিক্ষককে দ্বায়িত্ব দাও তাকে গড়ে তোলার জন্য আর স্বযত্নে একটা ক্যারিয়ার ফাইল রাখো তার জন্য।
  • সমান অভিজ্ঞতা সম্পন্ন ডিজাইনারদেরকে নিজেদের মধ্যে যোগাযোগ করার সুযোগ করে দাও, যাতে তারা একে অপরকে উদ্দীপিত করতে পারে।

এই চিন্তাধারা ধরে নেয় প্রতিটি মানুষের মধ্যে ক্ষমতা আছে মহান সফ্টওয়্যার ডিজাইনার হবার; আসল কাজ হচ্ছে তাদের গড়ে তোলা। অ্যালান পারলিস আরো সংক্ষেপে এই চিন্তাটা প্রকাশ করেছে, “Everyone can be taught to sculpt: Michelangelo would have had to be taught how not to. So it is with the great programmers”। পারলিস বলছে যে, মহানদের মধ্যে একটা নিজস্ব সহজাত ক্ষমতা আছে প্রশিক্ষণের সীমা অতিক্রম করে যাবার। কিন্তু সেই গুণটা কোথেকে আসে? সেটা কি আসলেই শুধু তাদের সহজাত প্রকৃতিদত্ত গুণ? নাকি তারা সেটা তাদের অধ্যাবসায় আর অনলস পরিশ্রম দিয়ে গড়ে তোলে? এর উত্তর আমি দিতে পারি অগাস্ট গুস্তো (Ratatouille সিনেমার কাল্পনিক শেফ) এর কথা থেকে, “anyone can cook, but only the fearless can be great.”। আমার মনে হয়, এটা আসে জীবনের একটা বড় অংশ স্বেচ্ছাকৃত প্রতিনিয়ত প্র্যাকটিস করার জন্য সঁপে দেয়ার মনোভাব থেকে। কিংবা হয়তো শুধু fearless শব্দটাই এই পুরো চিন্তাটুকুর সারমর্ম। অথবা গুস্তোর সমালোচক, অান্তন ইগোর কথামতো, “Not everyone can become a great artist, but a great artist can come from anywhere.”।

তো হাত বাড়াও বইয়ের তাকে, আর কিনে ফেলো ওই জাভা/রুবি/জাভাস্ক্রিপ্ট/PHP বইটা; তুমি হয়তো কিছু একটা শিখবে সেখান থেকে। কিন্তু সেটা তোমার জীবন বদলে দেবে না, তোমাকে মহান প্রোগ্রামার বানাবে না ২৪ ঘন্টায়, ২৪ দিনে বা এমনকি ২৪ সপ্তাহে। কিন্তু কেমন হয়, যদি তুমি পরিশ্রম করতে শুরু করো অল্প অল্প করে নিজেকে ইম্প্রুভ করার সামনের ২৪ মাস সময় ধরে? আমি নিশ্চিত যে, সেটা তোমাকে অনেক দূরে নিয়ে যেতে শুরু করবে …

৪ রেফারেন্স

১ - বেঞ্জামিন ব্লুম - "Developing Talent in Young People" (Ballantine, 1985)
২ - ফ্রেড ব্রুকস - "No Silver Bullets" (IEEE Computer, vol. 20, no. 4, 1987, p. 10-19)
৩ - W.L. ব্রায়ান এবং N. হার্টার - "Studies on the telegraphic language: The acquisition of a hierarchy of habits" (Psychology Review, 1899, 8, 345-375)
৪ - জন হেস - "Complete Problem Solver" (Lawrence Erlbaum, 1989)
৫ - উইলিয়াম চেস এবং হার্বার্ট সিমন - "Perception in Chess" (Cognitive Psychology, 1973, 4, 55-81)
৬ - জিন লেভ - "Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life" (Cambridge University Press, 1988)

৫ উত্তর

অ্যাপ্রক্সিমেট টাইম

execute typical instruction 1/1,000,000,000 sec = 1 nanosec
fetch from L1 cache memory 0.5 nanosec
branch misprediction 5 nanosec
fetch from L2 cache memory 7 nanosec
Mutex lock/unlock 25 nanosec
fetch from main memory 100 nanosec
send 2K bytes over 1Gbps network 20,000 nanosec
read 1MB sequentially from memory 250,000 nanosec
fetch from new disk location (seek) 8,000,000 nanosec
read 1MB sequentially from disk 20,000,000 nanosec
send packet US to Europe and back 150 milliseconds = 150,000,000 nanosec

৬ পরিশিষ্ট

৬.১ প্রথম ল্যাঙ্গুয়েজ

আমাকে অনেকে জিজ্ঞেস করেছে কোন প্রোগ্রামিং ল্যাঙ্গুয়েজ তাদের শুরুতে শেখা উচিত। আসলে এই প্রশ্নের কোন সহজ উত্তর নেই, কিন্তু এই পয়েন্টগুলো বিবেচনা করো।

  • তোমার বন্ধুদের ব্যবহার করো। যখন কেউ জানতে চায়, “আমি কোন অপারেটিং সিস্টেম ব্যবহার করবো? উইন্ডোজ, ম্যাক নাকি ইউনিক্স?”, আমি সাধারণত বলি “সেটা ব্যবহার করো যেটা তোমার বন্ধুরা ব্যবহার করে”। সেটার সুবিধা হচ্ছে সেটা ল্যাঙ্গুয়েজ হোক বা অপারেটিং সিস্টেমই হোক তুমি তোমার বন্ধুদের কাছ থেকে শেখার সুযোগ পাবে। আবার তুমি এভাবেও চিন্তা করতে পারো, ভবিষ্যতে কারা তোমার বন্ধু হবে? তুমি যদি এই ল্যাঙ্গুয়েজ বা অপারেটিং সিস্টেম ব্যবহার করতে শুরু করো সেটা তোমাকে কোন প্রোগ্রামারদের কমিউনিটির অংশ বানাবে? তোমার পছন্দের ল্যাঙ্গুয়েজের কি একটা বিশাল ক্রমবর্ধমান কমিউনিটি আছে, নাকি একটু ছোট্ট মৃতপ্রায় কমিউনিটি আছে? প্রশ্নের উত্তর খুঁজে বের করার জন্য কি বই, ওয়েব সাইট বা অনলাইন ফোরাম আছে? এই সব ফোরামের লোকজনকে কি তোমার পছন্দ হয়?

  • Keep it simple. C++ বা জাভার মতো ল্যাঙ্গুয়েজগুলো আসলে ডিজাইন করা হয়েছে প্রফেশনাল ডেভেলপমেন্টের জন্য যেখানে সাধারণত প্রোগ্রামারদের একটা বড় টিম থাকে, যারা খুব মাথা ঘামায় প্রোগ্রামের রানটাইম এফিশিয়েন্সি নিয়ে। সে কারণে, এই ল্যাঙ্গুয়েজগুলো এইসব জিনিস চিন্তা করে বেশ জটিল করে ডিজাইন করা। তুমি যদি শুধু প্রোগ্রামিং শিখতে চাও, তোমার এই জটিলতার মুখোমুখি হবার প্রয়োজন নেই। তোমার প্রয়োজন এমন একটা ল্যাঙ্গুয়েজ যেটা ডিজাইন করা হয়েছে সহজে শেখার জন্য আর এমনভাবে ডিজাইন করা হয়েছে যাতে নবীনতম প্রোগ্রামারও সেটা মনে রাখতে পারে।

  • খেলো। তোমাকে যদি আমি পিয়ানো শিখতে দেই, কিভাবে শেখাটা মজার হবে? একটা উপায় হতে পারে তুমি প্রতিটা কী চাপার পর শব্দ হবে, যেটা হচ্ছে নরমাল ইন্টারেক্টিভ উপায়। অথবা তুমি “ব্যাচ” মোডে শিখতে পারো, যেখানে তুমি পুরো গানটার সবগুলো নোট বসানোর পর একসাথে পুরো গানটা বাজবে। নিঃসন্দেহে নরমাল ইন্টারেক্টিভভাবে পিয়ানো শেখাটা সহজ, এবং একই কথা প্রোগ্রামিং এর জন্যও প্রযোজ্য। সেজন্য আমি তোমাকে বলব, একটা ল্যাঙ্গুয়েজ খুঁজে বের করো যেটা ইন্টারেক্টিভ মোডে চালানো যায় এবং সেটা ব্যবহার করো।

এই জিনিসগুলো বিবেচনা করলে প্রথম প্রোগ্রামিং ল্যাঙ্গুয়েজের জন্য আমার রিকোমেন্ডেশন হবে পাইথন অথবা স্কিম। কিন্তু তোমার ক্ষেত্রে সবকিছু অন্যরকম হতেও পারে, হয়তো তোমার জন্য এর চে’ ভালো অল্টারনেটিভ আছে। যেমন ধরো, তোমার বয়স যদি এক সংখ্যার হয়, তুমি হয়তো অ্যালিস বা স্কুইক (বড়দের জন্যও স্কুইক বেশ উপভোগ্য হতে পারে)। আসল ব্যাপার হচ্ছে মনস্থির করা আর সেই ল্যাঙ্গুয়েজ শেখা শুরু করা।

৬.২ বই এবং অন্যন্য রিসোর্স

আমাকে অনেকে জিজ্ঞেস করেছে কোন বই আর ওয়েবপেইজ থেকে তারা শিখতে পারে। আমি বরাবরের মতোই বলছি, “পুঁথিগত বিদ্যা যথেষ্ট নহে” কিন্তু তারপরও আমি এগুলো সুপারিশ করবো -

  • স্কিম: Structure and Interpretation of Computer Programs (অ্যাবেলসন এবং সুসম্যান) হয়তো কম্পিউটার বিজ্ঞান শেখার জন্য সবচে’ সেরা বই। আর একই সাথে এটা প্রোগ্রামিংও শেখায় কম্পিউটার সায়েন্স শেখার একটা উপায় হিসেবে। তুমি অনলাইন ভিডিও লেকচার দেখতে পারো এই বইটার আর একই সাথে অনলাইনে পুরো বইটা পড়তেও পারো। এটা আসলে খুব সহজ বই না পড়ার জন্য এবং হয়তো অনেক মানুষ স্বাচ্ছন্দ্যবোধ করবে না এটার সাথে কারণ এটা বেশ চ্যালেঞ্জিং।

  • স্কিম: How to Design Programs (ফেলেইসন এবং অন্যন্য) হচ্ছে প্রোগ্রাম এলিগ্যান্ট আর ফাংশানালভাবে ডিজাইন করার উপর আমার পড়া সেরা বই গুলোর একটা।

  • পাইথন: Python Programming: An Intro to CS (জেলে) খুব ভালো একটা ইন্ট্রো হতে পারে পাইথন শেখার জন্য।

  • পাইথন: Python.org এ বেশ কিছু অনলাইন টিউটোরিয়াল আছে।

  • Oz: Concepts, Techniques, and Models of Computer Programming (ভ্যান রয় এবং হ্যারিডি) কে অনেকে আধুনিক সময়ের অ্যাবেলসন এবং সুসম্যান হিসেবে বিবেচনা করে। এটা অনেকটা প্রোগ্রামিং এর সব বড় বড় আইডিয়ার উপর প্রমোদভ্রমণের মতো এবং এটা অনেক বড় রেঞ্জের কনসেপ্ট কাভার করে। হয়তো অ্যাবেলস এবং সুসম্যান পড়ার চেয়ে সহজ হবে এটা পড়া। এটা Oz বলে একটা ভাষা ব্যবহার করে, যেটা হয়তো খুব বিখ্যাত না কিন্তু সেটা অন্য প্রোগ্রামিং ল্যাঙ্গুয়েজ শেখার জন্য চমৎকার ভিত হতে পারে।

৭ কৃতজ্ঞতা স্বীকার

রস কোহেনকে অনেক ধন্যবাদ হিপোক্রেটাস নিয়ে আমাকে সাহায্য করার জন্য।

মূল লেখার লিংক


পিটার নরভিগ

পিটার নরভিগ আমেরিকান কম্পিউটার বিজ্ঞানী, গুগলের কোর সার্চ অ্যালগরিদম গ্রুপের প্রাক্তন ডিরেক্টর এবং Artificial Intelligence: A Modern Approach এর লেখক। পড়াশুনা করেছেন ব্রাউন ইউনিভার্সিটি এবং ইউনিভার্সিটি অফ ক্যালিফর্নিয়া অ্যাট বার্কারলিতে। বর্তমানে গুগলে কাজ করছেন ডিরেক্টর অফ রিসার্চ হিসেবে।