প্রোগ্রামিং আপনার জন্য নয়

যে ১০টি লক্ষণ থাকলে বুঝতে হবে প্রোগ্রামিং আপনার জন্য নয়

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

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

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

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

নিচের তালিকাটি আপনাকে খুঁজে বের করতে সাহায্য করবে যে আপনি প্রোগ্রামিং করার উপযোগী কি না, এবং এই অবস্থা বদলাতে চাইলে আপনাকে কী করতে হবে।

১) কৌতূহলের অভাব

আপনার যদি কম্পিউটার এবং টেকনোলজির প্রতি আগ্রহ না থাকে, আপনি কখনোই প্রোগ্রামার হিসেবে সফল হতে পারবেন না।

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

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

২) আত্ম-নিয়ন্ত্রণ ও দ্রুত সমাধান খুঁজে বের করার ক্ষমতা না থাকা

আপনি যদি নিজে নিজে প্রবলেম সলভ করার দক্ষতা তৈরি না করেন তো আপনি কখনো প্রোগ্রামার হিসেবে সফল হতে পারবেন না।

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

ইন্টারনেটে দরকারী সব তথ্য পাওয়া যায়। এই বিশাল তথ্যভাণ্ডারে প্রবেশের একটি বিশাল দরজা রয়েছে: গুগল (google.com)। আপনি যা চান তাই গুগলের সাহায্যে পেতে পারেন। এর জন্য শুধু জানতে হবে গুগল কীভাবে ব্যবহার করতে হয়।

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

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

৩) অধ্যবসায়ের অভাব

সমস্যায় পড়লে আপনি যদি সহজেই হাল ছেড়ে দেন, তাহলে প্রোগ্রামার হিসেবে আপনি কখনোই সফল হতে পারবেন না।

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

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

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

আপনার জানা প্রয়োজন যে, সমস্যাগুলো আসলে সমস্যা নয়, চ্যালেঞ্জ। প্রত্যেকটি চ্যালেঞ্জের মোকাবিলা আপনাকে গভীর জ্ঞান দেয়, সেই সাথে নতুন চ্যালেঞ্জ মোকাবিলা করার দক্ষতাও বৃদ্ধি করে।

৪) সমস্যা সমাধানের পর সফলতার অনুভূতি না থাকা

কোনো সমস্যা সমাধানের পর যদি আপনার মাঝে উত্তেজনা ও সফলতার কোনো অনুভূতি না জন্মায় তো আপনি কখনো প্রোগ্রামার হিসেবে সফল হতে পারবেন না।

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

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

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

৫) শেখা ও বোঝার ক্ষেত্রে ধৈর্য না থাকা

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

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

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

৬) চিন্তা করতে গিয়ে ক্লান্ত/বিরক্ত হয়ে যাওয়া

আপনি যদি চিন্তা করায় অলস হন এবং মনোযোগ দিয়ে চিন্তা করাকে বিরক্তিকর জিনিস মনে করেন তো আপনি কখনো সফল প্রোগ্রামার হতে পারবেন না।

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

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

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

আপনার মস্তিষ্ক একটি পেশির মতো— যতই ব্যবহার করবেন, ততই এটি চিন্তা করতে পারবে। যতই বিভিন্ন বিষয় জানবেন, ততই মানসিক ধারণা বাড়বে, সমাধান খোঁজা তত সহজ হবে।

৭) নিজের জন্য চিন্তা করতে না পারা

আপনি যদি চান যে অন্যরা আপনার জন্য ভাবুক, এবং যদি নিজের অবস্থা ভালো করে দেখতে অনিচ্ছুক হন, আপনি কখনো সফল প্রোগ্রামার হবেন না।

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

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

নিজের অভিজ্ঞতা ও যৌক্তিক চিন্তন দক্ষতার দ্বারা নিজস্ব দৃষ্টিভঙ্গি তৈরি করুন। যুক্তিসংগত অনুমান করুন, একটি অবস্থান নিন এবং নতুন তথ্য এলে তা গ্রহণ করতে প্রস্তুত থাকুন।

৮) অনড়, সংকীর্ণ এবং/বা অগোছালো চিন্তা

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

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

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

