Thursday, 9 May 2019

প্রোগ্রামিং শেখার সময় জয় করতে হবে ৮ টি প্রতিবন্ধকতা



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

১. বিরাট মহৎ কোন উদ্দেশ্য নির্দিষ্ট করে প্রোগ্রামিং শিখবেন নাঃ

প্রোগ্রামিং শেখার প্রতিবন্ধতাগুলো খোঁজার আগে প্রোগ্রামিং শেখার learning process বা motivation নিয়ে কথা বলা দরকার। আপনি কেন প্রোগ্রামিং শিখবেন? আপনি অবশ্যই এজন্য প্রোগ্রামিং শিখবেন না যে অমুকে বলেছে “programming is cool!” বা প্রোগ্রামিং শিখে বিল গেটস হওয়া যায় অনেক টাকা বেতন পাওয়া যায় ইত্যাদি।
আপনি প্রোগ্রামিং শিখবেন আপনার নিজের কোন একটা প্রবলেম সলভ করার জন্য। আপনার দৈনন্দিন জীবনের কোন কাজকে automate করার জন্য বা improve করার জন্য। আপনি প্রোগ্রামিং শিখতে পারেন স্রেফ আপনার আনন্দের জন্য। চিন্তা করার চেয়ে আনন্দের আর কিছু হতে পারে না। দীর্ঘ সময় একটা প্রবলেমে আটকে থাকার পর চিন্তার একটা পর্যায়ে এটা সলভ হয়ে গেলে যে নির্মল আর অনাবিল আনন্দ পাওয়া যায় সেটা এক্সপেরিয়েন্স করার জন্য। আপনার লক্ষ্য যদি হয় ‘হাগার হাগার ডলার’ কামানো, তাহলে আপনার শেখাটা শুধু এই ডলার কামানোর দিকেই ধাবিত হবে। অর্থের পাশাপাশি জীবনে দরকার কিছুটা প্রশান্তি-সুখ। একটা সময় পর্যন্ত আপনার হাতে টাকা আসলে মনে হতে পারে এটাই আসলে সুখ। অপরপক্ষে আপনি যদি নতুন একটা বিষয় শেখার আনন্দটা নিজের মধ্যে প্রতিষ্ঠা করতে পারেন, প্রোগ্রামিং এর চমৎকার জগতটাকে যদি আপন করে নিতে পারেন জাস্ট একটা খেলার মত করে। তাহলে বিশ্বাস করেন, আপনি শেখার আনন্দ যেমন পাবেন আপনার হাতে টাকাও আসবে। পুরো ব্যাপারটাই মনস্তাত্বিক। আপনি টাকা কামানোর জন্য প্রোগ্রামিং করলে টাকা কামাতে পারবেন, আবার আনন্দের জন্য প্রোগ্রামিং করলেও টাকা কামাতে পারবেন। প্রথম ক্ষেত্রে একটা পর্যায়ে লাইফটা বোরিং মনে হবে, দ্বিতীয় ক্ষেত্রে লাইফটাকে এঞ্জয় করতে পারবেন। এখন আপনার উপর পুরোটাই নির্ভর করে। আপনি কী করতে চানন, কিভাবে করতে চান সেটা আপনাকেই বের করতে হবে। আর দশটা মানুষ যে পথে সফল হয়েছে আপনার পথটা সেরকম নাও হতে পারে। আপনার সফল হবার পথ আপনাকেই বের করে নিতে হবে।
যদি আপনি প্রোগ্রামিংটাকে পছন্দ করেন কিন্তু এটাতে ক্যারিয়ার গড়তে চান না তাহলে অনেক সময়ই এটা আপনাকে পথ হারিয়ে ফেলতে বাধ্য করতে পারে। একটা প্রোজেক্ট করতে গিয়ে কঠিন কোন প্রবলেমে আটকে গেলে আপনার কাছে মনে হতে পারে যে ‘প্রোগ্রামিং আমার জন্য না’ বা ‘প্রোগ্রামার হবার জন্য আমার জন্ম হয় নি’ ইত্যাদি।
যদি আপনার মাথায় কোন একটা প্রোজেক্ট আইডিয়া থাকে বা বেশ কঠিন একটা প্রবলেম সলভ করার ব্যাপারে চিন্তা করেন তাহলে আপনি মনকে এভাবে প্রস্তুত করতে পারেন যে “আমি জানি এটা সলভ করা খুব একটা আনন্দের বিষয় না। কিন্তু যেভাবেই হোক আমি এটাকে সলভ করবোই। এর জন্য আমি আমার নিজেকে যতটা সম্ভব খাটাবো। একটা সময় অবশ্যই বাধাগুলো অতিক্রম করা সম্ভব হবেই!”
জানেনই তো “ধারে না কাটলে, ভারে কাটে…”।

