পাইথন-এ ডেটা অ্যানালাইটিক্স

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

পাইথন এর প্রাথমিক ব্যাপারগুলো নিয়ে কিছু বলার আর তেমন দরকার আছে বলে আমার মনে হয় না। কারো প্রয়োজন হলে বিস্তারিত দেখে নেয়া যাবে এখান থেকে –

১। পাইথন পরিচিতি   

২। প্রাথমিক ধারনা  

আমার এই লিখাটা মূলত তিনটি বা চারটি পর্বে ভাগ করার ইচ্ছে। এই পর্বে আলোচনা করব NumPy এর একেবারের শুরুর কিছু ব্যাপার। সামনের পর্ব গুলোতে  থাকবে NumPy আর Pandas নিয়ে বিস্তারিত কিছু যা মূলত ডাটা এনালাইটিকস এর কাজে ব্যাবহৃত হয়।

তার আগে কিন্তু আমাদের পাইথন এর বেসিক কিছু ডাটা স্ট্রাকচার নিয়ে হাতেকলমে কাজ করে আসতে হবে ,যেমন list, dict, tuples, sets, strings । আমি নিশ্চিত তোমরা এই জিনিসগুলো পড়েই ডাটা এনালাইটিক্স এর কাজে হাত দিবে –
চটপট একটা পুরনো পড়া পড়ে ফেলতে পারি আমরা –
List এ  append আর  extend এর পার্থক্য কি ?

NumPy (সচরাচর উচ্চারন “নামপাই”) একটি লাইব্রেরি এবং শব্দটা এসেছে Numerical Python থেকে । এই লাইব্রেরি এন-ডাইমেনশনাল Array , বিভিন্ন জটিল গাণিতিক ফাংশন এর কাজ ( যেমন  Fourier transforms )-সহ আরো অনেক ধরনের গাণিতিক কাজ করার ক্ষেত্রে ওস্তাদ ।

ঢাকায় এখন বিভিন্ন এপভিত্তিক পরিবহন খুব জনপ্রিয় – আমরা সবাই উবার, পাঠাও, মুভ বা স্যাম নামে এইসব সেবা ব্যাবহার করছি আর সেইরকম একটি সার্ভিস-এর তিনজন ব্যবহারকারীর কিছু ডেটা আছে, সেইরকম তিনটা ফাইল নিয়ে আমরা কাজ শুরু করতে পারি।
আমরা সেখান থেকে তিনটা জিনিস বের করতে চাইব :
১। অফিস থেকে কে কখন রাইড নিয়ে বের হয়ে গিয়েছে ?
২। তাদের ভাড়ার Standard Deviation দেখতে কেমন ?
আর
৩। চেষ্টা করব বের করতে এই তিনজনের মাঝে কোন বাইক ড্রাইভার কমন ছিলেন কিনা, সম্ভব হলে সেটা গ্রাফে দেখা (যদিও গ্রাফে দেখার ব্যাপারটা এর সাথে তেমন একটা সম্পর্কিত না – কিন্তু দেখতে সুন্দর লাগে)।

এখান থেকে ফাইলগুলো নামিয়ে নেয়া যাবে (আপাতত আমি একটা ফাইল রেখেছি …পরবর্তী পর্বে বাকীগুলো পাওয়া যাবে)। 

প্রথমেই RidersData1 ফাইলটি পড়ে নিয়ে পাইথন-এ এর ডাটা দেখে নেই – 

import csv
with open("C:\Users\Asus\Desktop\RidersData1.csv", 'r') as f:
riders_data = list(csv.reader(f, delimiter=","))
print(riders_data[:2])

দেখে নেই যাত্রীর ভাড়ার পরিমান কত ছিল তার ভ্রমণের দিনগুলোতে

fare = [item[10] for item in riders_data[1:]]
print(fare)

তার মোট পরিমান কত ছিল ?

fare = [int(item[10]) for item in riders_data[1:]]
print(sum(fare))

>> ৫১৮৫ টাকা