অন্য সম্ভাবনা দেখতে না পাওয়া বা সমালোচনা ঠিকভাবে গ্রহণ না করা উন্নতির অন্তরায়। অগোছালো হলে আপনার কাজ ধীরগতির হবে। কাজের সার্বিক মানও খারাপ হবে।

আপনাকে পেছনে ফিরে যেতে হবে। কীভাবে এগোচ্ছেন তা দেখতে হবে। কীভাবে আরো ভালো করতে পারেন? এমন কিছু কি করতে পারেন যাতে আপনার জীবন সহজ হয়? কিছু কি বাদ যাচ্ছে যা আপনাকে সাহায্য করতে পারতো?

৯) ভালো ও খারাপ উত্তরের পরিধি না জেনে ‘সঠিক’ উত্তর খোঁজা

আপনি যদি প্রোগ্রামিংকে সমাধানের ক্ষেত্র হিসেবে না বিবেচনা করে শুধু ‘সঠিক’ উত্তর খোঁজার লক্ষে ব্যবহার করেন, আপনি কখনো প্রোগ্রামার হিসেবে সফল হতে পারবেন না।

কোনো দক্ষতা বা প্রোগ্রামিং শেখার সময় অনেকে জানতে চায় যে তারা যা করেছে তা সঠিক কি না। উত্তর হচ্ছে, ”এটা নির্ভর করে”।

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

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

১০) খুঁটিনাটিতে মনোযোগ না দেওয়া

আপনি যদি ক্ষুদ্র ক্ষুদ্র বিষয়গুলোতে মনোযোগ না দেন তো সফল প্রোগ্রামার হতে পারবেন না।

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

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

খুঁটিনাটি সবই লক্ষ রাখতে হবে, আপনাকে সেটা মানতে হবে। যখন মানবেন, তখন আপনি আপনার কোড স্ক্যান করে সব ত্রুটি দূর করতে পারবেন। এমন টুল ব্যবহার করতে পারবেন যা দ্রুত ইস্যু বের করতে আপনাকে সাহায্য করবে।

বোনাস: ব্যবসায়ী-মনস্ক হওয়া

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

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

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

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

উপসংহার

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

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

অনুবাদ – মোশারফ হোসেন।

