প্রোগ্রামিংয়ের সাধারণ ভুলগুলো

আলাল এখন টুকটাক প্রোগ্রামিং পারে। সারাদিন সে বিভিন্ন অনলাইন জাজে প্রবলেম সলভের চেষ্টা করে। একেকটা ‘Accepted’ ভারডিক্ট মানেই তার আকর্ণবিস্তৃত হাসি। ওদিকে দুলাল তেমন একটা প্রোগ্রামিং পারে না, এব্যাপারে তার খুব একটা আগ্রহও নেই। তার সারাদিনের কাজের মধ্যে অন্যতম কাজ ফেসবুক চালানো, মুভি দেখা আর এখানে সেখানে আড্ডা দেয়া। তো দুলাল  প্রোগ্রামিং এসাইনমেন্টগুলো সব আলাল কে দিয়েই করিয়ে নেয়। আজকেও দুলাল একটা এসাইনমেন্ট নিয়ে এসেছে।
দুলালঃ তাড়াতাড়ি এই কোডটা করে দে তো। স্যার কে মেইল করতে হবে।
আলালঃ কোনো ব্যাপার না। ২ মিনিটেই হয়ে যাবে।
১০ মিনিট পর দুলাল এসে-
দুলালঃ কিরে কোড কই?
আলালঃ আর ৫ মিনিট।
দুলালঃ তুই না বললি ২ মিনিটেই হয়ে যাবে!
আলালঃ আরে কোড তো ২ মিনিটেই শেষ। ডিবাগিং করতে টাইম লাগতেছে। 😛

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

শুরু করা যাক কোডে সাধারণত কি কি ধরনের এরর পাওয়া যায় সেটা নিয়ে।

error

হ্যাঁ, সাধারণত আমাদের করা কোডে তিন ধরনের এরর হয়। কম্পাইল এরর, রানটাইম এরর আর লজিক্যাল এরর।

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

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

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

কোড করতে গিয়ে খুব বেশি যেই ভুলগুলো আমরা করি তার কয়েকটা নিয়ে একটু কথা বলি।

১. অনেক অনেক প্রোগ্রামারের রাতের ঘুম হারাম করে দেয়া একমাত্র বর্ণটার নাম বলতে পারবেন? আমিই বলে দিচ্ছি, সেটা হচ্ছে সেমিকোলন (;)। সেমিকোলন হচ্ছে প্রোগ্রামারদের দুঃস্বপ্ন। এমন প্রোগ্রামার খুঁজে পাওয়া ভার হবে যাকে এই সেমিকোলনের জন্য বিপদে পড়তে হয়নি।

semicolon

আর আপনি যদি একাধিক ল্যাংগুয়েজে কোড করেন এবং তার মধ্যে একটা যদি হয় পাইথনের মত ল্যাংগুয়েজ যেটায় প্রতিটা স্টেটমেন্টের পর ‘;’ দেয়া লাগে না তাহলে আপনার চাইতে ভালো কেউ জানার কথা না ‘;’ কি জিনিস! যাই হোক, কোড করার সময় অবশ্যই খেয়াল রাখতে হবে কোথায় কোথায় সেমিকোলন দিতে হয়, কোথায় দিতে হয় না।

২. প্রায় সব কোডেই এ্যারে ব্যবহার করতে হয়। গুরুত্বপূর্ণ বিষয় হচ্ছে এ্যারের সাইজ কি আপনি পর্যাপ্ত পরিমাণ নিয়েছেন কিনা? যদি পর্যাপ্ত পরিমাণ স্পেস আপনি এ্যারেতে না নিয়ে থাকেন তাহলে আপনি অন্যতম যে এররের শিকার হবেন তা হলো ‘Array Index out of bound’, অর্থাৎ আপনি এ্যারের এমন ইনডেক্সে ডাটা রাখতে চাচ্ছেন যেটা আপনার এ্যারের সাইজের বাইরে। আপনি যদি ১০ সাইজের একটা এ্যারে নেন arr[10] আর arr[12] তে ডাটা রাখার চেষ্টা করেন তখনই এই প্রবলেমটা হবে। সুতরাং, এ্যারের সাইজ পর্যাপ্ত পরিমাণ নেয়া হয়েছে কিনা সেটা নিশ্চিত হওয়া উচিত।

