প্রোগ্রামিং এর ট্রেইনার হিসেবে কাজ করার সময় দেখেছি অনেক নতুন প্রোগ্রামারই খুব উদ্যমের সাথে প্রোগ্রামিং শেখা শুরু করে। আর কয়েক দিন পরেই হতাশার কারণে তাদেরকে দেয়ালে কপাল ঠুকতে দেখা যায়। বেশির ভাগ শিক্ষার্থীই প্রায় একই ধরনের সমস্যাগুলোয় পড়ে থাকে। কিন্তু যখন তারা সেগুলোকে ওভারকাম করতে শিখে যায় তখনই তাদের প্রোগ্রামিং শেখাটা হয় আনন্দদায়ক। তারা বেশ দ্রুত শিখে ফেলতে থাকে নতুন নতুন বিষয়গুলো। তারা স্বাধীন ভাবে কোড করে আর কোথাও আটকে গেলে সেখান থেকে দ্রুত নিজেদেরকে বের করে নিয়ে আসতে পারে।
তো প্রোগ্রামিং শেখার সময় এই বাধাগুলো কী কী?
১. বিরাট মহৎ কোন উদ্দেশ্য নির্দিষ্ট করে প্রোগ্রামিং শিখো না
প্রোগ্রামিং শেখার প্রতিবন্ধতাগুলো খোঁজার আগে প্রোগ্রামিং শেখার 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 আর তোমার প্রচেষ্টার ধারাটা কেমন এই দুইটা জিনিস কিন্তু বেশি দায়ী। কোন একটা প্রোজেক্ট বা প্রবলেম সলভ করার জন্য তুমি নিচের স্টেপগুলো ফলো করতে পারোঃ
- তুমি সত্যিই সলভ করতে চাও বা কোন একটা প্রোজেক্ট করতে চাও এমন কিছু সিলেক্ট কর। মানে কারো চাপিয়ে দেয়া কোন কাজ না। যেই কাজটা তুমি ভালবেসে করতে পারবে সেরকম একটা প্রোজেক্ট চিন্তা কর।
- পুরো প্রোজেক্টের কাজগুলোকে ছোট ছোট task এ ভাগ কর। যেমন ধর একটা সাইট বানাতে চাচ্ছ তার একটা টাস্ক হতে পারে “লগিন পেজ বানানো”। সাধারণত টাস্কগুলো হতে হয় প্রোজেক্টের সর্বনিম্ন ইউনিক। ২০-২৫ লাইনের কোডের মধ্যে একেকটা টাস্ক শেষ করা ভাল।
- একটা টাস্ক নিয়েই কাজ করো। এক সাথে একাধিক টাস্কের কথা চিন্তা করলে মাথায় গিট্টু লেগে যাবে। যখন কোন একটা টাস্কের ব্যাপারে মোটামুটি নিশ্চিত হবে যে এটা কাজ করবে, কোনরকম বাঘ-ভাল্লুক (bug) এর মধ্যে নাই। তখনই পরের task টা শুরু করবে।
- কোন একটা টাস্কের কোড শুরু করার আগে অবশ্যই ঐ টাস্কের থিওরিগুলো জেনে নিবে। যেমন ধর তোমার একটা টাস্ক হচ্ছে কোন ইউজার কোন দেশের কোন শহর থেকে তোমার এপটা ব্যবহার করছে সেটা জানা। তাহলে কোড শুরু করার আগে তোমার জেনে নেয়া উচিত GPS কিভাবে কাজ করে? latitude ও longitude কী? এই দুইটা মান থেকে কিভাবে কোন জেলা বা শহরের নাম পাওয়া যায়? এজন্য কোন কোন API পাওয়া যায় বা কোন টেকনোলজিটা ব্যবহার করা হয়? ইত্যাদি।
- সবশেষে তুমি তোমার টাস্কটা শেষ করতে সক্ষম হলে। যখন তুমি এটা সলভ করছিলে তখন আরো কিছু প্রতিবন্ধকতা তোমার সামনে হাজির হবে। সেগুলো হচ্ছেঃ
৪. তোমার করা কোডের ভবিষ্যত নিয়ে তোমার কোন মাথা ব্যথা নাই
“কোডের আবার ভবিষ্যত কী? কোড করেছি, কাজ করছে। ব্যস! পরের প্রোজেক্ট বা পরের টাস্ক শুরু করি!” বেশির ভাগ শিক্ষার্থীই এই কাজটা করে। তুমিও যদি এটা করো তাহলে বেশ কিছু বিষয় শেখার সুযোগ তোমার হাতছাড়া হয়ে যাবে।
একেকটা টাস্ক শেষ করার পর তুমি নিজেকে এই প্রশ্নগুলো করতে পারোঃ
- এই কোডের ক্ষেত্রে কি কোন 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 করো। একবার না, বারবার এপ্লাই করতে হবে, যতক্ষণ না পর্যন্ত এটা তোমার রুটিনে পরিণত হয়।
প্রোগ্রামিং এমন একটা বিষয়, যেটা তোমার মধ্যে একটা ভাল অভ্যাস গড়ে তুলবে। আর তা হচ্ছে যে কোন সমস্যা থেকে নিজেকে টেনে তোলা
পুনশ্চঃ
আর্টিকেলটি আমার কোন মৌলিক লেখা নয়। TNW-এ প্রকাশিত Andrei Soare এর 8 barriers to overcome when learning to code এর ভাবানুবাদ মাত্র। যেহেতু ভাবানুবাদ তাই অনেক ক্ষেত্রেই শব্দগুলোকে এমন ভাবে সাজানোর চেষ্টা করা হয়েছে যেভাবে বর্তমান সময়ের এই লেখার টার্গেট অডিয়েন্স ভাল বুঝতে পারবে। বেশ কিছু কথাবার্তা নিজ থেকে যুক্ত করা হয়েছে যেগুলো মূল লেখায় ছিল না। যেমনঃ ACM এর ব্যাপারে যেই কথাগুলো ছিল। বা ১ নাম্বার পয়েন্টে যা উল্লেখ করা হয়েছে তার অনেকাংশই আমার মতামত। লেখায় কোন ভুল-ভ্রান্তি চোখে পড়লে জানানোর অনুরোধ রইলো। লেখাটি প্রথম প্রকাশিত হয়েছিল আমার ব্যক্তিগত ব্লগে।
copy
medium.com
0 comments:
Post a Comment