Python Fundamentals

সময় – ছয় সপ্তাহ, প্রতি সপ্তাহে ২টা ক্লাস, মোট ১২টা ক্লাস। প্রতিটি ক্লাস দেড় থেকে দুই ঘণ্টার। জুম (zoom) ব্যবহার করে অনলাইনে লাইভ ক্লাস নেওয়া হবে।

কোর্স শুরুর তারিখ (৩য় ব্যাচ) – পরে জানানো হবে।

কোর্সের উদ্দেশ্য – পাইথন প্রোগ্রামিং ভাষা ব্যবহার করে প্রোগ্রামিংয়ের একটি শক্ত ভিত্তি তৈরি করা।

ক্লাস হবে রবিবার ও মঙ্গলবার বাংলাদেশ সময় বিকাল তিনটা থেকে পাঁচটা পর্যন্ত।

কোর্স ফি – ৪০০০ টাকা (চার হাজার টাকা) অথবা ৬০ মার্কিন ডলার (যারা বাংলাদেশের বাইরে থেকে করবে)।

কোর্সের বিষয়বস্তু

Hello world, Variable, Data Type, Conditional Logic, Loop, String, Data Structures (List, Set, Tuple, Dictionary), Introduction to Problem Solving, Files, Module and Package, Class and Objects, Introduction to Pygames.

কোর্স সম্পর্কিত কিছু তথ্য – 

  • যারা প্রোগ্রামিংয়ে একেবারেই নতুন, তাদের জন্য কোর্সটি উপযোগী।
  • লাইভ ক্লাস রেকর্ড করা হবে। তবে যারা সরাসরি ক্লাসে উপস্থিত থাকতে পারবে, তারাই কোর্সটি করে লাভবান হবে।
  • কোর্সের জন্য সহায়ক বই – পাইথন দিয়ে প্রোগ্রামিং শেখা ১ম খণ্ড (তামিম শাহরিয়ার সুবিন), কিংবা pybook.subeen.com
  • কোর্সের শিক্ষার্থীদের জন্য একটি বিশেষ ফেসবুক গ্রুপ চালু করা হবে যেখানে বিভিন্ন সমস্যার উত্তর দেওয়া হবে।
  • কোর্স শেষে কোনো পরীক্ষা নেওয়া হবে না।
  • কোর্স করলে কোনো সার্টিফিকেট দেওয়া হবে না।
  • লাইভ ক্লাসে অংশগ্রহন করার পাশাপাশি প্রতি সপ্তাহে বাসায় আট-দশ ঘণ্টা প্র্যাকটিস করতে হবে। শুধু ক্লাস করলে প্রোগ্রামিং শেখা যাবে না।

পরবর্তী ব্যাচে অংশগ্রহন করতে চাইলে book@subeen.com ঠিকানায় ইমেইল করতে হবে।

দশটি কোডিং ইন্টারভিউ সমস্যা

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

  1. pow(a, n) – একটি ফাংশন তৈরি করতে হবে, যেখানে দুটি ইন্টিজার (a, n) ইনপুট দেওয়া থাকলে ফাংশনটি a^n রিটার্ন করবে। ফাংশনটির রানটাইম হতে হবে O(log n)।
  2. BST – একটি ফাংশন তৈরি করতে হবে, যেখানে একটি বাইনারি ট্রি ইনপুট দেওয়া হলে সেটি বাইনারি সার্চ ট্রি (BST) কী না, তা বের করতে হবে।
  3. Stack and Queue –  স্ট্যাক (Stack) ব্যবহার করে কিউ (Queue) তৈরি করতে হবে, অর্থাৎ কিউ এর এনকিউ (enqueue) ও ডিকিউ (dequeue) ফাংশন তৈরি করতে হবে।
  4. Triangle – একটি ইন্টিজার অ্যারে দেওয়া আছে, যার সবগুলো সংখ্যাই ধনাত্মক। ওই অ্যারে থেকে তিনটি করে উপাদান নিয়ে মোট কয়টি ত্রিভুজ বানানো যায়, সেটি গণনা করতে হবে।
  5. Difference – একটি ইন্টিজার অ্যারে দেওয়া আছে যার উপাদানগুলো ছোট থেকে বড় ক্রমে সাজানো। এখন একটি অঋণাত্মক সংখ্যা দেওয়া হলে, বলতে হবে যে, অ্যারের যেকোনো দুটি পৃথক সংখ্যার অন্তরফল ওই সংখ্যাটির সমান কী না। 
  6. 3 Sum – একটি পূর্ণসংখ্যার অ্যারেতে তিনটি করে সংখ্যা নিলে কতগুলো পৃথক ত্রয়ী পাওয়া যায়, যাদের যোগফল শূন্য (0) হবে?
  7. Substring – দুটি স্ট্রিং দেওয়া আছে – A ও s. একটি ফাংশন লিখতে হবে, যার কাজ হচ্ছে, s যদি A-এর সাবস্ট্রিং হয়, তাহলে A-এর যেই ইনডেক্স থেকে s শুরু হয়েছে, সেই ইনডেক্স রিটার্ন করতে হবে।
  8. Bit difference – একটা অ্যারেতে কতগুলো অঋণাত্মক সংখ্যা আছে। ওই সংখ্যাগুলোর মাঝে যতগুলো জোড়া (pair) আছে, তাদের মধ্যে বিটের পার্থক্যের যোগফল বের করতে হবে।
  9. Running Median – একটি অ্যারেতে বা লিস্টে শুরুতে কোনো সংখ্যা নেই। অ্যারেতে ক্রমান্বয়ে n সংখ্যক সংখ্যা যুক্ত হবে, আর প্রতিটি সংখ্যা যুক্ত হওয়ার পরে ওই অ্যারের বর্তমান সংখ্যাগুলোর মিডিয়ান বের করতে হবে।
  10. Linked List – লিঙ্কড লিস্টের শুরুর নোড (হেড নোড) দেওয়া থাকবে, আর একটা সংখ্যা দেওয়া থাকবে, ওই সংখ্যার মান যত, লিঙ্কড লিস্টের শেষ থেকে ততঘর বা ততটি নোড আগে এসে যেই নোড পাওয়া যায়, তার মান রিটার্ন করতে হবে।

