SL3 Framework

Problem Solving Strategy

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


Problem is not A Problem

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

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

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


Problem Solving Steps

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

সর্বমোট ছয়টা স্টেপে আমরা যে কোনো সমস্যাকে সমাধান করতে পারি -

  1. Understant The Problem
  2. Breakdown The Problem
  3. Writedown The Problem
  4. Breakdown The Solution
  5. Writedown The Solution
  6. Implement The Solution

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

সমস্যাঃ আরিফ সাহেব একজন ফরেক্স ট্রেডার। শেয়ার মার্কেট সম্পর্কেও তিনি অনেক জ্ঞান রাখেন। বিগত ১৫ বছর ধরে দক্ষতার সাথে তিনি ফরেক্স মার্কেটে নিজের অবস্থান ধরে রেখেছেন। তিনি সিদ্ধান্ত নিয়েছেন নিজেই একটি ফরেক্স ব্রোকার সাইট তৈরি করবেন। যেখানে তিনি মার্কেট এনালাইসিসের জন্য অত্যাধুনিক সব টুলস প্রোভাইড করবেন। তিনি জানেন মার্কেটের প্রাইস আপডাউন হয় গোল্ডেন রেশিও মেনে। তাই তিনি ডেভেলপারকে বললেন এমন একটি প্লাগইনস তৈরি করতে যেটা গোল্ডেন রেশিও ক্রস করলেই যেন তাকে একটা ইমেইল পাঠায়ে দেয়।

ডেভেলপার খুঁজে দেখলেন গোল্ডেন রেশিও বের করার জন্য দরকার ফিবোনাকি সিরিজ। ফিবোনাকি সিরিজে প্রথম দুইটা নাম্বার একেবারে ফিক্সড। এই সিরিজের প্রথম ভ্যালু ০ এবং দ্বিতীয় ভ্যালু ১। তার পর থেকে প্রথম আর দ্বিতীয় ভ্যালু যোগ করেই চলতে থাকবে। মানে, তৃতীয় ভ্যালু ০+১=১, চতুর্থ ভ্যালু ১+১=২, পঞ্চম ভ্যালু ১+২=৩ এই ভাবে করে সিরিজ চলতে থাকবে। এখন ডেভেলপারের কাজ হচ্ছে একটা নাম্বার ইনপুট দেওয়া এবং অত তম সংখ্যায় ফিবোনাকি সিরিজের কোন সংখ্যাটা আছে সেটা খুঁজে বের করা।

সমাধানঃ এখন আমরা ওপরের বর্ণিত সমস্যাকে আমাদের স্টেপ গুলোর মাধ্যমে সমাধান করার চেষ্টা করবো।


Understand The Problem:

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


Breakdown The Problem:

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

ওপরের সমস্যাকে যদি আমরা ব্রেকডাউন করি তাহলে আমাদের জন্য কাজের লাইন গুলো হচ্ছে "এই সিরিজের প্রথম ভ্যালু ০ এবং দ্বিতীয় ভ্যালু ১। তার পর থেকে প্রথম আর দ্বিতীয় ভ্যালু যোগ করেই চলতে থাকবে। মানে, তৃতীয় ভ্যালু ০+১=১, চতুর্থ ভ্যালু ১+১=২, পঞ্চম ভ্যালু ১+২=৩ এই ভাবে করে সিরিজ চলতে থাকবে"। এই লাইন গুলোর ভিতরেই বলে দেওয়া আছে আমাদের কয়টা ভ্যারিয়েবল দরকার হবে, সমস্যা সমাধানের লজিকটা কি এবং আমাদের কি করতে হবে।


Writedown The Problem:

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

ওপরের সমস্যাকে যদি আমি আমার মতো করে লিখি তাহলে যেটা দাঁড়ায় - "ফিবোনাকি সিরিজের প্রথম ভ্যালু হচ্ছে ০ এবং দ্বিতীয় ভ্যালু হচ্ছে ১। প্রথম ভ্যালু এবং দ্বিতীয় ভ্যালু যোগ করলে আমি তৃতীয় ভ্যালু পাবো। এই সূত্র মেনে আমি যে কোনো তম নাম্বারের জন্য ফিবোনাকি নাম্বার বের করতে পারি।"


Breakdown The Solution:

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

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


Writedown The Solution:

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

যদি ওপরের সমস্যাকে আমরা সুডো কোডে রূপান্তর করতে চাই তাহলে নিচের মতো করে লিখতে পারি -

START
RANGE = 10
FIRST_NUMBER = 0
SECOND_NUMBER = 1
IF RANGE IS SMALLER THAN 0:
PRINT "INCORRECT RANGE"
ELSE IF RANGE IS EQUAL TO ZERO:
PRINT FIRST_NUMBER
ELSE IF RANGE IS EQUAL TO ONE:
PRINT SECOND_NUMBER
ELSE:
LOOP I=2 TO RANGE:
THIRD_NUMBER = FIRST_NUMBER + SECOND_NUMBER
FIRST_NUMBER = SECOND_NUMBER
SECOND_NUMBER = THIRD_NUMBER
I++
PRINT SECOND_NUMBER
END

Implement The Solution:

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


সি প্রোগ্রাম

#include <stdio.h>
int main() {
int range = 10, i;
int first_number = 0, second_number = 1, third_number;
if (range < 0)
{
printf("Invalid Input");
}
else if (range == 0)
{
printf("%d", first_number);
}
else if (range == 1)
{
printf("%d", second_number);
}
else
{
for (i=2; i<=range; i++)
{
third_number = first_number + second_number;
first_number = second_number;
second_number = third_number;
}
printf("%d", second_number);
}
return 0;
}

জাভা প্রোগ্রাম

public class Main {
public static void main(String [] args) {
int range = 10;
int firstNumber = 0, secondNumber = 1;
if (range < 0) {
System.out.println("Invalid Input");
} else if (range == 0) {
System.out.println(firstNumber);
} else if (range == 1) {
System.out.println(secondNumber);
} else {
for (int i=2; i<=range; i++) {
int thirdNumber = firstNumber + secondNumber;
firstNumber = secondNumber;
secondNumber = thirdNumber;
}
System.out.println(secondNumber);
}
}
}

জাভাস্ক্রিপ্ট প্রোগ্রাম

const range = 10;
let firstNumber = 0,
secondNumber = 1;
if (range < 0) {
console.log('Invalid Input');
} else if (range == 0) {
console.log(firstNumber);
} else if (range == 1) {
console.log(secondNumber);
} else {
for (let i = 2; i <= range; i++) {
let thirdNumber = firstNumber + secondNumber;
firstNumber = secondNumber;
secondNumber = thirdNumber;
}
console.log(secondNumber);
}

পাইথন প্রোগ্রাম

range = 10
firstNumber, secondNumber = 0, 1
if range < 0:
print("Invalid Input")
elif range == 0:
print(firstNumber)
elif range == 1:
print(secondNumber)
else:
for i in range(2, range+1):
thirdNumber = firstNumber + secondNumber
firstNumber = secondNumber
secondNUmber = thirdNumber
print(secondNumber)

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

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

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

Edit this page on GitHub