[Jonathan Bluks রচিত মূল লেখাটি পাওয়া যাবে এখানেhttps://bit.ly/2DdU6VF]

স্ট্যাক দিয়ে কিউ তৈরি – প্রোগ্রামিং ইন্টারভিউ সমস্যা ৩

সমস্যাঃ স্ট্যাক (Stack) ব্যবহার করে কিউ (Queue) তৈরি করতে হবে, অর্থাৎ কিউ এর এনকিউ (enqueue) ও ডিকিউ (dequeue) ফাংশন তৈরি করতে হবে।

সমাধানঃ প্রথমে একটু চিন্তা করলেই আমরা বুঝতে পারবো যে একটি স্ট্যাক দিয়ে আসলে একটি কিউ তৈরি করা সম্ভব নয়। যদি সম্ভব হতো, তাহলে এই দুটি আলাদা ডেটা স্ট্রাকচার হতো না। কিন্তু যেহেতু সমস্যা দেওয়া হয়েছে, সমাধান নিশ্চয়ই আছে। সমাধান হচ্ছে, দুটি স্ট্যাক ব্যবহার করা।

নোটঃ স্ট্যাক ও কিউ নিয়ে আমি বিস্তারিত আলোচনা করেছি, কম্পিউটার প্রোগ্রামিং ৩য় খণ্ড – ডেটা স্ট্রাকচার ও অ্যালগরিদম পরিচিতি এবং পাইথন দিয়ে প্রোগ্রামিং শেখা ৩য় খণ্ড – ডেটা স্ট্রাকচার ও অ্যালগরিদম পরিচিতি বইতে। এছাড়া ইউটিউবেও এ বিষয়ে আলোচনা  করেছি ডেটা স্ট্রাকচার ও অ্যালগরিদম প্লেলিস্টে

ধরা যাক, কিউতে প্রথমে আমি পাঁচটি সংখ্যা রাখতে চাই, অর্থাৎ enqueue অপারেশন হবে পাঁচবার এবং সংখ্যাগুলো হচ্ছে – 1, 2, 3, 4, 5. আমি এগুলো প্রথম স্ট্যাকে পুশ (push) করব।

এখন আমি চাই, কিউ থেকে প্রথম তিনটি সংখ্যা সরিয়ে ফেলতে, অর্থাৎ তিনবার dequeue অপারেশন হবে। তাহলে কিউ থেকে যথাক্রমে 1, 2, 3 – এই তিনটি সংখ্যা চলে যাবে। কিন্তু স্ট্যাক থেকে তো কেবল ওপরের সংখ্যাটি সরানো যায়। তাহলে, আমি প্রথম স্ট্যাকের সবগুলো সংখ্যা দ্বিতীয় স্ট্যাকে নিয়ে আসব। তখন স্ট্যাকগুলোর অবস্থা হবে নিচের ছবির মতো –

এখন আমি দ্বিতীয় স্ট্যাকে তিনবার পপ (pop) অপারেশন চালালে 1, 2, 3 স্ট্যাক থেকে চলে যাবে। তখন স্ট্যাকদুটির অবস্থা হবে নিচের ছবির মতো –

এখন আমি কিউতে 6 ও 7 ক্রমানুসারে রাখতে চাই। আমি সেগুলো প্রথম স্ট্যাকে পুশ করবো।

এখন কিউ-এর অবস্থা হচ্ছে এমন: 4, 5, 6, 7. আমি যদি কিউ থেকে তিনটি সংখ্যা সরিয়ে নিই (অর্থাৎ তিনবার ডিকিউ করি), সেগুলো হবে, যথাক্রমে 4, 5, 6। ডিকিউ করার জন্য আমি প্রথমে দেখবো যে দ্বিতীয় স্ট্যাকে কিছু আছে কী না। যদি থাকে, সেই স্ট্যাক থেকে পপ করবো। আর যদি stack2 খালি থাকে, তাহলে Stack1-এর সব কিছু Stack2-তে নিয়ে আসবো (তখন দ্বিতীয় স্ট্যাকে সেগুলো প্রথম স্ট্যাকের বিপরীত ক্রমে থাকবে)। তারপরে দ্বিতীয় স্ট্যাক থেকে পপ করবো।

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

pow(a, n) – প্রোগ্রামিং ইন্টারভিউ সমস্যা ১

সমস্যাঃ একটি ফাংশন তৈরি করতে হবে, যেখানে দুটি ইন্টিজার (a, n) ইনপুট দেওয়া থাকলে ফাংশনটি a^n রিটার্ন করবে। ফাংশনটির রানটাইম হতে হবে O(log n)।

সমাধানঃ আমাদেরকে যেটি করতে হবে, সেটি হচ্ছে pow() ফাংশনটি ইমপ্লিমেন্ট করতে হবে। কিন্তু এতে ঘাবড়াবার কিছু নেই। আমরা পাইথনে খুব সহজে এটি ইমপ্লিমেন্ট করতে পারি।

def pow(a, n):
   result = 1.0
   for _ in range(n):
      result = result * a
   return result

ওপরে যেই ফাংশনটি লিখলাম, সেটির কমপ্লেক্সিটি কত? টাইম কমপ্লেক্সিটি হচ্ছে O(n)। কিন্তু আমাদেরকে বলা হয়েছে O(log n) কমপ্লেক্সিটিতে ইমপ্লিমেন্ট করতে। যদি এটি বলা না থাকতো, তাহলে কিন্তু ওপরের কোড লিখে দিলেই হতো।
আমরা ডিভাইড এন্ড কনকোয়ার পদ্ধতিতে সমস্যাটির সমাধান করতে পারি। সেজন্য আমাদেরকে একটি বিষয় উপলব্ধি করতে হবে। a^n-কে আমরা লিখতে পারি, (a^n/2) * (a^n/2). যেমন, 5^4 হচ্ছে 625. কিন্তু আমরা 5^4-কে লিখতে পারি, (5^2) * (5^2)। এভাবে লিখে লাভ কী হলো? লাভ হচ্ছে, 5^2 এর মান আমাদের দুবার বের করতে হবে না, একবার বের করলেই হবে। কিংবা ধরা যাক, আমাদেরকে 2^32-এর মান বের করতে বলা হলো।

2^32 = (2^16) * (2^16)
2^16 = (2^8) * (2^8)
2^8 = (2^4) * (2^4)
2^4 = (2^2) * (2^2)
2^2 = (2^1) * (2^1)

এখন আমরা জানি, a^0 হচ্ছে 1 আর a^1 হচ্ছে a. তাই রিকার্শন ব্যবহার করে সমস্যাটির সমাধান বের করতে কিন্তু আমাদের তেমন বেগ পেতে হবে না। আর n যদি জোড় সংখ্যা না হয়ে বিজোড় সংখ্যা হতো, তখন আমাদের কী করতে হবে? তখন a^n-কে আমরা লিখতে পারি a^(n-1) * a. n যেহেতু বিজোড় সংখ্যা, n-1 অবশ্যই জোড় সংখ্যা। তাই আমরা আবার আগের মতো আগাতে পারি।

এখন আমি প্রোগ্রাম লিখে ফেলি –

def pow(a, n):
   if n == 0: return 1
   if n == 1: return a 

   if n % 2 == 1:
      return a * pow(a, n-1) 
   else:
      p = pow(a, n/2)
      return p * p

ওপরের pow() ফাংশনটির কমপ্লেক্সিটি হচ্ছে O(log n)। কেন সেটি আর এখানে বিস্তারিত ব্যাখ্যা করলাম না, তবে যারা বাইনারি সার্চের কমপ্লেক্সিটি বোঝে, তাদের এটি বুঝতে কোনো সমস্যা হবে না।

সমস্যাটির সমাধান কিন্তু পুরোপুরি হয় নি। কারণ n যদি ঋণাত্মক হয় তখন কিন্তু প্রোগ্রামটি কাজ করবে না। এটি ঠিকঠাক করার জন্য আমাদেরকে কী করতে হবে?

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

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

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

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

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

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

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

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

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

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

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

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

প্রথমেই প্রোগ্রামিং শেখাতে যাবেন না। গ্রাম/জেলা শহরের প্রায় অধিকাংশ মানুষের ধারনা কম্পিউটার বিনোদন এর কাজে ব্যবহার করা হয়, তাদের কাছে কম্পিউটার এর বিনোদনটাই আনন্দদায়ক। ঠিকাছে, আপনি ১০০ জন শিক্ষাথীকে এক জায়গায় করেন, যদি না পারেন তাহলে ৫০ জন, যারা ষষ্ঠ থেকে নবম শ্রেণীর শিক্ষার্থী। দশম শ্রেণীর শিক্ষাথীদেরকে নিতে হবে না, কারণ তাদের কিছুদিন পরই 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/ ) সেখানে শিক্ষার্থীরা তাদের সমস্যা বা প্রশ্ন পোস্ট করবে। আর যদি ফেসবুক না থাকে (না থাকাই আসলে ভালো) তাহলে আপনার মোবাইল নাম্বার দিয়ে দিন, আপনাকে ফোন করবে, আপনি ফোনে বুঝায়ে দিবেন, আর গুগল তো আছেই। এখন গ্রামেও খুব ভালো ইন্টারনেট। আর আপনি প্রচুর উৎসাহ দিবেন। ছোটরা আনন্দের সাথে শিখতে ভালোবাসে, তাদেরকে যেটুকুই শেখান না কেন, আনান্দের সাথে শেখান।

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

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

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

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

 

