প্রোগ্রামিং- কেন শিখবো? কীভাবে শিখবো?

একটি সমস্যা দিয়ে শুরু করা যাক। ধরুন আপনাকে বলা হলো ১ থেকে ১০ পর্যন্ত সংখ্যার যে ক’টি সংখ্যা ৩ দিয়ে ভাগ করা যায় সেগুলোর যোগফল কত তা বের করতে। কাজটা কিন্তু খুবই সহজ, কারণ ১ থেকে ১০ এর মধ্যে ৩ দিয়ে ভাগ যায় ৩, ৬ ও ৯। এদের যোগফল ১৮। এটা সমাধান করতে যে আপনার এক মিনিটের বেশি লাগবে না সেটা নিশ্চিত। কিন্তু যদি বলা হয় ১ থেকে ১০০০ পর্যন্ত যে সংখ্যাগুলো ৩ অথবা ৫ দিয়ে ভাগ যায় তার যোগফল বের করতে, তাহলে কিন্তু আপনি একটু ঝামেলায় পড়ে যাবেন। কারণ এবার আপনি একটি একটি সংখ্যা নিয়ে যাচাই করতে গেলে কিন্তু অনেক সময় লেগে যাবে।

ঠিক এখানে আপনার দরকার একটি গণকযন্ত্র বা, কম্পিউটার। আপনি যদি কম্পিউটারকে বলেন ১ থেকে ১০০০ এর মধ্যে যে সংখ্যাগুলো ৩ দিয়ে ভাগ করা যায় তাদের আলাদা করে রাখো এবং শেষে সবগুলো যোগ করে উত্তরটা বলো, তাহলে এক সেকেন্ডেই আপনি উত্তর পেয়ে যাবেন।

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

এবার তাহলে উপরের সমস্যাটা নিয়েই এগোনো যাক। প্রোগ্রাম লিখে এখন আপনি ১ থেকে ১০০০ এর মধ্যে যে সংখ্যাগুলো ৩ দিয়ে ভাগ যায় সেগুলোকে আলাদা করবেন। সেক্ষেত্রে আপনাকে একটি লুপ বা ঘূর্ণি চালাতে হবে, যেটা বার বার ঘুরে ঘুরে একই নির্দেশনা সম্পাদন করবে। এই লুপের ভেতর একটি চলকের মান ১ থেকে শুরু করে ১০০০ পর্যন্ত যাবে এবং প্রতিবার ঘোরার সময় চলকটিকে ৩ দ্বারা ভাগ করা হবে। যদি ভাগশেষ শূন্য হয় তাহলে সংখ্যাটিকে আপনি আরেকটি চলকের সাথে যোগ করবেন। সেক্ষেত্রে আপনার কোডটির ধরন হবে অনেকটা এরকম-

x = 0
for i in range(0,1000):
    if i%3==0:
        x = x + i

print(x)

এখন এটুকু যদি আপনি বুঝতে পারেন তাহলে যেকোনো প্রোগ্রামিং ভাষাতেই তা লিখে আপনি সমস্যাটির সমাধান করতে পারেন। এখানে প্রথম x = 0 দিয়ে আসলে একটি চলক ধরে নেয়া হয়েছে (declare করা হয়েছে) এবং তার মান ধরা হয়েছে শূন্য। এবার একটি for লুপ চালানো হয়েছে যেখানে ‘i’ নামের আরেকটি চলক রয়েছে যার মান লুপের ভেতর ০ থেকে ১০০০ পর্যন্ত যাবে এবং প্রতি ধাপে এটি i এর যে মান থাকবে তাকে ৩ দিয়ে mod করে দেখবে যে ভাগশেষ ০ থাকে কিনা। যদি(if) ভাগশেষ ০ হয় তাহলে i এর মান x এর সাথে যোগ করবে। এবং প্রোগ্রাম শেষে x এর মান আপনার স্ক্রিনে print করে দেবে (স্ক্রিনে দেখিয়ে দেবে)।

