<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Monirul Islam</title>
    <description>The latest articles on DEV Community by Monirul Islam (@mislam-dev).</description>
    <link>https://dev.to/mislam-dev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F914471%2Fb32f9d03-cedb-4d6e-9d36-c7d36b7ff0cd.JPG</url>
      <title>DEV Community: Monirul Islam</title>
      <link>https://dev.to/mislam-dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mislam-dev"/>
    <language>en</language>
    <item>
      <title>Day 6 — API Security — এই ভুলগুলো করলে production-এ কাঁদতে হবে</title>
      <dc:creator>Monirul Islam</dc:creator>
      <pubDate>Thu, 10 Sep 2026 18:20:00 +0000</pubDate>
      <link>https://dev.to/mislam-dev/day-6-api-security-ei-bhulgulo-krle-production-e-kaandte-hbe-2ii2</link>
      <guid>https://dev.to/mislam-dev/day-6-api-security-ei-bhulgulo-krle-production-e-kaandte-hbe-2ii2</guid>
      <description>&lt;p&gt;মনে করুন আপনারা ৪ ভাই। সবাই একসাথেই বসবাস করেন। সৌভাগ্যক্রমে আপনাদের বাবার huge পরিমাণে সম্পদ আছে এবং সম্পদের কারণে না চাইতেও অনেক শত্রু হয়ে গেছে। এখন তাদের নজর আপনাদের এই সম্পত্তির ওপরে। তারা আপনাদের ক্ষতি করতে চায়, সম্পত্তি হাতিয়ে নিতে চায়। এখন তারা কিছুই করতে পারে না। কারণ আপনারা সবাই একসাথে থাকেন।&lt;/p&gt;

&lt;p&gt;এখন আপনারা ৪ ভাই যদি আলাদা হয়ে যান এবং গ্রামে বিভিন্ন অংশে move করেন তাহলে কী হতে পারে?&lt;/p&gt;

&lt;p&gt;এখন আপনাদের যে শত্রুরা আছে তারা খুব easily-তেই আপনাদের ক্ষতি করতে পারবে। বিভিন্নভাবে আপনাদের ওপর হামলা করবে। তাই বলে কি এগুলো রুখে দেয়া যাবে না? অবশ্যই যাবে, যদি আপনি proper way-তে security maintain করেন।&lt;/p&gt;

&lt;p&gt;এখন same way-তে একটা application যখন একসাথে থাকে তখন তার security maintain করা একটু easy। কিন্তু যখন আপনি separate করবেন তখন কিন্তু এর security নিয়ে একটা issue থেকেই তৈরি হবে। উপরের গল্পের মতো hacker-রাও এই issue-গুলো খুঁজে বের করে আপনার application-এর damage করবে। তবে proper standard maintain করলে এই hacker attack থেকে application-কে protect করা যাবে।&lt;/p&gt;

&lt;p&gt;আজকে মূলত API security নিয়ে কথা বলবো।&lt;/p&gt;




&lt;h2&gt;
  
  
  Authentication vs Authorization
&lt;/h2&gt;

&lt;p&gt;Authentication সম্পর্কে মোটামুটি সবাই জানি। কোনো application-এ user_id এবং password দিয়ে access নেয়াই হচ্ছে authentication। কিন্তু এই authorization-টা হচ্ছে authentication-এর পরের step।&lt;/p&gt;

&lt;p&gt;একটা office-এর ভেতরে কিন্তু অনেক employee থাকে, সবাই কি সবকিছু ইচ্ছা করলেই করতে পারে? তাদের কি সবার authority আছে?&lt;br&gt;
অবশ্যই না। এখন manager যা যা করতে পারবে সেই same কাজ যদি একজন সাধারণ employee করতে পারে তাহলে তো office-এ অরাজকতার সৃষ্টি হবে। Management-এর অবস্থা খারাপ হয়ে যাবে। এই যার যে যে access, ঐগুলো বাদে অন্য কিছুর access ensure করাই হচ্ছে Authorization।&lt;/p&gt;

&lt;p&gt;API-এর authorization-এর ক্ষেত্রে authorization URL বা resource-এর access maintain করতে হয়। Suppose user related যে resource-গুলো আছে সেগুলো শুধুমাত্র admin-ই access করতে পারবে, এই access তো একটা সাধারণ user পেতে পারে না। এটা ensure করাই হচ্ছে API-এর authorization।&lt;/p&gt;

&lt;p&gt;একটা application-এর উদাহরণ দিলে easily মনে রাখতে পারবেন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication মানে হচ্ছে আপনি এই application-টা use করতে পারবেন কি না সেটা check করা।&lt;/li&gt;
&lt;li&gt;Authorization মানে হচ্ছে আপনি কী কী feature/functionality access করতে পারবেন সেগুলো check করা।&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  OWASP Top 10: সবচেয়ে বড় ভুলগুলো
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;OWASP&lt;/strong&gt; প্রতি বছর top security vulnerabilities publish করে।&lt;br&gt;
এখানে নানা security-এর মধ্যে top 10 security issue-গুলো নিয়ে বিস্তারিত থাকে। সাথে তার solution-ও সেখানে বিদ্যমান থাকে। তাই API security ensure করার জন্য এই OWASP report-টা খুব কাজে আসে। নিচে কয়েকটা common security issue নিয়ে আলোচনা করি:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Broken Authentication&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;weak password&lt;/li&gt;
&lt;li&gt;no token expiry (অনেক ক্ষেত্রে expiry set করলেও তা check করা হয় না।)&lt;/li&gt;
&lt;li&gt;plain text password storage (password hash না করেই database-এ store করা)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;SQL Injection&lt;/strong&gt; — URL-এর মাধ্যমে or POST request-এর মধ্যে malicious &lt;strong&gt;SQL clause&lt;/strong&gt; inject করা হয়, যেটা server-side database সেটাকে valid SQL হিসেবে execute করে ফেলে। এটাই হচ্ছে SQL Injection। এভাবে attacker চাইলে data চুরি করতে পারে, authentication bypass করতে পারে, এমনকি পুরো table drop করে দিতে পারে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Broken Access Control&lt;/strong&gt; — এটা authorization problem। কোন user-এর কোন access থাকবে সেটা control না করা। একজন admin-ও যা যা করতে পারে আবার একজন simple user-ও same করতে পারে।&lt;/p&gt;


&lt;h2&gt;
  
  
  Rate Limiting: বোকাদের বোকা বানানো
&lt;/h2&gt;

&lt;p&gt;একটা জিনিস চিন্তা করুন আপনি একটা API-কে access করছেন। এখন আপনার ১ মিনিটে কতবার access করা লাগতে পারে? আপনি তো প্রতি sec-এ access করবেন না। মিনিটে maximum ১৫-২০ বার access করবেন। এর বেশি যদি করেন সেটা unnecessary। কিন্তু আপনি না বুঝেই করছেন এই কারণে server-এর resource নষ্ট হচ্ছে। কিছু user-এর application use করতে problem হচ্ছে। তা এখন আমি যদি বলে দিই যে আপনি ১ মিনিটে maximum ১০ বারের বেশি access করতে পারবেন না, এর বেশি করলে error দেখাবে। So এটাই হচ্ছে rate limiting-এর concept।&lt;/p&gt;

&lt;p&gt;আবার একটা বিষয় চিন্তা করেন একটা application login করার ক্ষেত্রে আপনি login করতে password + username type করে কতক্ষণ লাগতে পারে? normally ১ মিনিটে ৩-৪ বারের বেশি কেউ login করার try করতে পারবে না। আর password save থাকলে তো একবারেই হয়ে যাবে।&lt;/p&gt;

&lt;p&gt;নিচে rate limiting-এর একটা code দেয়া হলো। এটা NestJS-এর ওপরে দেয়া আছে।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// NestJS + nestjs-throttler&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Throttle&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60000&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ওপরে দেয়া ২টা example আসলে দুইটা hacking attack।&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;প্রথমটা হচ্ছে DDoS attack, এই attack-এ bot-এর মাধ্যমে request send করে server-কে busy করা হয়। একটা সময় server resource শেষ হয়ে যায় এবং server down হয়ে যায়। Rate limiting করলে যখন request limit শেষ হবে, request processing হবে না, error দিবে।&lt;/li&gt;
&lt;li&gt;দ্বিতীয়টা হচ্ছে brute force attack, এই attack-এ password and username দিয়ে বারবার try করা হয়। যতবার try করা হয় ততবার request server-এ যেতে থাকে। এখন এটা manually করা possible না। Script দিয়ে করা লাগবে। যখন request limit শেষ হবে, request processing হবে না, error দিবে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এখানে একটা বিষয় মাথায় রাখা জরুরি যে rate limiting-এর সাহায্যে এই দুইটা attack foolproof-ভাবে prevent করা যায় না। তবে attack-এর speed কিছুটা কমানো যায়।&lt;/p&gt;




&lt;h2&gt;
  
  
  CORS: Browser-এর নিরাপত্তা প্রহরী
&lt;/h2&gt;

&lt;p&gt;মনে করুন আপনার একটা website আছে + একটা backend API-ও আছে। এখন আপনি চাচ্ছেন ঐ website বাদে অন্য কোনো website যেন আমার এই API-তে request দিতে না পারে। মানে শুধু আপনার website-এর জন্য access দিবেন। এটা করা possible। এই কাজটাই করে CORS।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CORS (Cross-Origin Resource Sharing)&lt;/strong&gt; হলো browser-এর একটা security feature।&lt;br&gt;
এটা শুধুমাত্র browser-এ support করে। কিন্তু এটা কিন্তু frontend-এর problem না। এটাকে backend থেকেই solve করতে হবে।&lt;/p&gt;

&lt;p&gt;আসলে browser কীভাবে এটা process করে সেটা বুঝলে problem solve করা যাবে। Browser যখন request send করে, send করার পরে backend থেকে response পাঠায় সেখানে body থাকে, header থাকে। এই header-এর মধ্যেই browser কয়েকটা field search করে। তার মধ্যে উল্লেখযোগ্য হচ্ছে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access-Control-Allow-Origin: এখানে উল্লেখ থাকে কোন কোন domain API access করতে পারবে। এখন যে domain থেকে request গেছে তার নাম যদি এই list-এ না থাকে তাহলে CORS error দেখাবে।&lt;/li&gt;
&lt;li&gt;Access-Control-Allow-Methods: এখানেও same logic but এখানে method-এর নাম check করে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;তবে একটা বিষয় অনেক সময়, অন্য কারণেও CORS-এর দেখা যেতে পারে। Browser এই header-গুলো না পেলেই সে CORS error দেখায়। বাকি বিষয়গুলো মাথা ব্যথা নেই। একটা personal experience share করি তাহলে বুঝতে পারবেন।&lt;/p&gt;

&lt;p&gt;আমি একটা VPS-এ Nginx setup করে, একটা frontend application host করেছি। কিন্তু কোনো POST request গেলেই CORS error শুধু CORS। কিন্তু backend-এ একদম ঠিকঠাক আছে। প্রায় ৩-৪ ঘণ্টা try করার পরে discover করলাম, application থেকে প্রায় ৪০-৫০MB-এর data server-এ যাচ্ছে। কিন্তু Nginx by default-ভাবে data size 10MB set করে রাখছে। যে কারণে Nginx request return করে দিচ্ছে। আর browser header পাচ্ছে না বলে CORS error-ই show করছে। সেটা ঠিক করার পরে সব ঠিক হয়ে গেছে।&lt;/p&gt;

&lt;p&gt;অতএব, backend-এ CORS configure করলেও অনেক ক্ষেত্রে CORS-এর error দেখা যেতে পারে। একটু carefully handle করা দরকার।&lt;/p&gt;
&lt;h3&gt;
  
  
  Browser Preflight Request
&lt;/h3&gt;

&lt;p&gt;Browser থেকে যখন কোনো write request (POST, PUT, PATCH, DELETE) server-এ যায় তখন সেই request send করার আগে একটা request send করা হয়ে থাকে। এই request-টা &lt;code&gt;OPTIONS&lt;/code&gt; method-এ send হয়ে থাকে। এই request-টাকে preflight request বলে। এই method-এর মাধ্যমে check করা হয় যে, browser এই request send করার জন্য allowed কি না।&lt;br&gt;
ওপরের মতো যদি এই request-এর response header-এ &lt;code&gt;Access-Control-Allow-Origin&lt;/code&gt; না থাকে, তাহলে browser সাথে সাথে CORS error throw করবে এবং actual write (POST, PUT, PATCH, DELETE) request server-এ send-ই হবে না।&lt;br&gt;
কোনো কারণে যদি server preflight-এ 404 response throw করে, তাহলেও same problem show করবে। এই জন্য server-এ এই method-টা handle করা অত্যন্ত জরুরি।&lt;/p&gt;


&lt;h2&gt;
  
  
  Hashing: Password কখনো plain text রাখবেন না
&lt;/h2&gt;

&lt;p&gt;একটা situation দিই আপনাকে, আপনার server সেই আকারে secure কোনো vulnerability নেই। এখানে আপনি একটা কাজ করেছেন আপনি user-দের password plain text হিসেবে database-এ store করেছেন। এই situation-এ আপনার server তো hack করতে পারবে না। কিন্তু আপনার database server hack হয়ে গেলো। এবং এখানে আপনার application-এর database-এর user table publish হয়ে গেলো। তাহলে ব্যাপার কী দাঁড়ালো?&lt;/p&gt;

&lt;p&gt;Hacker user-দের name + password দুইটাই পেয়ে গেলো। তাহলে আপনার backend এত secure করেও লাভ হলো না। এই অবস্থায় আপনার application-এর কী হবে বুঝতেই তো পারছেন।&lt;/p&gt;

&lt;p&gt;এই অবস্থায় আপনার করণীয় হচ্ছে, যখন কোনো user-এর data add করা হবে তখন password-কে hashing করতে হবে যাতে কেউ easily বুঝতে না পারে। Same কাজ password update করার ক্ষেত্রেও same কাজটাই করতে হবে।&lt;/p&gt;

&lt;p&gt;এই hashing করার জন্য অনেক algorithm আছে। এখানে একটা জিনিস মাথায় আসছে, এখানে যেহেতু option অনেক advantage, disadvantage থাকবে, আপনাকে research করে বের করতে হবে।&lt;/p&gt;


&lt;h2&gt;
  
  
  Hashing Algorithm
&lt;/h2&gt;

&lt;p&gt;বিগিনার হিসেবে hashing algorithm নিয়ে research করে শেষ করার মতো না। এখানে অনেক research করতে হবে। তবে Basic level-এ basic কিছু algorithms সম্পর্কে research করলে অনেক কিছু জানা যাবে।&lt;/p&gt;
&lt;h3&gt;
  
  
  Password Hashing
&lt;/h3&gt;

&lt;p&gt;bcrypt: এটা key stretching-এর জন্য তৈরি করা হয়েছে। এটা rainbow table-কে counter করতে পারে।&lt;/p&gt;

&lt;p&gt;Argon2: এটা passwords hashing এবং key derivation function-এর জন্য তৈরি করা হয়েছে। এটা memory-hard, time-hard, and tunable-by-parameter।&lt;/p&gt;

&lt;p&gt;Scrypt: এটা memory-hard, time-hard, and tunable-by-parameter।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;bcrypt&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bcrypt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SALT_ROUNDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Cost factor: ব্রুটফোর্স স্লো করার জন্য যথেষ্ট শক্তিশালী&lt;/span&gt;

&lt;span class="c1"&gt;// ১. রেজিস্ট্রেশনের সময় পাসওয়ার্ড হ্যাশ করা&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;hashPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;plainPassword&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;bcrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;plainPassword&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;SALT_ROUNDS&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ২. লগইনের সময় পাসওয়ার্ড ভেরিফাই করা&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;verifyPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;plainPassword&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;hashedPasswordFromDB&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// কখনোই `hash === plainPassword` দিয়ে চেক করবেন না!&lt;/span&gt;
  &lt;span class="c1"&gt;// `bcrypt.compare()` ইন্টারনালি constant-time comparison ব্যবহার করে Timing Attack প্রতিরোধ করে&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;bcrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;plainPassword&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;hashedPasswordFromDB&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Input Validation ও Parameterized Queries 🛡️
&lt;/h2&gt;

&lt;p&gt;SQL Injection বা NoSQL Injection থেকে বাঁচার একমাত্র সমাধান হলো: &lt;strong&gt;User-এর কোনো input-কে সরাসরি query string-এ না বসানো।&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;সর্বদা &lt;strong&gt;Parameterized Queries / Prepared Statements&lt;/strong&gt; বা টাইপ-সেফ ORM (যেমন Prisma, TypeORM, Drizzle) ব্যবহার করুন।&lt;/li&gt;
&lt;li&gt;রিকোয়েস্ট বডি ভ্যালিডেশনের জন্য &lt;strong&gt;Zod&lt;/strong&gt; বা &lt;strong&gt;class-validator&lt;/strong&gt; ব্যবহার করুন।&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  JWT Security Best Practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;স্বল্পমেয়াদী Access Token:&lt;/strong&gt; access token-এর expiry time ১৫–৩০ minutes থেকে বেশি রাখবেন না। seesion long time রাখতে &lt;strong&gt;Refresh Token Rotation&lt;/strong&gt; ব্যবহার করতে হবে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;টোকেন স্টোরেজ:&lt;/strong&gt; browser-এর &lt;code&gt;localStorage&lt;/code&gt;-এ store করলে XSS অ্যাটাকে এটা চুরি হতে পারে। তাই refresh token সবসময় &lt;code&gt;httpOnly&lt;/code&gt;, &lt;code&gt;secure&lt;/code&gt;, &lt;code&gt;sameSite&lt;/code&gt; কুকিতে সংরক্ষণ করতে হবে।&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  SSL/TLS: সব traffic encrypted রাখুন
&lt;/h2&gt;

&lt;p&gt;SSL নিয়ে আগেই কথাবার্তা হয়েছে, এখানে কথা বলে লাভ নাই।&lt;/p&gt;




&lt;h2&gt;
  
  
  বটম লাইন
&lt;/h2&gt;

&lt;p&gt;একটা কথা বলি, আমাকে একজন একটা কথা বলেছিল, যে security নাকি একটা bogus জিনিস। এখানে কোনো কিছুই নাই। আসলে security জিনিসটা কখনো bogus হবে না। Past-এও ছিল না, future-এও হবে না।&lt;/p&gt;

&lt;p&gt;API security-এর OWASP Top 10 জানলেই বেশিরভাগ security-গুলো encounter করতে পারবেন। আর নিজের logical thinking + business requirement অনুযায়ী security ensure করেন।&lt;/p&gt;

&lt;p&gt;আপনার কাছে security জিনিসটা কীভাবে দেখছেন? নিচে comment-এ জানাবেন।&lt;/p&gt;

</description>
      <category>security</category>
      <category>authentication</category>
      <category>backend</category>
      <category>owasp</category>
    </item>
    <item>
      <title>Day 5 | gRPC and Protocol Buffers - A game changer</title>
      <dc:creator>Monirul Islam</dc:creator>
      <pubDate>Thu, 10 Sep 2026 04:20:00 +0000</pubDate>
      <link>https://dev.to/mislam-dev/day-5-grpc-and-protocol-buffers-a-game-changer-22a6</link>
      <guid>https://dev.to/mislam-dev/day-5-grpc-and-protocol-buffers-a-game-changer-22a6</guid>
      <description>&lt;p&gt;আপনার tour শেষ হয়ে গেছে এবং আপনি এখন বাড়িতে আছেন। আপনি বিকালে বসে বসে একটা জিনিস ভাবতে লাগলেন যে, অনেক কিছুই তো করলাম, এর মধ্যে এই এই কাজগুলো না করলেও হতো। আমার খরচটা একটু কমে যেত। যেমন ধরুন, flight-এর ticket না কেটে bus-এ করে গেলেই হতো, খরচ কমে যেত। আবার বড় কোনো 5 star hotel-এ না উঠে, ছোটখাটো normal একটা hotel-এ উঠলেই হতো, খরচ অনেক কমে যেত।&lt;br&gt;
এখানে একটা জিনিস বুঝতে পারবেন, খরচ কমানোর চক্কর করতে গেলে সেখানে কিছু problem-এর সম্মুখীন হতে হবে। যেমন ধরুন, আপনার মালামাল management করা নিয়ে problem face করতে হতে পারে। এছাড়া আরও অনেক problem-এর সম্মুখীন হতে হবে।&lt;/p&gt;

&lt;p&gt;কিছু কি relate করতে পারছেন? একটু কষ্ট হচ্ছে। আসুন অন্য একটা বিষয় নিয়ে কথা বলি।&lt;/p&gt;

&lt;p&gt;আপনি যখন backend নিয়ে কাজ করছেন তখন microservice নিয়ে আপনার মোটামুটি idea হয়ে যাওয়ার কথা। সহজভাবে বললে একটা single application-কে ছোট ছোট part-এ ভেঙে আলাদাভাবে management করাই হচ্ছে microservice। এটা নিয়ে future-এ একটা dedicated article আসবে। তখন আরও ভালোভাবে জানতে পারবেন।&lt;br&gt;
এখন একটা বিষয় বুঝেন, আপনি যখন কোনো application develop করবেন তখন কিন্তু আপনার অন্য module-এর সাথে communication করার প্রয়োজন হবে। Monolith application-এর ক্ষেত্রে সব এক জায়গায় থাকে সেই জন্য কোনো problem হয় না। কিন্তু যখন microservice-এ যেয়ে communication করা হয় তখন REST API use করার প্রয়োজন পড়ে। কিন্তু problem হচ্ছে, REST API-এর ক্ষেত্রে text based json format serialize, deserialize করার জন্য extra time + bandwidth নষ্ট হয়। text based json serialize, deserialize করা হয় ডাটাকে human readable format-এ নিয়ে use করার জন্য।&lt;/p&gt;

&lt;p&gt;Microservice-এ internal communication সবই তো server বা machine। সেক্ষেত্রে এই text based json serialize, deserialize করার কোনো প্রয়োজন নেই। এই overhead-টা কমাতে পারলেই আপনার internal communication-এর speed অনেক বেড়ে যাবে।&lt;br&gt;
একটা জিনিস চিন্তা করুন আপনার একটা data-এর জন্য user-কে যদি ২ sec wait করা লাগে, তাহলে user কি আপনার application use করবে? আপনি কি use করবেন? ক্ষেত্রবিশেষে load বেশি হলে এই waiting-এর time আরও বেশি হতে পারে।&lt;/p&gt;

&lt;p&gt;এটার solution হচ্ছে gRPC।&lt;/p&gt;


&lt;h2&gt;
  
  
  What is gRPC?
&lt;/h2&gt;

&lt;p&gt;gRPC-তে যাওয়ার আগে, RPC সম্পর্কে বিস্তারিত জানাটা প্রয়োজন।&lt;br&gt;
RPC-এর full form হচ্ছে Remote Procedure Call। এটার concept হচ্ছে একদম simple। Server-এ কয়েকটা specific function থাকে। এই function-গুলো client directly call করে কাজ করবে। এটাই হচ্ছে Remote Procedure Call।&lt;/p&gt;

&lt;p&gt;এই concept-এর ওপর base করেই Google একটা RPC model develop করে। At first, gRPC Google তাদের internal project-এর জন্য use করে। Then ২০১৫ সালে open source করে দেয়। তবে concept-টা RPC-এর তবে অনেক efficient।&lt;/p&gt;

&lt;p&gt;gRPC-এর communication-এর জন্য Protocol Buffer (Protobuf, developed by Google themselves) use করে। যেটা অনেক efficient কারণ এখানে binary data communication হয়।&lt;/p&gt;

&lt;p&gt;RPC-এর ক্ষেত্রে একটা problem হচ্ছে এটা language specific। এছাড়াও এখানে method name mismatching-এর একটা প্রবল সম্ভাবনা থাকে। এই জন্য এটা একটু risky। কিন্তু gRPC language agnostic। gRPC-তে &lt;code&gt;.proto&lt;/code&gt; file use করা হয়, যেটা মূলত একটা contract হিসেবে কাজ করে। এই contract থাকার কারণে আমি চাইলেই method mismatch হবে না। Compile time-এই error show করবে। এই ক্ষেত্রে runtime-এ অনেক error থেকে save করবে।&lt;/p&gt;


&lt;h2&gt;
  
  
  Protocol Buffers: Magic of binary data
&lt;/h2&gt;

&lt;p&gt;Protocol Buffers হলো একটা data serializer। অন্যান্য data serializer (JSON, XML) text based formatting করে, কিন্তু protocol buffer binary format use করে data format করে। এর জন্য data size অনেক কম, speed অনেক high। তবে এর একটা downside হচ্ছে, এটা human readable না। Read করতে হলে কিছু tool use করতে হবে। যদিও এটাকে downside বলাটা ঠিক হবে না।&lt;br&gt;
এখন একটা বিষয় চিন্তা করুন, আপনি যখন machine to machine communication করবেন তখন এই human readable serialization-এর দরকার আছে? অবশ্যই না।&lt;/p&gt;

&lt;p&gt;gRPC-তে &lt;code&gt;.proto&lt;/code&gt; file use করা হয়। নিচের একটা example দেখলে কিছুটা idea করতে পারবেন।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight protobuf"&gt;&lt;code&gt;&lt;span class="kd"&gt;message&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;int32&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;service&lt;/span&gt; &lt;span class="n"&gt;UserService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;rpc&lt;/span&gt; &lt;span class="n"&gt;GetUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UserRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;returns&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এখন আপনার মাথায় একটা জিনিস আসবে, একটু আগে বললাম যে gRPC language agnostic। তাহলে নানা ধরনের language কীভাবে use হয়?&lt;/p&gt;

&lt;p&gt;আসলে language-এ use করার জন্য, gRPC-তে by default code generator আছে, এই generator দিয়ে easily যেকোনো language-এর জন্য code generate করে use করা যায়।&lt;/p&gt;

&lt;p&gt;এই Protocol Buffer একটু খেয়াল করলে দেখতে পারবেন যে ২ ধরনের code আছে। একটাতে schema আর আরেকটা অনেকটা class-এর মতো। মূলত এই schema-টা হচ্ছে data format বা type। আর service যে section-টা সেটার ভেতরে যেগুলো আছে ঐগুলো সবগুলাই method।&lt;/p&gt;

&lt;p&gt;এই &lt;code&gt;.proto&lt;/code&gt; file use করার কারণে, আপনার system-এ end-to-end type security ensure হচ্ছে। একবার schema লিখবেন সব language-এই কাজ করবে।&lt;/p&gt;




&lt;h2&gt;
  
  
  HTTP/2: The Underlying Technology
&lt;/h2&gt;

&lt;p&gt;gRPC behind the scene-এ HTTP/2 protocol use করে। এটা HTTP/1.1-এর modern version যেটা ২০১৫ সালে standardize হয়। এই HTTP/2 use করার কারণেই মূলত gRPC তুলনামূলক অনেক fast। HTTP/2-এর কিছু feature সম্পর্কে জানলেই এটা বুঝে যাবেন।&lt;/p&gt;

&lt;p&gt;HTTP/2-এর কিছু ফিচার:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bidirectional streaming&lt;/strong&gt; - client আর server দুইজনই একসাথে data পাঠাতে পারে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiplexing&lt;/strong&gt; - একটা connection-এই অনেক call।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Header compression&lt;/strong&gt; - repeated headers compress হয়।&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  REST vs gRPC
&lt;/h2&gt;

&lt;p&gt;এতক্ষণে কিছুটা idea পেয়ে গেছেন কখন gRPC আর কখন REST use করতে হবে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;gRPC use করুন যখন -&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Internal microservice-to-microservice communication&lt;/li&gt;
&lt;li&gt;High performance, low latency দরকার&lt;/li&gt;
&lt;li&gt;Streaming data দরকার (real-time)&lt;/li&gt;
&lt;li&gt;Strong contract/schema enforce করতে চান&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;REST use করুন যখন -&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Public-facing API&lt;/li&gt;
&lt;li&gt;Browser directly consume করবে&lt;/li&gt;
&lt;li&gt;Simple integration, documentation সহজ রাখতে চান&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;gRPC browser থেকে directly call করা যায় না সহজে - &lt;strong&gt;gRPC-Web&lt;/strong&gt; proxy লাগে। তাই public API-তে gRPC একটু ঝামেলার।&lt;/p&gt;