ফ্লো চার্ট (Flow Chart)

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

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

ফ্লো চার্টের দুইটি প্রকারভেদ আছেঃ

  • ডাটা ফ্লো চার্ট ।
  • প্রসেস ফ্লো চার্ট।

প্রোগ্রামাররা ডাটা ফ্লো চার্ট ব্যবহার করে থাকে। কোন জায়গা থেকে ডাটা আসছে, ডাটা কিভাবে পরিবর্ধন হচ্ছে এবং কোথায় জমা হচ্ছে এসব চিহ্নিত করার জন্য প্রোগ্রামাররা ডাটা ফ্লো চার্ট ব্যবহার করে।

প্রসেস ফ্লো চার্ট কোন প্রসেস বা কাজকে ডকুমেন্ট আকারে দেখানোর জন্য, একটি কাজের কার্যকারিতা বা efficiency বুঝানোর জন্য, কোন প্রশিক্ষণ বা ট্রেনিং এর জন্য ব্যবহার করা হয়।

ফ্লো চার্ট ছোটখাট প্রসেস বা প্রোগ্রামের জন্য ব্যবহার করা হয়ে থাকে। ফ্লো চার্টে সাধারণত দুই ধরণের বাক্স ব্যবহার করা হয়ঃ

  • প্রসেসিং স্টেপঃ এই ধাপকে এ্যাকটিভিটি বা কার্যক্রম ধাপও বলা হয়ে থাকে। একে আয়তাকার বাক্স দ্বারা প্রকাশ করা হয়।
  • ডিসিশন স্টেপ বা সিদ্ধান্ত ধাপঃ এই ধাপকে ডায়মন্ড বা হীরক আকৃতি দ্বারা প্রকাশ করা হয়।