এবার আমরা Numpy ইন্সটল করে কাজটা শুরু করি-
( Numpy ইন্সটল করার ধাপগুলো সুন্দর করে বলে দেয়া আছে এখানে

import numpy as np
riders_data = np.genfromtxt("D:\RidersData1.csv", delimiter=",", skip_header=1)

 

fare = [int(item[10]) for item in riders_data[0:]]
print(sum(fare))

এখন যদি Numpy ব্যাবহার করে Array তৈরী করি যা আসলে Array এর Array তৈরী করবে ।

riders_data_array = np.array(riders_data[1:], dtype=np.int)

এখানে dtype=np.int  আসলে নিশ্চিত করবে যেন ডাটা গুলোকে  String থেকে int এ রুপান্তর(convert) করে নেয়।

এখন আমরা যদি Array টা দেখতে চাই?

ইনপুট
 print(riders_data_array)
আউটপুট
 [[4445115     143    3180   15536       5]
  [4341383     167    3067   15704       5]
  [4153972     163    2383   15692       5]
  [4052253     167    3055   15703       5]
  [3935184     191    1520   12760       5]
  [3896665     202    2251   13224       5]
  [3807622     141    2611   15722       5]
  [3723194     236    2063   16165       5]
  [3650954     233    2411   15695       5]
  [3592384     262    5845   15721       5]
  [3538266     204    4802   11583       5]
  [3496106     242    3462   15698       5]
  [3455465     235    2588   15695       5]
  [3361305     229    1883   15724       5]
  [3353856     230    2173   15574       5]
  [3342150     234    2483   15700       5]
  [3302407     217    2461   15716       5]
  [3263818     163    2393   15688       5]
  [3227817     163    2270   15691       5]
  [3189625     166    2976   15635       5]
  [3118401     244    3155   16076       5]
  [3056517     245    3161   12712       5]
  [2966371     191    1882   12546       5]
  [2904590     242    2844   16122       5]
  [2872271     135    2652   15900       5]]

আমরা এখন যেকোন রকমের Array তৈরি করতে পারি

ইনপুট
 any_array = np.ones((5,6))
 print(any_array)
আউটপুট
 [[ 1.  1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.  1.]]

এখানে np.ones((5,6)) তে 5 এবং 6  যথাক্রমে row আর column বুঝাচ্ছে ।ঠিক একই রকম ভাবে একটা array তৈরি করতে পারি যেটার সবগুলো ভ্যালু হবে zero।

ইনপুট
 any_array = np.zeros((5,6))
 print(any_array)
আউটপুট
 [[ 0.  0.  0.  0.  0.  0.]
  [ 0.  0.  0.  0.  0.  0.]
  [ 0.  0.  0.  0.  0.  0.]
  [ 0.  0.  0.  0.  0.  0.]
  [ 0.  0.  0.  0.  0.  0.]]

আর এখন যদি চিন্তা করি একটা array তৈরি করব যার ভ্যালুগুলো হবে যে কোন নাম্বার বা Random ।

ইনপুট
 any_array = np.random.rand(2,3)
 print(any_array)
আউটপুট
 [[ 0.58870582  0.75596673  0.48148491]
  [ 0.39392526  0.16046594  0.34446376]]

এই পর্যায়ে এসে আমি দুটো বাড়ির কাজ দিতে চাই – 

১। Random নাম্বারের একটা array তৈরি করতে হবে যেখানে সংখ্যাগুলো হবে পূর্ণমান বা integer
২। any_array = np.eye(4)  – এই কোডটি run করলে যেই আউটপুট আসল তার মানে কি ?

স্লাইসিং (Slicing) :

শব্দটা শুনেই বুঝা যাচ্ছে – যে কোন বড় কোন Array থেকে কিছু অংশ কেটে নেয়াই slicing । যেমন আমাদের মূল ডাটা এর array ( riders_data_array)  যা দেখতে এমন

[[4445115     143    3180   15536       5]
  [4341383     167    3067   15704       5]
  [4153972     163    2383   15692       5]
  [4052253     167    3055   15703       5]
  [3935184     191    1520   12760       5]
  [3896665     202    2251   13224       5]
  [3807622     141    2611   15722       5]
  [3723194     236    2063   16165       5]
  [3650954     233    2411   15695       5]
  [3592384     262    5845   15721       5]
  [3538266     204    4802   11583       5]
  [3496106     242    3462   15698       5]
  [3455465     235    2588   15695       5]
  [3361305     229    1883   15724       5]
  [3353856     230    2173   15574       5]
  [3342150     234    2483   15700       5]
  [3302407     217    2461   15716       5]
  [3263818     163    2393   15688       5]
  [3227817     163    2270   15691       5]
  [3189625     166    2976   15635       5]
  [3118401     244    3155   16076       5]
  [3056517     245    3161   12712       5]
  [2966371     191    1882   12546       5]
  [2904590     242    2844   16122       5]
  [2872271     135    2652   15900       5]]

আমি যদি এখন এখান থেকে ২য় কলাম এর প্রথম ৫ টা ডাটা দেখতে চাই –

ইনপুট
 print(riders_data_array[0:5,1])
আউটপুট
 [143  167   163   167   191]

এখানে [0:5,1] অংশ টা বুঝাচ্ছে – প্রথম ৫ টি row এর ডাটা এবং তা ২য় column এর। এখানে যদি 0 এর পরিবর্তে আমি 1 লিখি – তারমানে তখন প্রথম row বাদ দিয়ে চারটি ডাটা নিবে এবং আউটপুট হবে এরকম

[167   163    167     191]

NumPy নিয়ে পরবর্তী পর্বটি কিছুদিন পর প্রকাশিত হবে। ধন্যবাদ।

 

 

 

 

Facebook Comments

কেন সিএসই পড়বা না

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

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

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

প্রোগ্রামিং শিখতে পরিশ্রম করা লাগে – পড়া এবং প্র্যাকটিস করা। আর এই প্র্যাকটিস করার জন্য আবার মাথাও খাটাতে হয়, এটা কিন্তু দেখে দেখে টাইপ করা ধরণের প্র্যাকটিস না। মাঝে-মধ্যে অজানা সমস্যা চিন্তা করে সমাধান করতে হয়। প্রোগ্রামিং শেখার সময় একটা ছোট সমস্যার সমাধান করতে ৪-৫ ঘণ্টা লেগে যায়। তো আমরা কিন্তু ক্লাস ওয়ান থেকে শুরু করে এইচএসসি পর্যন্ত মোটামুটি মুখস্থ করেই পার করে এসেছি। বড়জোর কিছু অঙ্ক হয়তো বোঝার চেষ্টা করেছি। আমাদের কখনওই একটা প্রবলেম করার জন্য ৪-৫ ঘণ্টা সময় দেয়া লাগে নাই। আশা করি, বিষয়টা পরিষ্কার। এখন কথা হচ্ছে, সময় দেওয়া লাগলে দিবো, যত পরিশ্রম করার দরকার করবো, টিচারের সাহায্য নিবো। কথা কিন্তু এখানেই।

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

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

আর কম্পিউটার সায়েন্স কিন্তু অনেক বোঝার বিষয়। যাদের গণিতের সাধারণ বিষয়গুলো বুঝতেই সমস্যা হয়, তাদের আসলে এই দিকে না আসাই ভালো।

যারা আমার কথায় এখনও একমত হও নাই, তারা আমার লেখা প্রোগ্রামিং শেখার একটা বই আছে, (http://cpbook.subeen.com-এ গিয়ে ফ্রি-তে বইটা পড়া যায়)। সেই বইটা কিছুদিন পড়। যদি মনে হয়, এই জিনিস নিয়া আগামী চার বছর ব্যাপক খাটাখাটনি করতে পারবা এবং আগামী ২০-৩০ বছর এইরকম বিদঘুটে জিনিসকেই নিজের পেশা হিসেবে নিতে পারবা, তাহলে কম্পিউটার সায়েন্স পড়লেও পড়তে পারো।

Facebook Comments

এইচটিএমএল কিভাবে শিখব?

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

এইচটিএমএল জানার আগে ওয়েবসাইট সম্পর্কে একটু ধারণা থাকা প্রয়োজন। তাই প্রথম ভিডিওতে ওয়েব ডিজাইন সম্পর্কে আলোচনা করেছি।

দ্বিতীয়, তৃতীয় ও চতুর্থ ভিডিওতে এইচটিএমএল-এর বিভিন্ন জিনিস দেখানো হয়েছে।

আশা করি, ভিডিওগুলো অনেকের কাজে আসবে। কোনো মতামত থাকলে পোস্টের নিচে কমেন্টে জানানোর অনুরোধ রইল।

Facebook Comments

প্রোগ্রামিং ক্লাব

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

আপনি কিভাবে আপনার এলাকায় একটি প্রোগ্রামিং সংগঠন গড়ে তুলবেন?

প্রথমেই প্রোগ্রামিং শেখাতে যাবেন না। গ্রাম/জেলা শহরের প্রায় অধিকাংশ মানুষের ধারনা কম্পিউটার বিনোদন এর কাজে ব্যবহার করা হয়, তাদের কাছে কম্পিউটার এর বিনোদনটাই আনন্দদায়ক। ঠিকাছে, আপনি ১০০ জন শিক্ষাথীকে এক জায়গায় করেন, যদি না পারেন তাহলে ৫০ জন, যারা ষষ্ঠ থেকে নবম শ্রেণীর শিক্ষার্থী। দশম শ্রেণীর শিক্ষাথীদেরকে নিতে হবে না, কারণ তাদের কিছুদিন পরই SSC পরীক্ষা।

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

https://www.youtube.com/watch?v=krYXHtrzXLU

https://youtu.be/wldli30PT1E

সর্বপরি প্রথমে তাদের কে এটাই খুব ভালো করে বোঝাতে হবে যে কম্পিউটার বিনোদন এর মেশিন না, এটা অনেক শক্তিধর, যেটা দিয়ে পৃথিবী পৃষ্ঠ থেকে চাঁদে একটা রোবট নিয়ন্ত্রন করা যায় যেন রুপকথার মতন)।

এখন আসি প্রোগ্রামিং-এ, এতক্ষণ ধরে তাদেরকে যেই রূপকথা শোনালেন, সেটার আসল শক্তি যে প্রোগ্রামিং সেটা ভালো করে বোঝান। বোঝান যে, এই প্রোগ্রামিং শিখলে তুমি এক সুপার পাওয়ার এর অধিকারি হতে পারবে, তুমি যে ক্লাশ অফ ক্লান, টেম্পল রান নামক গেম গুলা খেলো সেগুলা বানাতে পারবে। বোঝান যে এই প্রোগ্রামিং শিখলে অনেক সম্মান + পুরস্কার পাওয়া যায় (NHSPC এর ব্যাপার টা)।

এর পর দেখেন সেই ১০০ জন এর মধ্যে কত জন প্রোগ্রামিং এর ব্যাপারে উৎসাহী হয়। আশা করি, অনেকে হবে, কারন আমার অভিজ্ঞতা তাই বলে।

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

এবার আসি কিভাবে প্রোগ্রামিং শেখাবেন সেই কথায়। আপনি তাদেরকে শুধু শেখান, কিভাবে কোডব্লকস ইনস্টল দিবে, কিভাবে কোড লিখবে, কিভাবে কোড রান কম্পাইল করবে, কোডে কোথাও ভুল থাকলে সেগুলা কিভাবে বুঝবে, কিভাবে কোড রান করবে। এবং পরিশেষে তাদের কে আপনি “Hello World” টা রান করা শিখিয়ে দিন। বাকি সব কিছু তারা শিখে নিবে! কিভাবে? ওদের কে খুব ভালো করে একটা জিনিশ শিখিয়ে দিতে হবে আপনাকে, সেটা হলো তারা নিজেরা কিভাবে বই (বই এর লিংক http://cpbook.subeen.com) পড়ে প্রোগ্রামিং শিখবে। বই-এর প্রতিটা কোড সে নিজে নিজে লিখবে এবং রান করবে। কোথাও না বুঝলে ফেসবুক-এ অনেক গ্রুপ আছে (যেমন : https://facebook.com/groups/programming.school/ অথবা https://facebook.com/groups/bengaliprogramming/ ) সেখানে শিক্ষার্থীরা তাদের সমস্যা বা প্রশ্ন পোস্ট করবে। আর যদি ফেসবুক না থাকে (না থাকাই আসলে ভালো) তাহলে আপনার মোবাইল নাম্বার দিয়ে দিন, আপনাকে ফোন করবে, আপনি ফোনে বুঝায়ে দিবেন, আর গুগল তো আছেই। এখন গ্রামেও খুব ভালো ইন্টারনেট। আর আপনি প্রচুর উৎসাহ দিবেন। ছোটরা আনন্দের সাথে শিখতে ভালোবাসে, তাদেরকে যেটুকুই শেখান না কেন, আনান্দের সাথে শেখান।

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

আমি শতভাগ নিশ্চিত আপনি ১/২ মাস পর ১০/২০ জন শিক্ষাথী পাবেন যারা মোটামুটি প্রোগ্রামিং পারে। এর পর ঐ ১০ জনকে দেখেই আরো ১০ জন শিখবে। তারপর আরো ১০ জন, তারপর আরো…এভাবেই চলবে…।

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

– মিজানুর রহমান।

 

Facebook Comments

গড়, মধ্যক ও প্রচুরক

গড় শব্দটির সঙ্গে তোমরা যারা স্কুলে বিষয়টি পড়ে ফেলেছ, তারা যেমন পরিচিত, তেমনি যারা ক্রিকেট খেলা দেখো, তারাও পরিচিত। এই বইটি যখন লেখা হচ্ছে, তখন তামিম ইকবালের টেস্ট ক্রিকেটে ব্যাটিং গড় হচ্ছ 40.34 আর সাকিব আল হাসানের 40.93। এই গড় কিভাবে হিসেব করা হলো আর এর মানেই বা কী?

আমাকে যদি দুটি সংখ্যা দিয়ে এদের গড় বের করতে বলা হয়, তখন আমি সংখ্যা দুটি যোগ করে দুই দিয়ে ভাগ করবো। যেমন : 5 ও 6, এই দুটি সংখ্যার গড় হচ্ছে (5 + 6) / 2 বা 11 / 2 বা 5.5। তিনটি সংখ্যা 6, 7, 8-এর গড় হচ্ছে (6 + 7 + 8) / 3 বা 21 / 3 বা 7। তাহলে আমাকে যদি n সংখ্যক সংখ্যা দেওয়া হয়, তাহলে তাদের গড় বের করতে হলে সবগুলো সংখ্যা যোগ করে n দিয়ে ভাগ করবো। তাহলেই হয়ে গেলো।

এখন আমরা পাইথন ব্যবহার করে একটি প্রোগ্রাম লিখবো, যার কাজ হচ্ছে অনেকগুলো সংখ্যার গড় বের করা।

def average(li):
   s = sum(li)
   n = len(li)
   return s / n

li = [1, 2, 3]
print("Average:", average(li))
li = [10, 20, 30, 40, 50, 60, 70, 80]
print("Average:", average(li))
li = [-1, 0, 1]
print("Average:", average(li))

প্রোগ্রামটি রান করলে আমরা আউটপুট পাবো এরকম :

Average: 2.0
Average: 45.0
Average: 0.0

ক্রিকেট খেলায় ব্যাটিং গড় কিভাবে বের করে? মোট রানকে ইনিংস দিয়ে ভাগ করতে হয়। তবে একটি মজার বিষয় হচ্ছে, কোনো ইনিংসে অপরাজিত থাকলে, অর্থাৎ, আউট না হলে, সেই ইনিংসকে ভাগ করার সময় গণনা করা হয় না। ধরা যাক, কোনো ব্যাটসম্যান প্রথম খেলায় করলো 50 রান, দ্বিতীয় খেলায় 100 রান (অপরাজিত), তৃতীয় খেলায় আবারো 50 রান করে আউট হলো। তাহলে তার ব্যাটিং গড় হবে, (50 + 100 + 50) / 2, বা 200 / 2 বা 100। এখানে 3 এর বদলে 2 দিয়ে ভাগ করার কারণ হচ্ছে, দ্বিতীয় খেলায় সে অপরাজিত ছিল।

এখন গড় আমাদের কী কাজে লাগে? ধরা যাক, আন্তর্জাতিক ক্রিকেট খেলায় নতুন একটি দেশের আগমন ঘটলো এবং বাংলাদেশের সঙ্গে ওই দলের খেলা। টসে হেরে ওই দল প্রথমে ব্যাটিং পেল। এখন ওদের যেই দুজন ব্যাটসম্যান ইনিংস ওপেন করতে এসেছে, ঘরোয়া লিগে একজনের ব্যাটিং গড় হচ্ছে 26 আরেকজনের হচ্ছে 41। এই তথ্য থেকে তুমি দুজন ব্যাটসম্যানের মধ্যে তুলনা করতে পারো যে, কে তুলনামূলক ভালো ব্যাটসম্যান। তবে আজকের ম্যাচে কে কত রান করবে, এটি কিন্তু ব্যাটিং গড়ের ওপর নির্ভর করে না। কারও ব্যাটিং গড় 26 মানে এই নয় যে, সে প্রতি ইনিংসে 26 রান করে। তাহলে গড় হচ্ছে কোনো কিছুর মান সম্পর্কে ধারনা করার জন্য একটি টুল মাত্র। ইংরেজিতে একে average বলে, তবে গণিতের ক্ষেত্রে mean শব্দটিই বেশি ব্যবহার করা হয়।

এখন আরেকটি উদাহরণ দেই। কোনো দেশের মানুষ কেমন ধনী বা গরিব, তা বোঝার জন্য অনেকসময় মাথাপিছু আয় ব্যবহার করা হয়। মাথাপিছু আয় মানে হচ্ছে গড় আয়। সেটি ব্যবহার করে সেই দেশের মানুষের অর্থনৈতিক অবস্থা সম্পর্কে ধারণা পাওয়া যায়। কিন্তু সেখানে যদি মানুষের আয়ের মধ্যে বৈষম্য অনেক বেশি হয়, তাহলে কিন্তু গড় ব্যবহার করে প্রকৃত ধারণা পাওয়া যাবে না। একটি উদহারণ দিয়ে বোঝাই। ধরা যাক, কোনো দেশে 10 জন মানুষ আছে। তাদের মধ্যে 2 জন প্রতি মাসে 10 হাজার টাকা আয় করে। 5 জন প্রতিমাসে 20 হাজার টাকা আয় করে। আর একজন আয় করে প্রতিমাসে 30 হাজার টাকা। বাকী দুইজন প্রতি মাসে 5 লক্ষ টাকা আয় করে। তাহলে প্রতিমাসে তাদের গড় আয় কত?

গড় আয় = (10000 + 10000 + 20000 + 20000 + 20000 + 20000 + 20000 + 30000 + 500000 + 500000) / 10 = 115000।
তার মানে গড় আয় এক লক্ষ পনের হাজার টাকা! তাহলে শুধু গড় আয় জানলে যেকেউ সেই দেশের মানুষকে ধনী ভাববে। তাই গড় ব্যবহার করে সবসময় প্রকৃত চিত্র পাওয়া যায় না। তবে এতে হতাশ হওয়ার কিছু নেই, কারণ আমাদের হাতে রয়েছে মধ্যক ও প্রচুরক।

মধ্যক

এখন ধরা যাক, তুমি কোনো ক্রিকেট দলের ম্যানেজার। তোমার দল তৈরির সময় দুই জন ব্যাটসম্যান – রবিন ও সমিত-এর মধ্যে একজনকে বেছে নিতে হবে। দুজনের মধ্যে যার ব্যাটিং গড় বেশি, তুমি তাকে দলে নিতে পারো। কিন্তু তুমি যদি আরেকটু সচেতন হও, তখন হয়ত তুমি জানতে চাইতে পারো যে, কে কতগুলো ম্যাচ খেলেছে। ধরা যাক, রবিন 50 টি ম্যাচ খেলেছে এবং তার ব্যাটিং গড় 30। আর সমিত খেলেছে 5টি ম্যাচ এবং তার ব্যাটিং গড় 38। তুমি কিন্তু বেশিরভাগ ক্ষেত্রেই রবিনকে দলে নেবে, যেহেতু সে সমিতের তুলনায় অনেক বেশি অভিজ্ঞ। কিন্তু দুইজন যদি সমান সংখ্যক ম্যাচ খেলে, তখন কি কেবল গড় হিসেব করবে? তুমি চাইলে তখন আরেক ধরনের টুল ব্যবহার করতে পারো, যার নাম মধ্যক (ইংরেজিতে বলে median)। ধরা যাক, রবিন ও সমিত – দুজনেই 10টি করে ম্যাচ খেলেছে। 10টি ম্যাচে রবিনের রান হচ্ছে 95, 88, 47, 0, 10, 1, 5, 12, 0, 3। আর সমিতের রান হচ্ছে 10, 40, 20, 37, 0, 1, 25, 35, 30, 33। রবিনের গড় রান সমিতের গড় রানের চেয়ে বেশি। তবে এখানে আমরা দেখতে পাচ্ছি, রবিন মাঝে-মধ্যে অনেক বেশি রান করে, তবে বেশিরভাগ সময়ই সে খুব একটা ভালো খেলে না। আর সমিত দুয়েকটা বাদের বাকি খেলাগুলোয় মোটামুটি রান করতে পারে। তাই শুধু গড়ের ওপর ভরসা করা আমাদের ঠিক হবে না। আমরা মধ্যক বের করবো। প্রথমে আমরা তাদের প্রতি ম্যাচের রান ছোট থেকে বড় ক্রমানুসারে সাজাবো। তাহলে রবিনের রান হবে 0, 0, 1, 3, 5, 10, 12, 47, 88, 95 আর সমিতের রান হবে 0, 1, 10, 20, 25, 30, 33, 35, 37, 40। মধ্যক বের করতে গেলে আমাদেরকে তালিকার মাঝামাঝি সংখ্যাটি নিতে হবে। মোট সংখ্যা যদি বিজোড় হয়, তাহলে মাঝামাঝি সংখ্যা হবে একটি। যেমন 11-এর ক্ষেত্রে 6 নম্বর সংখ্যাটি হচ্ছে মাঝামাঝি সংখ্যা। কারণ ওই সংখ্যার চেয়ে ছোট 5টি সংখ্যা আছে। আবার বড় সংখ্যাও আছে 5টি। কিন্তু জোড় সংখ্যার বেলায় একটি মাঝামাঝি সংখ্যা বের করা যায় না। যেমন 10টি সংখ্যার ক্ষেত্রে আমরা যদি 5 নম্বর সংখ্যাটিকে মাঝামাঝি সংখ্যা ধরি, তাহলে তার ছোটি 4টি আর তার বড় 5টি সংখ্যা থাকবে। আবার 6 নম্বর সংখ্যাকে মাঝামাঝি সংখ্যা ধরলে, তার ছোট 5টি আর বড় 4টি সংখ্যা থাকবে।

যেহেতু আমাদের 10 টি সংখ্যা, তাই আমরা 5 ও 6 নম্বর সংখ্যা দুটি নিয়ে তাদের গড় বের করবো, মানে সংখ্যা দুটি যোগ করে দুই দিয়ে ভাগ করবো। তাহলে রবিনের রানের মিডিয়ান হবে 7.5 আর সমিতের রানের মিডিয়ান হবে 27.5। এখানে আমরা মিডিয়ান ব্যবহার করে সিদ্ধান্ত নিতে পারি যে কাকে দলে নেব। কাজটি তোমরা খাতা কলমে করে ফেল, তবে আমি পাইথন ব্যবহার করে একটি প্রোগ্রাম লিখে দেখাবো।

def median(li):
   li.sort()
   count = len(li)
   if count == 0:
      return None
   if count % 2 == 1:
      mid = count // 2
      return li[mid]
   else:
      mid2 = count // 2
      mid1 = mid2 - 1
      return (li[mid1]+li[mid2])/2

robin_run = [95, 88, 47, 0, 10, 1, 5, 12, 0, 3]
shomit_run = [10, 40, 20, 37, 0, 1, 25, 35, 30, 33]

median_robin = median(robin_run)
median_shomit = median(shomit_run)

print("Median run for Robin", median_robin)
print("Median run for Shomit", median_shomit)

আমরা এখন আমাদের মাথাপিছু আয়ের হিসেবে ফেরত যাই। তোমরা যদি সেই উদাহরণ থেকে মধ্যক বের করো, তাহলে সেটি হবে 20000। তোমরা হাতে-কলমে কিংবা একটি প্রোগ্রাম লিখে সেটি বের করতে পারো। এখানে কিন্তু মধ্যক ব্যবহার করেই বাস্তব চিত্রের কাছাকাছি চিত্র পাওয়া যাচ্ছে।

প্রচুরক

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

একটি ওয়ানডে ম্যাচে একজন বোলারের পক্ষে সর্বোচ্চ ও সর্বনিম্ন কয়টি উইকেট পাওয়া সম্ভব? উত্তর হবে, যথাক্রমে 10টি ও 0টি। 0-এর চেয়ে কম কিংবা 10-এর চেয়ে বেশি উইকেট পাওয়া সম্ভব নয়। এখন ধরা যাক, মোস্তাফিজ এখন পর্যন্ত 20টি ওয়ানডে ম্যাচে বোলিং করেছে। সেই খেলাগুলোতে সে প্রতি খেলায় যতগুলো উইকেট পেয়েছে, তা হচ্ছে : 6, 5, 6, 4, 3, 1, 3, 2, 1, 0, 5, 3, 3, 2, 2, 1, 3, 4, 3, 3। এখন আমি একটি তালিকা তৈরি করবো, যে মোস্তাফিজ 0 উইকেট পেয়েছে কতবার, 1 উইকেট পেয়েছে কতবার … এরকম।

উইকেট ম্যাচের সংখ্যা
0 1
1 3
2 3
3 7
4 2
5 2
6 2
7 0
8 0
9 0
10 0

তাহলে আমরা দেখতে পাচ্ছি, মোস্তাফিজ সবচেয়ে বেশি পেয়েছে 3 উইকেট। 20টি খেলার মধ্যে 7 টি খেলাতেই সে 3 উইকেট করে পেয়েছে। তাহলে তুমি ধরে নিতে পারো যে, আজকের খেলাতে মোস্তাফিজের 3 উইকেট পাওয়ার সম্ভাবনাই সবচেয়ে বেশি। এখানে প্রচুরক হচ্ছে 3। কারণ উইকেটের লিস্টে 3 সবচেয়ে বেশি বার আছে। আমরা এখন ওপরের হিসেবটা একটি পাইথন প্রোগ্রাম লিখে করবো।

wkts_list = [6, 5, 6, 4, 3, 1, 3, 2, 1, 0, 5, 3, 3, 2, 2, 1, 3, 4, 3, 3]

for item in range(11):
   print("Wicket:", item, "Count:", wkts_list.count(item))

প্রোগ্রামটি রান করলে আউটপুট আসবে এরকম :

Wicket: 0 Count: 1
Wicket: 1 Count: 3
Wicket: 2 Count: 3
Wicket: 3 Count: 7
Wicket: 4 Count: 2
Wicket: 5 Count: 2
Wicket: 6 Count: 2
Wicket: 7 Count: 0
Wicket: 8 Count: 0
Wicket: 9 Count: 0
Wicket: 10 Count: 0

যে ঘটনাটি সবচেয়ে বেশি সংখ্যক বার ঘটে, সেটিই হচ্ছে প্রচুরক। বিভিন্ন রকম মতামত জরিপ করতে প্রচুরক ব্যবহার করা হয়। যেমন ধরো, তুমি একটি নতুন মোবাইল ফোন কিনতে চাও। কিন্তু কোন ব্র্যান্ডের ফোন ভালো সেটা বুঝতে পারছ না। তখন তুমি তোমার বন্ধুদের জিজ্ঞাসা করতে পারো এবং সবচেয়ে বেশি সংখ্যক বন্ধু যেই ব্র্যান্ডের মোবাইল ফোন ব্যবহার করে বা ভালো বলে, সেই ব্র্যান্ডের ফোন কিনতে পারো।

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

Facebook Comments

FAQ – পাইথন দিয়ে প্রোগ্রামিং শেখা

পাইথন দিয়ে প্রোগ্রামিং শেখা (লেখক তামিম শাহরিয়ার সুবিন) বই সম্পর্কে কিছু সচরাচর জিজ্ঞাসিত প্রশ্নের উত্তর –

১) কোন প্রকাশনী থেকে বইটি প্রকাশিত হয়েছে?

উত্তরঃ দ্বিমিক প্রকাশনী (ওয়েবসাইট http://dimik.pub )

২) বইয়ের দাম কত?

উত্তরঃ গায়ের দাম ২০০ টাকা (দোকানে একটু কম রাখার কথা)।

৩) বইতে পাইথন ২ নাকি পাইথন ৩ ব্যবহার করা হয়েছে?