&lt;p&gt;কিন্তু backend-to-backend? এখানে REST-এর সাথে gRPC-র কোনো তুলনাই হয় না।&lt;/p&gt;




&lt;h2&gt;
  
  
  বটম লাইন
&lt;/h2&gt;

&lt;p&gt;আগের article-এ একটা কথা বলেছিলাম যে, option future-এ অনেক আসবে কিন্তু আমার যেটা দরকার, যেটা আমার requirement full করে সেটা choose করতে হবে। তাহলে একটা ভালো application বানানো possible।&lt;/p&gt;

&lt;p&gt;এখানে আমি শুধুমাত্র gRPC সম্পর্কে একটু idea দিলাম। আপনি চাইলে নিচের document থেকে বিস্তারিত পড়তে পারেন।&lt;/p&gt;

&lt;p&gt;&lt;a href="https://grpc.io/" rel="noopener noreferrer"&gt;Read more on gRPC&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;আপনি কি কখনো gRPC ব্যবহার করেছেন? Experience কেমন ছিল? কমেন্টে শেয়ার করুন! 👇&lt;/p&gt;

</description>
      <category>grpc</category>
      <category>microservices</category>
      <category>backend</category>
      <category>api</category>
    </item>
    <item>
      <title>Day 04 — GraphQL vs REST — কোনটা কখন? সত্যিকারের trade-off</title>
      <dc:creator>Monirul Islam</dc:creator>
      <pubDate>Wed, 09 Sep 2026 04:20:00 +0000</pubDate>
      <link>https://dev.to/mislam-dev/day-04-graphql-vs-rest-konttaa-kkhn-styikaarer-trade-off-1fip</link>
      <guid>https://dev.to/mislam-dev/day-04-graphql-vs-rest-konttaa-kkhn-styikaarer-trade-off-1fip</guid>
      <description>&lt;p&gt;মনে করুন, আপনি একটা ট্যুর দিতে যাবেন। এই জন্য একটু রিসার্চ করলেন। কোথায় যাবেন তার জন্য অনেকগুলো প্লেস শর্টলিস্ট করলেন। এখন এখান থেকে আপনার জন্য একটা প্লেস চুজ করা একটু কষ্ট হয়ে যাচ্ছে কারণ সবগুলো প্লেসই আকর্ষণীয়। অনেক রিসার্চ করার পরে ২টা প্লেসে আপনি আটকে গেছেন। আপনি কোনোভাবেই একটাতে শিফ্ট করতে পারছেন না। কোইনসিডেন্টলি ২টা প্লেসের খরচই প্রায় একই। এখান থেকে আপনি একটা জিনিস বুঝতে পারলেন যে—ফ্লেক্সিবিলিটি বেশি থাকলে চুজ করা একটু কষ্ট হয়ে যায়।&lt;/p&gt;

&lt;p&gt;এই প্রবলেমের সলিউশন থেকে বের হওয়ার জন্য আপনি আপনার এক বন্ধুর পরামর্শ নিতে গেলেন। আপনার কথা সে শুনলো। এর পর কিছুক্ষণ ভাবলো। প্রশ্ন করলো, "তুই আসলে কী জন্য ট্যুরটা দিতে চাচ্ছিস? তোর উদ্দেশ্যটা কী?"। এই কথা শোনার পর আপনি তাকে সব কিছুই বললেন। তারপর সে আপনাকে কিছু কথা বললো, "এখানে প্লেসটা কিন্তু মুখ্য না, মুখ্য হচ্ছে তোর প্রয়োজনীয়তা। এখানে এখানে গেলে তোর সব উদ্দেশ্য সাকসেসফুলি পূরণ হবে। এখন তুই যে সিদ্ধান্তটা নিতে পারছিস না, তার মেইন রিজন হচ্ছে—তোর প্রয়োজনীয়তার ওপরে ফোকাস করিসনি। আরও একটা বিষয় হচ্ছে ওই প্লেস সম্পর্কে তোর খুব বেশি আইডিয়া নেই।"&lt;/p&gt;

&lt;p&gt;এর পরে আপনি আরামে ট্যুরে চলে গেলেন। আপনার উদ্দেশ্য হাসিল হলো। সব কিছু একদম পারফেক্ট।&lt;/p&gt;

&lt;p&gt;এখন আপনি বলবেন এখানে ট্যুরের সাথে টেকনোলজির সম্পর্ক কী? সম্পর্ক আছে। এখানে আপনি একটা জিনিস রিয়ালাইজ করতে পারবেন যে, ফ্লেক্সিবিলিটি যত বেশি, সেখানে প্রবলেম তত বেশি। এই প্রবলেম সলভ করতে হলে নলেজ এবং ফোকাস দুইটা জিনিসই দরকার।&lt;/p&gt;

&lt;p&gt;REST এবং GraphQL, দুইটার ফান্ডামেন্টাল কাজ হচ্ছে সার্ভারের সাথে কমিউনিকেট করে ডাটা ট্রান্সফার করা। এখন আপনার সিদ্ধান্ত নেওয়া কিন্তু একটু প্রবলেমেটিক, কারণ দুইটাই প্রায় একই কাজের জন্য।&lt;/p&gt;

&lt;p&gt;এই প্রবলেমকে সলভ করতে হলে আগে যে স্ট্র্যাটেজি ফলো করে একটা প্লেস সিলেক্ট হয়েছে, একই উপায়ে সলভ করতে হবে। আগে আপনার রিকোয়ারমেন্ট সম্পর্কে স্পষ্ট ধারণা নিতে হবে—আপনার অ্যাপ্লিকেশনের আসলে কী দরকার। এর পরে REST ও GraphQL সম্পর্কে নলেজ গ্যাদার করতে হবে, তাদের ইউজার কেস সম্পর্কে জানতে হবে। সবশেষে আপনার অ্যাপ্লিকেশন রিকোয়ারমেন্টের সাথে যার ইউজার কেস মিলে যাবে, সেটাই বেছে নিতে হবে।&lt;/p&gt;




&lt;h2&gt;
  
  
  REST-এর সমস্যাটা কোথায়?
&lt;/h2&gt;

&lt;p&gt;একটা জিনিস চিন্তা করুন—একটা প্রবলেম সলভ করার জন্য যখন একাধিক অপশন থাকে, তখন স্বাভাবিকভাবেই বোঝা যায় যে অপশনগুলোর কিছু না কিছু ডিসঅ্যাডভান্টেজ থাকেই। এগুলো জানলেই আপনার অপশন চুজ করতে সুবিধা হবে।&lt;/p&gt;

&lt;p&gt;REST সম্পর্কে তো আগেই জেনে গেছেন (আগের আর্টিকেল থেকে)। ওখানে REST-এর ডিসঅ্যাডভান্টেজ নিয়ে তেমন কোনো আলোচনা হয়নি।&lt;/p&gt;

&lt;p&gt;মনে করুন আপনার একটা মোবাইল অ্যাপ আছে, ওই অ্যাপের প্রোফাইল পেজে নিচের এই জিনিসগুলো দেখাতে হবে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ইউজারের নাম, ফটো&lt;/li&gt;
&lt;li&gt;লেটেস্ট ৩টা পোস্ট&lt;/li&gt;
&lt;li&gt;ফলোয়ার কাউন্ট&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এখন এটা সলভ করতে হলে কতগুলো API Call লাগবে?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /users/5           → ইউজারের নাম, ফটো
GET /users/5/posts     → সব পোস্ট ফেচ করে, লজিক দিয়ে ফিল্টার করতে হবে।
GET /users/5/followers → ফলোয়ার কাউন্ট
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;৩টা API Call করা লাগবে। এখানে API Call সংখ্যার চেয়ে আরও একটা জিনিস ম্যাটার করছে।&lt;/p&gt;

&lt;p&gt;এখানে কয়েকটি জিনিস খেয়াল করুন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ইউজারের জন্য লাগবে শুধু নাম আর ইমেজ, কিন্তু ফেচ করতে হচ্ছে ইউজারের সব কিছু।&lt;/li&gt;
&lt;li&gt;পোস্ট লাগবে মাত্র ৩টি, কিন্তু ফেচ হচ্ছে অনেকগুলো পোস্টের ডাটা।&lt;/li&gt;
&lt;li&gt;ফলোয়ার কাউন্টের জন্য লাগবে জাস্ট একটা নম্বর, কিন্তু পুরো লিস্ট ফেচ করতে হচ্ছে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এখানে অনেক অপ্রয়োজনীয় ডাটা ফেচ হচ্ছে, এই ডাটাগুলোর জন্য ব্যান্ডউইথ নষ্ট হচ্ছে, সাথে রেসপন্স সাইজ বড় হওয়ার জন্য API Call Latency-ও বেড়ে যাচ্ছে।&lt;/p&gt;

&lt;p&gt;এই সমস্যার নামই হলো &lt;strong&gt;Over-fetching&lt;/strong&gt; আর &lt;strong&gt;Under-fetching&lt;/strong&gt;।&lt;/p&gt;




&lt;h2&gt;
  
  
  GraphQL কীভাবে এটা সলভ করে?
&lt;/h2&gt;

&lt;p&gt;এই প্রবলেমটা সলভ করে GraphQL। কীভাবে সলভ করে? তাহলে GraphQL কীভাবে কাজ করে সেটা জানতে হবে।&lt;/p&gt;

&lt;p&gt;মূলত GraphQL-এ একটি মাত্র Endpoint থাকে (&lt;code&gt;/graphql&lt;/code&gt;), এই এন্ডপয়েন্টের মধ্যে Query পাস করতে হয়। GraphQL হলো একটি &lt;strong&gt;Schema-driven&lt;/strong&gt; প্রযুক্তি। সার্ভার আগে একটি স্ট্রং টাইপ কন্ট্রাক্ট ডিফাইন করে যাকে &lt;strong&gt;Schema (SDL - Schema Definition Language)&lt;/strong&gt; বলা হয়:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="c"&gt;# ১. Server Schema (কন্ট্রাক্ট)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;avatar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;!]!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;followerCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!):&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;আর ক্লায়েন্ট তার দরকার অনুযায়ী ঠিক যতটুকু ডেটা প্রয়োজন ততটুকুই ব্যাকএন্ড থেকে চেয়ে নেয়:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="c"&gt;# ২. Client Query (অনুরোধ)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;avatar&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;followerCount&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই একটা কলেই পুরো প্রয়োজনীয় ডাটা সার্ভার থেকে নির্দিষ্ট ফরম্যাটে চলে আসবে। কোনো ওভার-ফেচিং বা আন্ডার-ফেচিং থাকবে না।&lt;/p&gt;




&lt;h2&gt;
  
  
  GraphQL-এর মূল তিনটি অপারেশন ⚙️
&lt;/h2&gt;

&lt;p&gt;REST-এ যেমন &lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;-এর মতো HTTP মেথড থাকে, GraphQL-এ তিনটি প্রধান রুট অপারেশন রয়েছে:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Query (Read):&lt;/strong&gt; ডেটা রিড করার জন্য (REST-এর &lt;code&gt;GET&lt;/code&gt;-এর অনুরূপ)।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mutation (Write):&lt;/strong&gt; ডেটা তৈরি, আপডেট বা ডিলিট করার জন্য (REST-এর &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;-এর মতো)।
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;mutation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CreateNewPost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;createPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GraphQL Mastery"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Backend deep dive"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;createdAt&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Subscription (Real-time):&lt;/strong&gt; সার্ভারে কোনো ইভেন্ট ঘটলে ক্লায়েন্টের কাছে লাইভ ডেটা পুশ করার জন্য। এটি ব্যাকগ্রাউন্ডে WebSockets ব্যবহার করে পারসিস্টেন্ট কানেকশন বজায় রাখে।
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;subscription&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OnNewComment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$postId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;commentAdded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;postId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$postId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Schema Introspection ও অটোমেটিক ডকুমেন্টেশন 🔍
&lt;/h2&gt;

&lt;p&gt;GraphQL-এর দারুণ একটি সুবিধা হলো &lt;strong&gt;Introspection&lt;/strong&gt; (&lt;code&gt;__schema&lt;/code&gt;)। ক্লায়েন্ট বা ডেভেলপার সরাসরি সার্ভারকে কোড দিয়ে জিজ্ঞাসা করতে পারে: &lt;em&gt;"তোমার কাছে কী কী টাইপ, কী কী কুয়েরি আর আর্গুমেন্ট আছে?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;এর ফলে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GraphiQL / Apollo Studio:&lt;/strong&gt; সার্ভার রান করলেই অটোমেটিক ইন্টারঅ্যাকটিভ API ডকুমেন্টেশন আর টেস্ট কনসোল তৈরি হয়ে যায়। কোনো ম্যানুয়াল Swagger ফাইল লিখতে হয় না।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Generation:&lt;/strong&gt; ফ্রন্টএন্ডে GraphQL Code Generator ব্যবহার করে ব্যাকএন্ড স্কিমা থেকে হুবহু TypeScript Types এবং SDK স্বয়ংক্রিয়ভাবে তৈরি করে নেওয়া যায়।&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  তাহলে সব জায়গায় GraphQL ব্যবহার করব না কেন?
&lt;/h2&gt;

&lt;p&gt;সবকিছুরই ট্রেড-অফ থাকে। GraphQL বেশ কিছু জায়গায় অতিরিক্ত জটিলতা তৈরি করে:&lt;/p&gt;

&lt;h3&gt;
  
  
  ১. N+1 Problem
&lt;/h3&gt;

&lt;p&gt;GraphQL-এ প্রতিটি ফিল্ডের জন্য আলাদা &lt;code&gt;Resolver&lt;/code&gt; ফাংশন এক্সিকিউট হয়। যদি আপনি ৫০ জন ইউজারের লিস্ট চান এবং প্রতি ইউজারের সাথে তাদের &lt;code&gt;posts&lt;/code&gt; চান, তাহলে ১টি কুয়েরি দিয়ে ইউজার ফেচ হবে এবং প্রতি ইউজারের পোস্টের জন্য ডাটাবেসে আলাদা আলাদা আরও ৫০টি কুয়েরি এক্সিকিউট হবে (১ + ৫০ = ৫১টি কুয়েরি!)।&lt;/p&gt;

&lt;p&gt;এখানে উদ্ধারকর্তা হিসেবে কাজ করে Facebook-এর তৈরি &lt;strong&gt;DataLoader&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Batching:&lt;/strong&gt; ইভেন্ট লুপের এক ফ্রেমে আসা সব রিকোয়েস্টকে জমা করে একটিমাত্র &lt;code&gt;SELECT * FROM posts WHERE userId IN (...)&lt;/code&gt; কুয়েরি চালায়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caching:&lt;/strong&gt; একই রিকোয়েস্টে একই ইউজারের ডেটা একাধিকবার প্রয়োজন হলে তা ডাটাবেস থেকে না টেনে মেমোরি থেকে দিয়ে দেয়।
&lt;em&gt;(Day 11-এ আমরা কোডসহ N+1 ও DataLoader-এর গভীর ব্যবচ্ছেদ দেখব)&lt;/em&gt;।&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ২. Caching জটিলতা
&lt;/h3&gt;

&lt;p&gt;REST-এ URL ধরে ব্রাউজার ও CDN লেভেলে খুব সহজে HTTP ক্যাশিং করা যায়। কিন্তু GraphQL-এ সব রিকোয়েস্ট একই &lt;code&gt;/graphql&lt;/code&gt; এন্ডপয়েন্টে &lt;code&gt;POST&lt;/code&gt; মেথডে পাঠানো হয়। ফলে প্রথাগত HTTP ক্যাশিং সরাসরি কাজ করে না। এখানে জটিল Normalized Client Cache (যেমন Apollo Client InMemoryCache) বা Persisted Queries ব্যবহার করতে হয়।&lt;/p&gt;

&lt;h3&gt;
  
  
  ৩. Query Complexity ও Security রিস্ক
&lt;/h3&gt;

&lt;p&gt;GraphQL ক্লায়েন্টকে নিজের মতো করে কুয়েরি সাজানোর পূর্ণ স্বাধীনতা দেয়। কোনো ক্ষতিকর ইউজার বা হ্যাকার চাইলে এমন একটি রিকার্সিভ নেস্টেড কুয়েরি পাঠাতে পারে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MaliciousQuery&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;friends&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;friends&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;friends&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="n"&gt;friends&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই কুয়েরি সার্ভার এবং ডাটাবেসের সিপিইউ ১০০% দখল করে পুরো অ্যাপ্লিকেশন ক্র্যাশ করিয়ে দিতে পারে (DDoS Attack)।&lt;br&gt;&lt;br&gt;
তাই প্রোডাকশন GraphQL সার্ভারে সবসময় &lt;strong&gt;Query Depth Limiting&lt;/strong&gt; এবং &lt;strong&gt;Query Cost Analysis&lt;/strong&gt; কনফিগার করে রাখতে হয়, যাতে নির্দিষ্ট লিমিটের বেশি জটিল কুয়েরি সার্ভার সরাসরি রিজেক্ট করে দেয়।&lt;/p&gt;




&lt;h2&gt;
  
  
  কখন কোনটা?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;REST ব্যবহার করুন যখন —&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple CRUD operations&lt;/li&gt;
&lt;li&gt;Public API যেটা বাইরে বিভিন্ন থার্ড-পার্টি ডেভেলপাররা consume করবে&lt;/li&gt;
&lt;li&gt;Caching critical (CDN লেভেলে স্ট্যাটিক ক্যাশিং দরকার)&lt;/li&gt;
&lt;li&gt;টিম GraphQL-এর জটিলতায় ঢুকতে চায় না&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;GraphQL ব্যবহার করুন যখন —&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex, deeply nested ডাটা রিলেশনশিপ দরকার&lt;/li&gt;
&lt;li&gt;Multiple clients (web, mobile, smart watch) আলাদা আলাদা ডাটা সাইজ ও ফরম্যাট চায়&lt;/li&gt;
&lt;li&gt;Rapid UI iteration দরকার—ফ্রন্টএন্ডের সামান্য পরিবর্তনের জন্য ব্যাকএন্ডে বারবার নতুন এন্ডপয়েন্ট বানানোর ঝামেলা এড়াতে চান&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  বটম লাইন
&lt;/h2&gt;

&lt;p&gt;ভবিষ্যতে একটা প্রবলেম রিসলভ করার জন্য অনেক অপশন আসতে পারে। কিন্তু সিলভার বুলেট বলে কিছু নেই। রিকোয়ারমেন্ট অনুযায়ী বেস্ট অপশনটাই বেছে নিতে হবে।&lt;/p&gt;

&lt;p&gt;আপনার Current Project-এ কোনটা ব্যবহার করছেন? কমেন্টে জানান! 👇&lt;/p&gt;

</description>
      <category>restapi</category>
      <category>graphql</category>
      <category>backend</category>
    </item>
    <item>
      <title>Day 3 — REST API Design — যেভাবে করলে কেউ কিছু বলতে পারবে না</title>
      <dc:creator>Monirul Islam</dc:creator>
      <pubDate>Tue, 08 Sep 2026 04:20:00 +0000</pubDate>
      <link>https://dev.to/mislam-dev/day-3-rest-api-design-yebhaabe-krle-keu-kichu-blte-paarbe-naa-3k97</link>
      <guid>https://dev.to/mislam-dev/day-3-rest-api-design-yebhaabe-krle-keu-kichu-blte-paarbe-naa-3k97</guid>
      <description>&lt;p&gt;আগে যখন কোনো web project develop করা হতো তখন typically server total content generate করে frontend-এ send করে দিত, then frontend এটা render করে display করতো। এখন একটা বিষয় চিন্তা করে দেখুন, একটা full page যদি প্রতিবার server থেকে load হয়, তাহলে network latency + bandwidth খরচ কিন্তু বেশি হবে। মোটামুটি সব user-ই কিন্তু almost similar জিনিস বারবার server থেকে load করবে। এখানে এই content-এর ভেতরে শুধুমাত্র user specific information-গুলোই change হবে, বাকিগুলো similar। তখন ইঞ্জিনিয়াররা ভাবলো, আমরা যদি এই fixed data-গুলো frontend-এই রেখে, শুধু user specific data-গুলোই server থেকে fetch করে ঐ যেখানে যেখানে লাগবে সেখানে বসিয়ে দিই তাহলে কেমন হবে? এতে করে cost reduce হয়ে যাবে + network latency-ও কমে যাবে।&lt;/p&gt;

&lt;p&gt;এভাবেই মূলত API-এর শুরু হয়। API-এর মূল purpose হচ্ছে client-server communication হবে only necessary data-এর মাধ্যমে। No unnecessary data।&lt;/p&gt;




&lt;h2&gt;
  
  
  REST API কী?
&lt;/h2&gt;

&lt;p&gt;Suppose, আপনি একটা ৫ তলা ঘর বানাচ্ছেন। এখন আপনি কি যেমন তেমনভাবে বানাবেন?&lt;br&gt;
অবশ্যই না। আপনি একজন engineer নিয়ে এসে একটা design করে নেবেন। আপনাকে proper একটা architecture দিয়ে দেবে এবং সেই architecture-এ আপনি বাড়িটা বানাবেন।&lt;/p&gt;

&lt;p&gt;Similar way-তে REST হলো API বানানোর একটা architecture style। REST-এর full form হচ্ছে &lt;strong&gt;Representational State Transfer&lt;/strong&gt;। আর মজার ব্যাপার হচ্ছে আপনি চাইলে যেকোনো architecture fully follow-ও করতে পারেন আবার partially-ও use করতে পারেন। এর জন্য এই REST-কে rules বলার থেকে guidelines বলাটাই better।&lt;/p&gt;

&lt;p&gt;REST-এর মূল concept হচ্ছে, সবকিছু resource। আর এই resource-এর উপরে HTTP method দিয়ে request করলেই হয়ে যাবে। এইটুকু করলেই হয়ে যাবে। HTTP নিয়ে তো already জানেন।&lt;/p&gt;


&lt;h2&gt;
  
  
  REST API কেন ডিজাইন করাটা জরুরি?
&lt;/h2&gt;

&lt;p&gt;এটা একদম easy। তাহলে এটা নিয়ে এত ভাবার কী আছে? একটা জিনিস মাথায় রাখবেন, যে জিনিস যত flexible সেখানে problem-এর সংখ্যা তত বেশি। Initially আপনি simple way-তে API develop করবেন তখন কোনো problem হবে না। কিন্তু যখন একটু grow করবেন তখন যে কী ধরনের problem হবে আপনি experience না করলে বুঝতে পারবেন না।&lt;/p&gt;

&lt;p&gt;আমার একটা real life experience share করি তাহলে বুঝতে পারবেন।&lt;/p&gt;

&lt;p&gt;আমি যখন আমার development journey শুরু করি, তখন present time-এর মতো API development বা API-এর demand ছিল না। Just server থেকে সবকিছু ready হয়ে আসবে, সবকিছুই আরামসে চলে যাবে। এত বেশি প্যারা নেওয়ার দরকার নেই।&lt;br&gt;
আস্তে আস্তে আমি API development-এর দিকে move করি। এই journey-এর শুরু হয় tutorial follow করে করে, সাথে practice করতাম। এভাবেই আস্তে আস্তে used to হয়ে যাই। একটা সময় যেয়ে tutorial দেখার থেকে documentation পড়া শুরু করি।&lt;/p&gt;

&lt;p&gt;অনেকগুলো project করার পরে একটা সময় যেয়ে আমি একটা decision নিই যে, আমি একটা বড় project বানাবো যেটা real life work-টা reduce করবে and believe me, সেই project এই নিয়ে ৪ বার try করেও সেটা complete করতে পারিনি। এর অনেকগুলো reason ছিল, তার মধ্যে API properly design না করা একটা।&lt;/p&gt;

&lt;p&gt;এখন বর্তমান সময়ে আমি ঐ project open করলে আমি নিজেই সেই project বুঝতে পারি না। এখন একটা বিষয় চিন্তা করেন আমার নিজের লেখা code &amp;amp; style, নিজেই বুঝতে পারছি না। এটা যদি অন্য কেউ দেখে তার কী অবস্থা হবে? আপনার team feature development করার বদলে project style বুঝতে বুঝতেই অনেক সময় চলে যাবে। এই জন্য API properly design করাটা জরুরি।&lt;/p&gt;


&lt;h2&gt;
  
  
  Resource Naming: নাম রাখার নিয়ম
&lt;/h2&gt;

&lt;p&gt;আগের article-এ আপনি HTTP method নিয়ে already জেনে গেছেন। এই method থেকে আপনি বুঝে যাবেন যে আসলে এটা server থেকে data fetch করা হচ্ছে নাকি server-এ send করা হচ্ছে। এই ক্ষেত্রে আপনার resource-এর নামের সাথে get বা post লেখার প্রয়োজন হবে না। Method is explaining everything।&lt;/p&gt;

&lt;p&gt;Resource naming-এর ক্ষেত্রে &lt;code&gt;noun&lt;/code&gt; use করা হয়। আর &lt;code&gt;verb&lt;/code&gt; word (create, get, update, delete) গুলো avoid করা হয়। কারণ HTTP method-গুলো এগুলো explain করে দেয়। নিচে একটা example দেয়া হলো, এটা দেখলে বুঝতে পারবেন।&lt;/p&gt;

&lt;p&gt;❌ খারাপ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /createUser
GET /getUsers
DELETE /deleteUser/5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ ভালো:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /users           # create new user
GET /users            # get all users
DELETE /users/5       # delete user with id 5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resource naming-এর ক্ষেত্রে &lt;code&gt;plural&lt;/code&gt; use করা হয়। এটা একটা convention।&lt;/p&gt;




&lt;h3&gt;
  
  
  Nested Resources: কতটা গভীরে যাবেন?
&lt;/h3&gt;

&lt;p&gt;URL path + resource naming আরও convenient করতে nesting resource use করা হয়। নিচের example-এর মতো:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /users/5/posts/3/comments
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;কিন্তু কথা হচ্ছে এই nesting করলে তো URL অনেক বড় হয়ে যাবে এবং URL-এ unwanted data-এর প্রয়োজন হবে। For example: যখন আমার সবার জন্য post-গুলো দরকার হবে তখন কিন্তু users define করার কোনো প্রয়োজনীয়তা নেই। আবার same rules যায় single and specific resource-এর ক্ষেত্রে। একটা post-এর ID সম্পূর্ণ posts table-এ generally unique হয়। তাহলে post-এর ID দিয়ে direct access না করে এত nesting করে access করা make sense করে না।&lt;/p&gt;

&lt;p&gt;এখন বলতে পারেন, এর জন্য কি nesting use করবো না? অবশ্যই use করবেন তবে maximum ২ level। নিচের example দেখলে বুঝতে পারবেন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /users/5/posts       ✅
GET /posts/3/comments    ✅
GET /users/5/posts/3/comments/7/replies  ❌
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এটা একটা convention, আপনার যদি মনে হয় আপনি nesting level আরও increase করবেন, it's all up to you।&lt;/p&gt;




&lt;h2&gt;
  
  
  Versioning: ভবিষ্যতের জন্য দরজা খোলা রাখা
&lt;/h2&gt;

&lt;p&gt;মনে করুন আপনি একটা application বানিয়েছেন, যেটা সময়ের সাথে সাথে অনেক grow করেছে। একটা সময় যেয়ে আপনার API architecture + request + response + logic এগুলো change করা দরকার। আর আপনার application এত বড় হয়েছে যে আপনি existing API change করতে পারবেন না। এটা কিন্তু একটা problem।&lt;br&gt;
এই problem-টা solve করার solution হলো versioning। Versioning করার মাধ্যমে এই problem-টা solve করা যায় easily।&lt;/p&gt;