সমস্যাটা এখানেই সমাধান হয়ে গেল, তাই তো? কিন্তু এখানে আরো একটি মজার ব্যাপার আছে। দেখুন, তো ০ থেকে ১০০০ পর্যন্ত লুপ চালানো ছাড়াই আপনি সমস্যাটা সমাধান করতে পারেন কিনা!

প্রথমে দেখুন ১ থেকে ১০ পর্যন্ত আমাদের যোগফল এরকম আসবে-

18 = 3 + 6 + 9

একে এরকমও লেখা যায়-

18 = 3(1+ 2 + 3)

এক্ষেত্রে আপনি কিন্তু একটা সিরিজ n সংখ্যক সংখ্যার একটা বীজগাণিতিক সিরিজ পাচ্ছেন। ১০০ এর ক্ষেত্রে এই সিরিজটা হবে এরকমঃ
3(1+2+3+4+…+33)

এ ধরনের সিরিজের যোগফল কিন্তু আপনি সহজেই এই সূত্র দিয়ে বের করতে পারবেন-

$latex \displaystyle \large S_{n}=\frac{n(n+1)}{2}$

সেক্ষেত্রে কিন্তু আপনাকে লুপ না চালিয়ে এই সূত্র আপনার প্রোগামে বসিয়ে নিমিষেই কাজটা করে ফেলতে পারছেন। এর একটা সুবিধা আছে। প্রতিবার লুপ চালাতে একটা নির্দিষ্ট সময় খরচ করা লাগে। তাই লুপ ঘোরার পরিমাণ বেশি হলে সময়টাও বেশি লাগবে। ছোট খাটো কাজের ক্ষেত্রে ব্যাপারটা আপনার চোখে পড়বে না। কিন্তু এই সমস্যাটির সীমা যদি ০ থেকে ১০০,০০০,০০০ এর মধ্যে হয়? তখন আপনি লুপ দিয়ে আপনার বাসার কম্পিউটারে সমাধান করতে গেলে সময়ের ব্যাপারটি চোখে পড়বে। এখানে গাণিতিক সূত্র প্রয়োগ করে যে আমরা এই সময়সীমা কমিয়ে আনলাম একে বলে Optimization। এটাও একজন দক্ষ প্রোগ্রামারের লক্ষ্য।

কোন প্রোগ্রামিং ভাষা দিয়ে শুরু করবো? image source: wikihow.com

প্রোগ্রামিং শেখার শুরুতে অনেকে এই ভেবেই কূল পায় না যে, কোন ভাষা দিয়ে শুরু করবেন। Java, C++ নাকি Python? আবার যারা C দিয়ে শুরু করেন তাদের মনে আবার খচ খচ করতে থাকে – “C++ তো আরও আধুনিক বা, আপগ্রেডেড, ওটা দিয়ে শুরু করলে ভালো হত না?”। আসল কথা হলো, আপনি যেকোনো একটা দিয়ে শুরু করতে পারেন। কিন্তু দক্ষ প্রোগ্রামার হওয়ার জন্য আসলে আগে প্রয়োজন আপনি একটি সমস্যাকে কীভাবে দেখেন। একটি সমস্যা প্রোগ্রামিং করে সমাধানের আগে সেটা আসলে আমাদের চিন্তার জগতে সমাধান করা লাগে। সেই চিন্তাটাই যদি আপনি না করতে পারেন তাহলে চার পাঁচটা প্রোগ্রামিং শিখেও আপনি খুব একটা দক্ষ প্রোগ্রামার হতে পারবেন না।

মূলত প্রোগ্রামিংয়ের বেসিক যে ধারণাগুলো শেখার দরকার হয় সেগুলো হলো- চলক (variable), শর্তমূলক নির্দেশনা (conditional program), লুপ, ডাটা স্ট্রাকচার এবং লাইব্রেরি। এই পাঁচটি ধারণা আপনি ধরতে পারলে যেকোনো প্রোগ্রামিং ভাষাই আপনি রপ্ত করে নিতে পারবেন।

