খারাপ কোড হল নিম্নমানের সোর্স কোডের জন্য একটি অপভাষা শব্দ: অপাঠ্য, খারাপভাবে কাঠামোবদ্ধ এবং রক্ষণাবেক্ষণে কঠিন। Stripe রিপোর্ট (2022) অনুসারে, ডেভেলপাররা তাদের কাজের সময়ের 40% পর্যন্ত খারাপভাবে লেখা কোড পড়তে এবং বুঝতে ব্যয় করে। রুশভাষী সম্প্রদায়ে শব্দটি এতটাই বিস্তৃত যে একটি বিশেষায়িত ওয়েবসাইট govnokod.ru বিদ্যমান যেখানে ডেভেলপাররা বিশেষভাবে চোখে পড়ার মতো ঘটনার উদাহরণ প্রকাশ করে।
মূল বিষয়
খারাপ কোড হল কোডের একটি বিষয়গত কিন্তু সাধারণভাবে গৃহীত বৈশিষ্ট্য যা ন্যূনতম মানের মান পূরণ করে না। রবার্ট মার্টিন তার বই ক্লিন কোড (2008) এ খারাপ কোডকে এমন কোড হিসাবে সংজ্ঞায়িত করেছেন যা “বুঝতে বাধা দেয় যে এটি কী করে”। খারাপ কোড সিনট্যাক্সগতভাবে সঠিক এবং এমনকি কাজও করতে পারে, কিন্তু এর রক্ষণাবেক্ষণ দলের জন্য দুঃস্বপ্নে পরিণত হয়।
খারাপ কোড শব্দটি বিশেষ করে রুশভাষী সম্প্রদায়ে ব্যাপক। ইংরেজিতে আরও আনুষ্ঠানিক শব্দ ব্যবহার করা হয়: স্প্যাগেটি কোড, ডার্টি কোড, টেকনিক্যাল ডেট কোড। তবে, “খারাপ কোড” এর আবেগগত রঙ ডেভেলপারদের এই ধরনের কোডের প্রতি দৃষ্টিভঙ্গি আরও সঠিকভাবে প্রকাশ করে — বিরক্তি, ঘৃণা এবং পেশাদার অপরাধবোধের মিশ্রণ।
McKinsey সমীক্ষা (2023) অনুসারে, উচ্চ স্তরের প্রযুক্তিগত ঋণযুক্ত কোম্পানিগুলি — এবং খারাপ কোড এর প্রধান উপাদান — নতুন বৈশিষ্ট্য বিকাশে 20–40% বেশি সম্পদ ব্যয় করে। কোডের গুণমান সরাসরি ব্যবসায়িক মেট্রিককে প্রভাবিত করে, এবং এটি কোনও রূপক নয় বরং একটি নিশ্চিত সত্য।
কোনও বস্তুনিষ্ঠ মেট্রিক বিদ্যমান নেই, তবে ব্যবহারিক মানদণ্ড রয়েছে: যদি কোনও ডেভেলপার 20 লাইনের একটি ফাংশন বুঝতে 5 মিনিটের বেশি সময় ব্যয় করে — এটি খারাপ কোড। যদি একটি লাইন পরিবর্তন করলে তিনটি অসম্পর্কিত মডিউল ভেঙে যায় — এটি খারাপ কোড। যদি সম্পূর্ণ পুনর্লিখন ছাড়া কোড পরীক্ষার মাধ্যমে কভার করা না যায় — এটি খারাপ কোড।
কপি-পেস্ট প্রোগ্রামিং সবচেয়ে স্পষ্ট এবং সহজে সনাক্তযোগ্য লক্ষণগুলির মধ্যে একটি। যখন কোডের একই ব্লক ন্যূনতম পরিবর্তনের সাথে একাধিক জায়গায় পুনরাবৃত্তি হয়, এটি কেবল খারাপ কোড নয় — এটি ভবিষ্যতের বাগগুলির উৎস। এক জায়গায় ঠিক করা এবং অন্য জায়গায় বাদ দেওয়া একটি সাধারণ পরিস্থিতি।
অর্থহীন ভেরিয়েবলের নাম একটি ক্লাসিক। `a`, `b`, `x`, `data`, `temp`, `tmp`, `result`, `list`, `obj`-এর মতো নামের ভেরিয়েবলগুলি তাদের উদ্দেশ্য সম্পর্কে কোনও তথ্য বহন করে না। কোড পাঠককে বুঝতে সম্পূর্ণ ফাংশন বিশ্লেষণ করতে হয় যে ভেরিয়েবলে কী রয়েছে। রবার্ট মার্টিন এটিকে “নামে মিথ্যা” বলে — নাম তথ্যের প্রতিশ্রুতি দেয় কিন্তু তা প্রদান করে না।
গভীর নেস্টিং — যখন শর্ত, লুপ এবং ত্রুটি ব্যবস্থাপনা 5+ ইন্ডেন্টেশন স্তরের একটি কাঠামো তৈরি করে। এই ধরনের কোড অনুভূমিক স্ক্রলিং বা সমস্ত স্তরের মানসিক ট্র্যাকিং ছাড়া পড়া অসম্ভব। এটি ত্রুটির সরাসরি পথ: লজিক্যাল অপারেটরগুলি সহজেই বিভ্রান্ত হতে পারে এবং বন্ধ করার বন্ধনীগুলি মিস হতে পারে।
| লক্ষণ | খারাপ কোডের উদাহরণ | পরিষ্কার কোড |
|---|---|---|
| কপি-পেস্ট | একটি ব্লক 5 বার কপি করা হয়েছে | একটি ফাংশনে নেওয়া হয়েছে |
| নাম | `var a = getData()` | `var userList = getData()` |
| নেস্টিং | 6 স্তর if/for | 2–3 স্তর early return সহ |
| ফাংশন | 300 লাইনের ফাংশন | 3–5 পদ্ধতিতে বিভক্ত |
| মন্তব্য | `i++ // i বাড়ান` | মন্তব্য ছাড়া স্ব-ব্যাখ্যামূলক কোড |
মৃত কোড (dead code) — ফাংশন, ভেরিয়েবল, ক্লাস যা কোথাও ব্যবহার করা হয় না। এটি কোডের পরিমাণ বাড়ায়, ডেভেলপারকে বিভ্রান্ত করে এবং সিস্টেমের ক্ষমতা সম্পর্কে মিথ্যা ধারণা তৈরি করে। যাদু সংখ্যা — প্রসঙ্গ ছাড়া সংখ্যা। গড ক্লাস — ক্লাস যা একসাথে সবকিছু করে, একক দায়িত্ব নীতি (SOLID: S) লঙ্ঘন করে।
সময়ের অভাব সবচেয়ে সাধারণ কারণ। যখন সময়সীমা কাছাকাছি থাকে, ডেভেলপাররা গতির জন্য গুণমান বিসর্জন দেয়। কৌশলগতভাবে, এটি ন্যায়সঙ্গত হতে পারে, কিন্তু কৌশলগতভাবে — এটি প্রযুক্তিগত ঋণ সঞ্চয় করছে। সমস্যা হল যে “অস্থায়ী” খারাপ কোড খুব কমই ঠিক করার জন্য পুনর্বিবেচনা করা হয়।
কোড রিভিউর অভাব দ্বিতীয় সবচেয়ে গুরুত্বপূর্ণ কারণ। যখন কোড সহকর্মী পর্যালোচনা ছাড়া একা লেখা হয়, খারাপ প্যাটার্নগুলি গভীরভাবে প্রোথিত হয় এবং বহুগুণ বেড়ে যায়। কোড রিভিউ শুধু গুণমান নিয়ন্ত্রণ নয় বরং দলের মধ্যে জ্ঞান স্থানান্তরও। পর্যালোচনা ছাড়া প্রকল্পগুলি অনিবার্যভাবে খারাপ কোডে পরিণত হয়।
ডেভেলপারের কম যোগ্যতা বা মেন্টরশিপের অভাব। তত্ত্বাবধান ছাড়া রেখে দেওয়া জুনিয়র ডেভেলপাররা স্বাভাবিকভাবেই খারাপ কোড লেখে — এটি শেখার প্রক্রিয়ার অংশ। সমস্যা দেখা দেয় যখন এই কোড পর্যালোচনা এবং রিফ্যাক্টরিং ছাড়া উৎপাদনে চলে যায়।
সেই দলগুলিতে যেখানে “এটি কাজ করে, ঠিক আছে” নীতিবাক্য, খারাপ কোড বিকাশ লাভ করে। কোডিং মান, পরীক্ষার প্রয়োজনীয়তা এবং পর্যালোচনা প্রক্রিয়ার অনুপস্থিতি একটি পরিবেশ তৈরি করে যেখানে কোডের গুণমান কারও উদ্বেগের বিষয় নয়। এই ধরনের প্রকল্পগুলি দ্রুত “লিগ্যাসি” হয়ে ওঠে — কোড যা স্পর্শ করতে সবাই ভয় পায়।
খারাপ কোডের প্রধান পরিণতি হল উন্নয়নের মন্দা। খারাপ কোডের প্যারাডক্স হল যে এটি প্রথম সংস্করণ দ্রুত লিখতে দেয়, কিন্তু প্রতিটি পরবর্তী সংশোধন আরও বেশি সময় নেয়। কোডের গুণমান বনাম উন্নয়নের গতির গ্রাফটি সূচকীয় — একটি নির্দিষ্ট সীমার পরে, নতুন বৈশিষ্ট্য যুক্ত করা কার্যত অসম্ভব হয়ে পড়ে।
কর্মচারী টার্নওভার একটি পরোক্ষ কিন্তু গুরুতর পরিণতি। ডেভেলপাররা, বিশেষ করে অভিজ্ঞরা, খারাপ কোড নিয়ে কাজ করতে চায় না। Stack Overflow ডেভেলপার জরিপ 2024 অনুসারে, 47% ডেভেলপার কর্মক্ষেত্র নির্বাচন করার সময় কোডবেসের গুণমানকে মূল কারণগুলির মধ্যে একটি হিসাবে উল্লেখ করে। খারাপ কোডযুক্ত প্রকল্পগুলি তাদের সেরা কর্মীদের হারায়।
নিরাপত্তা খারাপ কোডের আরেকটি শিকার। খারাপভাবে লেখা কোডে বেশি দুর্বলতা থাকে: অপরিচালিত ব্যতিক্রম, SQL ইনজেকশন, XSS, মেমরি লিক। ইউনিট পরীক্ষা এবং কোড রিভিউ সহ মানসম্পন্ন কোড উৎপাদনের আগে এই সমস্যাগুলির বেশিরভাগই ধরে ফেলে।
SonarQube এবং অনুরূপ সরঞ্জামগুলি ব্যক্তি-ঘন্টা বা দিনে প্রযুক্তিগত ঋণ অনুমান করতে পারে। উদাহরণস্বরূপ, কপি-পেস্ট সম্পর্কে 500 সতর্কতা, যাদু সংখ্যা সম্পর্কে 200, এবং গভীর নেস্টিং সম্পর্কে 50, প্রযুক্তিগত ঋণের 30 দিনের একটি অনুমান দেয়। রিফ্যাক্টরিংকে ন্যায়সঙ্গত করার জন্য এই সংখ্যাগুলি ব্যবস্থাপনাকে দেখানো যেতে পারে এবং উচিত।
DRY (Don’t Repeat Yourself) নীতি প্রথম যে জিনিসটি বাস্তবায়ন করা উচিত। যুক্তির প্রতিটি টুকরো একটি একক জায়গায় বিদ্যমান থাকা উচিত। কপি-পেস্টের পরিবর্তে — পুনরাবৃত্তিমূলক কোডটি একটি পৃথক ফাংশন, ক্লাস বা মডিউলে নিন। যাদু সংখ্যার পরিবর্তে — নামযুক্ত ধ্রুবক। দীর্ঘ ফাংশনের পরিবর্তে — বেশ কয়েকটি ছোট।
KISS (Keep It Simple, Stupid) নীতি অত্যধিক জটিলতা থেকে রক্ষা করে। যদি একটি কাজ 10 লাইনে সমাধান করা যায় — 50 লিখবেন না। যদি একটি লুপ স্ট্রিমের চেয়ে সহজ হয় — লুপ ব্যবহার করুন। যদি একটি সাধারণ ফাংশন ডেকোরেটরের চেয়ে স্পষ্ট হয় — ফাংশন লিখুন। সরলতা রক্ষণাবেক্ষণযোগ্য কোডের প্রধান গুণ।
Boy Scout নিয়ম — “কোডটি তুমি যেভাবে পেয়েছ তার চেয়ে ভালো রেখে যাও।” প্রতিটি সম্পাদনার সাথে ছোট উন্নতিও ধীরে ধীরে খারাপ কোডকে ভালো কোডে রূপান্তরিত করে। একটি ভেরিয়েবলের নাম পরিবর্তন করুন, একটি বড় ফাংশন বিভক্ত করুন, একটি পরীক্ষা যোগ করুন — যে কোনও উন্নতি গুরুত্বপূর্ণ।
// খারাপ কোড — কপি-পেস্ট, যাদু সংখ্যা, খারাপ নাম
function calc(a, b, c) {
let x = a * 0.85;
if (b > 1000) { x = x * 0.9; }
let y = c * 0.85;
if (b > 1000) { y = y * 0.9; }
return x + y;
}
// পরিষ্কার কোড — পরিষ্কার নাম, DRY, ধ্রুবক
const DISCOUNT_RATE = 0.85;
const BULK_THRESHOLD = 1000;
const BULK_DISCOUNT = 0.9;
function applyDiscount(amount, quantity) {
let price = amount * DISCOUNT_RATE;
if (quantity > BULK_THRESHOLD) {
price = price * BULK_DISCOUNT;
}
return price;
}
function calculateTotal(items, quantity) {
return items.reduce((sum, item) => {
return sum + applyDiscount(item, quantity);
}, 0);
}
আসুন Python-এ একটি সাধারণ উদাহরণ দেখি। ফাংশনটি অর্ডার প্রক্রিয়া করে কিন্তু খারাপভাবে করে: 80 লাইন, গভীর নেস্টিং, যাদু সংখ্যা, পুনরাবৃত্তি। রিফ্যাক্টরিংয়ের পরে, কোডটি পঠনযোগ্য, পরীক্ষাযোগ্য এবং রক্ষণাবেক্ষণযোগ্য হয়ে ওঠে।
# খারাপ কোড — একটি ফাংশন সবকিছু করে
def process_order(order):
if order.get("type") == "premium":
if order["amount"] > 100:
discount = 0.8
else:
discount = 0.9
else:
discount = 1.0
total = order["amount"] * discount
return total
# পরিষ্কার কোড — নেওয়া ফাংশন এবং ধ্রুবক
class OrderProcessor:
PREMIUM_DISCOUNT_HIGH = 0.8
PREMIUM_DISCOUNT_LOW = 0.9
PREMIUM_THRESHOLD = 100
def get_discount(self, order):
if order.type == "premium" and order.amount > self.PREMIUM_THRESHOLD:
return self.PREMIUM_DISCOUNT_HIGH
return self.PREMIUM_DISCOUNT_LOW
def calculate_total(self, order):
return order.amount * self.get_discount(order)
একটি ভাল ফাংশন একটি কাজ করে এবং তা ভালভাবে করে। যদি একটি ফাংশন তিনটি ভিন্ন কাজ করে — এটি বিভক্ত করুন। যদি একটি ফাংশনে 20টির বেশি লাইন থাকে — সম্ভবত এটি বিভক্ত করা যেতে পারে। যদি একটি ফাংশনে দুইটির বেশি ইন্ডেন্টেশন স্তর থাকে — এটির রিফ্যাক্টরিং প্রয়োজন।
স্ট্যাটিক কোড বিশ্লেষকগুলি খারাপ কোডের বিরুদ্ধে প্রতিরক্ষার প্রথম লাইন। ESLint (JavaScript), Pylint (Python), SonarQube (বহু-ভাষা), Checkstyle (Java) স্বয়ংক্রিয়ভাবে কপি-পেস্ট, যাদু সংখ্যা, খালি ক্যাচ ব্লক, অত্যধিক দীর্ঘ ফাংশন এবং আরও শত শত অ্যান্টিপ্যাটার্ন সনাক্ত করে।
কোড স্টাইল এবং ফর্ম্যাটারগুলি সুরক্ষার দ্বিতীয় স্তর। Prettier, Black, gofmt স্বয়ংক্রিয়ভাবে কোড ফর্ম্যাট করে, স্পেস, ইন্ডেন্টেশন এবং বন্ধনীর সমস্যাগুলি দূর করে। দলে একটি সামঞ্জস্যপূর্ণ শৈলী এটি কে লিখেছে তা নির্বিশেষে কোডকে পঠনযোগ্য করে তোলে। ফর্ম্যাটিং নিয়ে বিতর্কগুলি স্বয়ংক্রিয় হওয়া উচিত।
কোড রিভিউ তৃতীয় এবং সবচেয়ে গুরুত্বপূর্ণ স্তর। কোনও বিশ্লেষক সেই মানুষটিকে প্রতিস্থাপন করতে পারে না যে লক্ষ্য করে যে সমাধানের আর্কিটেকচার ভুল বা ডেভেলপার ভুল পদ্ধতি বেছে নিয়েছে। কার্যকর পর্যালোচনা সময় নেয়, কিন্তু এটি খারাপ কোডের পরিমাণ উল্লেখযোগ্যভাবে হ্রাস করে তার মূল্য ফিরিয়ে দেয়।
সচরাচর জিজ্ঞাস্য
অত্যন্ত বিরল। প্রোটোটাইপিং বা হ্যাকাথনে, গতি গুণমানের চেয়ে গুরুত্বপূর্ণ, তবে এই ধরনের কোডকে অস্থায়ী হিসাবে চিহ্নিত করা উচিত এবং রিফ্যাক্টরিং ছাড়া উৎপাদনে যাওয়া উচিত নয়। উৎপাদনে, খারাপ কোডের জন্য কোনও অজুহাত নেই — এখন সংরক্ষিত যে কোনও সময় ভবিষ্যতে বহুগুণ ক্ষতিতে পরিণত হবে।
শিক্ষানবিশের কোড অনভিজ্ঞ কিন্তু প্রায়শই আন্তরিক কোড যা দক্ষতা বৃদ্ধির সাথে উন্নত হয়। খারাপ কোড হল গুণমানের প্রতি সচেতন বা উদাসীন অবহেলা। একজন শিক্ষানবিশ উপ-অনুকূল কিন্তু পঠনযোগ্য কোড লিখতে পারে। অন্যদিকে, খারাপ কোড মৌলিকভাবে অপাঠ্য — এর লেখক অন্যেরা এটি বোঝে কিনা তা নিয়ে চিন্তা করেন না।
পুনর্লিখন শেষ উপায়। ধীরে ধীরে রিফ্যাক্টরিং বেশি নিরাপদ: আপনি একটি মডিউল আলাদা করেন, এটি পরীক্ষা দিয়ে কভার করেন, টুকরো টুকরো পুনরায় লেখেন। সম্পূর্ণ পুনর্লিখন ঝুঁকিপূর্ণ — আপনি পুরানো কোডে সঞ্চিত ব্যবসায়িক যুক্তি হারাতে পারেন, যার মধ্যে এজ কেস হ্যান্ডলিং রয়েছে যা কেউ ডকুমেন্ট করেনি।
মেট্রিক ব্যবহার করুন: SonarQube ঘন্টায় প্রযুক্তিগত ঋণ দেখাবে। দেখান পুরানো কোডে বাগগুলিতে কত সময় ব্যয় হয়। প্রকল্পের “পরিষ্কার” এবং “নোংরা” অংশে নতুন বৈশিষ্ট্য বিকাশের গতি তুলনা করুন। ব্যবসায়িক ভাষায় অনুবাদ করুন: সময় অর্থ, এবং খারাপ কোড অর্থ ব্যয় করে।
«ক্লিন কোড» রবার্ট মার্টিন (2008) গুণমান প্রোগ্রামিংয়ের বাইবেল। এতে নামকরণের নীতি, ফর্ম্যাটিং, ত্রুটি ব্যবস্থাপনা এবং পরীক্ষা কভার করা হয়েছে। অতিরিক্ত: স্টিভ ম্যাককনেলের «কোড কমপ্লিট», মার্টিন ফাউলারের «রিফ্যাক্টরিং», গ্যাং অফ ফোরের «ডিজাইন প্যাটার্নস»। প্রতিটি ডেভেলপারের এই বইগুলি পড়া উচিত।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।