&lt;p&gt;API-কে ৩ way-তে versioning করা যায়:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;using headers: এই way-তে request header-এর ভেতরে version define করে দিতে হয়। এর মাধ্যমে server versioning-টা manage করে। এর benefit হচ্ছে আপনার URL same থাকে but function + internal logic change হয়ে যায়।&lt;/li&gt;
&lt;li&gt;url path: এটায় URL path-এর ভেতরে version define করতে হয়।&lt;/li&gt;
&lt;li&gt;url query parameter: এটায় URL-এ query parameter হিসেবে version-টা define করে দিতে হয়। এটা অনেকটা header versioning-এর মতো।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;url versioning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/api/v1/users
/api/v2/users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Query versioning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/users?version=1
/users?version=2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;তবে practically URL versioning-টাই সবচেয়ে বেশি use হয়। কারণ এখানে complexity অনেক কম। তবে বিষয়টা এমন না যে সবাই use করছে বলে আপনাকেও use করতে হবে।&lt;/p&gt;




&lt;h2&gt;
  
  
  Idempotency: এই concept টা না জানলে খবর আছে!
&lt;/h2&gt;

&lt;p&gt;মনে করুন, আপনার একটা ছোট ভাই জিজ্ঞাসা করছে, বাংলাদেশের রাজধানী (capital) কোথায়? আপনি normally বললেন ঢাকা। কিছুক্ষণ পরে এসে আবার same question করেছে। আপনিও same answer দিলেন। এভাবে next ১০ মিনিটে ১০-১২ বার জিজ্ঞাসা করা হয়ে গেছে। এবার আপনি আপনার মেজাজ হারিয়ে ফেললেন এবং রেগে রেগে বললেন যে রাজধানী জিনিসটা কোনো ছেলেখেলা না যে এত তাড়াতাড়ি change হয়ে যাবে।&lt;br&gt;
তো এই change না হওয়ার concept-টাই হচ্ছে Idempotency। API-এর ক্ষেত্রে আপনি একটা specific resource access করছেন। এখন ঐ resource-টা idempotent হতে হলে সবসময় ঐ same response provide করতে হবে। সেটা ১০০ বার হোক বা ২০০ বার। [তবে এর ভেতরে data update করলে বিষয়টা আলাদা জিনিস]। Concept-টা hopefully clear হয়ে গেছে।&lt;/p&gt;

&lt;p&gt;এখন চলুন HTTP method-এর idempotency নিয়ে কিছু আলোচনা করি:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;POST&lt;/strong&gt;: স্বাভাবিক কারণেই POST method idempotent করা possible না কারণ per request-এ এটা নতুন data return করবে। তবে এটাকেও idempotent করা সম্ভব। modern system-এ request এর header এ key provide করা হয়। সেই key থেকে server বুঝতে পারে যে এটা duplicate ডাটা কিনা।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GET&lt;/strong&gt; - এটা idempotent হতেই হবে। না হলে duplicate data নিয়ে অনেক প্যারা খেতে পারেন।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PUT/PATCH&lt;/strong&gt; - এখানে একটু confusing লাগতে পারে। এখানে ensure করতে হবে যেই resource-টা update করছি, always যেন সেই resource-টাই update হয়। তাহলে এটাকে idempotent বলা যাবে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DELETE&lt;/strong&gt; - এখানে concept-টা PUT method-এর মতো। তবে same ID দিয়ে first request-এ actual data delete হবে কিন্তু বাকি সব ক্ষেত্রে তা Not Found বা Already Gone show করবে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এই idempotency-এর concept-টা API + আপনার application-কে অনেকটা stable এবং predictable করবে। এটা না জেনে যদি আপনি API develop করেন তবে অনেক unexpected problem face করতে পারেন।&lt;/p&gt;


&lt;h2&gt;
  
  
  Pagination Strategies
&lt;/h2&gt;

&lt;p&gt;আপনার কাছে মিলিয়ন মিলিয়ন ডাটা আছে। এই ডাটাকে একবারে ফেচ করলে লেটেন্সি অনেক বেড়ে যাবে। আর ইউজারের পক্ষে এত ডাটা একবারে রিড করা সম্ভব না। তাই ইউজার এক্সপেরিয়েন্স প্রপারলি মেইনটেইন করার জন্য চাঙ্ক চাঙ্ক (টুকরো টুকরো) করে ডাটা রেসপন্স করাটা বেটার। এই চাঙ্ক চাঙ্ক আকারে ডাটা রেসপন্স করার সিস্টেমকেই বলে Pagination।&lt;/p&gt;

&lt;p&gt;বিষয়টা এমন হবে যে—ইউজার বলবে আমাকে ১০টা করে আইটেম (limit) দাও এবং ১ম (page) ১০টা আইটেম দাও। তখন সার্ভার "১ম ১০টি" আইটেম প্রোভাইড করবে। এটা একটা সিম্পল স্ট্র্যাটেজি। সার্ভার এখানে সব ডাটাকে limit দিয়ে ভাগ করবে, তারপর যে পেজের ডাটা ইউজার চাইবে সেই পেজের ডাটা ইউজারকে প্রোভাইড করবে।&lt;/p&gt;

&lt;p&gt;Pagination-এর জন্য বেশ কিছু স্ট্র্যাটেজি আছে।&lt;/p&gt;
&lt;h3&gt;
  
  
  Offset
&lt;/h3&gt;

&lt;p&gt;এই স্ট্র্যাটেজি একদম সিম্পল—ইউজারের কাছ থেকে limit এবং offset (কয়টা আইটেম বাদ দিতে হবে) ইনপুট নেওয়া হয়। তারপর রেসপন্স করা হয়ে থাকে।&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="nx"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;offset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই স্ট্র্যাটেজি সিম্পল কিন্তু বিশাল ডেটাসেটের ক্ষেত্রে বটলনেক তৈরি করতে পারে। এখানে যে offset আছে, এই offset কিন্তু ডাটাবেসে কুয়েরি করার সময় রিড হয়। এখন যদি ডাটাবেসে ১ মিলিয়ন ডাটা থাকে এবং offset-এর ভ্যালু হাফ মিলিয়নে চলে যায়, তখন কিন্তু এই হাফ মিলিয়ন ডাটাই রিড করতে হবে।&lt;br&gt;
এখন আপনার পেজিনেশনের যে উদ্দেশ্য, সেটা কিন্তু অ্যাচিভ হচ্ছে না। ইনিশিয়ালি এটা ভালো মনে হলেও ডেটাসেট বিশাল হলে প্রবলেম শুরু হয়ে যায়।&lt;/p&gt;
&lt;h3&gt;
  
  
  Cursor
&lt;/h3&gt;

&lt;p&gt;এই স্ট্র্যাটেজিতে একটা cursor (unique id, timestamp ইত্যাদি) ব্যবহার করা হয়। লাস্ট যে ডাটার cursor ভ্যালু হিসেবে প্রোভাইড করা হবে, তারপর থেকে ডাটা ফেচ করা হয়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="nx"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="nx"&gt;e4567&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;e89b&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="nx"&gt;d3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;a456&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;426614174000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই স্ট্র্যাটেজি অফসেটের সমস্যা সমাধান করে। কিন্তু এই স্ট্র্যাটেজি ইমপ্লিমেন্ট করা অফসেটের চেয়ে অনেকটাই কমপ্লেক্স। এ ছাড়াও এই স্ট্র্যাটেজিতে ডুপ্লিকেট ডাটা রিটার্ন হওয়ার পসিবিলিটি থাকে। এই স্ট্র্যাটেজিতে কেয়ারফুলি হ্যান্ডেল না করলে এই ইস্যু ফেস করতে হতে পারে।&lt;/p&gt;

&lt;p&gt;Cursor Based Pagination বিশাল ডেটাসেটের জন্য বেস্ট চয়েস। আর ইন্ডাস্ট্রিতে এই স্ট্র্যাটেজি সবচেয়ে বেশি ব্যবহার হয়।&lt;/p&gt;

&lt;h3&gt;
  
  
  Time-Based Pagination
&lt;/h3&gt;

&lt;p&gt;এই স্ট্র্যাটেজিতে limit-এর পরিবর্তে একটা timestamp-এর রেঞ্জ প্রোভাইড করা হয়ে থাকে।&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="nx"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;from_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1234567890&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;to_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1234567890&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই স্ট্র্যাটেজি সব ধরনের ডেটাসেটের সাথে সুইটেবল না। যেখানে ডাটাগুলো টাইমস্ট্যাম্পের ভেতরে থাকে, সেই ক্ষেত্রে এটা বেস্ট কাজ করে। যেমন: logs, analytics রিলেটেড ডাটা ইত্যাদি।&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thought
&lt;/h3&gt;

&lt;p&gt;ওপরের সব স্ট্র্যাটেজিগুলো কিছু স্পেসিফিক প্রবলেম সলভ করে। তবে প্রোডাকশনে রিকোয়ারমেন্ট অনুযায়ী হাইব্রিড অ্যাপ্রোচ ব্যবহার করা হয়। কারণ এই স্ট্র্যাটেজিগুলো কিছু বেনিফিট দেয় + কিছু ওভারহেডও নিয়ে আসে। কোনো স্ট্র্যাটেজিই পারফেক্ট না। তবে ইন্ডাস্ট্রিতে সবচেয়ে বেশি ব্যবহার হয় cursor based pagination।&lt;/p&gt;




&lt;h2&gt;
  
  
  Error Response Strategy
&lt;/h2&gt;

&lt;p&gt;একটা অ্যাপ্লিকেশনে সবকিছু নিখুঁতভাবে কাজ করবে না। ইউজার ইনভ্যালিড ডাটা ইনপুট দিতেই পারে। এখন ইউজার যে ইনভ্যালিড ডাটা দিয়েছে, কী ডাটা দিয়েছে, কী ভুল করেছে—এই সব ইনফরমেশন ইউজারকে প্রপারলি প্রোভাইড করতে হবে, এটাই স্বাভাবিক ব্যাপার।&lt;/p&gt;

&lt;p&gt;এখন কোনো error তৈরি হলে, সেটা প্রপারলি হ্যান্ডেল করে ইউজারকে একটা গোছানো ফরম্যাটে error response প্রোভাইড করতে হবে। তবে এই error response যেন predictable হয়, সেটা নিশ্চিত করতে হবে।&lt;/p&gt;

&lt;p&gt;Error response-এর জন্য &lt;strong&gt;RFC 9457&lt;/strong&gt; স্ট্যান্ডার্ড রয়েছে।&lt;/p&gt;

&lt;p&gt;RFC 9457 ("Problem Details for HTTP APIs") হলো একটি স্ট্যান্ডার্ড স্পেসিফিকেশন, যা HTTP API-এর জন্য সহজে বোঝা যায় এমন JSON বা XML এরর ফরম্যাট নির্ধারণ করে।&lt;/p&gt;

&lt;p&gt;এই স্ট্যান্ডার্ড অনুযায়ী কিছু ফিল্ড প্রোভাইড করতে হয়, তবে সব ফিল্ড দেওয়া বাধ্যতামূলক না। নিচে উদাহরণ দেওয়া হলো:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;type (URI Reference):&lt;/strong&gt; একটি লিঙ্ক বা URI যা স্পেসিফিক সমস্যার ধরনকে চিহ্নিত করে। আদর্শভাবে এটি এমন একটি ডকুমেন্টেশনের লিঙ্ক হওয়া উচিত যা দেখলে এরর সম্পর্কে বিস্তারিত বোঝা যায়। কিছু না দিলে এটি ডিফল্ট হিসেবে &lt;code&gt;about:blank&lt;/code&gt; থাকে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;status (Number):&lt;/strong&gt; এই সমস্যার জন্য সার্ভার থেকে জেনারেট হওয়া সঠিক HTTP status code (যেমন: 400, 404, 422)।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;title (String):&lt;/strong&gt; সমস্যার একটি সংক্ষিপ্ত ও সহজবোধ্য শিরোনাম। এটি প্রতিবার একই রকমের হওয়া উচিত এবং কেবল ভাষার পার্থক্যের জন্য পরিবর্তিত হতে পারে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;detail (String):&lt;/strong&gt; এই নির্দিষ্ট এররের পেছনের কারণ নিয়ে বিস্তারিত ব্যাখ্যা। এটি একেক রিকোয়েস্টে একেক রকম হতে পারে এবং ডিবাগিংয়ে সাহায্য করে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;instance (URI Reference):&lt;/strong&gt; একটি ইউনিক URI বা পাথ যা নির্দিষ্ট এই ঘটনাটিকে আইডেন্টিফাই করে। এটি সাধারণত ইন্টারনাল রিকোয়েস্ট লগ বা ট্রানজেকশনের ইউনিক রেফারেন্স লিংক হিসেবে কাজ করে।
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/probs/out-of-stock"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Out of Stock"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"detail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The requested product is out of stock."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.example.com/products/123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"extra"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"You can add any extra information you want."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;আপনি চাইলে কাস্টম ফিল্ডও প্রোভাইড করতে পারেন। এখানে ফিক্সড কোনো নিয়ম নেই। যেমন ওপরে "extra" ফিল্ড ব্যবহার করা হয়েছে।&lt;/p&gt;




&lt;h2&gt;
  
  
  HATEOAS: API design standard
&lt;/h2&gt;

&lt;p&gt;API design নিয়ে অনেক কিছুই বললাম, কিন্তু কোনো standard বা architectural style নিয়ে কোনো কথাই বলিনি। না বলার main reason হচ্ছে industry-তে already একটা popular architectural style রয়েছে। সেটা শিখে নিতে পারলেই you are good to go।&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.digitalapi.ai/blogs/what-is-hateoas" rel="noopener noreferrer"&gt;Read More from here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HATEOAS স্ট্যান্ডার্ড প্রোভাইড করলেও বর্তমানে এটি ইগনোর করা শুরু হয়ে গেছে। এর মেইন কারণ হচ্ছে এর ওভারহেড। বর্তমানে ফ্রন্টএন্ড আর্কিটেকচারে সবসময় প্রেডিক্টেবল ডাটা প্রেফার করে, যাতে খুব সহজেই ফ্রন্টএন্ডের UI অর্গানাইজ ও অপ্টিমাইজ করা যায়। কিন্তু HATEOAS-এর প্রি-বিল্ট লিঙ্ক জেনারেশন ইত্যাদির কারণে এটি রিজেকশনের দিকে চলে গেছে। আর সবকিছু মাইক্রোসার্ভিসের দিকে যাওয়ার কারণে এটি ব্যবহার করার প্রয়োজনীয়তাও আর থাকে না।&lt;/p&gt;




&lt;h2&gt;
  
  
  বটম লাইন
&lt;/h2&gt;

&lt;p&gt;এই article-এ আমি just basic and important topic-গুলো cover করার try করেছি। এছাড়াও REST API design-এর ক্ষেত্রে আরও অনেক জিনিস আছে যেগুলো help করবে। API design-এর ওপর Stack Learner-এর একটা 9hrs free workshop আছে। আপনারা চাইলে তাদের YouTube বা official website থেকে access করতে পারেন।&lt;/p&gt;

&lt;p&gt;আপনি কি এখনও &lt;code&gt;POST /getUser&lt;/code&gt; টাইপের API লেখেন? সৎভাবে কমেন্টে বলুন! 😄👇&lt;/p&gt;

</description>
      <category>api</category>
      <category>backend</category>
      <category>rest</category>
      <category>software</category>
    </item>
    <item>
      <title>Day 02 — HTTP Deep Dive — ইন্টারনেটের রাজপথ</title>
      <dc:creator>Monirul Islam</dc:creator>
      <pubDate>Mon, 07 Sep 2026 04:20:00 +0000</pubDate>
      <link>https://dev.to/mislam-dev/day-02-http-deep-dive-inttaarnetter-raajpth-4e95</link>
      <guid>https://dev.to/mislam-dev/day-02-http-deep-dive-inttaarnetter-raajpth-4e95</guid>
      <description>&lt;p&gt;একটা জিনিস চিন্তা করুন, আপনি যখন কোনো খাবার খান, তখন কিন্তু খাবারটা সব কিছুই ঠিকঠাক থাকে। কিন্তু একটু চিন্তা করে দেখুন এই tasty খাবারটা prepare করার জন্য কী করা হয়েছে। Raw material collect করে, সেগুলো clean করার পরে একটা shape-এ নিয়ে যেতে হবে। Then প্রয়োজন অনুযায়ী নানা ধরনের মশলা, ঝাল, নুন, oil ইত্যাদি দিয়ে cook করে prepare করার পরেই কিন্তু এই অবস্থায় আপনি consume করছেন বা খাচ্ছেন।&lt;/p&gt;

&lt;p&gt;Web browser-এ HTTP মূলত এই cooking-এর কাজটা করে। Web server থেকে data আসে packet আকারে। সেটা আপনি দেখে বুঝতে পারবেন না। এটা decryption করে then prepare করে browser-কে দিবে, then browser render করার পরে আপনি দেখতে পারবেন। এখানে HTTP এই prepare করার কাজটা করে। Browser-এর জন্য একটা data prepare করে।&lt;/p&gt;




&lt;h2&gt;
  
  
  HTTP কী?
&lt;/h2&gt;

&lt;p&gt;HTTP (HyperText Transfer Protocol) হলো ইন্টারনেটের ভিত্তি, যার উপর দাঁড়িয়ে আছে পুরো World Wide Web। &lt;strong&gt;HTTP&lt;/strong&gt; হলো একটি &lt;strong&gt;application-layer protocol&lt;/strong&gt; যা client এবং server-এর মধ্যে data আদান-প্রদানের নিয়ম নির্ধারণ করে।&lt;/p&gt;

&lt;p&gt;আপনি যখন browser-এ কোনো website-এর address লেখেন, তখন আপনার browser সেই server-কে HTTP-র মাধ্যমে বলে: &lt;em&gt;"এই website-এর data-গুলো আমাকে দাও।"&lt;/em&gt; আর server সেই নিয়ম মেনে response পাঠায়।&lt;/p&gt;




&lt;h2&gt;
  
  
  HTTP কীভাবে কাজ করে?
&lt;/h2&gt;

&lt;p&gt;HTTP কাজ করে &lt;strong&gt;Request-Response&lt;/strong&gt; মডেলে:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkkq192creve54eaq0wgf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkkq192creve54eaq0wgf.gif" alt="Client Server HTTP" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;সহজভাবে বললে, দোকানদার এবং customer-এর কথা বলা যেতে পারে। Customer দোকানদারের কাছে গিয়ে যা চাইবে সেটাই দোকানদার দেবে। এখানে customer হচ্ছে client আর দোকানদার হচ্ছে server।&lt;br&gt;
Suppose customer এমন একটা জিনিস দিতে বলল যেটা available নাই। তখন কী হয়? দোকানদার বলেন যে এটা available না। HTTP-এর ক্ষেত্রে এরকম হলে server তখন error message return করবে।&lt;/p&gt;

&lt;p&gt;আমি এখানে খুব easily frank-ভাবে আলোচনা করছি, এই request পাঠানো এবং response receive করার জন্য অনেক rule and regulation follow করতে হয়। একটা standard way-তে এই কাজগুলো করতে হয়। এই standard follow করার জন্য অনেকগুলো বিষয় আছে, for example: Method, URL path, URL and Query parameters, Headers, Body, Status Code ইত্যাদি। এগুলো নিয়ে নিচে আলোচনা হবে।&lt;/p&gt;




&lt;h2&gt;
  
  
  Methods: শুধু GET আর POST না!
&lt;/h2&gt;

&lt;p&gt;একটা বিষয় চিন্তা করেন, আপনি যখন দোকানদারের কাছে কোনো কিছু নেন, তখন কিন্তু আপনাকে বলে দিতে হয় যে, এটা আমাকে দিন। আর টাকা pay করার সময়, আপনি আবার বলেন এই জিনিসের জন্য টাকা নিন। এখানে কিন্তু আপনি সবকিছু নির্দিষ্ট করে বলে দিচ্ছেন।&lt;/p&gt;

&lt;p&gt;Similar way-তে HTTP request করার সময়ও বলে দিতে হয় যে, আমার কী দরকার। আমি server থেকে নেব নাকি server-কে আমি দেব। এটার জন্য HTTP-তে method নামে একটা জিনিস আছে।&lt;/p&gt;

&lt;p&gt;HTTP Method মূলত ২ ধরনের: Read Methods &amp;amp; Write Methods।&lt;/p&gt;

&lt;p&gt;Read Methods-এর কাজ হচ্ছে server থেকে data fetch করে আনা। Server আপনাকে data provide করবে। আর Write method তার উল্টো কাজটা করে, আপনার কোনো data server-কে provide করতে হলে এই method-গুলো use করতে হয়।&lt;/p&gt;

&lt;p&gt;Read Methods অনেকগুলোই আছে তবে সবচেয়ে বেশি use হয়:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GET method:&lt;/strong&gt; এই একটা method দিয়ে read related সবকিছু করা যায়। সবসময় এই method-টা use হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;POST method:&lt;/strong&gt; Enterprise অ্যাপ্লিকেশন যেখানে জটিল কুয়েরি দিয়ে ডাটা ফেচ করতে হয়, সেখানে অনেক সময় POST মেথড ব্যবহার করে ডাটা রিড করা হয়। এটি মূলত জটিলতা কমানোর জন্য করা হয়ে থাকে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Write Methods:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;POST method:&lt;/strong&gt; এই method দিয়ে নতুন কোনো ডেটা create করার সময় use করা হয়। এর মাধ্যমে client থেকে server-এ data send করা হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PUT method:&lt;/strong&gt; এই method-টা অনেকটা POST-এর মতো, তবে এই ক্ষেত্রে নতুন data create করার বদলে existing কোনো data-কে update করা হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PATCH method:&lt;/strong&gt; PUT আর PATCH method একদম similar, এদের difference হচ্ছে PUT method সম্পূর্ণ data-কে replace করে দেয় আর PATCH method যতটুকু দরকার ঠিক ততটুকুই update করে। PUT-এর থেকে PATCH method বেশি use হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DELETE method:&lt;/strong&gt; নাম শুনেই বুঝে গেছেন, এর আসলে কাজ কী। এই method-এর কাজ হচ্ছে existing data-কে delete করা।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এখানে আপনি চাইলে যেকোনো method use করে কাজ চালিয়ে নিতে পারবেন। তবে long term এগুলো maintain না করলে problem-এর সম্মুখীন হওয়ার possibility থেকে যায়।&lt;/p&gt;




&lt;h2&gt;
  
  
  Status Codes: দ্য ওয়ে সার্ভার কমিউনিকেটস 📡
&lt;/h2&gt;

&lt;p&gt;আপনি দোকানদারকে pay করলেন এবং দোকানদার বলল যে এখনও টাকা কম হয়ে গেছে, আরও টাকা লাগবে। এখন আপনাকে কথার মাধ্যমে বলেছে আপনি বুঝে গেছেন। কিন্তু computer কীভাবে বুঝবে? আর এই বলার ধরন কিন্তু একেক সময় একেক রকমের হতে পারে। এটা কিন্তু guess করা প্রায় impossible। Client computer যাতে easily বুঝতে পারে, এই জন্য একটা standard কোনো কিছু দরকার। সেই standard-টাই হচ্ছে Status Code।&lt;/p&gt;

&lt;p&gt;Status-এর উপরে depend করে, একটা request fail, success, pending, redirect হয়েছে কি না। Client এই status code দেখেই বুঝবে আসলে request success হয়েছে নাকি fail হয়েছে। এই status code-গুলো কয়েকটা category-তে বিভক্ত:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2xx&lt;/strong&gt; — Everything OK।&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;200 OK&lt;/code&gt; : কাজ হয়েছে।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;201 Created&lt;/code&gt; : নতুন resource তৈরি হয়েছে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3xx&lt;/strong&gt; — Redirection।&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;301 Moved Permanently&lt;/code&gt; : URL পাল্টে গেছে চিরতরে।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;302 Found&lt;/code&gt; : সাময়িকভাবে অন্য জায়গায়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4xx&lt;/strong&gt; — Client Side Error।&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;400 Bad Request&lt;/code&gt; : Request-এ কোনো সমস্যা আছে।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;401 Unauthorized&lt;/code&gt; : এই resource access করার জন্য আগে login করতে হবে।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;403 Forbidden&lt;/code&gt; : এই resource access করার permission আপনার নেই।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;404 Not Found&lt;/code&gt; : Resource পাওয়া যায়নি।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5xx&lt;/strong&gt; — Server Side Error।&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;500 Internal Server Error&lt;/code&gt; : Server-এ কোনো অভ্যন্তরীণ সমস্যা হয়েছে।&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;503 Service Unavailable&lt;/code&gt; : সার্ভার সাময়িকভাবে ডাউন বা ওভারলোডেড। কিছু সময় পর আবার চেষ্টা করুন।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.restapitutorial.com/httpstatuscodes.html" rel="noopener noreferrer"&gt;HTTP status code&lt;/a&gt; এখানে সুন্দরভাবে গুছিয়ে সব কোডের details দেওয়া আছে।&lt;/p&gt;




&lt;h2&gt;
  
  
  Headers: খামের ওপরের তথ্য ✉️
&lt;/h2&gt;

&lt;p&gt;আপনার নিশ্চয়ই idea আছে যে একটা letter কীভাবে লিখে অন্যের কাছে পাঠাতে হয়। এখানে main letter-এর content থাকে। আর চিঠির খামে receiver এবং sender-এর address + কিছু information লেখা থাকে। এগুলো কিন্তু খুবই important।&lt;/p&gt;

&lt;p&gt;Similar way-তে HTTP request-এও কিছু important information header-এর মাধ্যমে server-এ পাঠানো হয়। এগুলোর উপরে server-এর অনেক decision depend করে। যেমন ধরুন আপনি response হিসেবে HTML চাচ্ছেন নাকি raw text চাচ্ছেন নাকি JSON data expect করছেন এটা header-এর ওপর depend করে। আবার আপনি কী type data client থেকে server-এ পাঠাবেন এটাও header-এর ওপর depend করে।&lt;/p&gt;

&lt;p&gt;নিচের header-এর example তুলে ধরা হলো:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Content-Type: application/json&lt;/code&gt; — এটা দিয়ে বোঝানো হয় আমি JSON পাঠাচ্ছি।&lt;br&gt;
&lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code&gt; — এই token দিয়ে আমাকে চেনো এবং access দাও।&lt;br&gt;
&lt;code&gt;Cache-Control: no-cache&lt;/code&gt; — cache করো না।&lt;/p&gt;

&lt;p&gt;Header মূলত ২ ধরনের:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Request Header:&lt;/strong&gt; এই header, request-এর সাথে client থেকে server-এ পাঠানো হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response Header:&lt;/strong&gt; এই header, response-এর সাথে server, client-এর জন্য পাঠায়।&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔒 HTTP vs HTTPS
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;HTTPS&lt;/strong&gt; = HTTP + &lt;strong&gt;SSL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SSL কীভাবে কাজ করে তা আগের article-এ খুব সুন্দর করে বুঝিয়েছি। এখন আর এখানে explain করার দরকার হবে বলে মনে হয় না।&lt;/p&gt;




&lt;h2&gt;
  
  
  HTTP/2: একের ভেতর সব এবং পারফর্ম্যান্স ট্রিকস 🚀
&lt;/h2&gt;

&lt;p&gt;HTTP/1.1 বহু বছর রাজত্ব করলেও এর একটি বড় সমস্যা ছিল। এটি &lt;strong&gt;Text-based&lt;/strong&gt; এবং একটি TCP কানেকশনে একবারে মাত্র একটি Request-Response process করতে পারতো। ফলে একটি request complete না হওয়া পর্যন্ত server পরের request process করতে পারতো না। ফলে latency অনেক বেড়ে যেত। এতে করে একটি রিকোয়েস্ট complete না হওয়া পর্যন্ত পরের রিকোয়েস্ট প্রসেস করতে পারতো না!&lt;/p&gt;