৩. আমরা অনেকেই অনেক রকমভাবে ভ্যারিয়েবল নেম ডিক্লেয়ার করি। এটা যার যার পছন্দের ব্যাপার। কেউ হয়তো a,b,c,d নেয় ভ্যারিয়েবল নেম হিসেবে, কেউ হয়তো start, end, index, position এরকমভাবে ভ্যারিয়েবল ডিক্লেয়ার করেন। তবে গুড প্রাকটিস হচ্ছে ভ্যারিয়েবল নেমটা এমন নেয়া উচিত যাতে করে নাম দেখলেই ভ্যারিয়েবলটার কাজ বোঝা যায়। এটা পরে আপনাকেই ডিবাগিং করতে বা কোড বুঝতে সাহায্য করবে। ভ্যারিয়েবল নেম রিলেটেড যেই এররগুলোতে আপনি পড়তে পারেন সেগুলো হলো-

  • প্রত্যেকটা ল্যাংগুয়েজেরই কিছু রেস্ট্রিক্টেড কি-ওয়ার্ড থাকে। এগুলোকে ভ্যারিয়েবল নেম হিসেবে ব্যবহার করা যায় না। ব্যবহার করলেই এরর খাবেন। যেমন- while, if, do, break এগুলো C এবং আরো কিছু সিমিলার ল্যাংগুয়েজের কি-ওয়ার্ড। এগুলো কোডে ভ্যারিয়েবল নেম হিসেবে ব্যবহার করা যায় না। ডিটেইলস কি-ওয়ার্ড লিস্ট ল্যাংগুয়েজের রেফারেন্স থেকে দেখে নিয়েন।
  • ভ্যারিয়েবল নেম কি কোডের সবজায়গায় ঠিক মতো দিয়েছেন কিনা সেটা চেক করে নেয়া উচিত। বানান ভুলের জন্য কম্পাইল এরর খাবেন।
  • আমরা সাধারণত লুপ ভ্যারিয়েবল হিসেবে i, j, k  ব্যবহার করি। একের বেশি লুপ থাকলে বা নেস্টেড লুপ থাকলেই আমরা খুব কমন যে ভুলটা করি সেটা হচ্ছে i এর জায়গায় j বা এরকম একটার জায়গায় আরেকটা লিখে এরপর বসে বসে মাথা চুলকাই, “কোড কেনো কাজ করে না?” লুপ ভ্যারিয়েবল লেখার সময় এজন্য খেয়াল রাখা উচিত যেটা যেখানে লেখা দরকার সেখানেই লিখছি তো?

৪. বিগিনার C কোডারদের অনেকসময়ই প্রবলেমে পড়তে হয় printf() আর scanf() নিয়ে। একটাতে & দিতে হয় আর্গুমেন্ট পাঠানোর সময় আরেকটায় দিতে হয় না। scanf() এ ভুল করে & না দিলে আপনাকে Segmentation fault এররে পড়তে হবে। কোড ইনপুট নিতে পারবে না।

৫. আরেকটা বেশ কমন ভুল হয় ‘=’ এবং ‘==’ নিয়ে। একটার জায়গায় আরেকটা লিখেছেন কি বিপদে পড়েছেন। মনে রাখার জন্য একট সিস্টেম হচ্ছে আমরা খুব কমই if এবং while এর ব্রাকেটের ভেতর ‘=’ ব্যবহার করি, বেশিরভাগ সময়ই ‘==’ ব্যবহার করি কন্ডিশন চেক করতে হয় বলে। if এবং while এর ব্রাকেটের ভেতর ‘=’ করা লাগতে পারে যদি আমরা একইসাথে কোনো ডাটা এসাইন করেই আবার সেটার কন্ডিশন চেক করতে চাই। এরকম-

if((str=gets())!=NULL)
{
dosomething;
}

৬. একটা কোড লিখে কমপ্লিট করার পর বিভিন্ন রকম টেষ্ট কেস দিয়ে সেই কোডটা চেক করা হয়। এক্ষেত্রে যে কয়েকটা কেস বেশি বিশেষভাবে নজরে রাখা দরকার সেগুলো হলো-

  • Overflow case
  • Underflow case
  • 0
  • Negative value