এরকম 71টি প্রোগ্রামিং সমস্যা ও তাদের সমাধান নিয়ে আলোচনা করা হয়েছে “কোডিং ইন্টারভিউ – প্রস্তুতি, সমস্যা ও সমাধান” বইতে।

বইয়ের লিঙ্ক – http://dimik.pub/book/475/coding-interview-preparation-problem-solution-by-tamim-shahriar-subeen

কম্পিউটার বিজ্ঞানের পড়ালেখা

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

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

প্রোগ্রামিং

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

  • আমি কেন প্রোগ্রামিং শিখতে পারছি না, এ জন্য দশ-বিশটা কারণ খুঁজে বের করে দেশ-সমাজ-শিক্ষাব্যবস্থা ইত্যাদির ওপর দায় চাপিয়ে দিয়ে ঘুরে-বেড়ানোর পরিবর্তে নিজের প্রোগ্রামিং শেখার দায়িত্ব নিজের কাঁধেই তুলে নিতে হবে।
  • প্রোগ্রামিং মাত্র তিন ক্রেডিট কিংবা ল্যাবসহ পাঁচ-ছয় ক্রেডিটের কোর্স হলেও প্রথম সেমিস্টারের ৬০-৭০% সময় প্রোগ্রামিং বই পড়া, শেখা ও চর্চা করার পেছনে দিতে হবে। পরীক্ষার আগের রাতের পড়া দিয়ে প্রোগ্রামিং শেখা যায় না, সপ্তাহে পাঁচ-ছয় দিন নিয়মিতভাবে তিন থেকে পাঁচ ঘণ্টা প্রোগ্রামিং নিয়ে কাটাতে হবে।
  • প্রোগ্রামিং শিখতে গিয়ে নানান ধরনের বাধার সম্মুখীন হবে, অনেক জায়গায় আটকে যাবে— মনে হবে, আমাকে দিয়ে হবে না। কিন্তু হতাশ হওয়া চলবে না, পর্যাপ্ত সময় দিলে প্রোগ্রামিং শেখাটা সহজ হয়ে যাবে। তাই দিনের পর দিন ঘণ্টার পর ঘণ্টা প্রোগ্রামিং প্র্যাকটিস করতে হবে।
  • প্রোগ্রামিং কিছুটা শেখার পরেও যদি ক্লাস টেস্টে কিংবা পরীক্ষায় প্রোগ্রামিং কোর্সে রেজাল্ট খারাপ হয়, তাহলে মন খারাপ করা চলবে না। পরীক্ষায় ভালো করতে হলে শিক্ষকের ক্লাস অনুসরণ করতে হবে, প্রোগ্রামিং বেশি জানলেই যে পরীক্ষায় ভালো ফল আসবে বিষয়টি এমন নয়।
  • এক হাজার ভিডিও কিংবা পিডিএফ বই কম্পিউটারে ডাউনলোড করে সময় নষ্ট করা উচিত নয়। প্রোগ্রামিং শিখতে হাজার হাজার বই কিংবা ভিডিও টিউটোরিয়ালের দরকার নেই। দু-তিনটি বই-ই যথেষ্ট।