&lt;p&gt;ধরুন, একটি সুপারমার্কেটের ক্যাশ কাউন্টারে অনেকজন কাস্টমার লাইনে দাঁড়িয়ে আছে। কিন্তু ক্যাশিয়ার কেবল একজন কাস্টমারের বিল বানিয়ে শেষ করার পরেই পরবর্তী কাস্টমারকে সামনে ডাকতে পারছে! এটাকে বলে &lt;strong&gt;Head-of-Line (HOL) Blocking&lt;/strong&gt;। ওয়েবসাইটে ৫০টি ছবি ও স্ক্রিপ্ট থাকলে ৫০বার লাইন ধরে সার্ভিস নিতে হতো!&lt;/p&gt;

&lt;p&gt;এই problem গুলার সমাধান করতে ২০১৫ সালে আসে &lt;strong&gt;HTTP/2&lt;/strong&gt;। এর মূল feature গুলো হলো:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Multiplexing:&lt;/strong&gt; এখন আর আগের মতো আলাদা লাইনে দাঁড়াতে হয় না। একটি মাত্র TCP কানেকশনের ভেতর দিয়ে একই সাথে অনেক Request ও Response parallelly আদান-প্রদান করা যায়!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Binary Protocol:&lt;/strong&gt; ডাটা আর আগের মতো টেক্সট হিসেবে যায় না, বরং &lt;code&gt;0&lt;/code&gt; ও &lt;code&gt;1&lt;/code&gt; বাইনারি ফ্রেমে রূপান্তর হয়ে যায়। এতে প্রসেসিং অনেক ফাস্ট হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HPACK Header Compression:&lt;/strong&gt; প্রতি রিকোয়েস্টে বারবার একই হেডার পাঠানোর বদলে হেডার কমপ্রেস করে ব্যান্ডউইথ বাঁচানো হয়।&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;এইগুলো ছড়াও আরও অনেক ফিচার রয়েছে।&lt;/p&gt;




&lt;h2&gt;
  
  
  HTTP/3: TCP ছেড়ে UDP
&lt;/h2&gt;

&lt;p&gt;HTTP/2 এসে speed অনেক বাড়ালেও একটা মূল problem থেকে যায়। এটি তখনও &lt;strong&gt;TCP Protocol&lt;/strong&gt;-এর ওপর নির্ভরশীল ছিল! TCP-র স্বভাব হলো ডাটা পেকেট নিখুঁতভাবে পৌঁছানো নিশ্চিত করা। এখন কোনো কারণে ইন্টারনেটে একটি মাত্র পেকেট ড্রপ করলে বা হারিয়ে গেলে, TCP পুরো লাইন আটকে দেয় যতক্ষণ না সেই পেকেট পুনরায় রিসিভ হয়! ফলে HTTP/2-এর মাল্টিপ্লেক্সিংও আটকে যেতো!&lt;/p&gt;

&lt;p&gt;এই problem টাকে solve করার জন্য আসে &lt;strong&gt;HTTP/3&lt;/strong&gt;। এটি TCP পুরোপুরি বাদ দিয়ে &lt;strong&gt;UDP&lt;/strong&gt;-র ওপর নির্মিত &lt;strong&gt;QUIC Protocol&lt;/strong&gt; ব্যবহার করে।&lt;/p&gt;

&lt;p&gt;এর feature হলো:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;No Transport Head-of-Line Blocking:&lt;/strong&gt; এখন আর একটা পেকেট হারালে পুরো ট্রাফিক থমকে দাঁড়ায় না! বাকি সার্ভিসগুলো নিজেদের মতো আপন গতিতে চলতে থাকে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0-RTT Handshake (মুহূর্তের মধ্যে কানেকশন):&lt;/strong&gt; TCP-র মতো বারবার ৩-ওয়ে হ্যান্ডশেক না করে অতি দ্রুত প্রথম রিকোয়েস্টেই রেসপন্স আনা সম্ভব হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connection Migration (নেটওয়ার্ক বদলালেও ডিসকানেক্ট হয় না!):&lt;/strong&gt; মনে করুন, আপনি ওয়াইফাই থেকে বাড়ির বাইরে গিয়ে মোবাইল ডাটায় সুইচ করলেন। আপনার IP পরিবর্তন হয়ে গেল! প্রথাগত TCP সিস্টেমে কানেকশন ডিসকানেক্ট হয়ে ডাউন হয়ে যেতো। কিন্তু HTTP/3 IP-র বদলে ইউনিক &lt;strong&gt;Connection ID&lt;/strong&gt; ব্যবহার করে, তাই নেটওয়ার্ক বদলালেও আপনার ডাউনলোডিং বা স্ট্রিম বিরামহীনভাবে চলতে থাকে!&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  বটম লাইন
&lt;/h2&gt;

&lt;p&gt;HTTP শুধু GET/POST না, Methods, status codes, headers — এই পুরো জিনিসটা মাথায় না থাকলে API design-এ, debugging-এ বারবার ক্যাচাল লাগবে। এই জিনিসগুলো maintain করলে বিশেষ করে Team-এ কাজ করলে অনেক সমস্যা থেকে দূরে থাকা যায়। আমি এমনও সিচুয়েশন দেখেছি যেখানে data conflict-এর জন্য ২০০ status code return করছে!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;বি:দ্র:&lt;/strong&gt; HTTP হলো stateless — প্রতিটা request স্বাধীন। আগের request-এর কথা server মনে রাখে না। এই কারণেই আমরা &lt;strong&gt;JWT token, session, cookie&lt;/strong&gt; ব্যবহার করি।&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;আপনার সবচেয়ে বেশি confuse করা status code কোনটা? কমেন্টে বলুন! 👇&lt;/p&gt;

</description>
      <category>http</category>
      <category>webdev</category>
      <category>network</category>
      <category>api</category>
    </item>
    <item>
      <title>Day 1 — ইন্টারনেট আসলে কীভাবে কাজ করে</title>
      <dc:creator>Monirul Islam</dc:creator>
      <pubDate>Sun, 06 Sep 2026 04:20:00 +0000</pubDate>
      <link>https://dev.to/mislam-dev/day-1-inttaarnett-aasle-kiibhaabe-kaaj-kre-18pc</link>
      <guid>https://dev.to/mislam-dev/day-1-inttaarnett-aasle-kiibhaabe-kaaj-kre-18pc</guid>
      <description>&lt;p&gt;আকাশ নামের এক ছেলের কাছে একটা ফোন এলো। ওপাশ থেকে একজন খুব সিরিয়াস গলায় বলল, "আমাদের ব্যাংকের server maintain করা হচ্ছে। আপনার অ্যাকাউন্টে একটু সমস্যা হয়েছে। এখনই ঠিক না করলে অ্যাকাউন্ট freeze হয়ে যাবে।" আকাশ ঘাবড়ে গেল।&lt;/p&gt;

&lt;p&gt;"আপনাকে একটা OTP সেন্ড করেছি, জাস্ট ওটা বলেন। সব ঠিক হয়ে যাবে।" আকাশ কিছু না ভেবেই OTP টা দিয়ে দিল। পরের মুহূর্তেই ওর ফোনে মেসেজ এলো—অ্যাকাউন্টের পুরো টাকা গায়েব!&lt;/p&gt;

&lt;p&gt;এখন আপনার মনে প্রশ্ন জাগতে পারে। আমি তো জাস্ট কয়েকটা সংখ্যা দিলাম। তাহলে—&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;আমার ব্যাংকের টাকাগুলো অন্য কারো কাছে চলে গেল কীভাবে?&lt;/li&gt;
&lt;li&gt;এটা কীভাবে সম্ভব?&lt;/li&gt;
&lt;li&gt;তারা কি জাদুকর?&lt;/li&gt;
&lt;li&gt;নাকি আপনার ফোনের ভেতরে ঢুকে টাকা নিয়ে গেল?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;আসলে কোনো জাদু নেই। সবকিছুই ঘটছে একটা বিশাল জালের মাধ্যমে। যেটার নাম Internet।&lt;/p&gt;




&lt;h2&gt;
  
  
  Internet জিনিসটা কী?
&lt;/h2&gt;

&lt;p&gt;চিন্তা করেন, আপনি একটা পাড়াতে থাকেন। পাড়ার বাড়িগুলো একে অপরের সাথে রাস্তা দিয়ে কানেক্টেড থাকে। ইন্টারনেটও ঠিক এরকমই।&lt;br&gt;
এখানে বাড়িগুলো হচ্ছে এক একটা computer বা machine। আর রাস্তাগুলো হচ্ছে তার বা cable। এই তারের মাধ্যমেই পুরো দুনিয়ার সব কম্পিউটার একসাথে কানেক্টেড থাকে।&lt;/p&gt;

&lt;p&gt;এখন যেমন ইন্টারনেটকে সিম্পল এবং সহজ মনে হয়, আগে কিন্তু এত সহজ ছিল না। ১৯৬০-এর দশকের শেষের দিকে, যুক্তরাষ্ট্রের ডিফেন্স সিস্টেম নিজেদের ভেতরে সিক্রেট ডাটা শেয়ার করার জন্য একটা নেটওয়ার্ক তৈরি করে, যার নাম ছিল ARPANET। তখন এটা শুধুমাত্র সরকারি কাজের ব্যবহারের জন্য ছিল। এটাই মূলত পরবর্তীতে বিবর্তিত হয়ে internet হয়ে যায়।&lt;/p&gt;

&lt;p&gt;Internet উন্মুক্ত হতে শুরু করে যখন Tim Berners-Lee World Wide Web (WWW)-এর প্রবর্তন করেন। আর আজকের দিনে আমরা যা দেখছি YouTube, Facebook, Google, Netflix, Cloud, Online Banking, সব এই internet-এর ফসল।&lt;/p&gt;




&lt;h2&gt;
  
  
  DNS: ইন্টারনেটের ফোনবুক
&lt;/h2&gt;

&lt;p&gt;মনে করুন আপনার মা আপনাকে বলল, "ঐ মিস্টার মনসুর সাহেবের বাড়ির সামনে যে দোকান আছে সেখানে যাবি, গিয়ে লিস্টের মালামালগুলো নিয়ে আসবি।" সাথে কিছু টাকাও দিল। এখন আপনি কী করবেন?&lt;/p&gt;

&lt;p&gt;আপনি সোজা চলে যাবেন সেই দোকানে আর যা কাজ আছে শেষ করে ফেলবেন। কিন্তু বিষয়টা যদি অন্য দূরের কাউকে করতে বলা হয় তাহলে সে কী করবে?&lt;/p&gt;

&lt;p&gt;তার দোকানে যেতে হবে, skip করতে পারবে না। আর সে আপনার এলাকার কিছুই চেনে না। এখন তাকে যেতে হলে নিচের কাজগুলো করতে হবে:&lt;/p&gt;

&lt;p&gt;এলাকা সম্পর্কে যে ভালো চেনে-জানে তার কাছে গিয়ে জিজ্ঞাসা করে জেনে নিতে হবে, then সেই instruction follow করে সেই দোকানে যাবে। এখন সেই জানা লোকটা আপনিও হতে পারেন।&lt;/p&gt;

&lt;p&gt;DNS ঠিক এই কাজটাই করে।&lt;br&gt;
একটু আগেই বললাম যে internet অনেক computer-কে একসাথে করে communicate করে। এই computer-গুলোকে identify করার জন্য unique IP address থাকে। এগুলো দিয়ে সেই computer-গুলো access করা যায়। IP address নিয়ে একদিন বিস্তারিত কথা হবে। কিন্তু কথা হচ্ছে, এই IP address মনে রাখা একটু কষ্টকর, এর জন্য Domain Name System (DNS) use করা হয়। এখন এই domain-এর বিপরীতে তো IP address-গুলো save করা লাগবে, যেমনভাবে আপনি আপনার এলাকার সবকিছু নিজের memory-তে save করে রেখেছেন।&lt;/p&gt;

&lt;p&gt;DNS-এ আপনার domain name-এর বিপরীতে একটা IP address save করা থাকবে এবং আপনি URL-এ domain লিখে যখন hit করবেন তখনই, এই IP address resolve হয়ে যাবে এবং destinated computer-এ পৌঁছে যাবে।&lt;/p&gt;

&lt;p&gt;আশা করা যায়, DNS সম্পর্কে idea হয়ে গেছে।&lt;/p&gt;




&lt;h2&gt;
  
  
  TCP/IP: ডেটার ডাকঘর
&lt;/h2&gt;

&lt;p&gt;একটা বিষয় চিন্তা করুন, আপনি যখন আপনার কোনো friend বা senior বা কোনো ব্যক্তির সাথে কোনো conversation করতে চান তখন আপনি কী করেন?&lt;br&gt;
normally তাকে ভালো-মন্দ জিজ্ঞাসা করে তার কাছ থেকে জেনে নেন যে সে free আছে কিনা বা তার সাথে কথা বলতে পারবে কিনা? সে যদি free থাকে বা রাজি হয় তাহলে কথাবার্তা শুরু হয় তারপর একটা সময় শেষ হয়ে যায়।&lt;br&gt;
অনেক ক্ষেত্রে, সে কিন্তু আপনার এই request reject করে দিতে পারে, কারণ তার অন্য কাজ থাকতে পারে বা আপনার সাথে তার কথা বলার ইচ্ছা নেই।&lt;/p&gt;

&lt;p&gt;similar-ভাবে, যখন ২টা computer connect করার try করা হয়, তখন কিন্তু এই বিষয়গুলো ভাবতে হয়। আসলে সেই machine কি free আছে বা আমার সাথে connect হবে কিনা। accept করলেই তারপর connect করতে হবে। এই connection তো আর এমনি মুখে বললেই হয়ে যাবে না। এর জন্য rules and regulation প্রয়োজন বা একটা Protocol প্রয়োজন। সেই protocol-টাই হচ্ছে TCP/IP।&lt;/p&gt;

&lt;p&gt;TCP/IP হচ্ছে একটা protocol suite, যা ২টা computer-কে connect করতে help করে এবং data flow-কে regulate করে। এটা মূলত OSI model-এর Networking layer-এ কাজ করে। Data-কে packet-এ transform করে network-এর through-তে অন্য computer-এ send করার জন্য prepare করে।&lt;/p&gt;

&lt;p&gt;TCP/IP big topic। এই simple একটা topic নিয়ে পুরা একটা book লিখে ফেলা যাবে। আমি simple-ভাবে বুঝানোর try করলাম।&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: TCP/IP নিয়ে যদি কেউ বিস্তারিত পড়তে চান তাহলে আগে OSI model-টা ভালো করে পড়ে নিবেন। আর তারপর internet আর networking সম্পর্কে হালকা basic idea নিলেই আপনি TCP/IP বোঝার জন্য prepare।&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  HTTP: ভাষাটা শেখো
&lt;/h2&gt;

&lt;p&gt;একটু আগেই বললাম যে TCP/IP দিয়ে ২টা computer connect করা যায়। আর সেখানে data-গুলো packet-এ transfer করা হয়। কিন্তু problem হচ্ছে এই packet-গুলোকে কিন্তু আপনি দেখতে পারবেন না। এই packet-গুলো সুন্দর করে সাজাতে হবে যাতে করে user বা client খুব easily এগুলো use করতে পারে।&lt;/p&gt;

&lt;p&gt;এই কাজটাই করে HTTP (Hyper Text Transfer Protocol)। যখন আপনি browser-এ কোনো URL-এ hit করেন তখন সেটা server থেকে packet আকারে data client-এর কাছে আসে। এরপরে HTTP সেটাকে browser-এর জন্য ready করে এবং browser এই content-গুলো render করে তখন আপনি website-এর visual look-টাকে দেখতে পারেন।&lt;/p&gt;

&lt;p&gt;HTTP মূলত এই কাজটাই করে থাকে।&lt;/p&gt;




&lt;h2&gt;
  
  
  SSL: Security
&lt;/h2&gt;

&lt;p&gt;এতক্ষণ তো অনেক কিছুই বললাম। এখন কথা হচ্ছে সবাই যদি এই rules and regulation follow করে internet-এ data pass করা শুরু করে তাহলে কিন্তু যেকেউ চাইলেই একটু trick করে অন্য জনের data-র access নিতে পারবে। তাহলে solution কী?&lt;/p&gt;

&lt;p&gt;Solution is SSL (Secure Sockets Layer)।&lt;/p&gt;

&lt;p&gt;SSL-এর কাজ হচ্ছে ডাটাকে Encrypt করা। Encrypt করা, সেটা আবার কী জিনিস?&lt;/p&gt;

&lt;p&gt;ধরুন, আপনি একটা চিঠিকে একটা বাক্সে তালাবদ্ধ করে পাঠালেন। এই তালার চাবি আছে শুধু আপনার আর প্রাপকের কাছে। মাঝপথে কেউ বাক্সটা পেলেও খুলতে পারবে না কষ্টে, কারণ তার কাছে চাবি নেই।&lt;/p&gt;

&lt;p&gt;SSL মূলত এই কাজটাই করে। Data-কে key দিয়ে encrypt করে send করে এবং অন্য computer থেকে receive করার পরে key দিয়ে data-টাকে decrypt করে। এই ক্ষেত্রে মাঝখান থেকে কেউ data-কে পেলেও তা decrypt করতে পারবে না।&lt;/p&gt;

&lt;p&gt;এই encryption decryption-এর জন্য অনেকগুলো algorithm রয়েছে। এখানে algorithm ভেদে এক বা একাধিক key ব্যবহার করা হয়ে থাকে encrypt/decrypt করার জন্য। এই নিয়ে অন্য একটা ব্লগে বিস্তারিত আলোচনা হবে।&lt;/p&gt;




&lt;h2&gt;
  
  
  Internet Protocol
&lt;/h2&gt;

&lt;p&gt;HTTP-এর মতো, এটাও একটা protocol। এই protocol-এর কাজ হচ্ছে, দুইটা computer-এর মধ্যে connection establish করা এবং data transfer-এর জন্য ideal (short and less costly) path খুঁজে বের করা। Then data packet properly transfer করা।&lt;/p&gt;

&lt;p&gt;Internet-এর through-তে যে data transfer হয়, তবে একটা জিনিস—এই protocol কিন্তু data loss হলে সেটার responsibility নিবে না। এটা জাস্ট data transfer করবে। That's it।&lt;/p&gt;

&lt;p&gt;এই responsibility নেওয়ার জন্য transport protocol যেমন TCP ব্যবহার করা হয়।&lt;/p&gt;

&lt;h3&gt;
  
  
  IP Routing
&lt;/h3&gt;

&lt;p&gt;IP Routing হচ্ছে internet-এর through-তে data transfer করার জন্য ideal path খুঁজে বের করা। এই routing করার জন্য কিছু algorithm ব্যবহার করা হয়। যেমন: OSPF (Open Shortest Path First), BGP (Border Gateway Protocol) ইত্যাদি।&lt;/p&gt;

&lt;p&gt;যখন কোনো request কোনো machine-এ পাঠানো হয় তখন ওই machine-এর IP address-কে target করে request send হয়। তখন request intercept করে router। Router-এর local routing table ওই machine-এর IP address store করে রাখে। সেখান থেকে fetch করে router এই request particular ওই machine-এ transfer করে দেয়।&lt;/p&gt;




&lt;h2&gt;
  
  
  TCP (Transmission Control Protocol)
&lt;/h2&gt;

&lt;p&gt;এই protocol-টার কাজ হচ্ছে, data-এর consistency এবং reliability ensure করা। Internet Protocol data transfer করতে help করে, কিন্তু data loss হলে তার responsibility নেয় না। Data যাতে loss না হয় এবং properly transfer হয় সেটা ensure করার জন্য TCP ব্যবহার করা হয়। Basically TCP একটা connection establish করে data transfer start করে। Receiver end-এ data receive হলে, সেখান থেকে একটা acknowledgment-এর message আসে। এইভাবেই data-র reliability ensure হয়।&lt;/p&gt;

&lt;p&gt;TCP-র reliability ensure করার জন্য flow control এবং error control-এর ব্যবস্থা আছে। Present time-এ TCP এবং IP এই দুইটা protocol একসাথে ব্যবহার করা হয়।&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;N.B.&lt;/strong&gt; TCP একটা huge topic। এর অনেকগুলো layer রয়েছে। প্রত্যেকটা layer different different responsibility carry করে। এখানে সে বিষয় নিয়ে আলোচনা করছি না। অন্য একদিন সেটা নিয়ে আলোচনা হবে।&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  UDP (User Datagram Protocol)
&lt;/h2&gt;

&lt;p&gt;এটা TCP-র মতো একটা protocol। কিন্তু এখানে delivery check করা হয় না। অনেকটা fire and forget-এর মতো। এই protocol real-time communication যেমন Video streaming, Voice Calling, online Gaming ইত্যাদিতে ব্যবহার হয়।&lt;/p&gt;




&lt;h2&gt;
  
  
  তাহলে হ্যাক হলো কীভাবে?
&lt;/h2&gt;

&lt;p&gt;এখন একটা প্রশ্ন থেকেই যায়, এত কিছু থাকার পরেও আকাশের টাকা গায়েব হলো কীভাবে?&lt;/p&gt;

&lt;p&gt;এখানে hacker-রা internet break করেনি। Hacker আকাশের brain বা mobile hack করে টাকাটা গায়েব করেছে।&lt;/p&gt;

&lt;p&gt;আসলে আকাশের account internet-এর মাধ্যমে access করার facility আছে। এখন ঐ account access করার জন্য একটা OTP দরকার ছিল যেটা মূলত আকাশের mobile-এ send হবে। সেটা পেলেই পুরা account-এর access পেয়ে যাবে। আর hacker-রা কিন্তু call করেই সেই OTP-টা collect করেছে।&lt;/p&gt;

&lt;p&gt;এভাবেই মূলত টাকাগুলো গায়েব হয়েছে।&lt;/p&gt;




&lt;h2&gt;
  
  
  বটম লাইন
&lt;/h2&gt;

&lt;p&gt;ইন্টারনেট মূলত অসংখ্য কম্পিউটারের একটা বিশাল নেটওয়ার্ক, যারা একে অপরের সাথে তারের মাধ্যমে কানেক্টেড। ডাটা ট্রান্সফার করার জন্য এখানে HTTP, TCP/IP-এর মতো প্রটোকল কাজ করে। আর ডাটাকে সিকিউর রাখার জন্য কাজ করে SSL বা Encryption।&lt;/p&gt;

&lt;p&gt;এই বিষয়ে আরও গভীরে যাওয়ার ইচ্ছা থাকলে OSI model সম্পর্কে একটু রিসার্চ করার অনুরোধ রইল।&lt;/p&gt;

&lt;p&gt;আপনার সবচেয়ে বড় challenge কী ছিল? কমেন্টে জানাবেন 👇&lt;/p&gt;

</description>
      <category>networking</category>
      <category>dns</category>
      <category>http</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Agile Software Development Part-1 | Software Engineering</title>
      <dc:creator>Monirul Islam</dc:creator>
      <pubDate>Sun, 11 May 2025 10:37:44 +0000</pubDate>
      <link>https://dev.to/mislam-dev/agile-software-development-part-1-software-engineering-4796</link>
      <guid>https://dev.to/mislam-dev/agile-software-development-part-1-software-engineering-4796</guid>
      <description>&lt;p&gt;বর্তমানে বেশির ভাগ ব্যবস্যায় সারা বিশ্বে অপারেট করছে। আর সব কিছুই খুবই দ্রুত পরিবর্তন হচ্ছে। বেশির ভাগই ব্যবস্যাতেই বর্তমানে ম্যানেজম্যান্টের কাজ গুলো করা সম্পূর্ণ ভাগে সফটওয়্যার ব্যবহার করা হচ্ছে। এখন যেহেতু সব কিছুই দ্রুত পরিবর্তন হচ্ছে সেহেতু সফটওয়্যার ডেভেলোপ করা প্রয়োজন। কিন্তু সমস্যা হচ্ছে এই এত অল্প সময়ের মধ্যে এই ধরনের সফটওয়্যার তৈরি করা সম্ভব না। দেখা গেল, সফটওয়্যার তৈরি করা হওয়ার পর সেটার আর কোন প্রয়োজনীয়তা নেই।&lt;/p&gt;

&lt;p&gt;এই সমস্যা সমাধানের ক্ষেত্রে কোম্পানি গুলো একটা বিষয়ে রাজি হতে পারে। তারা সফটওয়্যার এর কুয়ালিটির তে ফোকাস এবং requirements এর উপর কম্প্রোমাইজ করতে পারে। যাতে তারা দ্রুত সফটওয়্যার ডেপ্লয় করতে পারে। এইটার কারন হিসেবে যুক্তি দেওয়া যেতে পারে এমন, সবকিছু পরিবর্তনশীল , আর ব্যবসায় তো প্রতিনিয়ত পরিবর্তন হয়, তাই একটা সম্পূর্ন সফটওয়্যার তৈরি করা প্রায় অসম্ভব কাজ।&lt;/p&gt;

&lt;p&gt;দ্রুত সফটওয়্যার ডেভেলপমেন্ট করার মুল কারন হচ্ছে, কাস্টমার জানেন বা বুঝতে পারেন এই সফটওয়্যার তার জীবনে কিভাবে প্রভাব ফেলবে। এজন্য সফটওয়্যারটি সফল বা ব্যর্থ উভয় হতে পারে। এক্ষেত্রে কাস্টমার ফিডব্যাক অধিকত গুরুত্বপূর্ন। সফটওয়্যার এর কিছু কিছু আছে যেগুলো কাস্টমারে কোন কাজে লাগে অথবা এমন কিছু আছে একটু পরির্তন করার প্রয়োজন হতে পারে।&lt;/p&gt;

&lt;p&gt;এখই এই পরিস্থিতে যদি Plan-driven বা Waterfall মডেল ব্যবহার করা হয়, যেটা অনেক সময় সাপেক্ষ , তাহলে দেখা গেল কাস্টমার এটা ব্যবহার করায় ছেড়ে দিছে।&lt;/p&gt;

&lt;p&gt;দ্রুত সফটওয়্যার ডেভেলপমেন্ট করার এমন কিছুর প্রসেস দরকার যেটার দ্বারা পরিবর্তন গুলো সহজে পরিচালনা করা যায়। এজন্য একমাত্র সমাধান হচ্ছে Agile Development or Agile methods.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agile methods
&lt;/h2&gt;

&lt;p&gt;Agile methods হলো একটি incremental development method যেখানে increments গুলো ছোট ছোট এবং সাধারনভাবে ২-৩ সপ্তাহের মধ্যে মধ্যে নতুন নতুন ফিচার রিলিজ করা হয়ে থাকে। এখানে কাস্টমারকে সংযুক্ত করা হয় এবং তার ফিডব্যাকের প্রহন করা হয়। এই ফিডব্যাকের উপর নির্ভর করে নতুন ফিচার পরবর্তী রিলিজে অ্যাড বা রিমুভ করে দেওয়া হয়।&lt;/p&gt;

&lt;p&gt;Plan Driven পদ্ধতি মূলত আবিষ্কার করা হয়েছিল, মূলত বড় টিমের জন্য। এই পদ্ধতিতে অনেক সময় লেগে যায়। Plan Driven পদ্ধতি ক্রিটিক্যাল সিস্টেম গুলো ডিজাইন করা জন্য ব্যবহার করা সব থেকে ভাল। কারন এই পদ্ধতিতে সব থেকে বেশি মাথাব্যাথা থাকে প্লানিং, জিজাইনিং এবং ডকুমেন্টশন এর উপর। এটা অবশ্যই যৈক্তিক। কারন এসব সিস্টেমে একটু এদিক ওদিক হয়ে গেলে বড় আকারে ক্ষতি হয়ে যেতে পারে। যেটা পূরন করা সম্ভব নয়।&lt;/p&gt;