নিচের ছবিতে আমি একটি ফ্লো চার্টের বিভিন্ন আকৃতির পরিচয় দিয়েছিঃ

table

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

sampfc

এই ফ্লো চার্টটিতে প্রথমেই আমরা ফ্লো চার্টের নিয়মানুযায়ী start দিয়ে শুরু করেছি , ওভাল বাক্স দিয়ে সেটিকে চিহ্নিত করেছি। তারপর আমরা ওয়েদার চ্যানেল দেখার কাজটি করেছি। এখানে আমরা প্রসেসিং এর জন্য আয়তাকার চিহ্ন ব্যবহার করেছি, কারণ এখান থেকেই আমরা আমাদের সিদ্ধান্ত বা ডিসিশন নেয়ার ধাপের দিকে যাবো। পরের ধাপে আছে ডিসিশন বা সিদ্ধান্ত ধাপ। সেখানে লেখা আছে “Rain Predicted?”, এখানে লক্ষ্য করে দেখো, ডিসিশন বা সিদ্ধান্ত ধাপে আমাদের অ্যারো বা তীর চিহ্ন আছে দুইটি; যা yes/no দিয়ে চিহ্নিত করা। যদি yes হয় তাহলে আমরা বলছি “Stay Home” এবং সেখান থেকে আরেকটি অ্যারো দিয়ে ফ্লো চার্টটি Stop করে দিচ্ছি। আবার যদি “Rain Predicted”-এ ডিসিশন হয় no, তাহলে আমরা “Play Golf” এর কাজ প্রসেসিং করে Stop ধাপে চলে যাচ্ছি। এখানে মনে রাখার বিষয় যে, ফ্লো চার্চের ডিসিশন সবসময় হয় ডান-বাম অথবা নিচের দিকে যাবে। কখনো উপরের দিকে যাবে না। কারণ, কোন কিছুর Flow সবসময় উপর থেকে নিচের দিকে আসে।

একটি সহজ প্রোগ্রামিং সমস্যার মাধ্যমে আমরা একটি ফ্লো চার্ট তৈরি করার চেষ্টা করি । ধরা যাক, আমরা দুইটি সংখ্যা যোগ করার জন্য একটি প্রোগ্রাম লিখবো। প্রোগ্রামটি হবে এমনঃ

#include<stdio.h>
int main()
{
    int a,b,total;
    scanf("%d %d", &a, &b);
    total = a + b;
    printf("%d\n",total);
    return 0;
}

প্রোগ্রামটির জন্য আমরা যদি ফ্লো চার্ট লিখি তাহলে হবে এমনঃ

enflowchartm_clip_image004

