আপনার বিশ্বস্ত লাইব্রেরিগুলোতে লুকিয়ে থাকা সেই পরিচিত কিছু বাগ (Bugs)
আমি Langchain, Vite এবং Bat-এর মতো বড় বড় রিপোজিটরিতে ছোটখাটো ফিক্স (fix) পাঠিয়ে সময় কাটাই।
এই প্রজেক্টগুলো ভিন্ন ভিন্ন ভাষা এবং ভিন্ন ভিন্ন ডোমেইন ব্যবহার করে। এর মেইনটেইনাররা অত্যন্ত দক্ষ।
অবাক করার মতো বিষয় হলো বাগের সংখ্যা নয়, বরং এর প্যাটার্ন। বেশিরভাগ বাগ আসলে একই ধরণের কিছু প্যাটার্ন, যা কেবল ভিন্ন ভিন্ন রূপে দেখা দেয়।
একবার আপনি এই প্যাটার্নগুলো চিনতে শিখলে, প্রোডাকশনে যাওয়ার আগেই আপনি সেগুলো ধরতে পারবেন। আমি যে পাঁচটি সাধারণ প্যাটার্ন খুঁজে পেয়েছি তা নিচে দেওয়া হলো:
ভুল ইনপুট কী (Wrong Input Keys) Langchain-এ একটি rename ফাংশন
old_pathনামক একটি কী (key) খুঁজছিল। কিন্তু সিস্টেম আসলেpathনামক একটি কী পাঠাচ্ছিল। ফলে কোডটি ক্র্যাশ করে। কেন এটি রিভিউতে ধরা পড়ে না: ইউনিট টেস্টটি সফল হয়েছিল কারণ ডেভেলপার ম্যানুয়ালি এমন একটি ইনপুট তৈরি করেছিলেন যা ফাংশনটি চেয়েছিল, কিন্তু সিস্টেম আসলে যে ইনপুট পাঠায় তা ছিল ভিন্ন। পরীক্ষা করার উপায়: যদি কোনো ফাংশন একটি কী (key) পড়ে, তবে সেই অবজেক্টটি কোথায় তৈরি করা হচ্ছে তা খুঁজে বের করুন। যদি দেখা যায় কোনো কিছু সেই কী-টি সেট করছে না, তবে আপনি একটি বাগ খুঁজে পেয়েছেন। আসল কলারের (caller) বিপরীতে এটি পরীক্ষা করুন।ট্রুথিনেস ট্র্যাপ (Truthiness Traps) একটি সাধারণ ভুল হলো যখন আপনি বোঝাতে চান "এই ভ্যালুটি কি সেট করা আছে", তখন ভুলবশত ট্রুথিনেস (truthiness) চেক ব্যবহার করা। উদাহরণ:
const clause = defaultValue ?DEFAULT ${defaultValue}: '';যদি ভ্যালু0হয়, তবে কোডটি সেই ব্রাঞ্চটি স্কিপ করে।0একটি বাস্তব ভ্যালু, কিন্তু এটি "falsy"। পরীক্ষা করার উপায়: সবসময়0, খালি স্ট্রিং (empty strings) এবংfalseদিয়ে পরীক্ষা করুন। যদি আপনার কোড "অনুপস্থিত" এবং "উপস্থিত কিন্তু শূন্য" এর মধ্যে পার্থক্য করতে না পারে, তবে সেটি ত্রুটিপূর্ণ।আনসাইনড ইন্টিজার আন্ডারফ্লো (Unsigned Integer Underflow) Bat প্রজেক্টে টার্মিনাল উইডথ (width) গণনার জন্য গণিত ব্যবহার করা হয়েছিল। যদি উইডথ খুব কম হতো, তবে বিয়োগফল একটি আন্ডারফ্লো (underflow) তৈরি করত। আনসাইনড টাইপের ক্ষেত্রে, এটি একটি বিশাল সংখ্যায় রূপান্তরিত হয় অথবা ক্র্যাশ করে। পরীক্ষা করার উপায়: ইউজার ইনপুট ব্যবহার করে কোনো আনসাইনড টাইপে বিয়োগ করার ক্ষেত্রে একটি 'স্যাচুরেটিং সাবট্রাকশন' (saturating subtraction) প্রয়োজন।
0এবং1দিয়ে পরীক্ষা করুন।এনকোডিং এবং এজ কেস (Encoding and Edge Cases) টেক্সট রুলগুলো দেখতে সহজ মনে হয় যতক্ষণ না আপনি নন-ASCII ক্যারেক্টার দেখেন। Mistune-এ স্ট্যাকড ডেলিমিটার (stacked delimiters) নিয়ে সমস্যা ছিল যা একটি জেনারেটর তৈরি করতে পারে। Wenmode ইউনিকোড কম্বাইনিং মার্ক (Unicode combining marks) হ্যান্ডেল করার সময় ব্যর্থ হয়েছিল। কেন এটি রিভিউতে ধরা পড়ে না: ASCII দিয়ে প্রতিটি টেস্ট পাস হয়ে যায়। বাগগুলো কেবল তখনই দেখা দেয় যখন ইনপুটটি আপনি নিজে হাতে টাইপ করেন না। পরীক্ষা করার উপায়: একটি ডিফারেনশিয়াল টেস্ট (differential test) ব্যবহার করুন। আপনার আউটপুটকে অন্য একটি প্রমাণিত ইমপ্লিমেন্টেশনের সাথে তুলনা করুন।
অনিরাপদ পার্সিং (Unsafe Parsing) Vite-এ এমন একটি মিডলওয়্যার ছিল যা কোনো গার্ড (guard) ছাড়াই URL ডিকোড করত। একটি ভুল ফরম্যাটের URL
URIErrorতৈরি করত এবং মিডলওয়্যারটিকে ক্র্যাশ করত। পরীক্ষা করার উপায়: আপনি নিজে তৈরি করেননি এমন যেকোনো কিছু ডিকোড বা পার্স করার ক্ষেত্রে একটিtry/catchব্লক প্রয়োজন। আপনার কোডে ভাঙা স্ট্রিং দিয়ে পরীক্ষা করে দেখুন সেটি ঠিকভাবে কাজ করে নাকি ক্র্যাশ করে।
আমার অভ্যাসটি খুব সহজ। যখন আমি একটি বাগ ফিক্স করি, আমি তার ঠিক পাশের কোডটি দেখি। যদি একটি হ্যান্ডলারে বাগ থাকে, তবে তার পাশের হ্যান্ডলারটিতেও প্রায়ই একই ধরণের বাগ থাকে।
উৎস: https://dev.to/greymothjp/the-same-few-bugs-keep-hiding-in-libraries-you-already-trust-1pgp