&lt;p&gt;এই ভারী পদ্ধতি ব্যবহার করে একধরনের অশান্তির সৃষ্টি হয় তখন আর্বিভাব ঘটে Agile methods এর। Agile methods এর দর্শন বা ফিলোসফি এর ম্যানিফেস্টতে বোঝা যায়।&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We are uncovering better ways of developing software by doing it and helping others do it. Through this work we have come to value:&lt;br&gt;
Individuals and interactions over processes and tools Working software over comprehensive documentation Customer collaboration over contract negotiation Responding to change over following a plan&lt;br&gt;
That is, while there is value in the items on the right, we value the items on the left more.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Visit &lt;a href="https://agilemanifesto.org/" rel="noopener noreferrer"&gt;Agile Manifesto&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agile এর সবগুলো methods একটা জিনিসের পরামর্শ দিয়ে থাকে, দ্রুত ডেভেলপমেন্ট এবং ডেলিভারি করা। এসব মেথডস গুলো বিভিন্ন পদ্ধতিতে কাজ করে থাকে কিন্তু এতের ভিতরে বিদ্যমান নীতি বা প্রিন্সিপাল গুলো একই ধরনের।&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F47gojuaznxfkd8nuo1cn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F47gojuaznxfkd8nuo1cn.jpg" alt="agile terms" width="768" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agile methods গুলো দুই ধরনের সিস্টেম ডেভেলপ করা জন্য সব থেকে সফল।&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;প্রোডাক্ট ডেভেলপমেন্ট সেখানে কোন কোম্পানি বিক্রয় করা জন্য ছোট অবথা মিডিয়াম সাইজের প্রোডাক্ট ডেভেলপ করছে।&lt;/li&gt;
&lt;li&gt;কোন সংগঠনের জন্য কাস্টম সিস্টেম ডেভেলপমেন্ট&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Agile Development Techniques
&lt;/h2&gt;

&lt;p&gt;Agile methods মুলত ডেভেলপ হয় নব্বই এর দশকে। সফটওয়্যার এর ডেভেলপমেন্ট কালচারে পরিবর্তন এক্সট্রিম প্রোগ্রামিং এর মধ্যে দিয়ে। এই পদ্ধতিতে বেস্ট প্রাক্টিস গুলো ফলো করা হয়, iterative ডেভেলপমেন্ট করা হয় এবং ডেভোলোপমেন্ট চরম পর্যায়ে পুশ করা হয়। একটা সিস্টেমের একটা নতুন ভার্সন একই দিনে আলাদা আলাদা প্রোগ্রামার ডেভেলপ, ইন্টিগ্রড এবং টেস্ট করবে।&lt;/p&gt;

&lt;p&gt;extreme programming-এ requirements গুলোকে বিভিন্ন সিনারিও হিসেবে প্রকাশ করা হয়, যেগুলো মুলত সিরিজ টাস্ক হিসবে ইমপ্লিমেন্ট করা হয়। প্রোগ্রামাররা এই টাস্ক গুলোর উপর ভিত্তি করে বিভিন্ন টেস্ট কেস ডেভেলপ করে এবং টেস্ট কোড লেখার এই টেস্ট গুলো অবশ্যই পাস করাতে হয়।&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4f25h5kjb1vq7pg8ybhc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4f25h5kjb1vq7pg8ybhc.jpg" alt="extreme programing practices" width="570" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;প্রাক্টিক্যালি দেখলে, দেখা যাবে XP যেমন টা সহজ মনে হয়, আসলে এটা ততটায় কঠিন একটা প্রসেস। এখানে বেশিরভাগ কোম্পানির ক্ষেত্রে এই প্রসেস টা ইন্টিগ্রেট করা সম্ভব হয় না। বিভিন্ন ধরনের সমস্যা দেখা দেয়। ম্যানেমেন্ট করতে সব থেকে বেশি সমস্যার সৃষ্টি হয়। বর্তমানে বেশির ভাগ কোম্পানিই Scrum কে ব্যবহার করছে কারন এটা সম্পূর্ণ ম্যানেজমেন্ট ফোকাস।&lt;/p&gt;

&lt;h3&gt;
  
  
  User Stories
&lt;/h3&gt;

&lt;p&gt;software requirements প্রতিনিয়ত পরিবর্তন হতে থাকে। এসব পরিবর্তনকে হ্যান্ডেল করা করা জন্য Agile methods এর আলাদা কোন requirements engineering আকটিভিটি নাই। মুলত requirements elicitation করা হয় ডেভেলপমেন্ট করার সময়। এই জিনিস টাকে সহজ করার জন্য উদ্ভব হয় “user stories”। “user stories” হল একটা সিনারিও যেখানে সিস্টেম ডেভেলপ হওয়ার পর একজন ব্যবহারকারীর কি রকম অভিজ্ঞতা হবে তার বিবরন।&lt;/p&gt;

&lt;p&gt;কাস্টমার এবংডেভেলপমেন্ট টিম একসাথে আলোচনার মাধ্যমে একটা স্টোরি কার্ড ডেভোলোপ করে যেখানে সব কিছু বিস্তারিত উল্লেখ থাকে। story card গুলো নিচের মত হতে পারে,&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mp3v1winw2m2zm4knzq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mp3v1winw2m2zm4knzq.png" alt="User stories" width="737" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;user stories সিস্টেম ডেভেলপ করা জন্য প্লানের কাজে ব্যবহার করা যেতে পারে, যেখানে ইটারেটিভ ভাবে কাজ গুলো করা হবে। একবার story card গুলো ডেভেলপ হয়ে গেলে সেগুলো কে ভেঙ্গে আলাদা আলাদা টাস্ক এ পরিনত করা হয়। এখানে মুলত রিসোর্স requirements এস্টিমেট করা হয় এবং কাস্টমার এর সাথে আলোচনা করা হয় এবং দেখা হয়, কোন পরিবর্তন করার প্রয়োজন আছে কিনা। এখানে টাস্ক গুলোকে এমনভাবে বিভক্ত করা হয় যাতে সেগুলো ২ সপ্তাহের ভিতরে তৈরি করা সম্ভব হয়।&lt;/p&gt;

&lt;p&gt;কোন কিছু যদি পরিবর্তন করা হয় তাহলে সেগুলো ২ সপ্তাহ পরে যে রিলিজ দেওয়া হবে সেখানে যুক্ত করে দেওয়া হয়। আর যদি কোন আগে থেকে ডেভেলপ করা থাকে তাহলে কাস্টমার এর ফিডব্যাক এর নির্ভর করে সিদ্ধান্ত নেওয়া হয়ে ওই নতুন ফিচার থাকবে নাকি আগের যেটা ছিল সেটাই থাকবে। আর যেগুলোর দরকার নেই সেগুলোকে মুছে ফেলা হয়।&lt;/p&gt;

&lt;p&gt;user stories এর সব থেকে বড় সমস্যা হল এর পূর্ণতা নিয়ে। একটা সম্পূর্ন সিস্টেমের requirements পূরনের জন্য প্রয়োজনীয় সকল স্টোরি গুলো ডেভেলপ হয়ে কিনা তা বোঝা খুব কঠিন। আবার একটা স্টোরির সিস্টেমের কোন একটিভিটি সম্পুর্ণ রুপে আলোচনা করছে কিনা তাও বোঝা কঠিন। ইউজার প্রায়শ অনেক কিছুই উল্লেখ করতে ভুলে যান।&lt;/p&gt;

&lt;h3&gt;
  
  
  Refactoring
&lt;/h3&gt;

&lt;p&gt;Software Engineering এর মৌলিক উদ্দেশ্য হচ্ছে সিস্টেম ডিজাইন করা পরিবর্তনের জন্য। এমন ভাবে সিস্টেমটাকে ডিজাইন করতে হবে , যাতে সহজে পরিবর্তন করা যায়। Refactoring এর মানে হচ্ছে, প্রগ্রামিং টিম সম্ভাব্য ইম্প্রুভমেন্ট গুলো খুজবে এবং তৎক্ষণাৎ সেগুলোকে ইমপ্লিমেন্ট করবে।&lt;/p&gt;

&lt;p&gt;আমরা যারা বিশেষ করে মিডলেভেল ডেভেলপার তারা বেশির ভাগ ক্ষেত্রেই এই কাজ গুলো করে থাকি। প্রথমে কোন ভাবে সমস্যা টা সমাধান করতে পারলেই হচ্ছে। তারপর যখন সিস্টেম রেডি হয়ে যাবে , তখন সেগুলো কে একটু একটু করে পরিবর্তন (যেখানে পরিবর্তন করা সম্ভব ) করা শুরু করে দেই। এমনকি এইধরনের কাজ অনেক সিনিয়র ডেভেলপারাও করে থাকেন। প্রথমে খারাপ কোড লেখা হয় বলে কিন্তু এটাকে খারাপ বলা যায় না। কারন যখন প্রথম রিলিজ দেওয়া হয় , কেউ জানে যে সিস্টেমটা কতজন ইউজার ব্যবহার করবে। আর খুব ভালো কোড লিখতে গেলে তো অনেক সময় আর খরচ লেগে যাবে। এজন্য অনেক এই ধরনের কাজ করা ভাল।&lt;/p&gt;

&lt;p&gt;Incremental development একটি মৌলিক সমস্যা হচ্ছে, এখানে সিস্টেম স্ট্রাকচার ধীরে ধীরে খারাপে দিকে যেতে থাকে। একটা পর্যায়ে এমনও হতে পারে যে সিস্টেম এ আর কাজ করা সম্ভব হচ্ছে না। Refactoring সিস্টেম স্ট্রাকচার এর মান বৃদ্ধি করে বোধ্যগম করে তোলে এবং স্ট্রাকচার যাতে অবনতি না হয় সেদিকে লক্ষ্য রাখা হয়।&lt;/p&gt;

&lt;p&gt;Refactoring এর উদাহরন অনেক রয়েছে। Code duplication remove, unused code remove, unwanted feature remove, make code organize ইত্যাদি। আরো ভালো করে বললে, কোড অনেক অংশ আছে যেগুলো বার ব্যবহৃত করে হয়েছে। একট কোড কপি পেস্ট করা হয়েছে। এক্ষেত্রে ওই কোডকে একটা ফাংশন বানিয়ে ব্যবহার করে কোড ডুপ্লিকেশন কমে যাবে।&lt;/p&gt;

&lt;h3&gt;
  
  
  Test Driven Development
&lt;/h3&gt;

&lt;p&gt;Test Driven Development বা TDD একটা পদ্ধতি যেখানে কোন কিছু ইমপ্লিমেন্ট করার আগেই তার প্রয়োজনীয় টেস্ট কেস লেখা হয়। TDD একটা Extreme Programming এর একটি অংশ। XP তে টেস্টিং এর কিছু বৈশিষ্ট রয়েছে।&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test First Development&lt;/li&gt;
&lt;li&gt;incremental test development from scenarios&lt;/li&gt;
&lt;li&gt;user involvement in the test development and validation&lt;/li&gt;
&lt;li&gt;the use of automated testing frameworks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Test Driven Development বা TDD সফটওয়্যার ইঞ্জিনিয়ারিং -এ একটি গুরুত্বপূর্ণ উদ্ভাবন। সাধারন ভাবে আমরা কি করি কোন ফিচারকে ইমপ্লিমেন্ট করি । তারপর তার জন্য প্রয়োজনীয় টেস্ট কেস লিখি। এখানে সমস্যা হচ্ছে আমরা অনেক কিছুই উপেক্ষা করতে পারি আবার কোড লেভেল ফোকাস করতে অনেক টেস্ট কেস এর কথা মাথায় থেকে চলে যেতে পারে। অনেক ক্ষেত্রে অনেক বাগ দেখা দিতে পারে। TDD কোন কিছু ইমপ্লিমেন্টশন করা আগে তার জন্য প্রয়োজনীয় সকল টেস্ট কেস গুলো লিখে ফেলা হয়। এবং তারপর কোড লেভেলে কাজ করা হয়। বাগ হওয়ার সম্ভাবনা কমে যায়। তাছার কোডার কে বেশি চিন্তা করা লাগে না। আর সব থেকে বড় কথা টেস্ট কেস গুলো যতক্ষন তা পাস হচ্ছে ততখন সেটা মূল সিস্টেমের সাথে যোগ করা হবে না।&lt;/p&gt;

&lt;p&gt;TDD এর আরেক টা সুবিধা হচ্ছে কাস্টমারকে হ্যাপি রাখা যায়। আমি ব্যক্তিগত ভাবে কাজ করতে যেয়ে অনেক সমস্যার সম্মুখীন হয়েছি।&lt;/p&gt;

&lt;p&gt;“এইটা কেন কাজ করছে, এইটা কেন কাজ হচ্ছে না? এই এমন হচ্ছে কেন? কাল রাতেই তো ঠিক ছিল আজকে আবার কি হল ? ইত্যাদি “&lt;/p&gt;

&lt;p&gt;এখানে আমার ভুল ছিল আমি তার Story কে ভালো করে ব্যাখা করতে পারিনি। কিরকম ফিচার লাগবে সেটা নিয়ে তেমন আলোচনা করলেও সেগুলো অনেক হাই লেভেল এর ছিলো (কোড থেকে অনেক উপরে )। এখানে যদি TDD প্রয়োগ করা হয়, তাহলে কি হত, কাস্টমার এর ভাব পরিবর্তন হয়ে যেত। তখন তার কথা নিম্নরুপ হতে পার,&lt;/p&gt;

&lt;p&gt;“এই ফিচার টা এমন করা যায় না? এই টা নিচে না দিয়ে উপরে দিকে দেওয়া যেতে পারে কিনা? এই ফিচার টা নতুন করে অ্যাড করা যায় কিনা ? ইত্যাদি”&lt;/p&gt;

&lt;p&gt;কাস্টমার এর কথা টোনই পরিবর্তন হয়ে যাবে। কারন যখন তার story এর উপরে বেইজ করে Story card বানানো হয়েছিল, কাস্টমার এর সাথে মিলেমিশেই টেস্টকেস গুলো লেখা হয়েছিল। এখানে তার মাথায় অনেক টেস্ট কেস এর আর্বিভাব হতে পারে, যেগুলো ডেভেলপার এর মাথায় সহজে আসবে না। এখন যদি কোন কিছু হয় তাহলে কাস্টমার ব্লেম করা সুযোগ পাবে না। কারন সে নিজেও তো ছিল। আর সেহেতু সব শর্ত্যই পূরন হয়ে যাচ্ছে এর মানে আর কোন সমস্যা নেই। কোড মূল সিস্টেমের সাথে অ্যাড করা জন্য প্রস্তুত।&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9daa5uf35mncylbngth.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9daa5uf35mncylbngth.jpg" alt="figure test case description for dose checking" width="764" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TDD এর জন্য টেস্ট আটোমেশন অত্যাবশীকীয়। টেস্ট গুলো লেখা হয় কম্পোনেন্ট গুলো তৈরি হওয়ার আগে execute করা জন্য। এই টেস্ট কেস গুলো অবশ্যই স্বতন্ত্র হতে হবে যাতে ইনপুট দিয়ে সহজে টেস্ট করা যায়। টেস্টিং কে অবশ্যই অটোমেশন করতে হবে যাতে যখন কোন পরিবর্তন হয় তখন যেন টেস্টিং শুরু হয়ে যায়। ফলাফল ইতিবাচক হলে মূল সিস্টেমে যুক্ত করতে দেওয়া হবে আর না হলে আবার কোড কর।&lt;/p&gt;

&lt;p&gt;TDD তে কিছু সমস্যা আছে।&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;প্রোগ্রামার টেস্টিং কে অগ্রধিকার দেয় তবে অনেক ক্ষেত্রে টেস্ট লেখার সময় সটকাট ব্যবহার করে। এসময় অনেক টেস্ট কেস এড়িয়ে যায়। এক্ষেত্রে অনাকাক্ষিতে বাগের দেখা মিলে।&lt;/li&gt;
&lt;li&gt;কিছু কিছু টেস্ট আছে যেগুলো লেখা খুবই কষ্টকর বিষয়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TDD তে অনেক টেস্ট কেস লেখা হয়। কিন্তু তারপরও এটা বলা মুশকিল যে টেস্ট কেস গুলো সম্পূর্ণ সিস্টেমকে কভারেজ দিতে পারছে।&lt;/p&gt;

&lt;h3&gt;
  
  
  Pair Programming
&lt;/h3&gt;

&lt;p&gt;Pair এর বাংলা হচ্চে জোড়া। যখন দুইজন প্রোগ্রামার একসাথে একই কম্পিউটারে বসে প্রোগ্রামিং করবে তখন তাকে Pair Programming বলা হবে। কোন টাস্ক সম্পূর্ন করা জন্য আপনার একজান পার্টানার থাকবে। তবে এই পেয়ার প্রতিবার ডায়নামিক্যালি তৈরি করা হবে।&lt;/p&gt;

&lt;p&gt;Pair Programming এর কিছু সুবিধা আছে।&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Collective Ownership:&lt;/strong&gt; সিস্টেম সবাই একই সাথে কাজ করে তাই সিস্টেম এর Ownership সবার থাকে। কেউ কাউকে ব্লেম করতে পারে না। দায়িত্ব বা দায়ভার সবার থাকে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Informal Reviews:&lt;/strong&gt; যেহেতু একজন পেয়ার থাকে সেহেতু কোডের একটা Informal review হয়ে যায়। এখান থেকে সিস্টেম এ অ্যাড হওয়ার আগেই অনেক এরর বের হয়ে আসতে পারে। যদি এই প্রসেসে অনেক সময় লেগে যায় বিধায় ডেভেলপমেন্ট প্রসেস এ ডিলে তৈরি হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encourages Refactoring:&lt;/strong&gt; নিজে নিজে কোড লিখলে অনেক সময় বোঝায় যায় না যে এখানে ইম্পূভ করা যেত । আর অন্য বিস্তারিত ভাবে বলে দেবে না। এখন একজন পেয়ার থাকলে দুইজনের মধ্যে আলোচনা অনেক ইম্পুভমেন্ট করা যেতে পারে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এখানে যে কেউ মনে করবে যে, Pair Programming individual programming এর থেকে ভালো না। আসলে দুইজন আলাদা আলাদা ভাবে যে কোড লিখতে পারবে , Pair Programming -এ তা অর্ধেক হয়ে যাবে। অনেক কোম্পানি আছে যারা Pair Programming কে ব্যবহার করে তারা এই নিয়ে সন্দিহান এবং তার এটা আর ব্যবহার করে না। তবে ক্ষেত্রে বিশেষ সিনিয়র প্রোগ্রামার জুনিয়র প্রোগ্রামের সাথে এক সাথে কাজ করে।&lt;/p&gt;

&lt;p&gt;Pair Programming সব থেকে সুবিধাজন হচ্ছে জুনিয়র এবং মিডলেভেল প্রোগ্রামারদের জন্য। কিন্তু সিনিয়র লেভেল প্রোগ্রামারদের জন্য একবারে যুক্তি যুক্ত নয়। এতে তাদের প্রোডাক্টিভিটি অনেক কমে যাবে।&lt;/p&gt;

&lt;p&gt;Pair Programming ক্ষেত্র বিশেষ-এ এখনো ব্যবহার করা হয়। তবে বেশির ভাগই কোম্পানিই এতা ব্যবহার করতে চাইবে না।&lt;/p&gt;

&lt;p&gt;To be continued...&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Software Process</title>
      <dc:creator>Monirul Islam</dc:creator>
      <pubDate>Thu, 08 May 2025 04:06:40 +0000</pubDate>
      <link>https://dev.to/mislam-dev/software-process-g2e</link>
      <guid>https://dev.to/mislam-dev/software-process-g2e</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Software Process হলো একগুচ্ছ পরস্পর সম্পর্কিত কার্যক্রম (activities) যা একটা একটি Software production এর দিকে নিয়ে যায়। &lt;/p&gt;

&lt;p&gt;Software Process টা System এর ভিত্তি করে  বিভিন্ন ধরনের হতে পারে। এর জন্য নিদির্ষ্ট কোন পদ্ধতি নেই। তবে process যেমনই  হোক না কেন ৪টা  জিনিস অবশ্যই তার ভিতরে রাখতে হবে।&lt;/p&gt;

&lt;p&gt;১। Software Specifications &lt;/p&gt;

&lt;p&gt;২। Software Development &lt;/p&gt;

&lt;p&gt;৩। Software Validation&lt;/p&gt;

&lt;p&gt;৪। Software Evolution &lt;/p&gt;

&lt;p&gt;( নিচে এগুলো নিয়ে বিস্তারিত আলোচনা করা হবে। )&lt;/p&gt;

&lt;p&gt;Software Process একটি জটিল বিষয় এবং অন্য একটি সৃজনশীল ( Creative) কাজগুলোর মত করে,  মানুষের সিদ্ধান্ত এবং তাদের চিন্তার ধারার উপর নির্ভর করে। যেহেতু এখানে কোনো Universal কোন  Process নায় এই জন্য, কম্পানিগুলো তাদের মত করে একটা Process তৈরি করে নেয় , যাতে তারা তাদের কম্পানিতে কর্মরত Engineer দের দক্ষতা ব্যবহার করে সর্বোচ্চ সুবিধা গ্রহন করতে পারে। তবে এক্ষেত্রে এই প্রসেস  Engineer এবং System এর উপর নির্ভর করে সময়ের সাথে সাথে পরিবর্তন হতে পারে। &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Roles reflect the responsibilities of the people involved in the process. For example: Project Manger, programmer , database designer etc.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Software Process Models
&lt;/h2&gt;

&lt;p&gt;Software Process model হলো software process এর সহজ উপস্থাপনা। একে অনেক সময় SDLC (Software Development Life Cycle) Models ও বলা হয়ে। এই সকল মডেল গুলো High লেভেল এর হয়ে থাকে। এখানে শুধুমাত্র activity গুলো তুলে ধরা হয়। এই activity এর উপর নির্ভর বিভিন্ন কর্মপদ্ধতি চিন্তা করা হয়। &lt;/p&gt;

&lt;p&gt;কিছু সাধারন মডেলঃ&lt;/p&gt;

&lt;p&gt;১। The Waterfall Model &lt;/p&gt;

&lt;p&gt;২। Incremental Development&lt;/p&gt;

&lt;p&gt;৩। Integration and Configuration&lt;/p&gt;

&lt;p&gt;এইগুলো সাধারন কয়েকটা মডেল। যেহেতু Universal কোন মডেল নেই সেহেতু কোন প্রতিষ্ঠান বা কম্পানি চাইলে তাদের মত এই সব মডেল ডিজাইন করে ব্যবহার করতে পারে। তবে এখানে তাদের মূল উদ্দেশ্য হবে  সময়ের মধ্যে দ্রুত Software প্রস্তুত করে Delivery করা।  তার চাইলে ২ বা ততোধিক মডেল একসাথে মডেল তৈরি করতে পারে। এতা সম্পূর্ণ নির্ভর করছে  তাদের System এর ধরন  এবং Developer দের দক্ষতার উপর। &lt;/p&gt;

&lt;h2&gt;
  
  
  The Waterfall Model
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09gva3yrx7f7eo50xxh9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09gva3yrx7f7eo50xxh9.jpg" alt="The Waterfall Model" width="600" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Waterfall model মডেল হলো কয়েকটি ধাপ নিয়ে গঠিত হয়। এখানে মূলত একটা ধাপের কাজ শেষ হলে পরবর্তী ধাপের কাজ শুরু হয় । তবে প্রতিটি ধাপের কাজ গুলো Document এর মাধ্যমে সংরক্ষন করা হয়। এটা একট plan-driven মডেল। এখানে Software Development শুরু করার আগেই সব কিছু প্লান করা হয়। &lt;/p&gt;

&lt;p&gt;The Waterfall model এর কিছু ধাপ যেগুলো মৌলিক Software Development এর কার্যক্রমঃ &lt;/p&gt;

&lt;p&gt;১। Requirements Analysis and Definition: এখানে সিস্টেম এর সক্ষমতা , সীমাবদ্ধতা ইত্যাদি বিষয় নিয়ে আলাপ আলোচনা হয়। &lt;/p&gt;

&lt;p&gt;২। System and Software Design:  এই ধাপে সিস্টেম এর জন্য হার্ডওয়্যার ও সফটওয়্যার এর জন্য একটা Architecture তৈরি করা হয়। &lt;/p&gt;

&lt;p&gt;৩। Implementation and Unit Testing: এই ধাপে এসে  মুলত  প্রোগ্রামিং করা হয় এবং প্রতিটি ছোট কম্পোনেন্টকে টেস্ট করা হয়।  &lt;/p&gt;

&lt;p&gt;৪। Integration and System testing: এই ধাপে সকল ছোট ছোট Unit কে একত্র করে , সম্পর্ণ সিস্টেমটাকে টেস্ট করা হয়। এই টেস্টিং সফল হলে সফটওয়্যার ডেলিভারি করা জন্য প্রস্তুত। &lt;/p&gt;

&lt;p&gt;৫। Operation and Maintenance: এই ধাপ তো হল সব থেকে লম্বা ধাপ। সিস্টেম ডেলিভারি করা হয়ে গেছে এবং প্রাক্টিক্যালি ব্যবহার করা হচ্ছে। এখন অনেক Bugs , error থাকতে যেগুলো টেস্টিং এর সময় ধরা পড়ে নি। এই ধাপে এসে সেগুলো ঠিক করা হয়। এছাড়াও সিস্টেম সিকিউরিটি , পারফরমেন্স উন্নত করা চেষ্টা করা হয়। &lt;/p&gt;

&lt;p&gt;এই বিষয় গুলো পরবর্তীতে আলোচনা হবে। &lt;/p&gt;

&lt;h3&gt;
  
  
  Problems of Waterfall Model
&lt;/h3&gt;

&lt;p&gt;Waterfall model হার্ডওয়্যার ডেভোলপ করা জন্য ঠিক আছে। কারন এই পন্য একটা প্রস্তুত হয়ে গেল তা আর পরিবর্তন করা যায় না। এর জন্য সবকিছু ভালো মত ধাপে ধাপে কার্য সম্পাদন করা হয়। যেকোন একটা ধাপে যদি ভুল হয় , সেটা সম্পূর্ণ প্রডাক্টকে নষ্ট করে দিতে পারে। &lt;/p&gt;

&lt;p&gt;তবে Software এর ক্ষেত্রে পরবর্তীতে পরিবর্তন করা সম্ভব। Software প্রতিনিয়তই পরিবর্তন করার প্রয়োজন হতে পারে। The Waterfall model-এ কোন ধাপে যদি সমস্যা হয় তাহলে সেটা আবার পূনরায় প্রথম ধাপ থেকে শুরু করা হয়। Software develop করার ক্ষেত্রে বিভিন্ন ধাপে প্রবলেম হবে। সেক্ষেত্রে প্রথম শুরু করা অনেক সময় লেগে যাবে। তার বড় বিষয় হচ্ছে এখানে একটা ঝুকি থেকে যায়। ঝুকি টা হচ্ছে, যদি Software ডেভেলোপ শেষ হওয়ার পরে সেটা কারও পছন্দ না হয়। User যদি গ্রহন না করে। তখন এই সময় টুকু নষ্ট হয়ে যাবে। তাছাড়া এই মডেলে কাজ করলে একটা ফিচার রিলিজ করতেও অনেক সময় লেগে যায়। &lt;/p&gt;

&lt;h3&gt;
  
  
  Applications of Waterfall model
&lt;/h3&gt;

&lt;p&gt;১। Embedded Systems:  Embedded Systems একবার ইমপ্লিমেন্ট করা হয়ে গেলে তা আর পরিবর্তন করার সুযোগ থাকে না। এজন্য প্রতিটা ধাপ খুব ভালো ভাবে রিসার্চ করে তারপর পার করা হয়। এর জন এই ধরনের সিস্টেম তৈরি করতে সময় ও লেগে যায়। &lt;/p&gt;