অন্যান্য ফ্লো চার্টের মতই এটা start দিয়ে শুরু হয়েছে। যেহেতু দুইটি নাম্বার ইনপুট নেয়ার দরকার আছে আমাদের, তাই আমরা এখানে Input A, Input B নিয়েছি এবং সেটিকে সামান্তরিক চিহ্নের মাধ্যমে দেখিয়েছি। তবে, আলাদা আলাদা ভাবে এভাবে ইনপুট না নিয়েও পাশাপাশি Input A,B অথবা Read A,B এভাবেও ফ্লো চার্টে ইনপুট নেয়ার কাজটি দেখানো যায়। তারপর আমরা a,b দুইটি যোগ করে একটি Total ভ্যারিয়েবলে রেখেছি এবং এর পরের ধাপে Total প্রিন্ট করেছি। সবশেষে আমরা stop দিয়ে ফ্লো চার্টটি শেষ করেছি।

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

#include<stdio.h>
int main()
{
    int i=0;
    while(i<=100)
    {
        if(i%2 != 0)
        {
            printf("%d\n",i);
        }
        i++;
    }
    return 0;
}

এই প্রোগ্রামটিতে আমরা while লুপের সাহায্যে 100 পর্যন্ত লুপটি চালিয়েছি এবং লুপের ভিতরে বিজোড় সংখ্যা বের করার কন্ডিশন দিয়েছি। বিজোড় সংখ্যা বা odd numbers বের করার জন্য if কন্ডিশনটিতে i এর যেসকল মানকে 2 দ্বারা ভাগ করলে ভাগশেষ শূন্য হবে না সেই সংখ্যাগুলোকে আমরা প্রিন্ট করেছি। এই প্রোগ্রামটির ফ্লো চার্টে আমাদের ডিসিশন স্টেপ আসবে দুইটিঃ একটি while এর জন্য এবং একটি if এর জন্য। ফ্লো চার্টটি নিম্নরূপঃ
odd-numsএখানে প্রথমেই আমরা i এর মান 0 এ্যাসাইন করে দিয়েছি, যেহেতু পরবর্তীতে আমরা i এর মান এক করে ইনক্রিমেন্ট করবো। তারপর আমরা while (i<=100) reached ডিসিশন ধাপে গিয়েছি। খেয়াল করে দেখো, এই ডিসিশন থেকে yes/no দিয়ে দুইটি তীর চিহ্ন বের হয়েছে। আমাদের প্রোগ্রামের লজিক আমাদের বলছে যতক্ষণ না i এর মান ১০০ এর সমান বা এর থেকে ছোট থাকছে , ততক্ষণ আমাদের if(i%2 !=0) কন্ডিশন তার কাজ করে যাচ্ছে এবং odd নাম্বার বা বিজোড় সংখ্যাগুলো প্রিন্ট করে যাচ্ছে। একই সাথে লুপটি সামনে এগিয়ে যাচ্ছে, i এর মান compute i= i+1 এ যেয়ে এক এক করে বৃদ্ধি পাচ্ছে। যখন i এর মান 100 এর বড় হয়ে যাবে, তখন ফ্লো চার্ট stop হয়ে যাবে।

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

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

ফ্লোচার্ট নিয়ে ভিডিও লেকচার :

সফটওয়্যার ইঞ্জিনিয়ারিং ইন্টারভিউ

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

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

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

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

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

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

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

সবশেষে বলি, গ্র্যাব (grab.com)-এ আমার বস অরুল (তিনি আগে ১৬ বছর মাইক্রোসফটে ও ৩ বছর অ্যামাজনে কাজ করেছেন) আমাকে ইন্টারভিউ নেওয়ার ক্ষেত্রে একটি সহজ টিপস্ দিয়েছেন। ইন্টারভিউ শেষে নিজেকে প্রশ্ন করতে হবে, “আমার বর্তমান টিমের বেস্ট প্রোগ্রামারকে অন্য টিমের জন্য ছেড়ে দিয়ে এই ছেলেকে (বা মেয়েকে) আমার টিমে নিতে কি আমি রাজি?”

আলফাগো বনাম লি সেডল – কৃত্রিম বুদ্ধিমত্তা এবং মানুষ

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

গো অথবা ষোলগুটি বা বাঘবন্দিঃ

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

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

আলফাগো বনাম লি সেডলঃ

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