নন-মেজর সাবজেক্ট

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

কম্পিটিটিভ প্রোগ্রামিং

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

হ্যাকাথন, কোডস্প্রিন্ট, প্রজেক্ট

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

আগামী দিনের প্রযুক্তি

Change is the only constant in life – দার্শনিকদের এই কথাটি প্রযুক্তি বিশ্বের বেলাতে আরো বেশি সত্য। প্রতি পাঁচ বছরেই যেন বিশাল পরিবর্তন ঘটে যাচ্ছে, নতুন প্রোগ্রামিং ভাষা, নতুন ফ্রেমওয়ার্ক, নতুন ডেটাবেজ, ক্লাউড কম্পিউটিং, মেশিন লার্নিংয়ের নতুন নতুন প্রয়োগ, মোবাইল কম্পিউটিং, আইওটি—লিখে শেষ করা যাবে না। এ জন্য দেশের সফটওয়্যার ইন্ডাস্ট্রির হর্তাকর্তারা প্রায়ই বলেন, আমাদের ভার্সিটিগুলোর সিলেবাস আধুনিক করতে হবে, নতুন নতুন জিনিস শেখাতে হবে ইত্যাদি। কিন্তু তারা আসলে ভুল বলেন। আগামী দিনের প্রযুক্তি নিয়ে কাজ করার জন্য তৈরি হতে হলে, বিশ্ববিদ্যালয়ের কম্পিউটার বিজ্ঞানের শিক্ষার্থীদের জন্য নতুন প্রযুক্তির পেছনে দৌড়ানোটা বোকামি হবে। বরং নিজের ভিত্তিটা অনেক বেশি মজবুত করার পেছনেই জোর দেওয়া উচিত। পাইথন লাইব্রেরি ব্যবহার করে মেশিন লার্নিং করার চেয়ে শিক্ষার্থীদের ডেটা স্ট্রাকচার ও অ্যালগরিদমের ওপর দখল থাকটা বেশি জরুরি। প্রবলেম সলভিং স্কিল থাকাটাও অনেক জরুরি। তবে প্রবলেম সলভিং স্কিল মানে এই নয় যে যেসব প্রবলেম আগে সলভ করা হয়েছে সেগুলো আবার সলভ করতে পারা, বরং নতুন প্রবলেম সলভ করা বা নতুন সমস্যা নিয়ে চিন্তা করার দক্ষতা। সমস্যার সমাধান করতে করতেই এই দক্ষতা তৈরি হবে এবং ভার্সিটির সময়টুকুই এই দক্ষতা তৈরির শ্রেষ্ঠ সময়। তেমনি লেটেস্ট ডেটাবেজ শেখার চেয়ে রিলেশনাল ডেটাবেজের মৌলিক ধারণা আয়ত্বে আনা বেশি জরুরি, নতুন ফ্রেমওয়ার্ক শেখার চেয়ে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং শেখাটা বেশি জরুরি। মোটকথা হচ্ছে, নতুন টেকনোলজির পেছনে না দৌড়ে, কম্পিউটার সায়েন্সের মৌলিক বিষয়গুলোর ওপর জ্ঞান ও দক্ষতা তৈরি করা অনেক বেশি গুরুত্বপূর্ণ। কম্পিউটার সায়েন্সের মূল বিষয়গুলো যাদের কাছে পরিষ্কার থাকবে, তাদের পক্ষে যেকোনো সময় নতুন টেকনোলজি আয়ত্বে আনতে বেগ পেতে হবে না। মনে রাখতে হবে, ভার্সিটি থেকে পাশ করার পরে ক্যারিয়ার কিন্তু ৩০ থেকে ৪০ বছরের। প্রযুক্তি নিয়ে এই দীর্ঘ ক্যারিয়ারের জন্য একটি শক্ত ভিত্তির ওপর নিজেকে দাঁড় করানোটাই সবচেয়ে গুরুত্বপূর্ণ।

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

প্যালিনড্রোম

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

source – https://www.deviantart.com/rose-xx-15412/art/Palindrome-Cow-364640478

একটি স্ট্রিং প্যালিন্ড্রোম কী না, সেটি পরীক্ষা করার উপায় কী? একটি উপায় হচ্ছে, স্ট্রিংটি উলটে দিয়ে আরেকটি স্ট্রিং তৈরি করা। তারপর তাদের মধ্যে তুলনা করে দেখা।