&lt;p&gt;২। Critical System:  critical system গুলোতে প্রতেক টি ডাটা প্রয়োজন এজন্য প্রতিটি ধাপ আস্তে আস্তে ভালো ভাবে পার করা প্রয়োজন, যাতে ভবিষ্যতে কোন অনাকাঙ্ক্ষিত ঘটনা না ঘটে। &lt;/p&gt;

&lt;h3&gt;
  
  
  Ending
&lt;/h3&gt;

&lt;p&gt;বর্তমানে  Waterfall model  একবারে যৌক্তিক না , কারন সিস্টেম এর Requirements  প্রতি নিয়ত পরিবর্তন হয়। এখন যদি Waterfall model ফলো করে সিস্টেম রেডি করা হয় তাহলে অনেক সময় লেগে যাবে। দিন যার ভ্যালু অনেক কমে যেতেও পারে। অতিতে এমন অনেক কেস আছে। দেখা গেছে, একজনের কাছে একটা খুব ভালো আইডিয়া আছে। কিন্তু সেই আইডিয়া সম্পর্ণ রুপ দিতে গেলে অনেক সময় লেগে যাবে। তার আইডিয়া ছিল সম্পূর্ণ রেডি করে তারপর ময়দানে নামবে। কিন্তু তার সেইম আইডিয়া অনেক পরে এসে অল্প অল্প করে ডেভেলোপ করে তারা আজ ধরা ছোয়ার বাইরে চলে গেছে। &lt;/p&gt;

&lt;p&gt;So The Waterfall model  is not suitable for current software development. &lt;/p&gt;

&lt;h2&gt;
  
  
  Incremental Development
&lt;/h2&gt;

&lt;p&gt;Incremental Development -এ প্রথমে একটা প্রাথমিক প্রোডাক্ট বা software তৈরি করা হয় এবং পরবর্তীতের user এবং অন্যান্যদের মতামতের উপর ভিত্তি করে আস্তে আস্তে ডেভেলোপ হয়। এখানে ভার্সন ম্যানেজমেন্ট করে নতুন নতুন ফিচার যুক্ত করা হয়। নতুন ফিচার এর জন্য নতুন একটা ভার্সন রিলিজ দেওয়া হয়ে থাকে। &lt;/p&gt;

&lt;p&gt;বর্তমানে এই ধরনের মডেল খুবই জন্যপ্রিয়।  এখানে সকল ফিচার আস্তে আস্তে ধাপে ধাপে ডেভোলোপ করা করা হয়। প্রতিনিয়ত সব কিছু পরিবর্তন হচ্ছে। সাথে মানুষের চাহিদা , প্রয়োজন , দৈনন্দিন জীবন ব্যবস্থা সব কিছুই  পরিবর্তন হচ্ছে। এখন একটি software কে যদি সার্ভাইভ করতে হয় তাহলে এই সকল বিষয় গুলো বিবেচনা করেই আগাতে হবে। এখানে যেহেতু পর্যায়ক্রমে সব কিছু ডেভেলোপ হয়,  সেহেতু নতুন নতুন ফিচার নিয়ে ডেভোলোপ করা খুবই সহজ হয়। আবার পুরাতন ফিচার যেগুলোর আর দরকার নেই সেগুলোও বাদ দেওয়া যায়। নতুনত্বের সাথে তাল মিলিয়ে চলা যায়। &lt;/p&gt;

&lt;p&gt;Incremental Development এর ক্ষেত্রে ভার্সন ম্যানেজ করা হয়। প্রথমে একটা মিনিমাল software রিলিজ দেওয়া হয়। এই ভার্সন গুলো user ব্যবহার করতে পারে। এর পরে নতুন নতুন ফিচার প্লান করা হয়। সেগুলো যুক্ত করা হয়ে গেলে সব কিছু টেস্ট করার পর নতুন একটা ভার্সন রিলিজ করা হয়। নতুন ফিচার, বাগ ফিক্সিং কোড পরিবর্তন করলেই সেটা নতুন ভার্সনে নিয়ে যাওয়া হয়। তবে প্রতিটি নতুন ভার্সন user এর কাছে expose না করলেও চলে। একবার অনেক গুলো ভার্সন রিলিজ দেওয়া যেতে । এটা নির্ভর করছে কম্পানি বা প্রতিষ্ঠানের উপর। এই ভার্সন ম্যানেজমেন্ট এর জন্য  প্রসেস টা Waterfall Model এর তুলনায় অনেক সহজ করে দেই। তাছাড়া এই ভার্সনের মাধ্যমে বেটা টেস্টিং করা যায়। &lt;/p&gt;

&lt;h3&gt;
  
  
  Advantages
&lt;/h3&gt;

&lt;p&gt;Incremental Development এ Waterfall model এর তুলনায় ৩ টা প্রধান সুবিধা রয়েছে।  &lt;/p&gt;

&lt;p&gt;১। খরচ কমে যায়ঃ Waterfall Model এ প্রতিটি ধাপে বিস্তারিত ভাবে সব কিছু ডকুমেন্ট করা হয়। এখন যদি কোন requirements এর পরিবর্তন হয় তাহলে তার খরচ Incremental Development model অনেক কম। &lt;/p&gt;

&lt;p&gt;২। কাস্টমার ফিডব্যাকঃ Waterfall model-এ সম্পূর্ণ software তৈরি না হলে কাস্টমার থেকে ফিডব্যাক নেওয়া সম্ভব হয় না। আর ডকুমেন্টশন কাস্টমার পড়তে খুব বেশি স্বাছন্দ বোধ করে না। এই মডেল যেহেতু ধাপে ধাপে develop করা হয়, সেহেতু customer খুব সহজে তার ফিডব্যাক দিতে পারে। &lt;/p&gt;

&lt;p&gt;৩। Early Delivery and Deployment : এই প্রসেস এ কাস্টমার দ্রুত একটা প্রোডাক্ট পেয়ে যায়। যদিও এটা সম্পূর্ন ফাংশনালিটি যুক্ত থাকে না। কিন্তু তা ব্যবহার এর উপযুক্ত হয়ে যায়। waterfall model এর তুলনায় এখানে সময় অনেক কম লাগে &lt;/p&gt;

&lt;h3&gt;
  
  
  Problems
&lt;/h3&gt;

&lt;p&gt;Incremental Development  এর সুবিধা থাকলেও ম্যানেজমেন্ট এর দিক থেকে চিন্তা করলে দুইটি অসুবিধা আছে। &lt;/p&gt;

&lt;p&gt;১। এর মডেলে প্রসেস দেখা যায় না। এই জন্য ম্যানেজার কে প্রতিনিয়ত ডিলিভারি গুলো দেখতে হয় এবং এই অনুযায়ী প্রগ্রেস তৈরি করতে হয়। এ ক্ষেত্রে যদি সফটওয়্যার যদি খুবই দ্রুত প্রয়োজন হয় এবং প্রতিটি ভার্সনে ডকুমেন্টেশন করা লাগে তাহলে খরচ অনেক বেড়ে যায়। &lt;/p&gt;

&lt;p&gt;২। সিস্টেম স্ট্রাকচার নষ্ট বা খারাপ হওয়ার সম্ভাবনা থাকে যখন নতুন ফিচার যুক্ত করা হয়। এখানে যেহেতু অনেক জন একসাথে কাজ করে সেক্ষেত্রে নতুন কিছু যুক্ত করতে গেলে সেখানে একটু সমস্যার সৃষ্টি হতে পারে। তাছাড়া সবার দক্ষতা সমান না। এই জন্য অনেক সময় সিস্টেম এর স্ট্রাকচার নিচের দিকে নেমে যায়। অনেক সময় নষ্ট ও হয়ে যায়।  &lt;/p&gt;

&lt;p&gt;এই সমস্যা গুলো সবথেকে বেশি দেখা দেয় বড় , জটিল এবং লম্বা সময় এর সিস্টেমে যেখানে এই সব বড় সিস্টেমের ছোট ছোট অংশ বিভিন্ন টিম কাজ করে । এই ধরনের সিস্টেম গুলোতে এই সমস্যাগুলো সব থেকে বেশি দেখা দেয়। মূলত এই ধরনের সিস্টেম এ কাজ করার জন্য আগেই থেকেই আর্কিটেকচার, ডকুমেন্টশন এবং আনুসাংঙ্গিক সব কিছুই আগে থেকে ঠিক ঠাক করে রাখতে হয়। &lt;/p&gt;

&lt;h2&gt;
  
  
  Integration and Configuration
&lt;/h2&gt;

&lt;p&gt;Software Engineer এর দের মধ্যে একটা প্রিন্সিপাল খুব পরিচিত &lt;strong&gt;DRY, Don’t Repeat Yourself&lt;/strong&gt;  এই প্রিন্সিপাল মুল নীতি একই রকম কম্পোনেন্ট কে বার বার নতুন করে না বানিয়ে , সেটাকে বার বার ব্যবহার করা। বর্তমানে এই জিনিস টা খুবই জনপ্রিয়তা। সবাই এই সিম্পল প্রিন্সিপাল ফলো করার চেষ্টা করে। এই ভাবে একই জিনিস বার বার ব্যবহার করার হলো Re-use oriented পদ্ধতি।&lt;/p&gt;

&lt;p&gt;Re-use oriented পদ্ধতি টা মুলত একটা পুনরায় ব্যবহার করা যাবে এমন সফটওয়্যার কম্পোনেন্ট (একাধিক হতে পারে)  এবং একটা ফ্রেমওয়ার্ক যার দ্বারা এসব কম্পোনেন্ট কে একসাথে ব্যবহার করা যাবে তার উপর নির্ভর করে । &lt;/p&gt;

&lt;p&gt;একটা উদাহরনের মাধ্যমে বিষয়টা সহজ করা যাক। &lt;/p&gt;

&lt;p&gt;আমাদের কাছে একটা Department Manage করার জন্য একটা সফটওয়্যার আছে। এখন এই সফটওয়্যার টা আমরা পুনরায় ব্যবহার করতে পারি (COTS)। এই সফটওয়্যার-এ  নিচের এই ফিচার গুলো আছে, &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interactive Dashboard&lt;/li&gt;
&lt;li&gt;Course Management&lt;/li&gt;
&lt;li&gt;Students , Teacher and Staff Management&lt;/li&gt;
&lt;li&gt;Online Exam&lt;/li&gt;
&lt;li&gt;Online Quiz and Assignment&lt;/li&gt;
&lt;li&gt;Calendar with Scheduling Facility&lt;/li&gt;
&lt;li&gt;Report Generation&lt;/li&gt;
&lt;li&gt;Setting and Preference Management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এখন সিভিল ডিপার্ট্মেন্ট থেকে বলা হলো ঠিক এইধরনের একটা সফটওয়্যার তৈরি করার জন্য। সেই সফটওয়্যার নিচের ফিচার গুলো থাকতে হবে, &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interactive Dashboard&lt;/li&gt;
&lt;li&gt;Course Management&lt;/li&gt;
&lt;li&gt;Students , Teacher and Staff Management&lt;/li&gt;
&lt;li&gt;Calendar with Scheduling Facility&lt;/li&gt;
&lt;li&gt;Attendance&lt;/li&gt;
&lt;li&gt;Instrument Management&lt;/li&gt;
&lt;li&gt;Report Generation&lt;/li&gt;
&lt;li&gt;Setting and Preference Management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এখানে লক্ষ্য করলে দেখা যাবে, আগের প্রস্তুতকৃত সফটওয়্যার সাথে কয়েকটা জিনিস বাদে বাকি গুলো বিল্ড করা রয়েছে। এখন আমরা  সিভিল ডিপার্ট্মেন্ট এর কাছে জিজ্ঞাসা করতে পারি যে আমাদের এই রকম একটা সফটওয়্যার আছে, তার ভিতরে এই এই ফিচার নেই । এখন কি আপনারা এটা ব্যবহার করবেন, তার যদি রাজি হয়, তাহলে আমরা কিছু কনফিগারেশন করে সফটওয়্যার ডেলিভারি করে দেব ব্যাস। আমারদের কাছ শেষ।  তারা যদি রাজি না হয় তাহলে  ওইগুলো ব্যবহার করে এবং নতুন কম্পোনেন্ট গুলো নতুন করে বিল্ড করে  দুই ধরনের কম্পোনেন্টগুলো একসাথে করে সফটওয়্যার টি প্রস্তুত করতে পারি । &lt;/p&gt;

&lt;h3&gt;
  
  
  Software Components
&lt;/h3&gt;

&lt;p&gt;তিন ধরনের সফটওয়্যার কম্পোনেন্ট রয়েছে। &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stand-alone applications: এই ধরনের অ্যাপ্লিকেশান গুলো সাধারনভাবে ব্যবহার করার জন্য ব্যবহৃত হয়। এখানে একসাথে প্রয়োজনীয় অপ্রয়োজনীয় অনেকগুলো ফিচার থাকে।&lt;/li&gt;
&lt;li&gt;Collection of Objects: এই ধরনের সফটওয়্যার  কম্পোনেন্টস গুলো বেশিরভাগ ক্ষেত্রেই প্যাকেজ হয়, যেটা আগে থেকে বিদ্যমান  বিভিন্ন সফটওয়্যার এর সাথে কাজ করে থাকে।&lt;/li&gt;
&lt;li&gt;Web services: এই বিভিন্ন ধরনের সার্ভিস যে ওয়েব এর মাধ্যমে অ্যাক্সেস করা যায়। যেমন Weather Api&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Process Stages
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fexnx4054rfpfy8ma1niy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fexnx4054rfpfy8ma1niy.png" alt="Process Stages" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;নিচের এই স্টেপ গুলো উপরে ইতোমধ্যেই অনুসরণ করা হয়ে গেছে। &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requirements Specifications: এই ধাপে একটা Requirements  এর তালিকা আসে । সাধারনভাবে কি কি লাগবে তার একটা বিবরন দেওয়া থাকে।&lt;/li&gt;
&lt;li&gt;Software Discovery and Evaluation: এই ধাপে এসে খোজা হয় যে Requirements এর সাথে মেলে এমন কোন সফটওয়্যার আছে কিনা এবং এই সফটওয়্যার এর কি ফিচার আছে সেগুলোকে মূল্যায়ন করা হয়।&lt;/li&gt;
&lt;li&gt;Requirements refinement: আগের ধাপে যদি কোন সফটওয়্যার খুজে পাওয়া যায় তাহলে সেটা ব্যবহার করতে হবে এবং এই ধাপে সেটা স্বাভাবিক ভাবেই  Requirements এর পরিবির্তন করতে হবে।&lt;/li&gt;
&lt;li&gt;Application System Configuration: এখন যদি Requirements  অনুযায়ী একই ধরনের কোন সফটওয়্যার থাকে থাকলে এই ধাপে এসে কনফিগারেশন করা এবং সফটওয়্যার ডেলিভারি দেওয়া&lt;/li&gt;
&lt;li&gt;Components Adaption and Integrations: যে সফটওয়্যার কম্পোনেন্টগুলো পাওয়া গেছে  সেগুলো ব্যবহার এর জন্য প্রস্তুত করা এবং  নতুন কম্পোনেন্টস গুলো তৈরি করা। সর্বশেষে এই দুইধরনের কম্পোনেন্টস গুলো একসাথে করা হয় এই ধাপে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;উপরে এই ধাপগুলোই কিন্তু অনুসরণ করা হয়েছিল। &lt;/p&gt;

&lt;h3&gt;
  
  
  Advantages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Development time কমে যায়&lt;/li&gt;
&lt;li&gt;দ্রুত সফটওয়্যার ডেলিভারি করা যায়&lt;/li&gt;
&lt;li&gt;সফটওয়্যার গুনগত মান ঠিক থাকে এবং বৃদ্ধি পায়।&lt;/li&gt;
&lt;li&gt;ভবিষ্যতে ব্যবহার করা যায় এবং নতুন ফিচার সহজে যুক্ত করা যায়।&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvantages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;এই ধরনের সিস্টেম কনফিগার করা একটু জটিল&lt;/li&gt;
&lt;li&gt;Maintenance করা কষ্টদায়ক&lt;/li&gt;
&lt;li&gt;নিরাপত্তা ঝুকি থাকে&lt;/li&gt;
&lt;li&gt;অনেক কিছু পরিবর্তন করা যায় না&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ending
&lt;/h3&gt;

&lt;p&gt;পরবর্তীতে integration and configuration model নিয়ে বিস্তারিত আলোচনা হবে। &lt;/p&gt;

&lt;h2&gt;
  
  
  Process Activities
&lt;/h2&gt;

&lt;p&gt;সফটওয়্যার প্রসেস হল পর্যায়ক্রমে থাকা টেকনিক্যাল এবং ম্যানেজমেন্ট সহ জিজাইন, টেস্টিং  ইত্যাদি বিষয়ের সুসংগঠিত কার্যাকলাপ। শুরু থেকে শুরু করে শেষ পর্যন্ত সব কিছুই উল্লেখ থাকে। বর্তমানে এসব কাজ গুলো সহজ করার জন্য অনেক টুল বিদ্যমান রয়েছে। এসব টুল ব্যবহার করা যায়। &lt;/p&gt;

&lt;p&gt;তবে এসব activities এর মধ্যে ৪ টি মৌলিক activities বিদ্যমান। &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Software Specifications&lt;/li&gt;
&lt;li&gt;Software Design and Implementation&lt;/li&gt;
&lt;li&gt;Software Validation&lt;/li&gt;
&lt;li&gt;Software Evolution&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Software Specifications
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7rrsdnkbwtz6mit3whw7.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7rrsdnkbwtz6mit3whw7.webp" alt="Software Specifications" width="800" height="666"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Software Specifications অথবা requirements engineering হল একটা প্রসেস, যা সফটওয়্যার এর প্রয়জনীয়তা সংগ্রহ , বিশ্লেষন, ডকুমেন্টেশন এবং বিভিন্ন প্রতিবন্ধকতা খুজে বের করা। এটা সফটওয়্যার ইঞ্জিনিয়ারিং এর প্রথম ধাপ। এটা দেখে মনে হবে খুবই সহজ জিনিস। কিন্তু এই ধাপের উপরে বাকি সব কিছু নির্ভর করে। এখানে একটু ত্রুটি হলে পরবর্তীতে সিস্টেম ডিজাইন করতে অনেক সমস্যার সম্মুখীন হতে হবে। এসে সমস্যা এড়াতেই প্রথম মার্কেট রিসার্স করা হয়, আদেও এই সফটওয়্যার কাজে দিবে কিনা। আদেও শ্রম এবং টাকা খরচ করে এই সফটওয়্যার কতটা যৌক্তিক তাও বোঝার চেষ্টা করা  হয়। &lt;/p&gt;

&lt;p&gt;Requirement Engineering-এ তিনটি প্রধান activities রয়েছে। &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requirement Elicitation and analysis: এই ধাপে মুলত সিস্টেম সম্পর্কে বিভিন্ন তথ্য সংগ্রহ করা হয়। এক্ষেত্রে বিদ্যমান কোন সিস্টেম ,ব্যবহার কারীর ফিডব্যাক ইত্যাদি বিষয়-এ তথ্য সংগ্রহ করে তা বিশ্লেষন করা হয়।&lt;/li&gt;
&lt;li&gt;Requirement Specification: আগের ধাপের সংগ্রহ করা তথ্যের উপর ভিত্তি করে , এই ধাপে এসে কি কি জিনিস প্রয়োজন সেগুলোর ডকুমেন্ট করা হয়। এখানে User requirements এবং System requirements এই দুই ধরনের requirements এর ডকুমেন্ট থাকতে পারে।&lt;/li&gt;
&lt;li&gt;Requirements Validation: এই ধাপে এসে যে requirements এর ডকুমেন্ট তৈরি করা হয়েছে তা বাস্তবিক কিনা, আদেও এই Consistency এর থাকবে কিনা, সম্পূর্ণ করা যাবে কিনা ইত্যাদি চেক করা করা হয়। এই ধাপে অনেক ভুল দেখা দিতে পারে। দেওয়াটায় স্বাভাবিক। এই ভুল গুলো সংশোধন করে পুনরায় এই ধাপের কাজ করা।&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Software Design and Implementation
&lt;/h2&gt;

&lt;p&gt;Software Design হলো  সফটওয়্যার এর আর্কিটেকচার, ডাটা মডেল এবং অন্যনা কম্পোনেন্ট এর সাথে সিস্টেম কিভাবে ইন্টারফেস করবে তার বিস্তারিত বর্ণনা। &lt;/p&gt;

&lt;p&gt;প্রথমেই একটা সফটওয়্যার একবারে রেডি করা সম্ভব নয়, আস্তে আস্তে ধাপে বিভিন্ন ফিচার যুক্ত করা হয়। কিন্তু প্রথম স্টেপেই নির্ধারন করা হয় কোন টেকনোলজি, কোন আর্কিটেকচার ব্যবহার করে করা হবে। এই জন্য প্রথমে সফটওয়্যার এর জন্য একটা আর্কিটেকচার, ডাটা মডেল  এবং প্রয়োজনীয় অনন্যা বিষয়গুলো নিয়ে বিস্তারতি ডকুমেন্ট তৈরি করা হয়। তবে এই ডকুমেন্ট যখন ই নতুন কোন ফিচার বা তথ্য যুক্ত করা হয় তখন এটা পরিবর্তন বা আপডেট করে ফেলা হয়।   &lt;/p&gt;

&lt;p&gt;একটা সিস্টেম বিভিন্ন সিস্টেম  সফটওয়্যার এর সাথে ইন্টারফেস করে থাকে। এগুলোর বেশিরভাগই হলো অপারেটিং সিস্টেম, ডাটাবেসজ, মিডেলওয়্যার এবং বিভিন্ন থার্ড পার্টি সিস্টেম। সফটওয়্যার ডিজাইনের জন্য এই কম্পোনেন্ট বা সিস্টেম  সফটওয়্যার গুলো গুরুত্বপূর্ণ ভুমিকা পালন করে থেকে। আর এই কম্পোনেন্ট গুলো ডিজাইনের শুরু ঠিক না করলে পরবর্তীতে অনেক সমস্যার সম্মুখীন হতে হয়। &lt;/p&gt;

&lt;p&gt;সিস্টেম এর প্রয়োজনীয়তার উপর নির্ভর করে এই সফটওয়্যার ডিজাইন এর প্রসেস ভিন্ন ভিন্ন হতে পারে। উদাহরন হিসবে একটা রিয়েলটাইম কমিউনিকেশন সফটওয়্যার এর জন্য ডাটাবেজের কোন প্রয়োজন নেই। এখানে ডাটাবেজ-এ কোন তথ্যই সেইভ করার প্রয়োজন হয় না। &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfc0lysbhcrxo2zpjdfz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfc0lysbhcrxo2zpjdfz.png" alt="Software Design and Implementation" width="617" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architectural design: এখানে সিস্টেম আর্কিটেকচার নির্ধারন করা হয়।  কম্পোনেন্ট গুলো কিভাবে থাকবে এবং তাদের মধ্যে ইন্টাফেস কিভাবে হবে এই ধরনের কাজ গুলো নির্ধারন করা হয়।&lt;/li&gt;
&lt;li&gt;Database design: সিস্টেম আছে মানেই ডাটা অস্তিত্ব আছে। এখন ডাটা গুলো কিভাবে সংরক্ষন করা হবে , তা এই portion-এ এসে নির্ধারন করা হয়।&lt;/li&gt;
&lt;li&gt;Interface design: এখানে মুলত সিস্টেম কম্পোনেন্টগুলো ইন্টারফেস নির্ধারন করা হয়ে থাকে।&lt;/li&gt;
&lt;li&gt;Component selection and design: এই ধাপে এসে, প্রয়োজনীয় বিভিন্ন কম্পোনেন্ট খোজার চেষ্টা করা হয়। যদি কম্পোনেন্ট বিদ্যমান থাকে তাহলে তা ব্যবহারের জন্য নির্ধারন করা হয়। আর যদি না থাকে তাহলে ডিজাইনের কাজ কাজ করা হয়। এখানে কম্পোনেন্ট এর জন্য তথ্য দিয়ে প্রোগ্রামার এর জন্য রেখে দেওয়া হয়। এক্ষেত্রে UML (Unified Modeling Language) এর ব্যবহার হয়ে থাকে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;সবগুলো activities এর সম্বনয়ে একটা ডিজাইন আউটপুট জেনারেট হয়। এটাকে ব্যবহার করে সফটওয়্যার এর কাজ সামনের দিকে অগ্রসর হয়। &lt;/p&gt;

&lt;h2&gt;
  
  
  Software Validation
&lt;/h2&gt;

&lt;p&gt;Software Validation অথবা সাধারন ভাবে verification and validation এর উদ্দেশ্য হল software specification মেনে চলা এবং customer expectation ফুলফিল করা।  এক্ষেত্রে software specification এর উল্লেখিত ফিচারগুলো চাহিদা মোতাবেক কাজ করছে কিনা তা নিশ্চিত করা হয় । এজন্য বিভিন্ন ধরনের টেস্ট করা হয়ে থাকে। এসব টেস্ট গুলো প্রথমে থেকে শেষ পর্যন্ত সকল ধাপে করা যেতে পারে।  &lt;/p&gt;

&lt;p&gt;প্রাথমিক ভাবে সব টেস্ট গুলো সিমুলেটেড ডাটা দিয়ে করা হয়ে থাকে। পরবর্তীতে বেটা টেস্টিং এর জন্য দেওয়া হয়। তবে এসব টেস্ট গুলো বড় সিস্টেমের সিংগেল ইউনিট হিসেবে একবারে টেস্ট না করে, কম্পোনেন্ট আকারে টেস্ট করা শ্রেয়। &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8vp9sx4q07zr67mkj4u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8vp9sx4q07zr67mkj4u.jpg" alt="Software Validation" width="758" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Component testing: এই ধাপে প্রতিটি কম্পোনেন্টকে আলাদা আলাদা ভাবে টেস্ট করা হয়। এসব কম্পোনেন্ট গুলো ছোট ফাংশন ক্লাস ইত্যাদি হতে পারে।  তবে এসব ছোট  অনেকগুলো কম্পোনেন্ট একসাথে একটা কম্পোনেন্ট হতে পারে।&lt;/li&gt;
&lt;li&gt;System testing: এই ধাপে পুরা সিস্টেম কে এক সাথে টেস্ট করা হয়। এখানে সব কিছু হাইলেভেল এ থাকে। সিস্টেমে requirement অনুযায়ী ইনপুটের বিপরীতে সঠিক আউটপুট আসছে কিনা তা টেস্ট করা হয়। এখানে internal coding বা এর implementation নিয়ে কোন কিছু করা হয় না। ইনপুটের বিপরীতে সঠিক আউটপুট নিশ্চিত করে।&lt;/li&gt;
&lt;li&gt;Customer testing: Customer testing অনেক সময় বেটা টেস্টিংও বলা হয়ে থাকে। এই টেস্টিং কিছু সম্ভাব্য ব্যবহার কারীকে সফটওয়্যার এর আক্সেস দেওয়া হয় এবং তারা ব্যবহার করে তাদের ফিডব্যাক দিয়ে থাকে। বেশিরভাগ ক্ষেত্রেই সিমুলেটেড ডাটা দিয়ে  টেস্ট করা কম্পোনেন্ট বা সিস্টেম, বাস্তবিক ভাবে ব্যবহারের ক্ষেত্রে অনেক ইসু  দেখা যেতে পারে । এজন্য রিয়েল ডাটা দ্বারা টেস্টিং করা প্রয়োজন।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এসব স্টেজে বিভিন্ন ধরনের বাগ দেখা দিতে পারে। এসব বাগ গুলো ডিবাগ করা দরকার। এর জন্য আলাদা স্টেজ এর প্রয়োজন হতে পারে। &lt;/p&gt;