চতুর্থ ম্যাচ, যেটিতে লি জয়লাভ করে মানবজাতির মানসম্মান রক্ষা করে, সেখানেও ৭৮ নাম্বার চাল পর্যন্ত আলফাগো-এর জিতে যাওয়ার সম্ভবনা ছিল ৭০%। কিন্তু ৭৯ নাম্বার চালে ভুল করে ফেলার কারণে আলফাগো বঞ্চিত হয় লি সেডলকে হোয়াইটওয়াশ করার সুযোগ থেকে।

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

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

শিক্ষার্থীদের জন্য অ্যান্ড্রুর উপদেশ

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

n-ANDREW-NG-628x314

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

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

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

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

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

আমার বক্তব্যের সারকথা যদি বলি: নিজের শিক্ষায় বিনিয়োগ করতে হবে (সেটা সময় বিনিয়োগ হতে পারে কিংবা অর্থ), এমনকী কষ্ট হলেও সেটা করতে হবে। আর সবসময় সুযোগের সন্ধান করতে হবে যে কীভাবে তুমি এমন কাজ করতে পার যা অন্যকে সাহায্য করবে, সমাজকে বদলে দিবে, পৃথিবীকে বদলে দিবে।

অফ-বাই-ওয়ান এরর (Off-by-one error)

“There are two hard things in Computer Science: Cache invalidation, naming things and off-by-one error”  

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

অফ বাই ওয়ান এরর কী

“অফ-বাই-ওয়ান এরর” সাধারণভাবে “অফ-বাই-ওয়ান বাগ” নামেও পরিচিত। সংক্ষেপে একে OBOE (Off By One Error ) বলা হয়ে থাকে। যখন কোন লুপের বাউন্ডারি কন্ডিশনে আমরা ভুল করি তখন এই এরর দেখা দেয়। বেশিরভাগ সময় এই এররটি হয় যখন আমরা “is less than equal” (<=) অপারেটরটি কোন তুলনা বা comparison-এর জন্য ব্যবহার করে থাকি বা যখন একটি সিকোয়েন্স শূন্য থেকে শুরু হওয়ার বদলে এক থেকে শুরু হয়।

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

অ্যারের লুপের অফ-বাই-ওয়ান এরর

ধরা যাক, আমাদের পাঁচটি উপাদানের একটি অ্যারে দেয়া আছে। আমরা যদি অ্যারের উপাদানগুলো প্রিন্ট করতে চাই তাহলে আমাদের একটি লুপ চালাতে হবে যেটি অ্যারের পাঁচটি উপাদান ঠিকঠাক প্রিন্ট করে। যদি আমরা এভাবে কোডটি লিখিঃ

Untitled

এখানে লুপটি 0 থেকে শুরু  করে 0,1,2,3,4,5 এভাবে ছয়টি iteration সম্পন্ন করছে। যেটি অ্যারে সাইজ n-কে অতিক্রম করেছে। অ্যারের ক্ষেত্রে আমরা এটিকে “অ্যারে বাউন্ড এক্সেপশন” বলে থাকি। অফ-বাই-ওয়ান এরর-এর কারণে এমনটি হয়ে থাকে।  এখানে for loop-টি n+1 সংখ্যক বার চলেছে। কিন্তু যদি আমরা লুপটির end condition-এ “<=” এর পরিবর্তে “<” ব্যবহার করি, তখন আমাদের লুপটি 0,1,2,3,4 এভাবে মোট পাঁচটি iteration সম্পন্ন করে n সংখ্যকবার চলবে।

তবে, সি++ এর ক্ষেত্রে “আউট অফ বাউন্ড এক্সেপশন” থ্রো করে না। বিগিনারদের এটি বেশ ঝামেলায় ফেলে। তখন দেখা যায়, অ্যারে সাইজ ছোট নেয়ার পরেও কোন রান টাইম এরর দেখায় না।

ফেন্সপোষ্ট এরর

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

598px-Fencepost_error.svg

প্রশ্নটির উত্তর যদি 10 বলা হয় তাহলে উত্তরটি হবে ভুল। যদি n+1 সংখ্যক পোষ্ট দিয়ে একটি বেড়া তৈরি করা হয় তাহলেই আমরা n সংখ্যক ভাগ পাবো সেই বেড়াটির। উপরের ছবিটি দিয়ে ব্যাপারটি বুঝানো হয়েছে।

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