কাজটি আমরা পাইথন ব্যবহার করে খুব সহজেই করে ফেলতে পারি।

def is_palindrome(s):
    return s == s[::-1]

আবার আমরা স্ট্রিংয়ের মাঝামাঝি থেকে শুরু করে একটি একটি করে অক্ষর তুলনা করেও প্যালিনড্রেম পরীক্ষা করতে পারি।

def is_palindrome(s):
    l = len(s)
    indx1 = l // 2 - 1
    indx2 = (l + 1) // 2
    while indx1 >= 0 and indx2 < l:
        if s[indx1] != s[indx2]:
            return False
        indx1, indx2 = indx1 - 1, indx2 + 1

    return True

দুটি ফাংশনই একই উদ্দেশ্য সাধন করবে, কিন্তু একটু আলাদভাবে। এখন পাঠকদের কাছে প্রশ্ন – প্রথম ও দ্বিতীয় ফাংশনের টাইম ও স্পেস কমপ্লেক্সিটি কত?

প্রোগ্রামিং নিয়ে এক ডজন কমন প্রশ্ন ও উত্তর

প্রোগ্রামিং নিয়ে শিক্ষার্থীরা যেসব প্রশ্ন বারবার করে, এরকম এক ডজন প্রশ্ন প্রশ্নোত্তর আকারে লিখে রাখলাম।

১) আমি কি প্রোগ্রামিং শিখতে পারব?
উত্তর – এটা আসলে আগে থেকে বলা কঠিন। তিন মাস প্রোগ্রামিং নিয়ে সময় দাও, প্রতিদিন গড়ে ৪-৫ ঘণ্টা। তিন মাস পরেও যদি এই জিনিস ভালো লাগে, তাহলে শিখতে পারবে।

২) কোন প্রোগ্রামিং ভাষা শিখব?
উত্তর – এটা নির্ভর করে তুমি কোন ক্লাসে পড়, স্কুল-কলেজ নাকি বিশ্ববিদ্যালয়ের শিক্ষার্থী। বিস্তারিত উত্তর লিখেছি এখানে – কোন প্রোগ্রামিং ভাষা দিয়ে শুরু করব?

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

৪) আমি কম্পিউটার সায়েন্স পড়ি না, অন্য বিষয়ে পড়ি। আমি কি সফটওয়্যার ডেভেলাপার হতে পারব?
উত্তর – এই পোস্টে আলোচনা করা হয়েছে।

৫) আমি প্রোগ্রামিং শেখা শুরু করতে চাই। একটু গাইডলাইন দেন।
উত্তর – “প্রোগ্রামিংয়ের আশ্চর্য জগত” বইতে একেবারে শুরু থেকে কী করতে হবে ধারণা দেওয়া হয়েছে। এছাড়া এই ভিডিওতে আলোচনা করেছি।

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

৭) আমি গুগল (কিংবা মাইক্রোসফট, ফেসবুক, অ্যামাজন)-এ সফটওয়্যার ইঞ্জিনিয়ার হিসেবে কাজ করতে চাই। আমি কিভাবে ইন্টারভিউয়ের জন্য প্রস্তুতি নিব?
উত্তর – এই ভিডিওতে বিস্তারিত আলোচনা করা হয়েছে।

৮) প্রোগ্রামিং চর্চা করার জন্য কোন অনলাইন জাজ ব্যবহার করব?
উত্তর – এই লেখায় উত্তর আছে – প্রোগ্রামিং চর্চার ১০টি অনলাইন জাজ

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

১০) কম্পিউটার সায়েন্স পড়লেই কি চাকরি পাওয়া যায়?
উত্তর – না, শুধু কম্পিউটার সায়েন্স পড়ে সার্টিফিকেট থাকলেই চাকরি পাওয়ার নিশ্চয়তা নেই। বরং প্রোগ্রামিং স্কিল ও সেই সাথে কম্পিউটার বিজ্ঞানের জ্ঞান গুরুত্বপূর্ণ।

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

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

পাইথন – ইতিহাস, বর্তমান ও ভবিষ্যৎ

প্রোগ্রামিং সম্পর্কে সামান্য ধারণা আছে, অথচ পাইথনের নাম শোনেনি এমন মানুষ বোধহয় খুঁজে পাওয়া যাবে না। বর্তমান সময়ের সবচেয়ে দ্রুত বর্ধনশীল প্রোগ্রামিং ভাষা হচ্ছে পাইথন। বাচ্চাদের প্রোগ্রামিং শেখা থেকে শুরু করে ব্যাকএন্ড ওয়েব ডেভেলপমেন্ট, বৈজ্ঞানিক গবেষণা, জটিল তথ্য বিশ্লেষণ (Complex Data Analysis), কৃত্রিম বুদ্ধিমত্তা (Artificial Intelligence) ইত্যাদিসহ আরো অনেক জায়গায় রয়েছে পাইথনের একচ্ছত্র আধিপত্য।