&lt;p&gt;কম্পোনেন্ট টেস্টিং এর ক্ষেত্রে বেশিরভাগ সময় প্রোগ্রামার নিজেই টেস্ট কেস গুলো লিখে। কারন সেই কম্পোনেন্ট সম্পর্কে সব থেকে বেশি জ্ঞান রাখে। Test Driven Development এর ক্ষেত্রে প্রথমে টেস্ট কেস গুলো লেখা হয় এবং পরবর্তীতে টা ইমপ্লিমেন্ট করা হয়। &lt;/p&gt;

&lt;h3&gt;
  
  
  Testing in Plan Driven Architecture
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkyraeka49o8lenqtvci7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkyraeka49o8lenqtvci7.jpg" alt="Plan Driven Architecture" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PDA -এ কিছু নির্দিষ্ট প্লানের উপর নির্ভর করে সাম্নের দিকে আগ্রসর হয়। এখানে টেস্টিং এর জন্য একটা টিম থাকে যেখানে তার শুধু টেস্ট নিয়ে কাজ করে। উপরে চিত্রে দেখলেই বোঝা যাবে, এখানে প্রতিটি ধাপে টেস্টিং করা হয়ে থাকে। &lt;/p&gt;

&lt;h2&gt;
  
  
  Software Evolution
&lt;/h2&gt;

&lt;p&gt;কোন একটা হার্ডওয়্যার প্রোডাক্ট একবারে তৈরি করা হয়ে গেলে সেখানে নতুন কোন পরিবর্তন করতে গেলে অতিরিক্ত মাত্রায় খরচ করতে হয়। কিন্তু সফটওয়্যার এর ক্ষেত্রে সেটা হয় না।  সফটওয়্যার এর কোন কিছু পরিবর্তন করতে চাইলে অথবা নতুন ফিচার যুক্ত করতে চাইলে খুব বেশি খরচ করতে হয় না। হার্ডওয়্যার এর তুলনায় অনেক কম। এই জন্য একটা সফটওয়্যার সময়ের সাথে সাথে এর গ্রোথ বৃদ্ধি পায়। প্রাথমিক পর্যায় যা ছিল তার তুলনায় অনেক বেশি ফিচার সমৃদ্ধ হয়ে যায়। এভাবেই সফটওয়্যার evolve হতে থাকে। &lt;/p&gt;

&lt;p&gt;Software Evolution কে maintenance এর সাথে তুলনা করা যেতে পারে।  maintenance-এ মুলত ডিবাগিং করা হয়ে থাকে। বাগ ফিক্সিং এবং নতুন ফিচারের এর জন্যই সফটওয়্যার evolve হতে থাকে। &lt;/p&gt;

&lt;h2&gt;
  
  
  Coping with change
&lt;/h2&gt;

&lt;p&gt;একটা বড় সফটওয়্যার প্রোজেক্ট-এ পরিবর্তন অনিবার্য। বিভিন কারনে সফটওয়্যার এর requirements পরিবর্তন হতে পারে। নতুন নতুন টেকনলজি তৈরি হচ্ছে এক্ষেত্রে নতুন পদ্ধতিতে সফটওয়্যার তৈরির করা হচ্ছে। নতুন পরিবর্তন সফটওয়্যার এর খরচ বৃদ্ধি করে কারন যে কাজ করা হয়ে গেছে সে কাজ আবার করতে হবে।&lt;/p&gt;

&lt;p&gt;দুইটা পদ্ধতিতে এই খরচ কমানো সম্ভব। &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Change anticipation: এই পদ্ধতিতে সফটওয়্যার এর  ভবিষ্যতের কথা চিন্তা ভাবনা করা হয়। একটা সফটওয়্যার-এ এমন অনেক ফিচার থাকতে পারে, যে গুলো নিকট ভবিষ্যতে অযৌক্তিক হয়ে যেতে পারে। এই ধরনের সমস্যা এড়াতে, প্রথমে একটা প্রোটোটাইপ তৈরি করা যেতে পারে, যেখানে কিছু প্রধান প্রধান ফিচার থাকবে। এবার কাষ্টমার  এটা টেস্টিং করার পর তার requirements পরিবর্তন করতে পারেন। এক্ষেত্রে প্রডাকশন খরচ কমে যাবে।&lt;/li&gt;
&lt;li&gt;Change tolerance:  সফটওয়্যার কে এমন ডিজাইন করতে হবে যেন খুব সহজেই এখানে পরিবর্তন করা যায়। এক্ষেত্রে Incremental Development পদ্ধতি অনুসরন করা হয়। নতুন পরিবর্তন বা আপডেট একটা increment হিসেবে অ্যাড করে দিলেই সফটওয়্যার প্রস্তুত।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এই পরিবর্তন কে মোকাবেলা অনেক ভাবেই করা যেতে পারে তবে এখানে ২ টা পদ্ধতি নিয়ে আলোচনা করা হবে। &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System Prototyping: এখানে সম্পূর্ন সিস্টেম তৈরি করার পূর্বে মুল ফিচারগুলো নিয়ে অল্প সময়ের মধ্যে একটা সিস্টেম তৈরি করা এবং কাস্টমার ফিডব্যাক প্রদান করে। এখানে requirements পরিবর্তন হতে পারে।&lt;/li&gt;
&lt;li&gt;Incremental delivery: এই পদ্ধতিতে সিস্টেম কে এমন ভাবে ডিজাইন করা হয় যাতে, খুব সহজেই পরিবর্তন বা পরিবর্ধন করা যায়। সফটওয়্যার তৈরি হওয়ার পর কোন পরিবর্তন আসলে সেখানে একটা নতুন একটা increment করলেই হয়ে যাবে।&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prototyping
&lt;/h2&gt;

&lt;p&gt;Prototype হলো একটা সফটওয়্যার এর প্রাথমিক ভার্সন , যা ব্যবহার করা হয় সফটওয়্যারকে উপস্থাপন করতে, বিভিন্ন ডিজাইন try করতে এবং কোন সমস্যা থাকলে সেগুলো খুজে বের করে তার সম্ভাব্য সলুশন বের করার কাজে। &lt;/p&gt;

&lt;p&gt;Prototype development এর জন্য development চলমান হতে হবে এই জন্য প্রতিনিয়ত development এর কাজ করতে হবে। নতুন নতুন ফিচার যুক্ত করতে হবে (অবশ্যই requirements অনুযায়ী প্রধান ফিচার গুলো)। এই Prototype একজন সম্ভাব্য ইউজারকে তার কাজে সাহয্য করবে। এখন তিনি যখন ব্যবহার করবেন তখন তার মাধায় নতুন নতুন requirement এর সৃষ্টি হতে পারে, যেগুলো অ্যাড করা প্রয়োজন। ব্যবহার করা ক্ষেত্রে অনেক এরর দেখা দিতে পারে যেটা requirement এ থেকে বাদ পড়ে গেছিলো।   &lt;/p&gt;

&lt;p&gt;একটা Prototype , প্রস্তাবিত ডিজাইন এর ফিসিবিলিটি টেস্টিং এর জন্য ব্যবহার করা যেতে পারে। উদারহর হিসবে, একটা সিস্টেম একসাথে একই সময়ে কত গুলো ইউজার এর request এর হ্যান্ডেল করতে সক্ষম তা চেক করা যেতে পারে।  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F764djnbp3qxclavyxs6p.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F764djnbp3qxclavyxs6p.jpg" alt="Prototyping Development" width="792" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prototype Development&lt;/p&gt;

&lt;p&gt;Prototype ডিজাইন করা শুরুতে এর উদ্দেশ্য ঠিক করতে হবে। এই উদ্দেশ্য হতে পারে , সফটওয়্যার এর ইন্টারফেস ডিজাইন, বিভিন্ন ভ্যালিডেশন চেক অথবফিসিবিলিটি টেস্টিং ইত্যাদি হতে পারে। একটা Prototype সকল উদ্দেশ্য পূরন করতে সক্ষম নয়। এই জন্য অনেক সময় ইউজার ভুল বুঝে থাকে। আসলে &lt;/p&gt;

&lt;p&gt;Prototype এর উদ্দেশ্যই হলো মুল ফিচার গুলো নিয়ে একটা সিস্টেম বানানো। এখানে non-functional (response time, memory utilization etc) বিষয়গুলো ইচ্ছাকৃত ভাবে ইগনোর করা হয়ে থাকে।  এখানে অনেক সময় এরর গুলো সঠিক হ্যান্ডেল নাও করা হতে পারে। এই সব কারনে সিস্টেম এর নির্ভরযোগ্যতা এবং মান কমে যেতে পারে। &lt;/p&gt;

&lt;p&gt;সবশেষে Prototype তৈরি করা হয়ে গেলে , ইউজার এর ট্রেনিং এবং Prototype এর উদ্দেশ্যগুলো পূরন করার জন্য এই Prototype কে evaluate করা হয়। এক্ষেত্রে এসব ইউজারদের একটু সময় লেগে যায়। নতুন সিস্টেম ব্যবহার করতে সময় লাগাটায় স্বাভাবিক। তবে একবার সিস্টেম ব্যবহার এ comfortable হয়ে গেলে তখন তারা নতুন নতুন requirement আবিষ্কার করতে পারে। &lt;/p&gt;

&lt;p&gt;তবে এখানে সমস্যা আছে, এই সব ইউজার ফাইনাল সিস্টেম কে যেভাবে ব্যবহার করতে চাই, সেভাবে এই Prototype কে সেইভাবে ব্যবহার নাও করতে পারে। এর কারন হতে পারে, slow response, slow processing, lots of errors ইত্যাদি।&lt;/p&gt;

&lt;h2&gt;
  
  
  Incremental Delivery
&lt;/h2&gt;

&lt;p&gt;Incremental Delivery হলো এমন একটা পদ্ধতি যেখানে requirements গুলোকে অনেক গুলো ভাগে ভাগ করা হয়ে থাকে। এর ভিতরে কিছু ডেভোলোপ করা ভাগগুলো কাস্টমারের কাছে ডেলিভারি করা হয়েছে এবং তার মেশিনে ডেপলয় করা হয়েছে। এই ভাগ কিভাবে করা হবে, কোনটা আগে কোনটা পরে সেটা কাস্টমার ঠিক করে দেন। সবোর্চ প্রাইরিটির কাজগুলো আগে করা হয়। &lt;/p&gt;

&lt;p&gt;যখন এসব কাজ গুলো হয়ে যায় , তখন প্রথম increment, ডেভোলোপ করা হয়ে গেছে তখন এই সিস্টেম ব্যবহার করা জন্য প্রস্তু হয়ে গেছে। তবে ডেভোলোপ করার সময় অনেক নতুন নতুন requirement এর দেখা দিতে পারে। এসব requirement গুলো প্রাইরিটি দিয়ে ডেভোলোপ করা হয়ে থাকে। &lt;/p&gt;

&lt;p&gt;এবার সিস্টেম কে কাস্টমারে কম্পিউটারে রান করা জন্য প্রস্তুত। এখন কাস্টমার ব্যবহার করে দেখবে তার চাহিদা মোতাবেক কাজ হচ্ছে কিনা অথবা নতুন কোন ফিচার যুক্ত করা লাগবে কিনা। এখানে কাস্টমার সম্পূর্ণ সিস্টেমকে মূল্যায়ন করবেন এবং তিনি ফিডব্যাক দিবেন। &lt;/p&gt;

&lt;h3&gt;
  
  
  Advantages
&lt;/h3&gt;

&lt;p&gt;Incremental Delivery এর কিছু সুবিধা আছে। যেমনঃ &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;প্রথম Increment হওয়ার পরপর কাস্টমার সফটওয়্যার ব্যবহার করতে পারে এবং তার মতামত দিতে পারে। এটা Prototype এর সম্পূর্ণ বিপরীত। এই Increment গুলো মূলত সিস্টেমের অংশ। একবার শুরু থেকে শুরু করার প্রয়োজন হয় না।&lt;/li&gt;
&lt;li&gt;কাস্টমার কে সিস্টেম সম্পূর্ণ রেডি হওয়া পর্যন্ত অপেক্ষা করার প্রয়োজন হয় না। প্রথম Increment-এ প্রধান প্রধান ফিচার গুলো থাকে। এজন্য তৎক্ষণাৎ এই সিস্টেম ব্যবহার করা যায়।&lt;/li&gt;
&lt;li&gt;যেহেতে সবোর্চ প্রাইরিটি সার্ভিস গুলো আগে আগেই ডেলিভারি করা হয়। এইজন্য এইসমস্ত সার্ভিস গুলো সব থেকে বেশি টেস্ট করা হয়ে থাকে। এক্ষেত্রে এরর বা বাগ এর পরিমান তুলনা মূলক ভাবে অনেক কমে যায়। অনেক ক্ষেত্রে থাকেই না।&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvantages
&lt;/h3&gt;

&lt;p&gt;Incremental Delivery এর কিছু অসুবিধা রয়েছে। যেমনঃ &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;এই ধরনের পদ্ধতি নতুন সিস্টেম এর জন্য সব থেকে উপযুক্ত। যখন কোন বিদ্যামান সিস্টেমকে নতুন সিস্টেম দ্বারা replace করা জন্য এই পদ্ধতি ব্যবহৃত হয় তখন সমস্যার সৃষ্টি হয়। বিদ্যামান সিস্টেম অনেক ইউজার থাকে যার অনেকগুলো ফিচার ব্যবহার করে অভ্যস্ত। এখন  হটাত করে যদি এসব ফিচার না থাকে অথবা ইউজার আক্সেস  করতে না পারে তখন এসব ইউজার উক্ত সিস্টেম ব্যবহার করা বন্ধ করে দিতে পারে।&lt;/li&gt;
&lt;li&gt;বেশির সিস্টেমেই কিছু বেসিক কিছু ফিচার থাকে যেগুলো প্রায় সব জায়গায় ব্যবহার করা হয়ে থাকে। এখন এই পদ্ধতিতে অনেক ডিটেলস এ থাকে না। সেক্ষেত্রে এই বেসিক ফিচার গুলো খুজে বের করা কষ্টকর হতে পারে। আবার অনেক ক্ষেত্রে একই কোড বার বার লেখার প্রয়োজন হতে পারে।&lt;/li&gt;
&lt;li&gt;এখানে যেহেতু প্রতিনিয়তই ডেলিভারি করা হয়ে থাকে এবং এসব ডেলিভারির ফিডব্যাক গ্রহন করে সেখানে কাজ করা হয়। সেহেতু এখানে নো নির্দিষ্ট requirement থাকে না। এসব ক্ষেত্রে কাস্টমার এবং কম্পানির এর মধ্যে চুক্তি সংক্রান্ত বিভিন্ন সমস্যার সৃষ্টি হয়।&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ending
&lt;/h3&gt;

&lt;p&gt;Incremental Delivery পদ্ধতি ,  বড় এবং জটিল সিস্টেমের জন্য সেরা পদ্ধতি নয়। মুলত এসব বড় সিস্টেম অনেক টিম একসাথে কাজ করে থাকে, এক্ষেত্রে অনিইচ্ছাকৃত ভাবে অনেক সমস্যার সৃষ্টি হতে পারে।  &lt;/p&gt;

&lt;p&gt;চুক্তি করার ক্ষেত্রে, প্রথমে একটা prototype ডিজাইন করে সেটার উপর বেজ করে একটা requirement specification এর ঠিক করে তার উপর বেজ করা চুক্তি সম্পন্ন করা যেতে পারে। নতুন কোন requirement আসলে সেটা পরবর্তী ফেজের জন্য রেখে দেওয়া যেতে পারে এবং পরবর্তী ফেজ একই ভাবে হ্যান্ডেল করা যেতে পারে &lt;/p&gt;

&lt;h2&gt;
  
  
  Process Improvement
&lt;/h2&gt;

&lt;p&gt;Process Improvement এর মানে বিদ্যমান প্রসেস কে বোঝা এবং এসব প্রসেস পরিবর্তন করা যাতে প্রডাক্ট এর মান, খরচ এবং সময় কমে যায়। &lt;/p&gt;

&lt;p&gt;দুই ধরনের পদ্ধতি ব্যবহার করা যেতে পারে। &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The process maturity: এই পদ্ধতিতে প্রসেস এবং প্রজেক্ট ম্যানেজমেন্ট এর উপর ফোকাস করা হয় এবং নতুন নতুন  ইঞ্জিনিয়ারিং নিয়ম প্রয়োগ করা হয়। এই পদ্ধতির প্রধান উদ্দেশ্য হচ্ছে,  প্রোডাক্ট এর মান বাড়ানো।&lt;/li&gt;
&lt;li&gt;The agile: এই পদ্ধতি মুলো ফোকাস করে প্রতিনিয়ত ডেভোলেপমেন্ট এর কাজ করে যাওয়া এবং প্রসেস এর অভারহেড কমিয়ে আনা। পরবর্তীতে এ নিয়ে বিস্তারিত আলোচনা হবে।&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>swe</category>
      <category>softwareengineering</category>
      <category>model</category>
    </item>
    <item>
      <title>What is Software Engineering?</title>
      <dc:creator>Monirul Islam</dc:creator>
      <pubDate>Sat, 26 Apr 2025 16:19:45 +0000</pubDate>
      <link>https://dev.to/mislam-dev/what-is-software-engineering-25ij</link>
      <guid>https://dev.to/mislam-dev/what-is-software-engineering-25ij</guid>
      <description>&lt;p&gt;অনেক দিন আগে (আনুমানিক ২ বছর) আমি নিজের স্কিল বাড়ানোর জন্য একটা সফটওয়্যার (ওয়েব অ্যাপ্লিকেশান) বানায়। মোটামুটি সবকিছু ঠিক ঠাকই ছিল। ওইসময় সব কিছুই যেমন টা চেয়েছিলাম তেমনই টায় হয়েছিল। ওই অবস্থায় কোড যা আছে সব গিটহাবে রেখে দিয়েছিলাম। এখনো আছে।&lt;/p&gt;

&lt;p&gt;এখন মনে হল , অনেক দিন তো হল, অ্যাপ তো বানিয়েছি এখন কিছু নতুন ফিচার অ্যাড করা জরুরি। আর প্যাকেজ গুলো আপডেটও করা দরকার। কবে প্যাকেজ গুলো deprecated করে দিবে কে জানে।&lt;/p&gt;

&lt;p&gt;গিটহাবে রিপো ওপেন করলাম। ক্লোন করলাম । ক্লোন করার পর , প্রজেক্ট সেটাপ করতে যেয়ে পড়া এক মহাবিপদ।&lt;/p&gt;

&lt;p&gt;প্রোজেক্ট সেটআপ এর জন্য ডকুমেন্টেশন নেই। এই প্রজেক্ট কিভাবে রান করতে হবে তার কোন গাইড লাইন নেই। প্রয়োজনীয় বিভিন্ন এনভায়রনমেন্ট ভ্যারিবল কি কি সেটা করা লাগবে তাও নেই।&lt;/p&gt;

&lt;p&gt;এই অবস্থায় একটু কষ্ট করে সব কিছু সেটাপ করলাম। এখানে আমার প্রায় ১ঘন্টা সময় চলে গেল। যাক বাবা , ভালো ভাবে প্রজেক্ট রান করা গেছে। খুবই ভালো কথা। এবার তাহলে ফিচার অ্যাড করার কথা চিন্তা করা যায়।&lt;/p&gt;

&lt;p&gt;কিন্তু যেই ফিচার অ্যাড করার জন্য কোড ওপেন করলাম। আবার পড়লাম আরেক বিপদে । বিপদটা হচ্ছে কোন ফাইল কোথায় রাখা আছে কিছুই তো জানি না। সব ভুলে গেছি। কি আর করা ফিচার তো অ্যাড করা লাগবে কিছু তো করার নেই। যাই হোক, লেগে পড়লাম ফাইল এক্সপ্লোর করতে। যেহেতু কোড আমি নিজেই করেছিলাম এই জন্য বেশি সময় লাগলো না। বেশি না, এই ৩০ মিনিট মত সময় লেগে গেল। এখন কোড গুলো মোটামুটি মাথায় ধরছে। সহজ কোথায় কোন জিনিস রাখা আছে সেগুলো মাথায় চলে আসছে।&lt;/p&gt;

&lt;p&gt;তাহলে সব কিছু রেডি হয়ে গেছে। এখন ফিচার অ্যাড করার পালা। লেগে পড়লাম কাছে। দীর্ঘ ৪ ঘন্টা করার পর একটা ছোট ফিচার অ্যাড করলাম। গিটহাবে পুশ করলাম। সার্ভারে আপলোড করলাম সেখানে আরো ১ ঘন্টা লেগে গেল। সব কিছু ঠিকঠাক। যাক হাফ ছেড়ে বাচলাম।&lt;/p&gt;

&lt;p&gt;এখানে অনেক গুলো বিষয় আছে যেগুলো না করার কারনে আমার অযথা প্রায় ৩-৪ ঘন্টা সময় নষ্ট হয়ে গেছে। তবে দুই বিষয় অতীব জরুরি।&lt;/p&gt;

&lt;p&gt;প্রথমত, একটা পরিপূর্ণ ডকুমেন্টেশন থাকা প্রয়োজন ছিল।&lt;/p&gt;

&lt;p&gt;দ্বিতীয়ত , রিপিটিভ কাজ গুলো অটোমেট করার প্রয়োজন ছিল।&lt;/p&gt;

&lt;p&gt;এছাড়া খুটিয়ে দেখলে অনেক প্রবলেম সামনে আসবে।&lt;/p&gt;

&lt;p&gt;এখন প্রশ্ন হছে, এত ফাউ তো বকচি, এর সাথে সফটওয়্যার ইঞ্জিনিয়ারিং এর সম্পর্ক কি?&lt;/p&gt;

&lt;p&gt;সম্পর্ক আছে, অবশই আছে।&lt;/p&gt;

&lt;h2&gt;
  
  
  What is software?
&lt;/h2&gt;

&lt;p&gt;সফটওয়্যার ইঞ্জিনিয়ারিং জানার আগে সফটওয়্যার সর্ম্পর্কে জানা তো প্রয়োজন,&lt;/p&gt;

&lt;p&gt;সহজভাবে বললে , সফটওয়্যার হল একটু নির্দেশনা বা প্রোগ্রাম যা কম্পিউটারকে নির্দিষ্ট কার্য সম্পাদনের জন্য নির্দেশ করে এবং সমস্যা সমাধান করে থাকে।&lt;/p&gt;

&lt;p&gt;সফটওয়্যার মুলত দুই ধরনেরঃ&lt;/p&gt;

&lt;p&gt;১। জেনেরিক্স সফটওয়্যারঃ এই ধরনের সফটওয়্যার গুলো মুলত বিভিন্ন কোম্পানি বা প্রতিষ্ঠান ডেভোলোপ করে করে থাকে এবং সাধারন ব্যবহারকারীরা সেগুলো ব্যবহার করে। উদাহরনস্বরুপঃ MS Office, Google Chrome, VS Code ইত্যাদি। এখানে মূল বিষয় হচ্ছে কোম্পানি তাদের মত করে বিভিন্ন ফিচার অ্যাড করে থাকে।&lt;/p&gt;

&lt;p&gt;২। কাস্টমাইজড সফটওয়্যারঃ এটা জেনেরিক্স এর সম্পূর্ন উলটা। এই সফটওয়্যার গুলো ব্যবহার কারীর (ক্লায়েন্ট) প্রয়োজন অনুসারে তৈরী করা হয়।&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Software Engineering?
&lt;/h2&gt;

&lt;p&gt;আমাদের দেশে অনেকেই মনে করে কম্পিউটার সায়েন্স এবং সফটওয়্যার ইঞ্জিনিয়ারিং একই জিনিস। কিন্তু মজার বিষয় হচ্ছে, দুইটা জিনিস একই রকম মনে হলেও এদের মধ্যে রয়েছে আকাশ পাতাল পার্থক্য।&lt;/p&gt;

&lt;p&gt;সফটওয়্যার ইঞ্জিনিয়ারিং হলো একটা ইঞ্জিনিয়ারিং ডিসিপ্লিন যেটা একটা সফটওয়্যার তৈরি থেকে শুরু করে এটা ব্যবহারকারীর কাছে পৌছানোর পরে তা মেইনটেইন করা পর্যন্ত সকল বিষয় গুলো কে ডিল করে।&lt;/p&gt;

&lt;p&gt;এখানে দুইটা বিষয় উল্লেখ্য&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;প্রথমত, ইঞ্জিনিয়ারিং ডিসিপ্লিন , ইঞ্জিনিয়াররা বিভিন্ন থিওরি , পদ্ধতির মাধ্যমে কার্য সম্পাদন করে থাকে। তারা চেষ্টা করে সব থেকে সেরা (যেটা ইঞ্জিনিয়ারিং জন্য অধিক গ্রহনযোগ্য) পদ্ধতি টা নির্বাচন করতে। অনেক সময় সমস্যা সমাধানের জন্য নতুন পদ্ধতি এক্সপ্লোর করার প্রয়োজন হয়। তবে তারা বিভিন্ন বাধ্যবাধকতার ভিতরে কাজ করে থাকে। এক্ষেতে তারা বাজেট এবং সময় কে মূল্যায়ন করে থাকে।&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;দ্বিতীয়ত, সসফটওয়্যার সকল বিষয়, সফটওয়্যার ইঞ্জিনিয়ারিং শুধুমাত্র প্রোগ্রামিং নিয়ে ডিল করে না। প্রজেক্ট ম্যানেজমেন্ট, পদ্ধতি, থিওরিস, বিভিন্ন টুল কিভাবে ব্যবহার করা যায়, প্রোজেক্ট প্লানিং ইত্যাদি বিষয় গুলো ডিল করে।&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;সফটওয়্যার ইঞ্জিনিয়ারিং মুলত পেশাগত সফটওয়্যার কে সাপোর্ট করার জন্য। কোন ব্যক্তিগত প্রোগ্রার কে সাপোর্ট করার জন্য এটা না। তবে একজন চাইলে সফটওয়্যার ইঞ্জিনিয়ারিং কে নিজের জন্য ব্যবহার করতেই পারেন।&lt;/p&gt;

&lt;p&gt;প্রোজেক্ট ম্যানেজমেন্ট এর মধ্যে একটা গুরুত্ব পূর্ণ বিষয় হচ্ছে প্রোজেক্ট এর ডকুমেন্টশন তৈরি করা। আমার ওই প্রজেক্ট কি কোন ডকুমেন্টশন ছিল? ছিল না। যার কারনে অনেকটা সময় লাগিয়ে প্রোজেক্ট সেটআপ করতে হয়েছে। আবার একই কারনে ফোল্ডার এবং ফাইল ওপেন করে ফাইল স্ট্রাকচার বুঝতে হয়েছে। এর পরে কোড পুশ করার পর মানুয়ালি কোড সার্ভারে পুশ করতে হয়েছে।&lt;/p&gt;

&lt;p&gt;আমি একজন ব্যক্তি এই কাজ করছি খুব বেশি প্রবলেম হচ্ছে না। কিন্তু একবার ভাবুন তো। এই প্রোজেক্ট এ ১০-১২ জন কাজ করছে। তখন বিষয়টা কেমন হবে। প্রতিবার যদি তাদের প্রজেক্ট সেটাপ করা লাগে তাহলে কতটা সময় নষ্টা হবে। সফটওয়্যার ইঞ্জিনিয়ারিং একটা গুরুত্বপূর্ণ বিষয় হলো বাজেট এবং সময়ের মাধ্যমে গুনমত মান সম্পন্ন সফটওয়্যার ডেলিভারি করা। এখন প্রজেক্টা সেটাপ থেকে শুরু করে ফিচার অ্যাড সহ সার্ভারে পুশ করা পর্যন্ত কতটা টা সময় নষ্ট হচ্ছে একবার চিন্তা করুন।&lt;/p&gt;

&lt;p&gt;এখানে সমাধান হচ্ছে, প্রোজেক্ট এর জন্য একটা প্রোপার ডকুমেন্টশন তৈরি করা। রিপিটেটিভ কাজ গুলো অটোমেট করা।&lt;/p&gt;