উত্তরঃ পাইথন ৩।

৪) আমি (তামিম শাহরিয়ার সুবিন-এর) কম্পিউটার প্রোগ্রামিং ১ম ও ২য় খণ্ড বইটি পড়েছি, এখন কি পাইথন বইটি পড়ব?

উত্তরঃ পাইথন শেখার কোনো দরকার থাকলে পড়া যেতে পারে, নইলে পড়ার দরকার নাই।

৫) বইটা কাদের জন্য উপযোগি?

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

৬) “পাইথন পরিচিতি” ও “পাইথন দিয়ে প্রোগ্রামিং শেখা” বই দুটির মধ্য পার্থক্য কী?

পাইথন পরিচিতি বইতে পাইথন 2.x ব্যবহার করা হয়েছে, আর পাইথন দিয়ে প্রোগ্রামিং শেখা বইটিতে 3.x। পাইথন পরিচিতি বইটি অভিজ্ঞ প্রোগ্রামার যারা পাইথন শিখতে চায়, তাদের জন্য, আর পাইথন দিয়ে প্রোগ্রামিং শেখা বইটি যারা নতুন প্রোগ্রামিং শিখতে চায়, তাদের জন্য।

৭) বইটি কোথায় পাওয়া যাবে?

নীলক্ষেতের হক লাইব্রেরি, মানিক লাইব্রেরি ও রানা বুক পাবলিশার্স-এ (ফোন নাম্বার দ্বিমিকের ওয়েবসাইটে দেওয়া আছে)। এছাড়া ঘরে বসে অনলাইনে অর্ডার করা যাবে রকমারি ডট কম-এ।