গিডো ফন রোসাম (Guido van Rossum) একটি ডিস্ট্রিবিউটেড সিস্টেম নিয়ে কাজ করতেন সিডাব্লিউআই-তে (Centrum Wiskunde & Informatica – CWI)। সেখানে তিনি সি ও ইউনিক্স শেল ব্যবহার করতেন। এগুলোর বিভিন্ন সীমাবদ্ধতা নিয়ে হতাশ ছিলেন তিনি। সি ভাষায় মেমোরি ব্যবস্থাপনার বিশাল ঝামেলা, প্রতি নতুন প্রজেক্টে কিছু নির্দিষ্ট কাজ বারবার করতে হতো, প্রয়োজনীয় লাইব্রেরির অভাবসহ নানা সীমাবদ্ধতা ছিল। ইউনিক্স শেল সাধারণ কাজ-কর্মের জন্য চমৎকার হলেও জটিল লজিক্যাল সমস্যা নিয়ে কাজ করার উপযুক্ত ছিল না।

তাই তিনি সিদ্ধান্ত নিলেন যে নিজেই একটি প্রোগ্রামিং ভাষা তৈরি করবেন, যা হবে সহজে ব্যবহারযোগ্য, পাঠযোগ্য ও শক্তিশালী। সিডাব্লিউআই-তে তিনি তিন বছর একটি দলের সঙ্গে কাজ করেছিলেন যারা এবিসি (ABC) নামের একটি ইন্টারপ্রেটেড ভাষা তৈরি করেছে। সেই সুবাদে তিনি ইন্টারপ্রেটার তৈরির মৌলিক বিষয়াদি শিখেছিলেন। মৌলিক বিষয়াদি জানা থাকায় তিনি সরাসরি ভাষা তৈরি করা শুরু করে দেন। এবিসি তৈরি হতে মোটামুটি তিন বছর সময় লাগলেও রোসাম মাত্র তিন মাসে পাইথনের একটা কাঠামো দাঁড় করিয়ে ফেলেন। এই তিন মাস তিনি পাইথনের পেছনে পূর্ণ সময় দিতে পারেননি। সিডাব্লিউআই-তে কাজের পাশাপাশি তিনি পাইথন প্রজেক্টে কাজ করেছেন। alt.sources নামের একটি নিউজগ্রুপে ১৯৯১ সালে তিনি প্রথম পাইথন উন্মুক্ত করেন।

পাইথনের ঐ সংস্করণে আধুনিক পাইথনের অনেক কিছুই ছিল। পরিপূর্ণ ইন্টারপ্রেটার, ডিকশনারি, টাপল, ইনডেন্টেশন সবই ছিল। অত্যাবশ্যক ইনডেন্টেশনের নিয়মটি পাইথনে যোগ করা হয়েছিল যাতে সোর্স কোড গোছানো থাকে, এর পাঠযোগ্যতা (readability) বাড়ে। অনেকেই বিষয়টির প্রশংসা করেছেন, আবার অনেকে পছন্দ করেননি। ধীরে ধীরে পাইথন ব্যবহারকারী বাড়তে থাকে, রোসামও উৎসাহ পেতে থাকেন।

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

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

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

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

Tk, PyQt, PyGTK ইত্যাদি দিয়ে ডেস্কটপ অ্যাপ ডেভেলপমেন্ট বেশ ভালোই চলছে। Kivy দিয়ে কিছু কাজ হলেও মোবাইল অ্যাপের বিশাল বাজারে পাইথনের দখল প্রায় নেই বললেই চলে। এটি পাইথনের একটি বড় সীমাবদ্ধতা। বর্তমানে পাইথনের সবচেয়ে বড় বাজার হচ্ছে ওয়েব প্রোগ্রামিং। তুলনামূলকভাবে অনেক সহজ হওয়ায় শিশুদের প্রোগ্রামিংয়ের সাথে পরিচয় করাতে বেশিরভাগ ক্ষেত্রেই পাইথন ব্যবহার করা হয়। দৈনন্দিন বিভিন্ন বিরক্তিকর কাজ, যেগুলো বারবার করতে হয়, সেগুলো অটোমেট করতে পাইথন ব্যবহার করা হচ্ছে।

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