&lt;h2&gt;
  
  
  Why software engineering is important?
&lt;/h2&gt;

&lt;p&gt;একটা জিনিস , আমি তো আমার অ্যাপের নতুন ফিচার সার্ভারে পুশ করে দিয়েছে তার খবর নিবেন না? তার খবর খুবই খারাপ , অ্যাপ ক্রাশ করেছে। বিষয়টা একটা খতিয়ে দেখলাম, দেখে যা বুঝলাম তা হচ্ছে , নতুন কোড পুশ করার কারনে সিস্টেম এর রিসোর্স অধিকমাত্রায় ব্যবহৃত হচ্ছে। অন্য ব্যবহারকারীরা রিকুয়েষ্ট করলেই ক্রাশ করছে। বিষয় নিয়ে একটু ঘাটাঘাটি করলাম। করার পরে যা বুঝলাম তাতে আমার মাথায় হাত। আমি কোন রুলস ফলো করিনি, কোন ডিজাইন প্যাটার্ন ব্যবহার করি নি, ব্যাকএন্ডে কুয়েরি অপ্টিমাইজ করিনি, কোন ক্যাশ ব্যবহার করিনি, কোন CDN ব্যবহার করিনি নি। ফ্রন্টএন্ডেও একই অবস্থা।&lt;/p&gt;

&lt;p&gt;এখন এই রকম অবস্থায় আমার অ্যাপস ইউজার রা কি আর ব্যবহার করবে? এখানে তাদের বিশ্বাস নষ্ট হবে। আমার অ্যাপ এর নির্ভরযোগ্য তা কমে যাবে। এই অবস্থায় আমার কাছে দুই টা অপশন খোলা আছে।&lt;/p&gt;

&lt;p&gt;প্রথম, সার্ভারে রিসোর্স এর পরিমান বৃদ্ধি করা&lt;br&gt;
দ্বিতীয়, কোড অপটিমাইজ করা&lt;/p&gt;

&lt;p&gt;আমার কি করা উচিত?&lt;/p&gt;

&lt;p&gt;এখানে আমি যদি লম্বা সময়ের কথা চিন্তা করি তাহলে ভবিষ্যতে এই প্রোজেক্ট একটা মেইনটেইন করা সম্ভব না। সেজন্য অনেক লোক দরকার হবে। এই দিকে থেকে চিন্তা করলে আমার কোড অপ্টিমাইজ করা টা ভালো অপশন হবে। সব থিওরি ও মেথড ফলো করে যদি সিস্টেম টা ঠিক করতে পারি তাহলে, লম্বা সময়ের জন্য এই রকম মেজর কোন সমস্যা সৃষ্টির সম্ভাবনা কমে যাবে । আবার খরচ ও তুলনামূলক ভাবে কমে আসবে।&lt;/p&gt;

&lt;p&gt;সফটওয়্যার ইঞ্জিনিয়ারিং মুলত এই দুইটা কারনের জন্যই গুরুত্বপূর্ণ।&lt;/p&gt;

&lt;p&gt;১। বাজেট এবং সময়ের মধ্যে নির্ভরযোগ্য ও বিশ্বাস যোগ্য সিস্টেম তৈরি করতে হয়। এর জন্য সফটওয়্যার ইঞ্জিনিয়ারিংর মেথড গুলো অত্যাবশ্যকীয়।&lt;/p&gt;

&lt;p&gt;২। যখন লম্বা সময়ের কথা চিন্তা করে সিস্টেম তৈরি করা হয়, সেক্ষেত্রে সফটওয়্যার ইঞ্জিনিয়ারিং এর মেথড খুব গুলো কাজে লাগে। মুলত সফটওয়্যার ইঞ্জিনিয়ারিং কারনে তুলনা মুলক ভাবে খরচ অনেক কমে যায়।&lt;/p&gt;

&lt;p&gt;তবে এখানে মনে রাখার বিষয় হচ্ছে সফটওয়্যার ইঞ্জিনিয়ারিং কোন ব্যক্তিগত কোন প্রোজেক্ট বা প্রোগ্রামিং এর জন্য একদম না।&lt;/p&gt;

&lt;p&gt;Fundamental to apply all systems&lt;br&gt;
যেহেতু সফটওয়্যার ইঞ্জিনিয়ারিং কোন ব্যক্তিগত প্রোগ্রামিং এর জন্য না। সেহেতু যারা এর পদ্ধতি গুলো ব্যবহার করবে তাদের বেশির ভাগ হবে টিম, গ্রুপ অথবা কোন প্রতিষ্ঠান।&lt;/p&gt;

&lt;p&gt;এখন তারা (এই সব গ্রুপ ) যদি কোন সফটওয়্যার তৈরি করে সেক্ষেত্রে কিছু জিনিস ব্যবহার করতে পারে।&lt;/p&gt;

&lt;p&gt;১। তাদের উচিত হবে একটা বোধ্যগম্য এবং সহজে ম্যানেজ করা যায় এমন প্রসেস এর মধ্য দিয়ে সসফটওয়্যার তৈরির কাজ গুলো সম্পন্ন করা। তাদের উচিত হবে সফটওয়্যার তৈরি জন্য একটা সুন্দর প্লান তৈরি করা। প্লান টা কার্যকর করতে হলে অবশ্যই সফটওয়্যারটি কম্পিলিট হলে কেমন হবে তা সম্পর্কে একটা পরিষ্কার ধারনা থাকতে হবে। তবে ক্ষেত্র বিশেষে প্রসেস ভিন্ন ভিন্ন হতে পারে।&lt;/p&gt;

&lt;p&gt;২। সফটওয়্যার কোন রকম কোন প্রবলেম অথবা ফেইলর ছাড়া কাঙ্ক্ষিত ফলাফল প্রদান করে এটা নিশ্চিত করা । সাথে সাথে যখন প্রয়োজন তখন যেন available থাকে সেটা নিশ্চিত করা।&lt;/p&gt;

&lt;p&gt;৩। Software Specification and Requirements এ জানতে হবে যে গ্রাহক এই সফটওয়্যার থেকে কি চাই এবং তার এই চাহিদা গুলো ম্যানেজ করতে হবে। কোনটা সম্ভব ,কোনটা সম্ভব না , কতদিন লাগবে, কেমন খরচ হবে , ইত্যাদি বিষয়গুলো ম্যানেজ করা।&lt;/p&gt;

&lt;p&gt;৪। রিসোর্স যা আছে , সেগুলো সর্বোচ্চ (যত টুকু সম্ভব) ব্যবহার করতে হবে। যে সফটওয়্যার অলরেডি তৈরি করা আছে, সে গুলো নতুন করে তৈরি না করে পূনব্যবহার করা। এতে রিসোর্স এর সুষ্ঠ ব্যবহার করা সম্ভব হবে।&lt;/p&gt;

&lt;h2&gt;
  
  
  Software engineering Ethics
&lt;/h2&gt;

&lt;p&gt;Software engineering একটি সম্মানীয় এবং মর্যাদা সম্পন্ন পেশা। তাই এই সম্মান এবং মর্যাদা রক্ষার স্বার্থে একজন software engineer কে নীতি নৈতিকতা মেনে দৈনন্দিন কার্যক্রম চালিয়ে যেতে যায়। software engineer এর জন্য কিছু নীতি নৈতিকতা রয়েছে। তন্মধ্যে&lt;/p&gt;

&lt;p&gt;১। গোপনীয়তা রক্ষা করাঃ আপনার কখনো উচিত হবে না, আপনার কম্পানি এবং কম্পানির ক্লায়েন্ট সম্পর্কে তথ্য ফাস করা।&lt;/p&gt;

&lt;p&gt;২। যোগ্যতা বাইরে কাজ না করাঃ আপনি যে জিনিস পারেন না বা বোঝেন না, সেই জিনিস কাজ জেনে বুঝে করা কখনোই উচিত না। এক্ষেত্রে আপারকতা স্বিকার করা করা উচিত। তাদের বলা উচিত , এটা আমার জ্ঞানের বাইরে।&lt;/p&gt;

&lt;p&gt;৩। intellectual property rights: আপনার উচিত intellectual property rights এর বিষয়ে স্থানীয় সরকারে কি ধরনের আইন কানুন বিদ্যমান রয়েছে এবং আপনার কোম্পানির এসব intellectual property rights এর ব্যাপারে সর্তক থাকা।&lt;/p&gt;

&lt;p&gt;৪। কম্পিউটারের অপব্যবহারঃ অন্যের কম্পিউটারকে আপ্রাসঙ্গিক কাজে(গেম খেলা) ব্যবহার করা থেকে বিরত থাকা।&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Marking Grading System with if-else-elif Part-09</title>
      <dc:creator>Monirul Islam</dc:creator>
      <pubDate>Fri, 06 Sep 2024 06:00:00 +0000</pubDate>
      <link>https://dev.to/mislam-dev/marking-grading-system-with-if-else-elif-part-09-5g6j</link>
      <guid>https://dev.to/mislam-dev/marking-grading-system-with-if-else-elif-part-09-5g6j</guid>
      <description>&lt;p&gt;আগের পার্টে একটা কাজ করতে দিয়েছিলাম। যারা করেছেন তাদেরকে ধন্যবাদ। &lt;/p&gt;

&lt;p&gt;আর যারা করতে পারেন নি অথবা কোথাও বুঝতে সমস্যা আছে তার এই পার্ট টা স্কিপ করতে পারেন। &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;`Marking&lt;/strong&gt; Grading System&lt;code&gt; সিস্টেম বানাতে গেলে প্রথমে এই সিস্টেম কিভাবে কাজ করে সেটা জানতে হবে। আমরা সবাই জানি যে ১০০ এর ভিতরে ৮০ থেকে এর উপরে নাম্বার পেলেই &lt;/code&gt;A+`।  নিচের টেবিল টা লক্ষ্য করুনঃ&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;মার্ক&lt;/th&gt;
&lt;th&gt;ফলাফল&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;৮০ থেকে ১০০&lt;/td&gt;
&lt;td&gt;A+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;৭০ থেকে ৭৯&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;৬০ থেকে ৬৯&lt;/td&gt;
&lt;td&gt;A-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;৫০ থেকে ৫৯&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;৪০ থেকে ৪৯&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;৩৩ থেকে ৩৯&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;৩৩ এর নিচে&lt;/td&gt;
&lt;td&gt;F&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;উপরে শর্ত্য গুলো মেনেই গ্রড নির্ণয় করা হয়। &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;এই বিষয়টা সমাধান করা জন্য পাইথন অপারেটর এর প্রয়োজন হবে।&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;এখানে কোড দেওয়া আছে। কোড থেকে বোঝার চেষ্টা করুন কিভাবে কি হয়েছে। তবে আগে নিজে নিজে চেষ্টা করে দেখুন।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;55&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You got A+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;79&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You got A&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;69&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You got A-&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You got B&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You got C&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You got D&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You got F&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Conditions (If-else-elif) Part-08</title>
      <dc:creator>Monirul Islam</dc:creator>
      <pubDate>Wed, 04 Sep 2024 06:00:00 +0000</pubDate>
      <link>https://dev.to/mislam-dev/conditions-if-else-elif-part-08-3noh</link>
      <guid>https://dev.to/mislam-dev/conditions-if-else-elif-part-08-3noh</guid>
      <description>&lt;p&gt;ছোট বেলায় আমি সন্ধার পর দেরি করে বাড়িতে যেতাম। প্রায় প্রতিদিন। এই জিনিস টা আমার মা ঠিক পছন্দ করে না। একদিন তো একটা warning দিয়েই দিলেন। &lt;/p&gt;

&lt;p&gt;“কালকে থেকে যদি সন্ধ্যার  আগে তুই বাড়ি না আসিস, তাহলে তোর খবর আছে।” &lt;/p&gt;

&lt;p&gt;“আচ্ছা ঠিক আছে।” &lt;/p&gt;

&lt;p&gt;“তোর না কালকে বললাম সন্ধ্যার আগে বাড়িতে আসবি। সন্ধ্যা কখন হয়েছে কোন খবর আছে”&lt;/p&gt;

&lt;p&gt;“আর যদি ঠিক সময় মত চলে আসি তাহলে”&lt;/p&gt;

&lt;p&gt;“তাহলে তোকে ২টা ডিম সিদ্ধ করে খেতে দিব”&lt;/p&gt;

&lt;p&gt;পরের দিন সন্ধ্যাবেলা&lt;/p&gt;

&lt;p&gt;অনেকদিনের অভ্যাস এত সহজে যায়। তারপর শুরু হল উত্তম মধ্যম। এভাবেই চলছে কিছুদিন। কোন কাজ হল। &lt;/p&gt;

&lt;p&gt;তখন  আমার মা বলল আমাকে একদিন ডেকে বলল &lt;/p&gt;

&lt;p&gt;“শোন আমি একটা সিদ্ধান্ত নিয়েছি।”&lt;/p&gt;

&lt;p&gt;“কি সিন্ধান্ত”। আমি একটু চিন্তিত। না যা জানি কি বলে বসে। &lt;/p&gt;

&lt;p&gt;“কালকে থেকে তুই সন্ধ্যা হওয়ার ৫ মিনিটের মধ্যে বাড়িতে আসিস তাহলে তোকে ৫ টাকার ২ টা কেক দেওয়া হবে।”&lt;/p&gt;

&lt;p&gt;আমি তো শুনেই সেই খুশি। &lt;/p&gt;

&lt;p&gt;“থাম অত খুশি হওয়ার দরকার নেই। আর ১৫ মিনিট এর মধ্যে আছিস তাহলে ১ টা কেক পাবি”&lt;/p&gt;

&lt;p&gt;“বাহ ভাল তো”&lt;/p&gt;

&lt;p&gt;“আরেক টা জিনিস আছে। উপরের কোন টায় করতে না পারিস তাহলে কেক তো পাবিই না। সাথে তোর রাতে খাওয়া ও বন্ধ।”&lt;/p&gt;

&lt;p&gt;“এই টা কিন্তু ঠিক হচ্ছে না।”&lt;/p&gt;

&lt;p&gt;“ঠিক নাকি ভুল আমি সেটা বুঝব। তোর কাছে অপশন দিয়ে দিছি তোর যেই টা ভালো লাগবে সেইটা করবি ”&lt;/p&gt;

&lt;p&gt;এখান থেকে কি কিছু বুঝতে পারছেন? আমার কপালে দুঃখ আছে। শর্ত অনুযায়ী কাজ না করলে তো থাকবেই। চাকরির ক্ষেত্রে চাকরিও চলে যেতে পারে। &lt;/p&gt;

&lt;p&gt;এখানে লক্ষ্য করলে বুঝতে পারবেন যে, &lt;/p&gt;

&lt;p&gt;প্রথম দৃশ্যে যদি লক্ষ করেন তাহলে খেয়াল করবেন এখানে কাজ ২ টা কিন্তু হবে যে কোন একটা। কোন কাজ টা হবে সেটা নির্ভর করছে একট শর্তের উপর (সন্ধ্যার আগে বাড়ি ফিরছি কিনা)। &lt;/p&gt;

&lt;p&gt;আমি যেহেতু ওই দিন বাড়ি সময় মত ফিরতে পারি নি এই জন্য। আমার ক্ষেত্রে প্রথম কাজ টাই হয়েছে । উত্তম মধ্যম দিয়েছে আরকি। &lt;/p&gt;

&lt;p&gt;এই একই বিষয়টা পাইথনেও আছে। নিচের কোড টা লক্ষ্য করুন&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# condition সত্য হলে এই নিচের কোড রান হবে
&lt;/span&gt;    &lt;span class="c1"&gt;# expression
&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# condition সত্য না হলে বা মিথ্যা হলে এই নিচের কোড রান হবে
&lt;/span&gt;    &lt;span class="c1"&gt;# expression
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এখানে &lt;code&gt;if&lt;/code&gt; হল পাইথনের কিওয়ার্ড। &lt;code&gt;if&lt;/code&gt; এর পরে একটা &lt;code&gt;condition&lt;/code&gt; হবে এবং এই condition এর উপর ভিত্তি করে কোন ব্লকের কোড রান হবে তা নির্ধারিত হবে। condition সত্য হলে প্রথম ব্লক টা রান হবে আর সত্য না হলে পরবর্তী else ব্লকে চলে যাবে। নিচের কোড টা রান করলেই বুঝতে পারবেন।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# ১ আর ১ সমান
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Condition is true&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Condition is false&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;বিঃদ্রঃ পাইথন অপারেটরের মাধ্যমে এখানে condition চেক করতে হবে।&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;এবার আসুন দ্বিতীয় দৃশ্যে &lt;/p&gt;

&lt;p&gt;এখানে কিন্তু ২ টা condition আছে। এখন কি করবেন? খুব সহজ। আপনি একটু ভাবলেই পেরে যাবেন। আগে একটু ভাবেন। &lt;/p&gt;

&lt;p&gt;এখানে প্রথম condition এর জন্য উপরে মত করে if else ব্যবহার করব। তারপর else ব্লক এর ভিতরে ২য় condition এর জন্য if else লিখবে। confusing লাগছে? নিচের কোড টা দেখলে বুঝতে পারবেন।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# 1st layer condition
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1st Condition is true&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# 2nd layer condition
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2nd Condition is true&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;No Condition is true&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;উপরে কোড কে পরিবর্তন করে নিজের মত করে কোন condition দেখতে পারেন। &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;কাজঃ আপনার এই if else ব্যবহার করে একটা Marking Grading System বানিয়ে ফেলুন। আর কোডের screenshot কমেন্ট এ শেয়ার করুন।&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;উপরে কোডে লক্ষ্য করলে দেখবেন এখানে 1st layer condition চেক করা পর 2nd layer condition এর চেক করছে । এখানে চাইলে একটু ভালোভাবে কোড লেখা যায়। নিচের কোড টা দেখুন&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1st Condition is true&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2nd Condition is true&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;No Condition is true&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এর আগের লেখা কোড  আর এই কোডের আউটপুট একই  আসবে। কিন্তু এই কোড আগের কোডের থেকে সহজে বোঝা যায়। পরবর্তীতে আমাদের সময় বাচাবে। &lt;/p&gt;

&lt;p&gt;এখানে শুধু একটা নতুন condition add করেছি elif কিওয়ার্ড দিয়ে। এখানে খেয়াল করলে দেখবেন এখানে কিন্তু কোডের লেয়ার একটা কমে গেছে &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;কাজঃ এবার আপনার  if else ব্যবহার করে Marking Grading System কে elif এ convert করে ফেলুন  । আর কোডের screenshot কমেন্ট এ শেয়ার করুন।&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;আজ এই পর্যন্ত। এতক্ষন সাথে থাকার জন্য ধন্যবাদ। আপনার মতামত অবশ্যই জানাতে ভুলবেন না। কমেন্ট এ যদি বলতে সমস্যা হয় তাহলে আমার inbox তো খোলায় আছে।&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>python</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Operators Part-07</title>
      <dc:creator>Monirul Islam</dc:creator>
      <pubDate>Mon, 02 Sep 2024 06:00:00 +0000</pubDate>
      <link>https://dev.to/mislam-dev/operators-part-07-35d5</link>
      <guid>https://dev.to/mislam-dev/operators-part-07-35d5</guid>
      <description>&lt;p&gt;আসুন আমার আজকে কম্পিউটার এর ইতিহাস কিছুটা জানি। চার্লস ব্যাবেজ নামটা নিশ্চয় শুনেছেন। আইটি আছে আর  এই  নাম আপনি শোনেনি এটা আপনার জন্য দুর্ভাগ্য। যাই হোক, ইনি হলে কম্পিউটার এর জনক। &lt;/p&gt;

&lt;p&gt;চার্লস ব্যাবেজ ছিলেন একজন মেকানিক্যাল ইঞ্জিনিয়ার। এছাড়া অনেক সেক্টর ছিল যেমন গনিত অর্থনীতি এসব সেক্টরেও তার সমান পারদর্শীতা ছিল। তিনি প্রথম একটা যন্ত্র বানান যার দ্বারা গননা করা যেত। গণ্না এর ইংরেজি শব্দ &lt;code&gt;compute&lt;/code&gt; । এখানে থেকেই পরবর্তীতে কম্পিউটার শব্দের উদ্ভব হয়। &lt;/p&gt;

&lt;p&gt;এই কম্পিউটার নির্দিষ্ট সংখ্যক কাজ করতে পারত। কিন্তু বর্তমান যুগের কম্পিউটার ওই কম্পিউটার কয়েক লক্ষ কোটি গুন কাজ করতে সক্ষম। এবার আপনি একটু ভাবুন তো, একটা যন্ত্র দিয়ে যখন অনেকগুলো কাজ করতে চাইবেন তখন তার তৈরী প্রক্রিয়া কি রকম জটিল হতে পারে?&lt;/p&gt;

&lt;p&gt;কম্পিউটার জিনিস টাও একটু জটিল। এজন্য কম্পিউটার কে কাজ করাতে চাইলে প্রায় সবকিছুই বলে দেওয়া লাগে। না বললে কি হবে?&lt;/p&gt;

&lt;p&gt;জগাখিচুড়ির সৃষ্টি হবে। আপনি ভাববেন এক, আর হবে আরেক। এসব সমাস্যার সৃষ্টি না সে জন্য কিছু সাংকেতিক চিহ্ন রয়েছে। এসব চিহ্নের মাধ্যমে যাব তীয় যৌক্তিক ও গানিতিক হিসাব নিকাশ সম্পন্ন করা হয়। এসব চিহ্নকে প্রোগ্রামিং লাংগুয়েজে অপারেটর বলে। &lt;/p&gt;

&lt;h3&gt;
  
  
  পাইথনে মোট ৭ ধরনের অপারেটর রয়েছে।
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Arithmetic Operators: গানিতিক অপারশন সম্পন্ন করতে ব্যবহার করা হয়।&lt;/li&gt;
&lt;li&gt;Relational Operators: দুই বা ততোধিক মানের ভিতর তুলনা করার জন্য ব্যবহার করা হয়।&lt;/li&gt;
&lt;li&gt;Assignment Operators: ভেরিয়েবলে ভ্যালু আসাইন করার জন্য ব্যবহার করা হয়।&lt;/li&gt;
&lt;li&gt;Logical Operators:দুই বা ততোধিক মানের ভিতর যৌক্তিক সম্পর্কের তুলনা করার জন্য ব্যবহার করা হয়।&lt;/li&gt;
&lt;li&gt;Bitwise Operators: বিট ম্যানুপুলেশন এর জন্য ব্যবহার করা হয়।&lt;/li&gt;
&lt;li&gt;Membership Operators: কোন ভ্যালু কোন লিস্ট-এ আছে কিনা তা চেক করা করার জন্য ব্যবহার করা হয়।&lt;/li&gt;
&lt;li&gt;Identity Operators: ফলসি ভ্যালু চেক করার জন্য ব্যবহার করা হয়।&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Arithmetic Operators
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;+&lt;/code&gt;&lt;/strong&gt; (Addition): দুটি সংখ্যা যোগ করতে ব্যবহার করা হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-&lt;/code&gt;&lt;/strong&gt; (Subtraction): একটি সংখ্যা থেকে অন্যটি বিয়োগ করতে ব্যবহার করা হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;*&lt;/code&gt;&lt;/strong&gt; (Multiplication): সংখ্যা গুণ করতে বা স্ট্রিংকে একাধিক বার পুনরাবৃত্তি করতে ব্যবহার করা হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/&lt;/code&gt;&lt;/strong&gt; (Division): সংখ্যা ভাগ করতে ব্যবহার করা হয়, এবং সবসময় একই ডিভাইজনের প্রকারভেদ দেয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;%&lt;/code&gt;&lt;/strong&gt; (Modulus): একটি সংখ্যা দিয়ে অন্যটি ভাগ করতে এবং মডুলোসহ প্রস্তুত হয়া বাকি অংশ হিসেবে নেওয়া হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;`&lt;/strong&gt;`** (Exponentiation): একটি সংখ্যা কে অন্যটি সংখ্যার পাওয়ার হিসেবে নেওয়া হয়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;নিচের কোড টি রান করলে বিষয়গুলো আরো ভালো ভাবে পরিষ্কার হবে।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Logical Operators:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;and&lt;/code&gt;&lt;/strong&gt;: দুটি শর্ত সত্য হলে সত্য প্রদান করে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;or&lt;/code&gt;&lt;/strong&gt;: দুটি শর্ত যেকোনো একটি সত্য হলে সত্য প্রদান করে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;not&lt;/code&gt;&lt;/strong&gt;: একটি শর্ত মিথ্যা হলে সত্য প্রদান করে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;নিচের কোড টি রান করলে বিষয়গুলো আরো ভালো ভাবে পরিষ্কার হবে।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Comparison Operators:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;==&lt;/code&gt;&lt;/strong&gt; (Equal to): দুটি মান সমান হলে সত্য প্রদান করে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;!=&lt;/code&gt;&lt;/strong&gt; (Not Equal to): দুটি মান সমান নয় হলে সত্য প্রদান করে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;&amp;lt;&lt;/code&gt;&lt;/strong&gt; (Less than): একটি মান অপর মানের থেকে ছোট হলে সত্য প্রদান করে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;&amp;gt;&lt;/code&gt;&lt;/strong&gt; (Greater than): একটি মান অপর মানের থেকে বড় হলে সত্য প্রদান করে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;&amp;lt;=&lt;/code&gt;&lt;/strong&gt; (Less than or equal to): একটি মান অপর মানের থেকে কম বা সমান হলে সত্য প্রদান করে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;&amp;gt;=&lt;/code&gt;&lt;/strong&gt; (Greater than or equal to): একটি মান অপর মানের থেকে বড় বা সমান হলে সত্য প্রদান করে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;নিচের কোড টি রান করলে বিষয়গুলো আরো ভালো ভাবে পরিষ্কার হবে।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Assignment Operators:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;=&lt;/code&gt;&lt;/strong&gt; (Assignment): একটি মান একটি ভেরিয়েবলে সম্পাদন করতে ব্যবহৃত হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;+=&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;=&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;=&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;/=&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;//=&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;%=&lt;/code&gt;&lt;/strong&gt;: ভেরিয়েবলে একটি মান যোগ, বিয়োগ, গুণ, ভাগ, পূর্ণাংশ ভাগ, বা মডুলো করতে এবং ফলাফলটি ভেরিয়েবলে সংরক্ষণ করতে ব্যবহৃত হয়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;নিচের কোড টি রান করলে বিষয়গুলো আরো ভালো ভাবে পরিষ্কার হবে। এই আপরেটর গুলো সামনে যখন লুপ ব্যবহার কর তখন কাজে লাগবে।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a = 10
print(a)
a+= 10
print(a)
a-= 10
print(a)
a*= 10
print(a)
a/= 10
print(a)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;আপাতত নিচের দুইটা অপারেটর এর কোন উদাহরণ দিচ্ছি না এখন। সামনে যখন লিস্ট নিয়ে কাজ করা হবে তখন দেখানো হবে।  ইনশাল্লাহ&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Membership Operators:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;in&lt;/code&gt;&lt;/strong&gt; : একটি মান একটি সিকুয়েন্সে বিদ্যমান থাকলে সত্য প্রদান করে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;not in&lt;/code&gt;&lt;/strong&gt;: একটি মান একটি সিকুয়েন্সে বিদ্যমান না থাকলে সত্য প্রদান করে।&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Identity Operators:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;is&lt;/code&gt;&lt;/strong&gt;: একটি অবজেক্ট আরেকটি অবজেক্টের সাথে একই অবস্থানে আছে কিনা তা চেক করতে ব্যবহার করা হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;is not&lt;/code&gt;&lt;/strong&gt;: একটি অবজেক্ট আরেকটি অবজেক্টের সাথে একই অবস্থানে নেই কিনা তা চেক করতে ব্যবহার করা হয়।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;আপনার মতামত দিতে ভুলবেন না। এতক্ষন সাথে থাকার জন্য ধন্যবাদ।&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