৮) ঢাকার বাইরে থেকে কিভাবে কিনব?

উত্তরঃ উপরে উল্লেখিত (নীলক্ষেতের) তিনটি বইয়ের দোকানে যোগাযোগ করতে হবে (ঠিকানা দ্বিমিকের ওয়েবসাইটে দেওয়া আছে)। এছাড়া rokomari.com বাংলাদেশের যেকোনো জায়গায় বই পৌঁছে দেয়।

৯) বাংলাদেশের বাইরে থেকে কিভাবে কিনব?

উত্তরঃ জানি না।

১০) বইতে কী কী বিষয় আলোচনা করা হয়েছে?

উত্তরঃ বইয়ের ওয়েবসাইটে বিস্তারিত আছে ঃ http://dimik.pub/book/155/

১১) পাইথন সম্পর্কিত কিছু প্রশ্ন ছিল, কোথায় জিজ্ঞাসা করবো?

উত্তরঃ পাইথন নিয়ে জিজ্ঞাসা থাকলে নিচের দুটি গ্রুপে কিংবা প্রোগ্রামাবাদে প্রশ্ন করতে হবে:

১২) আচ্ছা, পাইথন কী?

উত্তরঃ বিস্তারিত লিখেছি এই লেখায় : পাইথন কী?

Facebook Comments