২. আপনি জানেন না কোন টেকনোলজি বা কোন প্রোগ্রামিং ল্যাঙ্গুয়েজ শিখবেনঃ

কমন একটা প্রশ্ন হচ্ছে “ভাইয়া, কোন প্রোগ্রামিং ল্যাঙ্গুয়েজ দিয়ে শুরু করবো? সি নাকি সি++? জাভা নাকি এক নম্বর ল্যাঙ্গুয়েজ? তাহলে জাভাই শুরু করি, কী বলেন?” এই টাইপের প্রশ্নগুলোর একমাত্র কারণ হচ্ছে প্রশ্নকর্তা আসলে নিজেই জানে না সে কেন প্রোগ্রামিং শিখতে চাচ্ছে।
যদি আপনার মাথায় কোন নির্দিষ্ট প্রোজেক্টের আইডিয়া থাকে তাহলে আপনার কী শেখা উচিত সেটা বলাটা সহজ। যেমন আপনার যদি Android App ডেভেলপ করার ইচ্ছা থাকে বা এন্ড্রয়েডের জন্য কোন একটা এপের আইডিয়া আছে সেটা আপনি বানাতে চাচ্ছেন তাহলে আপনি Java শিখতে পারেন। আবার আইফোনের জন্য এপ বানানোর ইচ্ছা হলে Objective C বা Swift শিখতে পারেন। ওয়েবের কোন কাজ করতে চাইলে HTML, CSS, PHP, JavaScript শেখা যেতে পারে। আবার আপনার যদি উদ্দেশ্য হয় এই মুহুর্তেই সফটওয়্যার বা এপ ডেভেলপ না বরং প্রোগ্রামিং এর লজিক ডেভেলপ করা বা ACM problem solve করা। তাহলে সি/সি++ শিখতে পারেন।
এরপরেও যদি আপনি মাইন্ড সেট না করতে পারেন তাহলে কোন অভিজ্ঞ প্রোগ্রামারের সাথে কথা বলেন। তিনি আপনার কাছ থেকে কথা বের করে নিয়ে আপনাকে ভাল পরামর্শ দিতে পারবেন। আসলে আপনি যে কোন একটা প্রোগ্রামিং ল্যাঙ্গুয়েজ ঠিকঠাক মত শিখলেন এটা আপনি পরবর্তীতে যে কোন ল্যাঙ্গুয়েজেই কাজে লাগাতে পারবেন। কিছু syntax শুধু নতুন করে শিখতে হবে। এই যা…


৩. প্রবলেম বুঝতে পারছেন কিন্তু কোড করতে পারছেন নাঃ