৭. কোডে যদি কখনো Global variable ব্যবহার করা হয়, তাহলে খেয়াল রাখতে হবে একাধিক টেস্ট কেসের জন্য ভ্যারিয়েবলগুলো Re-initialize করা হচ্ছে কিনা। তা নাহলে আগের টেস্ট কেসের ডাটা ভ্যারিয়েবলগুলোতে থেকে গেলে কোড ঠিকমত কাজ নাও করতে পারে। এছাড়াও গ্লোবাল ভ্যারিয়েবল এবং একই নামে লোকাল ভ্যারিয়েবল থাকলেও সেটা পরিহার করা উচিত।

৮. কোডের কোনো লুপে যদি ঠিকভাবে break কন্ডিশন দেয়া না হয় তাহলে কোনো কোনো সময় কোড ইনফিনিট লুপে পড়ে যেতে পারে। এছাড়াও রিকার্সিভ কোডের ক্ষেত্রেও ঠিকমত base case ব্যবহার না করলে সেখানেও ইনফিনিট রিকার্সন হয়ে stack overflow হতে পারে।

৯. pass by value & pass by reference নিয়ে যদি আপনার কনফিউশন থেকে থাকে তাহলে আজকেই সেটা ক্লিয়ার হয়ে যান। তা না হলে এই জিনিস আপনাকে ভালোই জ্বালাতন করবে।

১০. প্রথম প্রথম জাভাতে কোড করতে গিয়ে আপনি দেখবেন যে আপনি দুইটা স্ট্রিংকে ‘==’ দিয়ে ইক্যুয়ালিটি চেক করতে পারছেন না। তার কারণ হচ্ছে জাভাতে দুইটা স্ট্রিংয়ের ভ্যালু একই কিনা এটা চেক করার জন্য আপনাকে .equals() মেথড ব্যবহার করতে হবে। অবজেক্টের ক্ষেত্রে ‘==’ ব্যবহার হয় দুইটা অবজেক্টের রেফারেন্স একই কিনা সেটা চেক করার জন্য। বিস্তারিত জানার জন্য-
how-do-i-compare-strings-in-java 

১১. জাভা রিলেটেড আরো একটা কমন প্রবলেম হয় String & StringBuffer নিয়ে। বোঝার সুবিধার জন্য মনে রাখতে হবে String টাইপের অবজেক্টে কোনো ভ্যালু বসানো হলে সেটাকে Edit করা যায় না, অর্থাৎ আপনি স্ট্রিংয়ের কোনো একটা ক্যারেকটারকে রিপ্লেস করে সেখানে অন্য আরেকটা ক্যারেকটার বসাতে পারবেন না। কারণ জাভার String হলো Immutable টাইপ অবজেক্ট। আপনি দুইটা স্ট্রিংকে জোড়া দিয়ে নতুন আরেকটা স্ট্রিং বানাতে পারবেন, কিন্তু একটা স্ট্রিং বানিয়ে ফেলার পর String টাইপ অবজেক্টের ভ্যালু পরিবর্তন করতে পারবেন না। সেজন্য আপনার লাগবে StringBuffer অবজেক্ট। StringBuffer অবজেক্ট হলো Mutable অবজেক্ট, অর্থাৎ পরিবর্তনযোগ্য।

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

১৩. প্রবলেম নিয়ে বকবকানি শেষ করবো আরেকটা জিনিস নিয়ে। এটা কোনো এরর না, বলা যায় inefficient প্রোগ্রামিং। নীচের কোডটুকু দেখি-

for(i=0;i<strlen(s);i++) //s is my char array
{
        //some stuff
}

কোডটায় সিনট্যাক্টিক্যালি কোনো ভুল নেই। কিন্তু কোডটা কি ধরনের প্রবলেম করতে পারে সেটা সুন্দরভাবে বোঝার জন্য এই পোস্টটা পড়ে দেখা যেতে পারে।

যথেস্ট বড় পোস্ট হয়ে গেছে। আর বড় না করে বরং কিছু লিংক দিয়ে দেই। 😛
বিভিন্ন প্রোগ্রামারদের bug experience নিয়ে কিছু লিংক-