একজন টিম বার্নার্স লী, ওয়ার্ল্ড ওয়াইড ওয়েব এবং একটি টুরিং পুরষ্কার

স্যার টিম বার্নার্স লী

সম্প্রতি স্যার টিম বার্নাস লী কম্পিউটার বিজ্ঞানের নোবেল পুরষ্কার হিসেবে খ্যাত টুরিং পুরষ্কারে ভূষিত হয়েছেন। এই বছর ছিল টুরিং পুরষ্কারের ৫০ বছর পূর্তি। গত ৪ মে, বৃহস্পতিবার এ্যাসোশিয়েন অফ কম্পিউটিং মেসিনারিজ (ACM) ওয়ার্ল্ড ওয়াইড ওয়েব (www), প্রথম ওয়েব ব্রাওজার এবং ওয়েবকে মানসম্মত করার জন্য যে মৌলিক নিয়মনীতি ইত্যাদি তৈরির জন্য প্রফেসর স্যার টিম বার্নাস লী-কে টুরিং পুরষ্কারে ভূষিত করেন ( “inventing the World Wide Web, the first web browser, and the fundamental protocols and algorithms allowing the web to scale”)।

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

টুরিং পুরষ্কার

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

এসিএম প্রেসিডেন্ট ভিকি এল হ্যানসন টিম লী এর টুরিং পুরষ্কার প্রাপ্তি সম্পর্কে বলেন, “ওয়ার্ল্ড ওয়াইড ওয়েব সর্বপ্রথম অনলাইনে আসে ১৯৯১ সালে। যদিও খুব বেশিদিন আগের কথা নয়, তারপরেও স্যার লী এর আবিষ্কারের আগের পৃথিবীর কথা ভাবাটা আমাদের জন্য কষ্টকর। বিভিন্ন দিক থেকে, ওয়ার্ল্ড ওয়াইড ওয়েবের অসামান্য প্রভাব সুস্পষ্ট। তারপরেও অনেকেই, WWW এর অন্তর্নিহিত প্রযুক্তিগত অবদানের স্বতঃস্ফূর্ত প্রশংসা করেন না। টিম বার্নাস লী, শুধুমাত্র ওয়ার্ল্ড ওয়াইড ওয়েবের মূল অংশটুকু উদ্ভাবন করেননি, একই সাথে তিনি URI (Uniform Resource Identifier) এবং ওয়েব ব্রাউজারও উদ্ভাবন করেছেন, যার দ্বারা Web এর ব্যবহার আমাদের কাছে সহজতর হয়েছে। WWW এর সামগ্রিক অংশের প্রতিটি উপাদান কিভাবে আলাদা আলাদা ভাবে কাজ করবে তার একটি সুস্পষ্ট ধারণা দিয়েছেন স্যার টিম বার্নাস লী।”