বর্তমানে পাইথনের ব্যবহার এত ব্যাপক যে, হঠাৎ এর হারিয়ে যাওয়ার বা নতুন কোনো ভাষা দিয়ে প্রতিস্থাপিত হয়ে যাওয়ার কোনো সম্ভাবনা অন্তত নিকট ভবিষ্যতে নেই। তাই যাদের ইচ্ছা আছে, তারা নির্দ্বিধায় পাইথন দিয়ে কাজ করা শুরু করতে পারেন। পাইথনের ভবিষ্যত নিয়ে আপাতত চিন্তা করতে হবে না।

বাংলা ভাষায় পাইথন শেখার জন্য ইন্টারনেটে বেশ কিছু রিসোর্স রয়েছে – 

লেখক – মোশারফ হোসেন।

অ্যালগরিদম কী?

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

মুহাম্মদ ইবন মুসা আল-খাওয়ারিজমি ৭৮০ খ্রিস্টাব্দে বৃহত্তর খোরাসানের খাওয়ারেজম অঞ্চলে জন্মগ্রহণ করেন। তিনি ছিলেন একাধারে প্রখ্যাত গণিতবিদ, জ্যোতির্বিজ্ঞানী ও ভূগোলবিদ। তিনি ভারতীয় দশভিত্তিক সংখ্যাপদ্ধতি নিয়ে একটি বই লিখেন যা ল্যাটিনে অনুবাদ করা হয় ‘Algoritmi de numero Indorum’ নামে। আল-খাওয়ারিজমি নামটি যখন ল্যাটিনে রূপান্তর করা হয়, তখন এটি হয়ে যায় ‘Algoritmi’। মূল বই লেখার প্রায় ৩০০ বছর পর এই অনুবাদটি করা হয়েছিল। এই বইটিই প্রথম দশভিত্তিক সংখ্যা ও এর বৈশিষ্টসমূহ ইউরোপে পরিচিত করে তোলে। এর ফলে জটিল রোমান সংখ্যার পরিবর্তে ইউরোপে এবং ক্রমে সারাবিশ্বে দশভিত্তিক সংখ্যাপদ্ধতি প্রচলিত হয়।

খাওয়ারিজমির নামানুসারে সংখ্যাপদ্ধতিটির নাম রাখা হয় Algorismus, যা ইংরেজিতে হয় Algorism। ১৩ শতকের দিকে Algorism শব্দটি ইংরেজি ভাষায় প্রবেশ করে। তৎকালিন উল্লেখযোগ্য অনেকেই, যেমন: জেফ্রি চসার (Geoffrey Chaucer) শব্দটি ব্যবহার করেছেন। গ্রিক শব্দ এরিথমস (ἀριθμός) অর্থ সংখ্যা। ১৫ শতকে এই শব্দের প্রভাবে ল্যাটিন Algorismus হয়ে যায় Algorithmus। ইংরেজি শব্দটিও তখন পরিবর্তিত হয়ে হয় Algorithm।

১৯ শতকের শেষভাগ পর্যন্ত Algorithm শব্দের অর্থ ছিল দশমিক সংখ্যা পদ্ধতি। ল্যাটিন Algorithmus অর্থও তাই ছিল। ২০ শতকের শুরুর দিকে এর অর্থ বদলে বর্তমান প্রচলিত অর্থটি আসে। এ সময় অ্যালান টুরিং আবিষ্কার করেন যে যন্ত্র অ্যালগরিদম অনুসরণ করে জটিল সমস্যা সমাধান করতে পারে। এটিই ছিল কম্পিউটার যুগের সূচনা। দ্বিতীয় বিশ্বযুদ্ধের সময় তিনি একটি যন্ত্র আবিষ্কার করেন যা অ্যালগরিদম অনুসরণ করে জার্মানদের এনক্রিপ্ট করা কোড (এনিগমা (Enigma) কোড) ক্র্যাক করতে পারত।

যদিও অ্যালগরিদম শব্দটির উৎপত্তি মোটামুটি ৯০০ বছর আগে, বাস্তবে অ্যালগরিদম কিন্তু আরো অনেক পুরোনো। উল্লেখযোগ্য ও বহুল ব্যবহৃত প্রাচীন অ্যালগরিদমের একটি হলো ইউক্লিডের গসাগু নির্ণয়ের অ্যালগরিদম। এই অ্যালগরিদমটি তাঁর এলিমেন্টস গ্রন্থে লিপিবদ্ধ আছে। বইটির রচনাকাল ৩০০ খ্রিস্টপূর্বাব্দ। ইউক্লিডের এই অ্যালগরিদমের বিভিন্ন তাত্ত্বিক ও ব্যবহারিক প্রয়োগ রয়েছে।