যাই হোক, কিভাবে কোডে কম এরর করা যায় এ নিয়ে আমার নিজের কিছু চিন্তাভাবনা এরকম-

  • কোডিংয়ের Best Practice গুলো ফলো করা উচিত। বড় বড় কোডাররা কিভাবে কোড করে সেটা দেখা যেতে পারে।
  • কোডে Proper Indentation থাকা উচিত, তা নাহলে অন্য কেউ তো বটেই নিজের কোড নিজে বুঝতেই অনেক সমস্যা হয়
  • একটা জিনিস হুট করে কোড না করে কি করছি, কি করতে চাচ্ছি সেটা বুঝে কোড করা উচিত।
  • কোড করার পর Edge case গুলো নিয়ে চিন্তা করা উচিত, যেসব কেসের জন্য কোড ব্রেক করতে পারে। এগুলো নিয়ে উপরে বলে ফেলেছি।
  • Safe side coding (আমার দেয়া টার্ম) করা উচিত। মানে হলো দুইলাইন বেশি লিখে হলেও যেই কোডটুকু ঠিকভাবে কাজ করবে আপনি নিশ্চিত সেটা করা। কোডিং এক্সপেরিমেন্ট আপনি করতেই পারেন, তবে সেটা কনটেস্ট বা প্রজেক্টের কোডে না করাই ভাল।
  • কোডের Error & Exception প্রপারলি হ্যান্ডেল করা উচিত।
  • কোডে পর্যাপ্ত কমেন্ট রাখা উচিত যাতে করে পরে কোড দেখলে বা অন্য কেউ কোড পরে সহজে বুঝতে পারে।

এখানে আরো বেশ কিছু পরামর্শ পাবেন এরর ছাড়া কিভাবে কোড করা যায় সে ব্যাপারে।

এছাড়াও প্রত্যেকের নিজস্ব কোডিং এক্সপেরিয়েন্স এবং কোডিং মেথডলজি থাকতে পারে। সকলের হাত দিয়ে BUG-FREE Code প্রত্যাশা করে একজন কোডারের মজার একটা ডিবাগিং এক্সপেরিয়েন্স দিয়ে পোস্ট শেষ করবো।

It happened in my 4th semester.The most embarrassing mistake.
The project was to build a web and android application.
My part: I’m solely responsible for android app development.
The whole team used a main server to test their code(of the web app part). The main server was supposed to have folder such as “books”,”videos” etc.

To test an my code , I hosted a server on my laptop. Just as the requirement, I created the required folders in my server and put some dummy files.

Time:5 hours to deadline
I am done with all kinds of testing and had covered all corner cases. It was time for me to integrate. I thought it would be an easy job as the only thing left for me is to change the address of the server. I did the same.While exploring “books” and other folders, the app performed as expected. But the only problem occurred while exploring the “videos” folder.

Time : 3 hours to deadline
I started to panic. Checked all my code, rewrote some of it and checked again. Trust me, I did all sort of things.

Time :1 hour to deadline
After so much frustration, still that part wont work. Just went out for walk.
Then I started to think what all changes did I make.The app runs perfectly when I use my server to run it but crashes when I use the main server, it has something to do with the server address.
I checked again. As when other folders were explored by the app performed as expected, so I only need to focus strictly on the part where I set path for videos.
I checked again, everything seems to be completely fine.

Time: The most embarrassing moment
My neighbor says :”Abe chutiye , tune videos ki spelling galat likhi hai”
The whole time I wrote “vedios” instead of “videos”!!!

English Translation : “You “censored stuff”, you spelled “videos” wrong”.

এটি Quora post থেকে পাওয়া।

Want to like or share?:
0

6 comments

  1. লেখা গুলো পড়ার পর আমার অনেক প্রিয় একজন স্যার এর কথা মনে পড়ে গেল।এই এরর গুলা স্যার ক্লাসে অনেক মজা নিয়ে কোডিং করে খেলতে খেলতে শিখিয়েছিলেন।স্যার এর কথা অনেক মনে পড়ছে।মিস উ স্যার………………

  2. Time: The most embarrassing moment
    My neighbor says :”Abe chutiye , tune videos ki spelling galat likhi hai” 😀 😀 😀

Leave a Reply

Your email address will not be published. Required fields are marked *