গুগলের বিশিষ্ট বিজ্ঞানী, অ্যান্দ্রেই ব্রোডার বলেন, “আমরা যেভাবে আইডিয়া এবং তথ্যের আদান-প্রদান করি, সেটির আমূল পরিবর্তন এনেছে এই ওয়েব এবং সেইসাথে বৈশ্বিক অর্থনৈতিক উন্নয়ন ও সম্ভাবনার চালিকাশক্তি হিসেবে নিজেকে প্রমাণ করেছে।” ভ্যানুভার বুশের একটি প্রবন্ধে ১৯৪৫ সালে ওয়েবের ধারণা পাওয়া গেলেও পরবর্তী কয়েক দশকে হাইপারটেক্সট, ইন্টারনেট, পারসোনাল কম্পিউটার ইত্যাদি নিয়ে ধোঁয়াশার সৃষ্টি হয়। কিন্তু টিম বার্নাস লী যখন Unified User Interface এর ধারণা দেন, তখন থেকেই মূলত ওয়েবের বিস্ফোরক বিকাশের সূচনা হয়।

১৯৮৯ সালে টিম বার্নার্স লী একাধারে এমআইটির কম্পিউটার সায়েন্স এ্যান্ড আর্টিফিসিয়াল ইন্টিলিজেন্স ল্যাব এবং ইলেক্ট্রিক্যাল ও ইলেক্ট্রিনিক্স প্রকৌশল বিভাগে কর্মরত ছিলেন, তখন এই ওয়ার্ড ওয়াইড ওয়েবের চিন্তা তাঁর মাথায় আসে। তাঁর চিন্তা ছিল পৃথিবী জুড়ে বিজ্ঞানীরা যেন সহজেই নিজেদের মধ্যে আইডিয়া এবং তথ্যের আদান প্রদান করতে পারে।

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

অক্সফোর্ড বিশ্ববিদ্যালয়ের অধ্যাপক টিম বার্নার্স লী World Wide Web Consortium এর প্রতিষ্ঠাতা এবং পরিচালক, যা ওয়েব ডেভেলপমেন্টের প্রযুক্তিগত মানদণ্ড স্থাপনের জন্য কাজ করে। একই সাথে তিনি World Wide Web Foundation এর প্রতিষ্ঠাতা, যার মূল লক্ষ্য জনস্বার্থে ওয়েবের ব্যবহার নিশ্চিত করা এবং ওয়েবের ব্যবহারকে মৌলিক অধিকার হিসেবে প্রতিষ্ঠিত করা।

CASIL এর ডিসেন্ট্রালাইজ ইনফরমেশন গ্রুপের পরিচালক, লী Http with Accountability (HTTPA) তৈরি করেন, যা Private-data এর ট্রান্সমিশন কিভাবে হচ্ছে সেটির উপর নজর রাখে এবং কিভাবে মানুষের দেয়া তথ্যের ব্যবহার হচ্ছে সেটি অনুসন্ধান করতে পারে। লী Solid (Social Linked Data) নামের একটি প্রকল্পের নেতৃত্ব দেন, যেটি একজন ব্যক্তিকে তার নিজস্ব ডাটা নিয়ন্ত্রণের অনুমতি দেয় এবং পছন্দসই অ্যাপ্লিকেশনে সেসব ডাটা ব্যবহারের জন্য যোগ্য করে তোলে।

এমআইটির প্রেসিডেন্ট এল র‍্যাফেল রেইফ বলেন, “টিম বার্নাস লী এর বর্নাঢ্য ক্যারিয়ার MIT এর মূল আসক্তি – প্রযুক্তির মাধ্যমে পৃথিবীর সৌন্দর্য বৃদ্ধির উদ্দেশ্যকেই ব্যাখ্যা করছে। আজ আমরা উদযাপন করছি আমাদের মানবজীবনের সর্বোৎকৃষ্ট প্রাপ্তি, যা টিম লী আমাদের জন্য করেছে এবং তাঁকে অভিনন্দন জানাচ্ছি এই সুন্দর পুরষ্কার প্রাপ্তিতে যা কিনা সত্যিকার অর্থেই তাঁর প্রাপ্য ছিল।”

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

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

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

লেখকঃ তামান্না নিশাত রিনি।

Facebook Comments

প্রোগ্রামিং শেখার এক ডজন টিপস্

 প্রথম প্রোগ্রামিং ল্যাঙ্গুয়েজ হিসেবে সি (C) বেশ জনপ্রিয় ও বহুল ব্যবহৃত। বিভিন্ন প্রোগ্রামিং প্রতিযোগিতায় (স্কুল-কলেজ-বিশ্ববিদ্যালয় পর্যায়ে) সি ব্যবহার করা হয়। কলেজে আইসিটি কোর্সের সি ব্যবহার করা হয় এবং বেশিরভাগ বিশ্ববিদ্যালয়েও প্রথম প্রোগ্রামিং কোর্সে সি ব্যবহার করা হয়। সি ভালোভাবে শিখতে গিয়ে অনেকেই নানান সমস্যায় পরে। তাই আমার অভিজ্ঞতা থেকে কিছু পরামর্শ দিলাম।

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

১) প্রোগ্রামিংয়ের পেছনে নিয়মিত সময় দিতে হবে। একটানা কয়েকঘণ্টা (২ থেকে ৫ ঘণ্টা)। সপ্তাহে কমপক্ষে ৫ দিন। এভাবে মাসের পর মাস। প্রোগ্রামিং করার সময় অন্য কিছু, যেমন টিভি দেখা, খেলা দেখা, ফেসবুক – এসব করা যাবে না।

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

৩) প্রোগ্রামিংয়ে অনেক সময়ই কেন হয় প্রশ্নের উত্তর পাওয়া যাবে না (আসলে পাওয়া যাবে, তবে অনেক পরে, কখনও কয়েক মাস পরে, কখনও আরো বেশি সময় পরে)। যেমন: scanf ফাংশনে ভেরিয়েবলের আগে & চিহ্ন কেন ব্যবহার করা হয়, সেটা নিয়ে শুরুতে বেশি মাথা ঘামানো দরকার নাই। কিভাবে ব্যবহার করতে হয়, সেটা জানলেই হবে। তবে প্রোগ্রামিং শিখতে থাকলে একসময় এর উত্তর পেয়ে যাবে। শুরুতে কী করলে কী হয়, সেটাই গুরুত্বপূর্ণ। এজন্য বেশি বেশি প্রোগ্রাম লিখতে হবে, এবং প্রোগ্রামিং করার সময় পূর্ণ মনোযোগ দিতে হবে।

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

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

৬) যেই বই দিয়েই সি শেখা শুরু কর না কেন, সেটা দুইবার পড়তে হবে (এবং সেই বইতে যা বলা হয়েছে, তা করতে হবে)। তারপরে কমপক্ষে আরো একটা বই পড়তে হবে।