এটা আসলে নতুন প্রোগ্রামারদের একটা জাতীয় সমস্যা। এটা নিয়ে বেশি ভয় পাওয়ার কিছু নাই। আমরা সাধারণত থিওরি পড়ি এরপর সেটাকে implement করার জন্য কোড করি। কিন্তু অনেক সময়েই দেখা যায় algorithm-টার স্টেপগুলো বুঝতে পারছি কিন্তু কোড করতে পারছি না। এর কারণ আর কিছু নয়, জাস্ট skill এর অভাব। অর্থাৎ এই এলগোটা করার মত পর্যাপ্ত দক্ষতা তৈরি হয় নাই।
যেমন ধরেন সাঁতারের উপর আপনি পড়াশোনা করলেন। কিছু ঘাটাঘাটি করে আপনি কিন্তু চাইলে বিরাট বড় সাঁতারের কোচের মত লেকচারও দিতে পারবেন। আপনার লেকচার শুনে অনেকে হয়ত প্র্যাক্টিস করে ভাল সাঁতারু হতে পারবে। যদিও আপনি নিজেই সাঁতার জানেন না। আপনার শুধু সাঁতারের স্টেপ, থিওরি ইত্যাদি জানলেই হবে না। আপনাকে পুকুরে নেমে কিছু ঘোলা জলও গলধঃকরণ করতে হবে। :D
আপনি যদি কোড করতে না পেরে নিজেকে গালাগালি করতে থাকেন। বা চিন্তা করেন যে “এসব কোডিং-ফোডিং আমারে দিয়া হবে না”, “এগুলা অনেক কঠিন”, “আমার আসলে ব্রেইন ভাল না”, “আমি ট্যালেন্ট না, বলদা একটা”… ইত্যাদি। তাহলে এর থেকে বাজে জিনিস কিন্তু আর হয় না। আপনার প্রাপ্তির ঝুলি ভারি হওয়ার ক্ষেত্রে আপনি কতটা disciplined আর আপনার প্রচেষ্টার ধারাটা কেমন এই দুইটা জিনিস কিন্তু বেশি দায়ী। কোন একটা প্রোজেক্ট বা প্রবলেম সলভ করার জন্য আপনি নিচের স্টেপগুলো ফলো করতে পারেনঃ
  1. ১. আপনি সত্যিই সলভ করতে চান বা কোন একটা প্রোজেক্ট করতে চান এমন কিছু সিলেক্ট করেন। মানে কারো চাপিয়ে দেয়া কোন কাজ না। যেই কাজটা আপনি ভালবেসে করতে পারবেন সেরকম একটা প্রোজেক্ট চিন্তা করেন।
  2. ২. পুরো প্রোজেক্টের কাজগুলোকে ছোট ছোট task এ ভাগ করেন। যেমন ধরেন একটা সাইট বানাতে চাচ্ছেন তার একটা টাস্ক হতে পারে “লগিন পেজ বানানো”। সাধারণত টাস্কগুলো হতে হয় প্রোজেক্টের সর্বনিম্ন ইউনিক। ২০-২৫ লাইনের কোডের মধ্যে একেকটা টাস্ক শেষ করা ভাল।
  3. ৩. একটা টাস্ক নিয়েই কাজ করেন। এক সাথে একাধিক টাস্কের কথা চিন্তা করলে মাথায় গিট্টু লেগে যাবে। যখন কোন একটা টাস্কের ব্যাপারে মোটামুটি নিশ্চিত হবে যে এটা কাজ করবে, কোনরকম বাঘ-ভাল্লুক (bug) এর মধ্যে নাই। তখনই পরের task টা শুরু করবেন।
  4. ৪. কোন একটা টাস্কের কোড শুরু করার আগে অবশ্যই ঐ টাস্কের থিওরিগুলো জেনে নিবেন। যেমন ধরেন আপনার একটা টাস্ক হচ্ছে কোন ইউজার কোন দেশের কোন শহর থেকে আপনার এপটা ব্যবহার করছে সেটা জানা। তাহলে কোড শুরু করার আগে জেনে নেয়া উচিত GPS কিভাবে কাজ করে? latitude ও longitude কী? এই দুইটা মান থেকে কিভাবে কোন জেলা বা শহরের নাম পাওয়া যায়? এজন্য কোন কোন API পাওয়া যায় বা কোন টেকনোলজিটা ব্যবহার করা হয়? ইত্যাদি।
  5. ৫. সবশেষে আপনি আপনার টাস্কটা শেষ করতে সক্ষম হলেন। যখন আপনি এটা সলভ করছিলেন তখন আরো কিছু প্রতিবন্ধকতা আপনার সামনে হাজির হবে। 

৪. আপনার করা কোডের ভবিষ্যত নিয়ে আপনার কোন মাথা ব্যথা নাইঃ

“কোডের আবার ভবিষ্যত কী? কোড করেছি, কাজ করছে। ব্যস! পরের প্রোজেক্ট বা পরের টাস্ক শুরু করি!” বেশির ভাগ শিক্ষার্থীই এই কাজটা করে। আপনিও যদি এটা করেন তাহলে বেশ কিছু বিষয় শেখার সুযোগ হাতছাড়া হয়ে যাবে।
একেকটা টাস্ক শেষ করার পর আপনি নিজেকে এই প্রশ্নগুলো করতে পারেনঃ
★এই কোডের ক্ষেত্রে কি কোন edge case আছে যার জন্য কোডটা কাজ করবে না? অথবা কোড কাজ করলেও পুরো এপ্লিকেশনটা যখন রান করবে তখন এই কোডের জন্য কোন ঝামেলা হবার কি কোন চান্স আছে?
  • ★আমার কোডটা কি clean enough? বছরখানেক পরে এই কোডের চেহারা দেখলে চিনতে পারবো তো? যে কোন ধরণের modification বা edit করার দরকার হলে করা যাবে তো? এই টাস্কের কোন আপডেটের কারণে এপের অন্য কোন টাস্কের কাজ আটকে যাবে না তো?
  • ★আমার approach-টা কি best approach? নাকি এর থেকেও ভাল কোন উপায়ে এটা করা যায়? অন্য আর কোন্‌ ভাবে এই একই জিনিস করা যায়? সেই সিসটেমের সুবিধা-অসুবিধাগুলো কী কী?
  • ★আমার এই মডিউলটা অন্য আরেকটা মডিউলের সাথে কিভাবে কাজ করছে? একটা আরেকটার উপর কতখানি dependent? একটার কারণে আরেকটার উপর কোন বাজে প্রভাব পড়বে না তো?

