The Term “Good Programming” — in a nutshell in Bangla

‘ভালো প্রোগ্রামিং কি?’ — এ নিয়ে দু’টি কথা

This article was originally posted in my personal blog. You can find the English version here

প্রোগ্রাম সবাই লিখে, বিশেষ করে আমরা যারা কম্পিউটার সায়েন্স কিংবা ওয়েব ডিজাইন ও ডেভেলপমেন্ট এর সাথে জড়িত তাঁরা সবাই কম বেশী প্রোগ্রামিং করে থাকি। তবে, ভালো প্রোগ্রাম লিখতে কিন্তু সবাই পারে না।

এর অন্যতম কারণ হলো ভালো কোড লিখতে হলে সময় ও রিসোর্স লাগে। কিন্তু প্রায়শঃ বিভিন্ন কোম্পানীতে কিংবা কর্মক্ষেত্রে এই বাড়তি সময় ব্যয়কে অপচয় মনে করা হয়। মজার ব্যাপার হলো — দেখতে ও পড়তে বিশ্রী এমন কোড দিয়েও কিন্তু দিব্যি কাজ চালিয়ে নেয়া যায়। যেটা ঐ সব ক্ষেত্রে, ঋণাত্মক প্রভাবকের ভূমিকা পালন করে। এমন অনেক কোম্পানী আছে যেখানে ডেভেলপাররা ১০ বছরের পুরনো কোন বিশাল দৈত্যাকার কোডবেইস কে এখনো পরিচর্যা করছে! এবং ঐ কোডবেইসের উপর ভিত্তি করে পাওয়া বিভিন্ন বাগ ট্রেইস কিংবা নতুন ফিচার ডেভেলপমেন্ট করতে গিয়ে মাথার চুল ছিঁড়ছে প্রতি নিয়ত। অনেক ক্ষেত্রে, ঐ ঐতিহাসিক কোডবেইস পুরোপুরিভাবে ব্যবহার অনুপযোগী না হওয়া পর্যন্ত কিংবা ভালো বিকল্প ব্যবস্থা না পাওয়া পর্যন্ত এটা চলতে থকে।

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

উপরের ফেইসবুকের উদাহরণ থেকেই দেখা যাচ্ছে, ভালো কোড এর জন্যে সময় ব্যয় করলে তা পরবর্তীতে ভালো ফল দেয়। এক্ষেত্রে, আরো একটা উদাহরণ দিইঃ

যখন আমি আমার প্রথম ল্যাপটপটি গিফট পাই, তখন আমি শুধু দুই তর্জনী দিয়ে টাইপ করতাম, কি বোর্ড দেখে দেখে। টাইপিং স্পীড ছিলো ১০-১৫ শব্দ প্রতি মিনিটে। পরবর্তী ৩-৪ মাসে ব্যবহার করতে করতে দুই আঙ্গুল দিয়েই রীতিমত ৩৫-৪০ শব্দ প্রতি মিনিটে উন্নীত হয়। এটা দিয়ে কাজ চলে যেত কিন্তু এর পরে স্পীড কেমন যেন থমকে গেলো… দুই আঙ্গুলে ৫০ শব্দ প্রতি মিনিট করা অনেক কষ্ট সাধ্য ছিলো (অন্ধকার রুম মানেই বিভীষিকা)। পরে একদিন চিন্তা করলাম দুই আঙ্গুলে অনেক হলো এবার ঠিক মতো টাইপিং শিখি। সুতরাং, অনুশীলন শুরু হলো। সব আঙ্গুল ব্যবহার করে না দেখে টাইপ করা প্রথম দিকে অনেক পেইনফুল ছিলো। স্পীড ড্রপ করে ৫-১০ শব্দে চলে আসলো। ১০ টা শব্দ লিখতে ১০০ বার ব্যাকস্পেস চাপতে হতো। সময় ও অনেক বেশী লাগতো। এভাবে, ১ মাস চলে গেলো। ধীরে ধীরে টাইপিং করার ধকল ও ব্যাকস্পেসের সংখ্যা কমতে লাগলো এবং স্পীড ও একুরেসী ইম্প্রোভ হতে লাগলো। বর্তমানে আমি টাচ টাইপিং করতে শিখেছি এবং এভারেজ টাইপিং স্পীড ৭৫-৮০ এর কাছাকাছি থাকে।

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