৭) ক্লাসের পরীক্ষায় (মানে প্রোগ্রামিং কোর্সের পরীক্ষায়) কম নাম্বার পেলে মন খারাপ করা চলবে না। কে কতটুকু প্রোগ্রামিং পারে সেটা আসলে পরীক্ষায় যাচাই করা খুব কঠিন।

৮) i++, ++i এসব জিনিস নিয়ে শুরুর দিকে মাথা ঘামানো মানে সময় নষ্ট করা, যদিও এটা পরীক্ষায় অনেক শিক্ষকেরই প্রিয় প্রশ্ন। ভেরিয়েবল, কন্ডিশনাল লজিক, লুপ, অ্যারে, ফাংশন – এসব জিনিস ভালোভাবে শিখতে ও এগুলো ব্যবহার করতে পারতে হবে।

৯) সি মোটামুটি শেখা হয়ে গেলে সি দিয়ে যেকোনো ওয়েবসাইট থেকে ৫০-১০০ টা সমস্যা সমাধান করতে হবে, তাহলে হাত ও মাথা পাকবে।

১০) আমি সি পুরোটা শিখতে চাই – এই টাইপ চিন্তাভাবনা থেকে বের হয়ে আসতে হবে। আমার মতে, এটা বোকার মত চিন্তা। পুরোটা সি শেখা বলতে আসলে তুমি কী বোঝাও, সেটা নিজেই জান না। অনেকে সি দিয়ে গ্রাফিক্যাল ইউজার ইন্টারফেস (গুই – GUI) সমৃদ্ধ সফটওয়্যার বানাতে চায়, যেটা আসলে না করলেই ভালো। কারণ এতে পরিশ্রম বেশি হয়, শেখা কম হয়। প্রোগ্রামিং শিখতে থাকলে একসময় গুই বানানোর অনেক টুলসের সাথে পরিচিত হবে, তাই অস্থির হওয়ার কিছু নেই।

১১) প্রোগ্রামিং কনটেস্টে অংশ নিতে হবে। প্রোগ্রামিং প্রতিযোগিতায় ভালো করতে পারলে তো ভালো, কিন্তু ভালো করতে না পারলেও ক্ষতি নেই। ভালো করার জন্য যেই চেষ্টা – সেটা করতে গিয়েই অনেক কিছু শিখতে পারবে যেটা তোমাকে ভবিষ্যতে একজন দক্ষ সফটওয়্যার ইঞ্জিনিয়ার হতে সহায়তা করবে।

প্রোগ্রামিং নিয়ে আনন্দে সময় কাটুক সবার!

নোট: প্রোগ্রামিং শুরু করার আরো কিছু গাইডলাইন এখানে আছে : http://programabad.com/questions/1447/-

Facebook Comments

প্রোগ্রামিং ল্যাঙ্গুয়েজ

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

আমি যখন কলেজে পড়তাম, তখন কিউ-বেসিক (Q Basic) নামে একটা প্রোগ্রামিং ল্যাঙ্গুয়েজ শেখার ব্যর্থ চেষ্টা করেছিলাম। কিউ-বেসিক ল্যাঙ্গুয়েজটা আমাদের সিলেবাসে ছিল আর কী। এইচএসসি পরীক্ষার পরে কম্পিউটার কিনি, তখন এইচটিএমএল (HTML) শিখলাম কিছুটা, যদিও এটা ঠিক প্রোগ্রামিং ল্যাঙ্গুয়েজ না। তারপরে ২০০১ সালের শুরু থেকে সি (C) শেখা শুরু করি। আমাদের ভার্সিটির ক্লাস শুরু হয় ২০০১ সালের মে মাসে, আর ততদিনে সি এর বেসিক কিছুটা শেখা হয়েছে। আমি আমার বাকী ভার্সিটি-জীবন এর সুবিধা ভোগ করি। আমার যদি ভার্সিটির সি কোর্সের ক্লাশ থেকে সি শেখা লাগতো, তাহলে একটু অসুবিধাই হতো হয়ত, যেটা আমার অনেক ক্লাসমেটকে দেখে বুঝতে পেরেছি। সি শেখার সময় প্রথম বছরে ৩-৪টা বই কিনেছিলাম, যদিও সবগুলো বই শুরু থেকে শেষ পর্যন্ত পড়ি নাই। এক বছর সি শেখার পরে আমি হার্বার্ট শিল্ডের টিচ ইয়োরসেল্ফ সি প্লাস প্লাস বইটা পড়ি। কিন্তু এরপরে আর আমার সি প্লাস প্লাস (C++) চর্চা করা হয় নাই।

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

ভার্সিটির সেকেন্ড ইয়ারে অবজেক্ট ওরিয়েন্টেড কোর্স ছিল। সেই কোর্সে জাভা (Java) শিখি। আর তারপরের সেমিস্টারে একটা প্রজেক্টও করি জাভা ব্যবহার করে। তারপরে ২০০৬-২০০৭ সালে কিছু টুকটাক কাজ করতে জাভা ব্যবহার করেছিলাম।

সম্ভবত ফোর্থ ইয়ারে আমাদের মাইক্রোপ্রসেস কোর্স ছিল, সেই কোর্সের ল্যাবের জন্য এসেম্বলি ল্যাঙ্গুয়েজ (Assembly Language) শিখতে হয়েছিল।

আমার প্রথম প্রফেশনাল চাকরি ছিল টাইগার আইটি-তে, ২০০৭ সালের মাঝামাঝি। সেখানে আমি যেই প্রজেক্টে জয়েন করলাম, সেই প্রজেক্টে পার্ল (Perl) প্রোগ্রামিং ল্যাঙ্গুয়েজ ব্যবহার করতে হয়। কিন্তু আমি আগে কখনও এই ল্যাঙ্গুয়েজের নাম শুনি নাই। তাই বলে আমার কিন্তু চাকরি পেতে সমস্যা হয় নাই। কারণ ভালো কোম্পানীগুলো বেশি গুরুত্ব দেয় প্রবলেম সলভিং স্কিলের ওপর, প্রোগ্রামিং ল্যাঙ্গুয়েজ শেখার ওপর নয়।

আমার দ্বিতীয় সফটওয়্যার ইঞ্জিনিয়ারিং চাকরি ছিল ট্রিপার্ট ল্যাবসে (যেটা পরে প্লেডম কিনে নেয়, আবার প্লেডমকে ডিজনী কিনে নেয়)। সেখানে ব্যাকএন্ডের কাজ হতো পিএইচপি (PHP) প্রোগ্রামিং ল্যাঙ্গুয়েজে। আর মাঝেমধ্যে অল্পস্বল্প জাভাস্ক্রিপ্ট। তো সেই চাকরির ইন্টারভিউতে আমাকে জিজ্ঞাসা করল যে পিএইচপি পারি কী না। আমি সোজা বলে দিলাম যে পারি না, কারণ এর আগে ২-৩ দিন পিএইচপি নিয়ে গুতাগুতি করলেও সেটা বলার মতো কিছু না। কিন্তু সেজন্য আমার চাকরি পাওয়া আটকায় নাই। সেখানে এক বছর কাজ করার পরে একটা নতুন প্রজেক্টে কাজ করতে হয়, আর সেই প্রজেক্ট হচ্ছে অ্যাকশন স্ক্রিপ্ট (Actionscript)-এ। তো সেটাও দুই-তিন দিন শিখে কাজ শুরু করে দেই।