প্রোগ্রামিং-এর মৌলিক ধারণা

একটি প্রোগ্রামিং ভাষা পারলে অন্য যেকোনোটির মূল কথা বুঝতে আপনার সময় লাগবে মাত্র দুই দিনের মতো। ইন্টারনেটে প্রোগ্রামিং বিষয়ক উপকরণের অভাব নেই। বাংলা ভাষাতেও প্রচুর তথ্য যুক্ত হচ্ছে। কিন্তু তার আগে আপনাকে চিন্তা করাও শিখতে হবে। সেক্ষেত্রে আপনি একটি ভাষা শিখে সেটি দিয়ে অনলাইনে কিছু প্রোগ্রামিং সমস্যার সমাধান করতে পারেন। সেক্ষেত্রে Hackerrank, UVa, URI এই তিনটি ওয়েবসাইট‎ শুরু করার জন্য ভালো।

কিছু প্রশ্ন

১. প্রোগ্রামিংয়ে দক্ষ হওয়ার জন্য কতগুলো সমস্যার সমাধান করবো?

অনেকে হয়তো লেখার প্রথম অংশে সমস্যা সসমাধানের কথা শুনে বিরক্ত হয়ে গেছেন। আপনি হয়তো একজন সৃষ্টিশীল মানুষ যে প্রোগ্রামিংটা দ্রুত শিখে ফেলে ডেক্সটপ বা স্মার্টফোনের জন্য  দারুণ দারুণ এপ্লিকেশন বানাতে চান। সেজন্য সমস্যাকে ইতিবাচক দিক থেকে গ্রহণ করতে হবে।

আপনি যদি ডেক্সটপ এপ্লিকেশন (অ্যাপ) বানাতে চান সেক্ষেত্রে C++ বা Python শিখতে পারেন। Python শেখার সুবিধা হলো, এটি শেখা সহজ এবং এখনকার সময়ে অনেক জনপ্রিয়। আর মোবাইল App বানাতে চাইলে আপনাকে Java শিখতে হবে। তবে এক্ষেত্রেও দক্ষভাবে প্রোগ্রাম লিখতে গেলে আগে থেকে কিছু সমস্যা সমাধানের অভিজ্ঞতা থাকা ভালো। এতে আপনার প্রোগ্রামিং দক্ষতা যেমন বাড়বে, বিভিন্ন সমস্যা মোকাবেলা করার ধৈর্য্যও বাড়বে। কিন্তু প্রতিযোগী প্রোগ্রামার না হলেও চলবে। প্রোগ্রামিং সমস্যার সমাধান করা আসলে প্রোগ্রামারদের কাছে একটা খেলার মতো।

২.প্রোগ্রামিং শেখার জন্য খুব বেশি করে গণিত শেখা দরকার কি?

অন্তত স্কুল লেভেলের গণিত ভালোভাবে জানা থাকলেই ভালো। আসলে গণিত একটি হাতিয়ার যেটি আমরা বিভিন্ন কাজে ব্যবহার করে আমাদের কাজ সহজ করে ফেলতে পারি। উপরে যেমনটি দেখালাম, একটি সূত্র ব্যবহার করে আমরা কীভাবে একটি প্রোগ্রামকে সহজ বা সরল করে ফেললাম। এর জন্য আপনাকে সব সময় জানার দরকারও পড়বে না সূত্রটা ঠিক কীভাবে এলো। আপনাকে মূলত জানতে হবে গণিত কীভাবে এবং কোথায় ব্যবহার করতে হয়। আমাদের দেশে স্কুল-কলেজ পর্যায়ে আসলে বেশিরভাগ ক্ষেত্রেই গণিতকে আনন্দের সাথে শেখানো হয় না। তাই দেখা যায় গণিত নিয়ে অনেকের মধ্যে ভয় কাজ করে।