অনেক তো হলো এবার মূল টপিকেই ফিরে যাইঃ

কিভাবে বুঝবো আমার কোড ভালো নাকি খারাপ?

এ প্রশ্নের উত্তর খুবই সাধারণ! নিচের ছবিতে দেখুনঃ

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

চলুন তবে, এবার আমরা ভালো কোডের কিছু বৈশিষ্ট্য নিয়ে আলোচনা করিঃ

  • মার্জিত ও যত্নপূর্ণ কোড — ভালো কোড পড়তেই আনন্দ লাগবে। অনেকটা গল্পের মতই শৈল্পিক। মনে হবে, কেউ যেনো অত্যন্ত যত্নের সাথেই বিস্তারিত তথ্যের প্রতি গুরুত্ব দিয়ে নিপুণভাবে কোডের মাধ্যমে এপ্লিকেশান বা সফটওয়ারটি গড়ে তুলেছে
  • ফোকাসড কোডিং — এটা ভালো কোডের অন্যতম বৈশিষ্ট্য। প্রতিটা ফাংশন, প্রতিটা ক্লাস কিংবা প্রতিটা মডিউল একটা নির্দিষ্ট বিষয়বস্তু কে কেন্দ্র করেই আবর্তিত হবে
  • টেস্ট — কোডের সাথে সাথে কোড সংশ্লিষ্ট মৌলিক ও গুরুত্বপূর্ণ টেস্টগুলো অবশ্যই থাকবে এবং টেস্ট গুলো ঠিক ভাবে রানও করবে।
  • রিপিটেড কোড থাকবে না — অর্থাৎ কোডটি DRY আদর্শের উপর ভিত্তি করেই লেখা হবে। অর্থাৎ কোন ডুপ্লিকেশান থাকবে না।
  • সিম্পল ও অপ্টিমাল — কোড হবে খুবই সাধারণ, এবং সর্বনিম্ন সংখ্যক ফাংশন, ক্লাস কিংবা এন্টিটি নিয়ে গঠিত।
  • সীমিত ও সংক্ষিপ্ত কমেন্ট — এ ছাড়াও অনেক জ্ঞ্যানীগুণী ব্যক্তিরা বলে থাকেন, ভালো কোডে কমেন্ট লাগে না! কোড দেখলেই যে কেউ বুঝতে পারে কোডটার কাজ কি!

কিভাবে ভালো কোড লিখবো?

ভালো কোডের বৈশিষ্ট্যগুলো তো জানলাম এবার, আসি ভালো কোড কিভাবে লিখতে হবে সে বিষয়েঃ

অর্থপূর্ণ নাম

ভেরিয়েবলের নাম — নামের অর্থের সাথে কাজের মিল থাকতে হবে। সংক্ষিপ্ত নাম ব্যবহার করতে হবে, যাতে করে ভ্যারিয়েবল, ফাংশন, ক্লাসের নাম গুলো দেখেই এদের কাজ গুলো বুঝা যায়। নিচের উদাহরণটি দেখুনঃ

s = 60000
m = 12
y = s * m

এবার পরবর্তী উদাহরণটি দেখুনঃ

salary = 60000
month = 12
yearly_income = salary * month

কোন কোডটি দেখে বুঝতে কম সময় লেগেছে? খেয়াল করে দেখবেন, কোড দুটিতে সব অপারেটর কিন্তু একই, শুধুমাত্র ভেরিয়েবলের নাম এর জন্যেই দ্বিতীয় কোডটি প্রথম কোড থেকেও ভালোভাবে বুঝা যাচ্ছে। এবার প্রথম কোডটির নিচের ভার্সন দেখুনঃ

s = 60000 // Salary of the user
m = 12 // number of months
y = s * m // calculated yearly income