তারপরে তিন বছর আমার নিজের কোম্পানী মুক্তসফট নিয়ে ব্যস্ত ছিলাম। সেখানে পিএইচপি, পার্ল, পাইথন (Python) – এসব ল্যাঙ্গুয়েজ ব্যবহার করেছি, যখন প্রোগ্রামিং করতে হয়েছে। জেকুয়েরি ব্যবহার করেও একটা প্রজেক্ট করেছিলাম। আসলে ক্লায়েন্ট যেই ল্যাঙ্গুয়েজ চাইতো, সেটাই ব্যবহার করতাম। আর ক্লায়েন্ট কিছু না বললে পাইথন। তারপরে দুই বছর একটা আমেরিকান কোম্পানীর কাজ করি, সেখানে আমি পাইথন ব্যবহার করার সিদ্ধান্ত নেই, কারণ পাইথনে কোড করতে ভালো লাগে এবং সময় কম লাগে।

২০১৫ সালের মাঝামাঝি আমি সিঙ্গাপুরের গ্র্যাব নামক কোম্পানীতে ইন্টারভিউ দেই। বেশ কয়েকটা ইন্টারভিউ হয় এবং সেখানে আমি সি ব্যবহার করি, প্রবলেম সলভ করার জন্য। ইন্টারভিউ শেষে অফার পেয়ে জয়েন করি। জয়েন করার পরে জানতে পারলাম যে এখানে গো (Go বা Golang) ব্যবহার করা হয়, তাই প্রথম কিছুদিন গো শিখি। লক্ষ্য করার বিষয় হচ্ছে এত বড় কোম্পানী এত বেতন দিয়ে অন্য দেশ থেকে ইঞ্জিনিয়ার হায়ার করছে, ওরা কিন্তু এই বিষয় নিয়ে মাথা ঘামায় নাই যে আমি গো পারি কী না। সুতরাং বোঝাই যাচ্ছে যে কয়টা প্রোগ্রামিং ল্যাঙ্গুয়েজ পারি, এটা আসলে বিবেচ্য বিষয় নয়। কম্পিউটার সায়েন্সের বেসিক জ্ঞান (ডাটা স্ট্রাকচার, অ্যালগরিদম, অপারেটিং সিস্টেম, ডাটাবেজ, অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং, নেটওয়ার্কিং ইত্যাদি) এবং প্রবলেম সলভিং স্কিল-ই একজন ভালো সফটওয়্যার ইঞ্জিনিয়ার হওয়ার পূর্বশর্ত। আর কাজ করতে করতে সফটওয়্যার ইঞ্জিনিয়ারিংটাও শেখা হয়ে যায়, তবে তার জন্য ভালো কোম্পানীতে কাজ করাটা জরুরী।

Facebook Comments

বাইনারি সার্চ-এর কোড

আজকে সকালে গো (Go) প্রোগ্রামিং ল্যাঙ্গুয়েজে একটু কোডিং প্র্যাকটিস করার জন্য বাইনারি সার্চ ফাংশন লিখলাম, তারপরে ইউনিট টেস্ট লিখলাম (টেবল ড্রিভেন টেস্ট)। তো এমন সময় আমার মনে হলো লাইব্রেরি ফাংশনগুলো কিভাবে ইমপ্লিমেন্ট করা, সেটা দেখা দরকার। তো গো এর লাইব্রেরিতে যে বাইনারি সার্চ আছে, তার কোড (এবং ডকুমেন্টেশন) দেখে তো আমি মুগ্ধ!
এটা হচ্ছে গো-এর কোড:

func Search(n int, f func(int) bool) int {
    // Define f(-1) == false and f(n) == true.
    // Invariant: f(i-1) == false, f(j) == true.
    i, j := 0, n
    for i < j {
	h := i + (j-i)/2 // avoid overflow when computing h 
        if !f(h) { 
            i = h + 1 // preserves f(i-1) == false 
        } else { 
            j = h // preserves f(j) == true 
        } 
    } 
    return i
}

ওপরের কোডটুকু দেখলে আসলে পুরোপুরি বোঝা যাবে না কেন আমি এত মুগ্ধ। এই লিঙ্কে গেলে বিষয়টা আরো পরিষ্কার হবে: https://golang.org/src/sort/search.go। কোডের চেয়ে ডকুমেন্টেশন অনেক বেশি। আর এই বেশি ডকুমেন্টেশনসহ কোড হচ্ছে ১১৩ লাইন। কিন্তু বিষয় এখানেই শেষ নয়। আমার তারপরে চিন্তা আসল, আচ্ছা, এত সুন্দর কোড আর ডকুমেন্টেশন – এই কোডের টেস্ট কোড (ইউনিট টেস্ট) ওরা কিভাবে লিখল? তার জন্য চলে গেলাম এই লিঙ্কেঃ https://golang.org/src/sort/search_test.go। ১১৩ লাইনের search.go এর জন্য search_test.go তে আছে ১৬২ লাইন। এই দুইটা ফাইলের কোড এবং ডকুমেন্টেশন ঠিকমতো পড়লে শেখার আছে অনেক কিছুই।

তারপর চিন্তা করলাম, গো এর কোড এত সুন্দর, সি এর লাইব্রেরিতে এটা কিভাবে করা হয়েছে? গুগল সার্চ করে খুঁজে বের করলাম কোড।

void *
bsearch (register const void *key, const void *base0,
    size_t nmemb, register size_t size,
    register int (*compar)(const void *, const void *))
{
    register const char *base = (const char *) base0;
    register int lim, cmp;
    register const void *p;

    for (lim = nmemb; lim != 0; lim >>= 1) {
        p = base + (lim >> 1) * size;
        cmp = (*compar)(key, p);
        if (cmp == 0)
            return (void *)p;
        if (cmp > 0) {	/* key > p: move right */
            base = (const char *)p + size;
            lim--;
        } /* else move left */
    }
    return (NULL);
}

এই কোডটাও বেশ সুন্দর, গুছানো। ডকুমেন্টেশনও ভালো। আর পয়েন্টার দেখে ভয় পাওয়ার কারণ নাই (পয়েন্টার নিয়ে আমি কম্পিউটার প্রোগ্রামিং ২য় খণ্ড বইতে বিস্তারিত আলোচনা করেছি অনেক উদাহরণসহ)। তবে এখানে গিয়ে পুরো ফাইলটা না দেখলে এর মর্ম বোঝা যাবে না : https://github.com/gcc-mirror/gcc/blob/master/libiberty/bsearch.c

গো আর সি-এর কোড যেহেতু দেখলাম, পাইথনের কোডটাও দেখা যাক। তাই সেটাও সার্চ করে বের করে ফেললাম :

def bisect_left(a, x, lo=0, hi=None):
    """Return the index where to insert item x in list a, assuming a is sorted.

    The return value i is such that all e in a[:i] have e < x, and all e in a[i:] have e >= x.  So if x already appears in the list, a.insert(x) will
    insert just before the leftmost x already there.

    Optional args lo (default 0) and hi (default len(a)) bound the
    slice of a to be searched.
    """

    if lo < 0:
        raise ValueError('lo must be non-negative')
    if hi is None:
        hi = len(a)
    while lo < hi:
        mid = (lo+hi)//2
        if a[mid] < x: lo = mid+1
        else: hi = mid
    return lo

গো আর সি এর তুলনায় বেশ সহজ! তবে ডকুমেন্টেশন সংক্ষিপ্ত হলেও ভালো। এখানে গিয়ে পুরো কোড দেখা যাবে : https://github.com/python-git/python/blob/master/Lib/bisect.py

তারপরে ভাবলাম, আমার ব্লগের পাঠকদেরকে বিষয়টা জানানো যাক। আশা করি, বিশ্বমানের প্রোগ্রামারদের কোডের সঙ্গে পাঠকদের কিছুটা হলেও পরিচয় করিয়ে দিতে পেরেছি। কোডিং সঠিক হোক, কোড সুন্দর হোক।

Facebook Comments