আধুনিক বিজ্ঞান ও প্রযুক্তির কল্যাণে আমরা প্রায় ২৪ ঘণ্টাই যন্ত্রপাতিতে ঘেরা। আর যন্ত্রপাতির উল্লেখযোগ্য একটা অংশ বুদ্ধিমান, যেমন: আমাদের ফোন, কম্পিউটার, স্মার্টওয়াচ ইত্যাদি। সাথে অতি প্রয়োজনীয় ইন্টারনেট তো আছেই। এগুলোর সবই চলে অ্যালগরিদম দিয়ে। আমাদের নিত্যব্যবহৃত সামাজিক যোগাযোগ মাধ্যম ফেসবুক, টুইটার, ইউটিউবে রয়েছে অনেক জটিল জটিল অ্যালগরিদম। এই অ্যালগরিদমগুলো এতই বুদ্ধিমান যে আমরা কখন কী দেখতে চাই, কী দেখতে চাই না তা অনুমান করতে পারে।

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

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

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

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

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

লেখকঃ মোশারফ হোসেন।

কম্পিউটার বিজ্ঞান ও প্রোগ্রামিং নিয়ে প্রচলিত কিছু ভুল ধারণা

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

এই আর্টিকেলে আমি প্রোগ্রামিং ও কম্পিউটার বিজ্ঞান সংশ্লিষ্ট কিছু ভুল ধারণা উপস্থাপন ও ব্যাখ্যা করব।

ভুল ধারণা ১: প্রোগ্রামিং শিখতে চাইলে গণিতে খুব দক্ষ হতে হবে

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

ভুল ধারণা ২: বিজ্ঞান বা প্রকৌশল বিষয়ে না পড়লে প্রোগ্রামিং শেখা যায় না

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

ভুল ধারণা ৩: প্রোগ্রামিং ভাষা জানলেই মোটা অঙ্কের টাকা কামানো যায়

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

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

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

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

ভুল ধারণা ৪: কম্পিউটার বিজ্ঞান একটি জটিল বিষয়

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

ভুল ধারণা ৫: প্রোগ্রামিং শুধু ছেলেদের জন্য

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

ভুল ধারণা ৬: কম্পিউটার বিজ্ঞান পড়লেই গেম তৈরি করতে পারব

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

এক নজরে ধারণাগুলো:

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

ড. মাহমুদ শাহরিয়ার হোসেন (সহকারী অধ্যাপক, ইউনিভার্সিটি অব টেক্সাস এট এল পেসো)-এর মূল লেখাটি পাওয়া যাবে এখানে https://bit.ly/2ENReAp। লেখাটি অনুবাদ করেছেন মোশারফ হোসেন।

সি শেখার গাইডলাইন!

বাংলা ভাষায় সি প্রোগ্রামিং ভাষা দিয়ে প্রোগ্রামিং শেখার গাইডলাইন

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

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

তারপর সি শেখা শুরু করতে হবে। প্রোগ্রামিংয়ে যারা একেবারেই নতুন, তাদের জন্য আমি “কম্পিউটার প্রোগ্রামিং ১ম খণ্ড” নামে একটি বই লিখেছি। এখানে জটিল-কঠিন-ভয়াবহ জিনিসগুলো বাদ দিয়ে বরং মৌলিক জিনিসগুলোর ওপর জোর দেওয়া হয়েছে। আশা করি, বইটি কেউ যদি দুইবার করে পড়ে ফেলে, তাহলে তার বেসিক শক্ত হয়ে যাবে। বইটি রকমারি ডট কম থেকে অর্ডার করা যাবে, এছাড়া আর কোথা থেকে পাওয়া যাব সেটি জানা যাবে দ্বিমিক প্রকাশনীর ওয়েবসাইটে। আবার বইটি ইন্টারনেটে ফ্রিও পড়া যাবে, cpbook.subeen.com ওয়েবসাইট থেকে।

কম্পিউটার প্রোগ্রামিং ১ম খণ্ড – চতুর্থ সংস্করণ

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

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

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

এখন, প্রোগ্রামিং শেখার পাশাপাশি, প্রবলেম সলভিংও করতে হবে। শুরুতে সহজ প্রবলেম সলভ করাই ভালো। এজন্য তৈরি করা আছে দ্বিমিক অনলাইন জাজ। এই ভিডিওগুলো দেখলে সেখানে শুরু করা সহজ হবে। প্রবলেমগুলো নিজে নিজে সমাধান করতে পারলেই সবচেয়ে ভালো, আর তা না পারলে “৫২টি প্রোগ্রামিং সমস্যা ও সমাধান” বইটি পড়া যেতে পারে।