৩. বাংলা ভাষায় প্রোগ্রামিং শিখবো কোথায় থেকে?

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

৪. দক্ষ প্রোগ্রামার হওয়ার জন্য কি মেধাবী হতে হবে?

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

সিলিকন থেকে ট্রানজিস্টর এবং মাইক্রোপ্রোসেসর

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

অর্ধপরিবাহীর একটি ধর্ম হল, তাপমাত্রা বাড়লে এর অভ্যন্তরে ইলেকট্রনের প্রবাহ খুব সহজেই হতে পারে। তবে একটি বিশুদ্ধ সিলিকনের টুকরার আসলে তেমন বিশেষত্ব নেই। সিলিকনের মধ্যে নিয়ন্ত্রিতভাবে ভেজাল মিশিয়ে তৈরি হয় p-type আর n-type অর্ধপরিবাহী। এই দুই প্রকার অর্ধপরিবাহীর সহযোগেই তৈরি হয় ডায়োড আর ট্রানজিস্টর যা এখন কম্পিউটার প্রযুক্তির প্রাণ।

তো ট্রানজিস্টর কিভাবে ইলেকট্রনিক্স প্রযুক্তিকে এত এগিয়ে নিয়ে গেল?

এটা সম্ভব হয়েছে ট্রানজিস্টর দিয়ে সহজেই সুইচিং(switching) কার্যক্রম চালানো যায়। অর্থাৎ, একে সুবিধামত on বা off করা যায়। এতে করে অনেক লজিকাল অপারেশন দ্রুত করা যায়। ব্যাপারটাকে আরো সহজে বোঝা যাক।

কম্পিউটারে আমরা যে বিভিন্ন নির্দেশনা দেই তার জন্য আমরা বিভিন্ন প্রোগ্রামিং ভাষা ব্যবহার করি। কম্পিউটার কিন্তু ওই প্রোগ্রামিং ভাষাগুলো সরাসরি বুঝতে পারে না। এই প্রোগ্রামিং ভাষায় দেয়া নির্দেশনাগুলো পরে বাইনারি তে রুপান্তরিত হয়। অর্থাৎ ০ আর ১ এ রুপান্তরিত হয়।। এক্ষেত্রে শূন্য বলতে ইলেকট্রনিক্সে off-state বা বন্ধ অবস্থা আর ১ বলতে বোঝায় on-state বা চালু অবস্থা। তাহলে বুঝতেই পারছেন, আপনার একটা নির্দেশনার বিপরীতে কম্পিউটারের একেবারে অভ্যন্তরে চলছে বন্ধ আর চালু হবার খেলা। আর এই বন্ধ-চালু(on-off) এর ব্যাপারটা যেন তেন করে উড়িয়ে দেয়ার ব্যাপার না। শুনলে অবাক হবেন, এখনকার সময়ে আমাদের বাসা-বাড়িতে ব্যবহার্য কম্পিউটারগুলো সেকেন্ডে লক্ষাধিক নির্দেশনা সম্পাদন করে। তার মানে প্রতি সেকেন্ডে কম্পিউটার সার্কিটের বিভিন্ন পয়েন্টে কি পরিমাণ বন্ধ-চালু হওয়ার ঘটনা ঘটছে ভেবে দেখেছেন?

একবার ভাবুন তো, আপনি আপনার বাসার পাখার সুইচ সেকেন্ডে লক্ষ বার অন-অফ করতে পারবেন কিনা! যান্ত্রিক উপায়েও এই পরিমাণ অন-অফ করা সম্ভব হয় না। কিন্তু ইলেকট্রনিক্সের জগতে এটা খুব সম্ভব! ট্রানজিস্টর দিয়ে এটা করা সম্ভব।

সেমিকন্ডাকটার আর ন্যানোপ্রযুক্তি কতটা বিস্ময়কর হতে পারে তা কিছু সহজ উদাহরণে দেখা যাক। ইলেকট্রনিক্সে ট্রানজিস্টরের প্রতীক নিচে দেখানো হল।