৫. আপনি জানেন না কিভাবে একটা task-কে এগিয়ে নিয়ে যাওয়া যায়ঃ

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

১. আপনি থিওরিগুলো ঠিকঠাক মত জানেন নাঃ
  • *Language Syntax জানেন না।
  • *কোন একটা API কিভাবে কাজ করে বা কোন library/method কিভাবে ব্যবহার করতে হয় জানেন না।
  • *programming paradigms (for example: asynchronous programming)
  • how the system works (for example: HTTP requests are a crucial thing to understand in Web development)
  • এসব ক্ষেত্রে আপনার কাজ হচ্ছে থিওরিগুলোকে আবারো ভাল ভাবে স্টাডি করা।
২. আপনার টাস্কগুলো অনেক বড় বড় হয়ে গেছে। এগুলোকে ভেঙ্গে আরো ছোট করতে হবে।
৩. আপনি আসলে টাস্কগুলো বুঝতেই পারেন নাই। হয়ত দ্রুত পড়ে গেছেন বা আপনার কাছে মনে হয়েছে “আরে এটা তো বুঝছিই!” কিন্তু আসলে হয়ত সেই টাস্কটা ঠিক যেভাবে চিন্তা করছেন সেরকম না।

৬. আপনি কোড করেছেন। তা কাজ করার কথা কিন্তু কাজ করছে নাঃ

এটা কম্পিউটার প্রোগ্রামিং এর ক্ষেত্রে প্রাচীনতম সমস্যা। এমন কি অনেক বছর ধরে প্রোগ্রামার হিসেবে যিনি কাজ করছেন তার ক্ষেত্রেও এমনটা ঘটতেই পারে। এজন্য আপনাকে শিখতে হবে debug করা। Debugging নামের একটা সম্পূর্ণ বইই আছে! আপনাকে শেখা উচিত কিভাবে ডিবাগ করতে হয়। এর চেয়ে বেশি শেখা উচিত কিভাবে ডিবাগিং বিষয়টাকে ভালবাসা যায়। ইউনিভার্সিটি বা অনলাইন কোর্সগুলোর খুব কম কোর্সেই ডিবাগ করার ব্যাপারে কিছু বলা থাকে। প্রথম প্রথম এই বিষয়টা খুব painful হতে পারে। কিন্তু এটা কাজ করার জন্য সারা জীবনই লাগবে।
কোন একটা bug ধরার পর fix করলেন। উচিত হবে এই বাগের ব্যাপারে একটা নোট রাখা। আস্তে আস্তে এই নোটের তালিকাটা বাড়তে থাকবে। আপনি একটা প্যাটার্ন ধরতে পারবেন যে কী টাইপের ভুলগুলো আপনি বেশি করেন। সে অনুযায়ী পরে কোড করার সময় সতর্ক হতে পারবেনন।

৭. আপনি জানেন না কিভাবে সাহায্য নিতে হয়ঃ

যখন কোন একটা প্রবলেমে আটকে গেলেন তখন সার্চ করলেন বা কাউকে জিজ্ঞেস করলেন। সে আপনাকে সলিউশনটা দিয়ে দিল। আপনি তা ব্যবহার করে প্রবলেমটা সলভ করে ফেললেন। এরপর আরেকটা প্রবলেম নিয়ে বসলেন। এটা কক্ষনো করবেন না!

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

৮. আপনি যেই থিওরিগুলো জানেন সেগুলো এপ্লাই করতে পারেন নাঃ

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

No comments:

Post a Comment

পোস্ট পড়ার পর অবশ্যই মন্তব্য করবেন। কারণ আপনার একটি মন্তব্য পোস্ট লেখককে ভাল কিছু লিখতে অনুপ্রাণিত করে। তবে এমন মন্তব্য করবেন না, যা লেখকের মনে আঘাত হানতে পারে।