প্রবলেম সলভিং করতে করতে গিয়ে মনে হবে, একটু ডেটা স্ট্রাকচার ও অ্যালগরিদম জানলে ভালো হতো। সি দিয়ে ডেটা স্ট্রাকচার ও অ্যালগরিদমের সঙ্গে পরিচিত হওয়ার জন্য আমার লেখা “কম্পিউটার প্রোগ্রামিং ৩য় খণ্ড – ডেটা স্ট্রাকচার ও অ্যালগরিদম পরিচিতি” বইটি পড়তে পারো। বই পড়ার পাশাপাশি ইউটিউবে আমার ভিডিও লেকচারগুলোও কাজে আসবে বলে আমি মনে করি।

ওপরের কাজগুলো ঠিকঠাকভাবে করলে আমি মনে করি সি প্রোগ্রামিং ভাষা দিয়ে প্রোগ্রামিং শেখা – এই পথে তুমি বহুদূর এগিয়ে যাবে। তারপরও কেউ আরেকটি বই পড়তে চাইলে আমি বলব The C Programming Language বইটি পড়ার জন্য।

লিঙ্ক –

একটি লিস্টে দ্বিতীয় লিস্টের সকল উপাদানের উপস্থিতি – প্রোগ্রামিং ইন্টারভিউ সমস্যা ১৫

সহজ প্রোগ্রামিং ইন্টারভিউ সমস্যা।

সমস্যা – একটি ফাংশন লিখতে হবে, যেখানে দুটি লিস্ট ইনপুট দেওয়া হবে। প্রথম লিস্টে যদি দ্বিতীয় লিস্টের সকল উপাদান থাকে তাহলে True রিটার্ন করতে হবে, আর নইলে False রিটার্ন করতে হবে।

সমাধান – সমাধান খুবই সহজ। দ্বিতীয় লিস্টের প্রতিটি উপাদান প্রথম লিস্টে আছে কী না, সেটি পরীক্ষা করতে হবে। যদি না থাকে, তাহলে False রিটার্ন করতে হবে, আর যদি সব উপাদানই প্রথম লিস্টে পাওয়া যায়, তাহলে True রিটার্ন করতে হবে।

def is_sublist(listA, listB):
    for item in listB:
        if item not in listA:
            return False
    return True

এখন প্রশ্ন হচ্ছে, ওপরের কোডের কমপ্লেক্সিটি কত? অতিরিক্ত কোনো মেমোরি ব্যবহার করা হচ্ছে না, তাই স্পেস কমপ্লেক্সিটি হচ্ছে O(1)। আর টাইম কমপ্লেক্সিটি হচ্ছে O(n * m), যেখানে n হচ্ছে listA-এর উপাদান সংখ্যা আর m হচ্ছে listB-এর উপাদান সংখ্যা। অনেকেই এখানে ভুল করে টাইম কমপ্লেক্সিটি বলবে O(n), কিন্তু item not in listA – এখানে কিন্তু লিস্টের সকল উপাদান পরীক্ষা করতে হতে পারে, তাই শুধু এই কাজটির টাইম কমপ্লেক্সিটি হচ্ছে O(m)।

পরবর্তী প্রশ্ন হচ্ছে, ওপরের কোডটি কীভাবে আরো ইফিশিয়েন্ট করা যায়? এজন্য সেট (set) ব্যবহার করা যেতে পারে। প্রথমে listA-কে সেটে রূপান্তর করতে হবে। তারপরে কোড আগের মতোই। আমি আর এখানে কোড লিখে দেখালাম না, এটি নিজে লিখতে হবে।

লিস্টে যদি n সংখ্যক উপাদান থাকে, তাহলে এটিকে সেটে রূপান্তর করার কমপ্লেক্সিটি হচ্ছে O(n)। আর তারপরে যেই হোড হবে, সেটি ঠিকঠাকমতো লিখলে তার কমপ্লেক্সিটি হবে O(m)। কারণ একটি উপাদান সেটে আছে কী না, সেটি পরীক্ষা করার জন্য O(1) সময় লাগে। তাহলে প্রোগ্রামটির টাইম কমপ্লেক্সিটি হবে O(n) + O(m)। তবে সেট ব্যবহার করায় কিন্তু এই প্রোগ্রামের স্পেস কমপ্লেক্সিটি বেড়ে যাচ্ছে, স্পেস কমপ্লেক্সিটি কত সেটি পাঠকের জন্য কুইজ (কমেন্টে উত্তর দেওয়া যাবে)।

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