আগের কোডটির চেয়ে আরেকটু ক্লিয়ার হলেও, সমস্যা কিন্তু সমস্যাই রয়ে গেছে। ধরেন, এইবার একই কোডের দুইশত নিরানব্বই নাম্বার লাইনে গিয়ে যদি আবার আপনাকে উপরের যেকোনো একটা ভেরিয়েবল ব্যবহার করতে হয় সেক্ষেত্রে, হয় আপনাকে মনে রাখতে হবে s, m ও y এর কাজ কি না হয়, স্ক্রল করে আবার উপরে গিয়ে ভেরিয়েবলগুলোর ডেফিনিশান চেক করতে হবে নতুবা, আপনাকে আবার একটা কমেন্ট লিখতে হবে। সুতরাং বুঝতেই পারছেন, যখনই এমন সিচুয়েশান দেখবেন অর্থাৎ, এমন ভেরিয়েবল লিখলেন যেটার জন্যে আপনাকে এক্সট্রা একটা কমেন্ট করতে হচ্ছে তখনি ঐ ভেরিয়েবল এর নাম নিয়ে ব্রেইনস্ট্রম করে নামটা সেট করে নিবেন এই এক্সট্রা চিন্তার কারণে ব্যয় করা সময় পরবর্তীতে অনেক অনেক ঘণ্টার অপচয় থেকে আপনাকে বাঁচাবে।

ফাংশনের নাম — ভালো ফাংশনের বৈশিষ্ট্য হলোঃ শুধুমাত্র একটা কাজ করা এবং ঐ কাজটি ভালোভাবে করা। যেহেতু ফাংশনের কাজই হলো ক্রিয়া সম্পাদন তাই, ফাংশনের নাম ও হতে হবে ক্রিয়া পদের। উদাহরনঃ delete_user(), make_payment()

ক্লাসের নাম — ক্লাসের নাম হতে হবে বিশেষ্যপদের, ফাংশনের মতো ক্রিয়াপদের নাম ক্লাসের ক্ষেত্রে প্রযোজ্য নয়। এছাড়াও, মনে রাখতে হবে শুধুমাত্র নামবাচক বিশেষ্য ব্যবহার করা উত্তম গুণবাচক বিশেষ্য এড়িয়ে চলা উচিত। উদাহরনঃ AbstractUser ইত্যাদি।তবে এ ধরনের নামগুলো পরিহার করা উচিত যেমন - Manager, Info

আরেকটা গুরুত্বপূর্ণ বিষয় হলোঃ নামের ক্ষেত্রে যেকোনো একটি শব্দ সিলেক্ট করে সেটাকে বার বার ব্যবহার করলে, দ্বিধান্মিত কিংবা বিভ্রান্ত হওয়া থেকে রক্ষা পাওয়া যায়। মনে করেন আপনি একটি এপি আই ডিজাইন করছেন, সে ক্ষেত্রে আপনি যদি create, update, delete শব্দগুলো ব্যবহার করেন আবার সে সাথে সাথে add, modify, remove ও ব্যবহার করেন সে ক্ষেত্রে এপিআই ইউজার কিন্তু বিভ্রান্ত হবে এবং, বার বার ডকুমেন্টেশান চেক করতে করতে হতাশ বা, বিরক্ত হয়ে যাবে।

ফাংশন নিয়ে আরো কিছু কথা

ফাংশন লেখার শুরুতেই মাথায় রাখতে হবে, ফাংশনকে হতে হবে ছোট এবং সংক্ষিপ্ত। এ রুল কিন্তু ফাংশনের ভিতরে যে loop বা if else স্টেটমেন্টগুলোও সেগুলোর ক্ষেত্রেও প্রযোজ্য অর্থাৎ ঐগুলোকেও ছোট হতে হবে। এমন হতে পারে ঐ গুলো একলাইনের অন্য কোন ফাংশন কল। আরেকটা জিনিস হলো ফাংশনের আর্গুমেন্ট ৩ এর বেশী হওয়া উচিত নয়। যদি দেখেন, কোন একটা ফাংশনের আর্গুমেন্ট অনেকগুলো তাহলে, সাথে সাথে বুঝে নিবেন ঐ ফাংশন মাত্রাতিরিক্ত কাজ করছে এবং, ছোট কয়েকটি ফাংশনে বিভক্ত করে নেওয়া উত্তম হবে।

— -

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

Author:

Wasi Mohammed Abdullah

Thinker, Day Dreamer, Python Enthusiast, Javascript Admirer, 
An Introvert with Exception!

CEO, Founder 
Dreamcatcher IT
twitter: twitter.com/wasi0013
facebook: fb.me/WasiMohammedAbdullah