ট্রানজিস্টরের প্রতীক

ইলেকট্রনিক্সে বিভিন্ন কাজ করার জন্য Integrated Circuit(IC) বা সমন্বিত বর্তনী (সংক্ষেপে আইসি) ব্যবহার করা হয়। মূলত বিভিন্ন ইলেকট্রনিক্স উপাদান(electronics component) দিয়ে সার্কিট বানিয়ে একটা প্যাকেজ তৈরি তৈরি করা হয়। এটাই আইসি। সাধারনত আইসিগুলোতে ট্রানজিস্টর আর রোধ থাকে। এখানে আইসি 555 এর সার্কিট ডায়াগ্রাম দেখানো হল।

IC 555 এর সার্কিট ডায়াগ্রাম

সার্কিটটা দেখতে কি একটু জটিল মনে হচ্ছে? এখানে ২৫ টার মত ট্রানজিস্টর আছে। সাথে দুটি ডায়োড আর ১৫ টি রোধ। কিন্তু পুরো প্যাকেজটার আকার খুবই ক্ষুদ্র। দৈর্ঘ্যের দিক থেকে মোটামুটি ১০ মিলিমিটারের মতো। এটুকুর মধ্যেই এতোগুলো ট্রানজিস্টর আর রোধ দিয়ে সার্কিট সাজানো হয়েছে। এই আইসি দিয়ে বেশ কিছু কাজ করা যায়। সহজ যে কাজটা করা যায় তা হল, একটা সময় ব্যবধানে বাতি জ্বলা-নিভা করা।

এবার চলুন কম্পিউটারের মাইক্রোপ্রোসেসরের দিকে তাকানো যাক। মাইক্রোপ্রসেসরও এক ধরনের আইসি। এই প্রোসেসরই হল কম্পিউটারের প্রাণ আর এটা গঠিত কোটি কোটি ট্রানজিস্টর নিয়ে।

Intel Core i7; image source: pcgamer.com

Intel Core i7 প্রসেসরের প্যাকেজের ক্ষেত্রফল মাত্র 42.5mm x 45mm। কিন্তু এতে আছে ৭৩১ মিলিয়ন ট্রানজিস্টর! একটা বাতি টানা এক মিলিয়নবার অন-অফ করতে আপনার হয়তো সময় লেগে যেতে পারে ২৫ বছর। কিন্তু এই প্রোসেসরের লাগবে মাত্র এক সেকেন্ড! চিন্তা করে দেখুন যে, কত জটিল কাজ চোখের নিমিষেই করিয়ে নেয়া সম্ভব এই ছোট্ট একটা প্রোসেসর দিয়ে যার মধ্যে কিনা কোটি কোটি ট্রানজিস্টর সুবিন্যস্ত আছে।

Intel 4004 প্রোসেসর; image source: extremetech.com

ইনটেল কর্পোরেশনের মাইক্রোপ্রোসেসরের যাত্রার প্রথম দিকে তারা যে প্রোসেসর বানিয়েছিল তা ছিল Intel 4004 যাতে ছিল মাত্র ২৩০০০ ট্রানজিস্টর। আর এটি ছিল ১৯৭১ এর দিকের ঘটনা। আর আজ কিনা বাসাবাড়িতে ব্যবহার করা কম্পিউটারের মাইক্রোপ্রোসেসরে ট্রানজিস্টরের সংখ্যা প্রায় ১০ লাখের মতো! আর এ পর্যন্ত সব থেকে বেশি সংখ্যক ট্রানজিস্টরওয়ালা মাইক্রোপ্রোসেসরে আছে ৩ বিলিয়নের উপর ট্রানজিস্টর! ভাবুন তাহলে! একটুখানি জায়গার মধ্যে কত কত ট্রানজিস্টর সুসজ্জিত করার উপায় বিজ্ঞানীরা আবিষ্কার করে ফেলেছেন।

featured image: arstechnica.com