Thursday, November 1, 2012

একটুখানি প্রোগ্রামিং (দ্বিতীয় প্রচেষ্টা)



But though this book does not presuppose on the part of the reader a mathematical education, it presupposes something just as rare; a capacity for absorbing and apprising ideas. -Tobias Dantzig

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

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

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

ভাজক) ভাজ্য (ভাগফল
          .......
          ভাগশেষ

নিঃসন্দেহে বানর বেশ বুদ্ধিমান। তো আপনি ভাবলেন, এতটুকু যেহেতু পারে একে তাহলে গসাগু বের করার নিয়মও শিখিয়ে দেওয়া যায়। তেমন কিছুই না, স্রেফ ভাগশেষ যেটা পাবে, সেটা দিয়ে আগেরবারের ভাজককে ভাগ করবে। নতুন ভাগশেষ ০ হলে গসাগু পেয়ে গেল। আর না হলে একই কাজ করতে থাকবে বার বার। [চিত্র -১] এক সময় গসাগু বের হবেই। তো মুখে বললে তো বানর শিখবে না। তাকে প্র্যাক্টিস করাতে হবে। সে জন্য আপনি লাল সবুজ আর হলুদ তিন রঙের তিনটি কার্ড, একটা পেনসিল আর ইরেজার নিয়ে বসলেন।

তো প্রথমে লাল কাগজে ভাজক (ধরিরি ৬) লিখে আর আর সবুজ কাগজে ভাজ্য (ধরি ১৬) লিখে বানরটিকে দেওয়া হলো। ধরি বানরের নাম ক! তো, ক তখন, হলুদ কাগজে লিখে দেবে ৪ যেটা কিনা আগের সংখ্যা দুটির ভাগশেষ। গসাগু নির্ণয়ের জন্য এই নতুন ভাগশেষকে দিয়ে ভাগ করতে হবে আগের ভাজক কে। তো বানরটিকে দিয়ে নতুন ভাগ করানোর জন্য সবুজ কাগজের আগের লেখা মুছে আপনি লিখে দিলেন

---------------------


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

ভাজক) ভাজ্য (ভাগফল
          .......
          ভাগশেষ
[চিত্র-১]

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

এর জন্য লাগবে লাল সবুজ হলুদ তিন রঙের তিনটি কার্ড, একটা পেনসিল আর ইরেজার।
প্রথমে মনে করুন লাল কার্ডে ৬ আর সবুজ কার্ডে ১৬ লিখে বানরটিকে দেওয়া হলো। সে হলুদ কার্ডে উত্তর দিলো ৪। আমরা জানি  ১৬ কে ৬ দিয়ে ভাগ করলে ভাগশেষ থাকে ৪। অর্থাৎ বানরটই ঠিক উত্তরই দিয়েছে। কিন্তু আমরা গসাগু বের করতে চাই, তাই এখানে থেমে গেলেই হবে না। কারণ ভাগশেষ ০ হয়নি। অর্থাৎ পরের ধাপে ৪ দিয়ে ৬ কে ভাগ করতে হবে। আর বানরকে দিয়ে সেটা করাতে হলে লাল কার্ডে ৪ ও সবুজ কার্ডে ৬ লিখে দিতে হবে। হলুদ কার্ডটিও মুছে পরিষ্কার করে দিতে হবে আমাদের। আগের কোন সংখ্যাটি মুছে পরের কোন কার্ডে লিখতে হবে সেটা [চিত্র-৩] এ দেখা যাচ্ছে। এরকম করলে এবার হলুদ কার্ডে সে ভাগশেষ লিখবে ২। যেটা অশূন্য। অর্থাৎ আরেক ধাপ করতে হবে আমাদের। এবারে, লাল<- nbsp="nbsp" p="p">
সমস্যা হলো, যে বানর ভাগ করতে শিখেছে (ধরি ওর নাম ক), ঐ কাজেই তার মানসিক ক্ষমতা সব খরচ করে ফেলেছে। ফলে আবার কখন কোন সংখ্যা, কোন কার্ড থেকে মুছে নতুন কোন কার্ডে লিখে দিতে হবে, এত সব নতুন নিয়ম শেখা তার পক্ষে প্রায় অসম্ভব। কিন্তু চাইলে আমরা এই মোছা/লেখার নিয়মটা আরেকটা বানরকে (ধরি ওর নাম খ) শিখিয়ে দিতে পারি। তখন আর আমাদের খাটাখাটি করতে হবে না। তো দ্বিতীয় বানরটিকে এক্সাক্টলি কি ট্রেনিং দেব সেটা আমরা আমাদের গবেষণা খাতায় লিখে রাখতে পারি। এখানে // দাগের পরে লেখাগুলো হচ্ছে আগে কি লিখলাম সেটা বুঝিয়ে বলার জন্য মন্তব্য। এর ফলে আমরা উপস্থিত না থাকলেও, অন্যকেউ এই গবেষণাগারে এসে বানরটিকে ঠিক কি ট্রেনিং দেওয়া হয়েছে পরিষ্কার বুঝতে পারবে।

গসাগু ট্রেইনিং
১. লাল <- nbsp="nbsp" p="p">২. সবুজ <- nbsp="nbsp" p="p">৩. হলুদ<- nbsp="nbsp" p="p">৪. কার্ডতিনটি ক বানরকে দাও।           // এই ধাপের পরে ক বানরটা ভাগশেষটা লিখে দেবে হলুদ কার্ডে। বাকিগুলোও ফেরত দেবে।
৫. হলুদ কার্ডে কি ০ লেখা? তাহলে লাল কার্ডের সংখ্যাটই নির্ণেয় গসাগু।     // কাজ শেষ।
৬. নাহলে,  সবুজ<- nbsp="nbsp" p="p">                                                   সংখ্যাটি লিখতে হবে।

৭. লাল<- nbsp="nbsp" p="p">৮. হলুদ<- nbsp="nbsp" p="p">৯. ৪ নাম্বার ধাপে যাও।                     // অর্থাৎ আবারো ক বানরকে দিয়ে ভাগ করাও। এবং পরবর্তী কাজগুলো একইভাবে
                                                     করতে থাকো। ভাগশেষ শূন্য পাওয়া গেলে ৫ নাম্বার ধাপেই পুরো প্রক্রিয়াটি থেমে যাবে। 

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

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

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


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


এখন আসি আমাদের কাল্পনিক কম্পিউটারটির কাছে।
[ নীচে নোট]

ক বানরটি যেমন নানান রঙের কার্ড চেনে। তেমনি কম্পিউটারও নানান রকম ভেরিয়েবল চেনে, ঐসব ভেরিয়েবলে আমাদের হিসাবের জন্য প্রয়োজনীয় সংখ্যাটি সে লিখে রাখে। ওগুলোকে কম্পিউটারের মধ্যে ছোট ছোট কার্ড ভেবে নিতে পারি আমরা। এইসব মেমরীকে, a, b, c এরকম নানান নাম দেওয়া যায়।

মনে করুন a, b দুইটি ভেরিয়েবল। অর্থাৎ কম্পিউটারের ভিতরে a, b নামক দুইটি যায়গায় দুইটি সংখ্যা লেখা আছে।
এখন কম্পিউটারের সাহায্যে এদের ভাগশেষ নির্নয় করে হলে লিখতে হবে a%b।

No comments:

Post a Comment