সরাসরি পর্বে যান
পর্ব ২১ · ৭০-এর মধ্যে · মডিউল ৪

Functional আর non-functional requirement — SRS আর মাপা যায় এমন requirement

Functional & Non-functional Requirements — Constraints, ISO/IEC/IEEE 29148, EARS, Fit Criteria, Planguage & the SRS

Taught in Bangla, this lesson separates what a system does from how well it does it, laying out the requirement types tree, user versus system requirements, the qualities of a good requirement and ambiguity traps. It teaches the five EARS templates, quantifying non-functional requirements with fit criteria and Planguage, the SRS from IEEE 830 to ISO/IEC/IEEE 29148, and requirement IDs and attributes in Agile teams.

এই পর্বে যা শিখবেন

  • Functional requirement, non-functional requirement, constraint আর domain requirement আলাদা করে চেনা
  • User requirement থেকে system requirement-এ নামা, আর কার জন্য কোনটি লেখা হয়
  • ISO/IEC/IEEE 29148-এর গুণ, shall-should-may, আর অস্পষ্টতার ফাঁদ (weak word, TBD, and/or, সর্বনাম) ধরার কৌশল
  • EARS ছাঁচে requirement লেখা, আর fit criterion ও Planguage দিয়ে NFR মাপা
  • IEEE 830 / 29148 কাঠামোয় একটি SRS অংশ বানানো, requirement-এর ID ও attribute, আর Agile দলে SRS-এর রূপ

১ · দর্জির মাপ — “কী বানাবেন” আর “কেমন হবে”

ঈদের আগে দর্জির দোকানে গেছেন একটি পাঞ্জাবি বানাতে। দর্জি খাতায় লিখলেন: লম্বা ৪২ ইঞ্চি, বুক ৪০, হাতা ২৪, বুকের বাঁ দিকে একটি পকেট, গলায় তিনটি বোতাম। এগুলো হলো কী বানাতে হবে। তারপর আপনি বললেন: “কাপড়টা যেন গরমে আরাম দেয়, ধোয়ার পর রং না ওঠে, আর চাঁদরাতের আগের দিনের মধ্যে চাই।” এগুলো কেমন হবে আর কোন সীমার মধ্যে। শেষে যোগ করলেন: “শুধু সুতি কাপড়, আর বাজেট দুই হাজার টাকা।” এটি পছন্দের পথ বেঁধে দেওয়া শর্ত।

Software-এর requirement-ও ঠিক এই তিন ভাগে পড়ে। পর্ব ২০-এ (Requirement engineering — stakeholder, elicitation আর feasibility) দেখেছেন, stakeholder-দের কাছ থেকে চাওয়াগুলো কীভাবে বের করে আনা হয়। এই পর্বের কাজ তার পরের ধাপ: বের করে আনা চাওয়াগুলোকে ভাগ করা, পরিষ্কার বাক্যে লেখা আর যাচাই করা যায় এমন রূপ দেওয়া।

পুরো পর্বে আমরা একটি কাল্পনিক হাসপাতালের অ্যাপয়েন্টমেন্ট অ্যাপ ধরে কাজ করব। রোগী অ্যাপে ডাক্তার খুঁজবেন, খালি সময় (slot) বেছে বুক করবেন, ফি দেবেন, SMS-এ মনে করিয়ে দেওয়ার বার্তা পাবেন; রিসেপশনিস্ট বুকিং সামলাবেন, ডাক্তার নিজের দিনের তালিকা দেখবেন।

⚙️ Functional requirement (FR)

System কী করবে: কোন ইনপুটে কোন আচরণ, কোন আউটপুট, কোন নিয়ম মেনে। “রোগী ডাক্তারের নাম বা বিভাগ দিয়ে খুঁজতে পারবেন।” “বুকিং নিশ্চিত হলে system রোগীকে booking ID-সহ SMS পাঠাবে।”

আচরণ · ইনপুট-আউটপুট · business rule

📏 Non-functional requirement (NFR)

System কতটা ভালোভাবে কাজটি করবে: গতি, নিরাপত্তা, নির্ভরযোগ্যতা, ব্যবহার-সহজতা, রক্ষণাবেক্ষণের সহজতা। “ভিড়ের সময়েও ডাক্তার-খোঁজার উত্তর ৯৫ শতাংশ ক্ষেত্রে ৮০০ মিলিসেকেন্ডের মধ্যে আসবে।”

quality attribute

🚧 Constraint

সমাধানের পথ সীমিত করা শর্ত: “হাসপাতালের বিদ্যমান PostgreSQL database ব্যবহার করতে হবে”, “রোগীর তথ্য দেশের প্রযোজ্য তথ্য-সুরক্ষা আইন মেনে রাখতে হবে”, “প্রথম সংস্করণ ছয় মাসে।”

প্রযুক্তি · আইন · বাজেট · সময়
মূল ধারণা

Functional requirement একটি হ্যাঁ-না প্রশ্নের মতো — system কাজটি করে, নাকি করে না। Non-functional requirement একটি মাত্রার প্রশ্ন — কাজটি কত দ্রুত, কত নিরাপদে, কত সহজে হয়। দুটো ছাড়াই software ব্যর্থ হতে পারে: সব feature থাকলেও ঈদের ভিড়ে অ্যাপ বসে গেলে রোগীর কাছে অ্যাপটির অস্তিত্বই নেই।

পর্ব ০৩-এ (Software quality — ISO/IEC 25010) quality-র আটটি characteristic আর quality scenario দেখেছেন। সেই শব্দভান্ডার এখানে আবার শেখানো হবে না; এখানে প্রশ্ন হলো, ওই গুণগুলোকে requirement-এর বাক্যে কীভাবে লিখবেন, SRS-এ কোথায় রাখবেন, আর পাস-ফেল কীভাবে ঠিক করবেন।

২ · Requirement-এর প্রকারভেদ — একটি গাছ

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

Requirement-এর প্রকারভেদ

Functional requirements, non-functional (quality) requirements and constraints

Requirement-এর প্রকারভেদ: functional, non-functional আর constraint Requirements software-এর চাওয়া Functional কী করবে আচরণ ইনপুট → আউটপুট business rule data ও report user interaction Non-functional কতটা ভালো performance security usability reliability maintainability portability (ISO/IEC 25010) Constraint পথের সীমা design ও implementation platform ও interface legal ও regulatory বাজেট ও সময় Domain requirement ক্ষেত্র থেকে আসে; তিন শাখার যেকোনোটিতে পড়ে স্তর: user requirement → system requirement একই চাওয়া, দুই পাঠকের জন্য দুই মাত্রার বিস্তার
ছবি ২১.১ — তিন প্রধান শাখা; domain requirement আর user-system স্তর আলাদা মাত্রা, তাই ড্যাশ বাক্সে।

Functional requirement-এর ভেতরে কী থাকে

একটি functional requirement সাধারণত তিনটি জিনিস বলে: কোন ঘটনা বা ইনপুটে (রোগী slot বেছে “নিশ্চিত” চাপলেন), system কী করবে (slot সংরক্ষণ করবে, booking ID বানাবে), আর কী আউটপুট দেবে (পর্দায় নিশ্চিতকরণ, SMS). এর ভেতরে প্রায়ই একটি business rule বসে থাকে — প্রতিষ্ঠানের নীতি, যা software-কে মানতে হয়: “একজন ডাক্তারের দিনে সর্বোচ্চ ৪০টি অ্যাপয়েন্টমেন্ট”, “অ্যাপয়েন্টমেন্টের ২ ঘণ্টা আগে পর্যন্ত বাতিল করলে পুরো ফি ফেরত।” Business rule আলাদা তালিকায় রাখা ভালো, কারণ নীতি বদলায় — আর বদলালে কোন কোন requirement ছুঁয়ে যায়, সেটি খুঁজে পাওয়া সহজ হয়।

Non-functional requirement — Sommerville-এর তিন ভাগ

Ian Sommerville-এর বহুল পঠিত পাঠ্যবই Software Engineering NFR-কে উৎস অনুযায়ী তিন ভাগে দেখায়: product requirement (software-এর নিজের আচরণ — গতি, জায়গা, নির্ভরযোগ্যতা, নিরাপত্তা, ব্যবহার-সহজতা), organisational requirement (প্রতিষ্ঠানের নীতি থেকে — কোন programming ভাষা, কোন development প্রক্রিয়া, কোন পরিবেশে চলবে) আর external requirement (বাইরের উৎস থেকে — আইন, নিয়ন্ত্রক সংস্থা, নৈতিকতা)। খেয়াল করুন, তাঁর “organisational” আর “external” ভাগের অনেকটাই অন্য লেখকেরা constraint বলেন। নাম নিয়ে বিভ্রান্ত হবেন না; প্রশ্নটি একই — এই শর্ত কোথা থেকে এলো, আর কে বদলাতে পারেন?

Domain requirement

Domain requirement আসে application-এর ক্ষেত্র থেকে — ব্যবহারকারী হয়তো মুখে বলবেনই না, কারণ তাঁর কাছে এটি “সবাই জানে”। চিকিৎসার ক্ষেত্রে: “একই রোগীর একই সময়ে দুই ডাক্তারের সাথে অ্যাপয়েন্টমেন্ট থাকতে পারবে না”, “শিশু রোগীর বুকিং অভিভাবকের মোবাইল নম্বরে হবে”, “ওষুধের নাম জেনেরিক নামসহ দেখাতে হবে।” ব্যাংকিংয়ে সুদের হিসাবের নিয়ম, রেলে আসন বণ্টনের নিয়ম — এগুলো domain requirement. সমস্যা হলো, ক্ষেত্রের বিশেষজ্ঞ এগুলো এত স্বাভাবিক ধরে নেন যে বলতে ভুলে যান, আর software engineer ক্ষেত্রটি না জানায় জিজ্ঞেস করতেও জানেন না। তাই domain বিশেষজ্ঞের সাথে বসা আর ক্ষেত্রের নথি পড়া elicitation-এর অংশ (পর্ব ২০)।

এবার অনুশীলন। নিচের stepper-এ হাসপাতাল অ্যাপের ছয়টি requirement একে একে শ্রেণিতে ফেলা হচ্ছে। প্রতিটি ধাপের আগে নিজে অনুমান করুন।

হাসপাতাল অ্যাপয়েন্টমেন্ট অ্যাপ (কাল্পনিক) — শ্রেণিবিন্যাস
R1 · রোগী নাম ও মোবাইল নম্বর দিয়ে নিবন্ধন করবেন
R2 · একজন ডাক্তারের দিনে সর্বোচ্চ ৪০টি অ্যাপয়েন্টমেন্ট
R3 · ২০০ req/s-এ ডাক্তার-খোঁজার p95 latency 800 ms-এর কম
R4 · রোগীর রিপোর্ট দেখতে পারবেন শুধু সেই রোগী ও তাঁর চিকিৎসক
R5 · হাসপাতালের বিদ্যমান PostgreSQL database ব্যবহার করতে হবে
R6 · রোগীর স্বাস্থ্য-তথ্য প্রযোজ্য তথ্য-সুরক্ষা আইন মেনে রাখতে হবে
  1. R1 — FR. একটি ইনপুট (নাম, মোবাইল নম্বর) আর একটি আচরণ (নিবন্ধন)। System এটি করে কি না, হ্যাঁ-না দিয়ে বলা যায় — পরিষ্কার functional requirement.
  2. R2 — FR, ভেতরে business rule. এটি “কতটা ভালো” নয়, একটি নিয়ম: ৪১তম বুকিং system গ্রহণ করবে না। নিয়মটি হাসপাতালের নীতি আর চিকিৎসার ক্ষেত্র থেকে আসা, তাই এটি domain requirement-ও। নীতি বদলালে (৪০ থেকে ৩০) শুধু এই নিয়মটি বদলাবে।
  3. R3 — NFR (performance). কাজটি (খোঁজা) R1-এর মতো আলাদা FR-এ বলা আছে; এখানে বলা হচ্ছে কত দ্রুত, কোন ভারে। সংখ্যা, একক আর শর্ত থাকায় এটি মাপা যায় — অংশ ৬-এ ঠিক এই বাক্যটি program দিয়ে যাচাই করব।
  4. R4 — ধূসর এলাকা। গুণ হিসেবে এটি security (confidentiality), কিন্তু বাক্যটি একটি পরীক্ষাযোগ্য আচরণ: অন্য কেউ চাইলে system রিপোর্ট দেখাবে না। বাস্তবে অনেক NFR এভাবে FR-এ “নেমে আসে” — একে কেউ কেউ derived functional requirement বলেন। কোন খাতায় রাখবেন, তার চেয়ে জরুরি হলো বাদ না পড়া আর test করা যাওয়া।
  5. R5 — Constraint. এটি কোনো আচরণ বা গুণ বলে না; নকশাকারীর একটি পছন্দ আগেই বেঁধে দেয়। হয়তো অন্য database এই অ্যাপের জন্য ভালো হতো, কিন্তু হাসপাতালের বিদ্যমান দক্ষতা আর লাইসেন্সের কারণে সিদ্ধান্ত আগে থেকে নেওয়া। Constraint-এর কারণ (rationale) লিখে রাখুন — কারণ ফুরালে constraint-ও তুলে নেওয়া যায়।
  6. R6 — Legal ও regulatory constraint. উৎস বাইরের — আইন। Sommerville-এর ভাষায় external requirement. এর সাথে লিখে রাখুন কোন আইন বা নীতি, কোন ধারা, কে নিশ্চিত করবেন (আইনি পরামর্শক)। আইনের নির্দিষ্ট শর্ত নিয়ে অনুমান না করে আইনজ্ঞের সাথে মিলিয়ে নেওয়াই নিরাপদ।

“NFR পরে দেখা যাবে” ফাঁদ। Feature-এর তালিকা সহজে আসে, কারণ stakeholder সেগুলো চোখে দেখেন। গতি, নিরাপত্তা বা বাড়তি ভার সামলানোর ক্ষমতা মানুষ “স্বাভাবিক” ধরে নেন, তাই মুখে বলেন না। অথচ নকশার বড় সিদ্ধান্তগুলো — কতগুলো server, cache লাগবে কি না, তথ্য কোথায় রাখা হবে — প্রায়ই NFR থেকেই আসে, আর পরে বদলানো খুব দামি। System Design কোর্সের Requirement আর trade-off পর্বে দেখবেন, NFR কীভাবে নকশার আকার ঠিক করে।

৩ · User requirement বনাম system requirement

একই চাওয়া দুই রকম পাঠকের জন্য দুই মাত্রায় লেখা হয়। হাসপাতালের পরিচালক বা রোগী-প্রতিনিধি চান এক পাতায় বুঝতে, অ্যাপটি কী সেবা দেবে। আর ডেভেলপার ও tester-এর দরকার এমন বিবরণ, যা থেকে কোড আর test লেখা যায়। Sommerville এই দুই স্তরকে বলেন user requirement আর system requirement.

স্তরকার জন্যউদাহরণ (হাসপাতাল অ্যাপ, কাল্পনিক)
User requirementরোগী, পরিচালক, গ্রাহক — যাঁরা প্রযুক্তিবিদ ননUR-3: অ্যাপয়েন্টমেন্টের আগে রোগীকে মনে করিয়ে দেওয়া হবে।
System requirementডেভেলপার, tester, স্থপতি; চুক্তির ভিত্তিSR-3.1: When a confirmed appointment is 24 hours away, the appointment system shall send an SMS reminder to the patient's registered mobile number.
SR-3.2: If the SMS gateway returns an error, then the appointment system shall retry up to 3 times at 5-minute intervals.
SR-3.3: The appointment system shall not send reminders between 22:00 and 07:00 local time.

খেয়াল করুন, একটি user requirement থেকে তিনটি system requirement এলো, আর এর দুটির কথা রোগী কখনো বলেননি — gateway ব্যর্থ হলে কী হবে, রাতে বার্তা পাঠানো যাবে কি না। এই “ভাঙার” সময়েই বেশিরভাগ লুকোনো প্রশ্ন বেরিয়ে আসে। প্রতিটি SR-এর সাথে কোন UR থেকে এলো (SR-3.1 → UR-3) লিখে রাখলে পরে traceability তৈরি হয় — পর্ব ২৪-এ (Requirement management) বিস্তারিত।

বাড়ি বানানোর কথা ভাবুন। মালিক বলেন, “তিন বেড, দুই বাথ, দক্ষিণমুখী বারান্দা।” এটি user requirement. স্থপতি আর রাজমিস্ত্রির নকশায় লেখা থাকে: প্রতিটি বেডরুম কমপক্ষে ১২ × ১৪ ফুট, বারান্দার রেলিং ৩.৫ ফুট উঁচু, বাথরুমের মেঝে ১ ইঞ্চি ঢালু। এটি system requirement. মালিককে দ্বিতীয় তালিকা দেখালে তিনি বিরক্ত হবেন; রাজমিস্ত্রিকে শুধু প্রথম তালিকা দিলে প্রত্যেকে নিজের মতো বাড়ি বানাবেন।

অনেক দলে এখন user requirement লেখা হয় user story আকারে (“রোগী হিসেবে আমি অ্যাপয়েন্টমেন্টের আগে মনে করিয়ে দেওয়ার বার্তা চাই, যাতে ভুলে না যাই”), আর system requirement-এর জায়গা নেয় acceptance criteria. সেই ধরন পর্ব ২২-এ (Use case আর user story) পুরোটা দেখবেন। আর চাওয়াগুলোকে ছবিতে মডেল করা — domain model, activity, state diagram — পর্ব ২৩-এ (Requirement modeling).

৪ · ভালো requirement-এর গুণ আর অস্পষ্টতার ফাঁদ

ভালো requirement-এর গুণ নিয়ে সবচেয়ে প্রচলিত আন্তর্জাতিক সূত্র এখন ISO/IEC/IEEE 29148 (প্রথম প্রকাশ ২০১১, সংশোধিত ২০১৮)। আমাদের জানামতে ২০১৮ সংস্করণ প্রতিটি requirement-এর জন্য নয়টি গুণ বলে, আর পুরো সেটের জন্য আলাদা কয়েকটি। মানদণ্ডের পূর্ণ লেখা কিনে পড়তে হয়, তাই শব্দ ও সংজ্ঞা পরীক্ষা বা চুক্তির কাজে মূল সূত্রে মিলিয়ে নিন; ২০১১ সংস্করণের তালিকা একটু আলাদা ছিল (যেমন সেখানে implementation free আর traceable আলাদা গুণ হিসেবে ছিল)।

গুণসহজ প্রশ্নভাঙলে যেমন দেখায়
Necessary (প্রয়োজনীয়)বাদ দিলে কি কোনো stakeholder-এর ক্ষতি হবে?“অ্যাপে আবহাওয়ার খবরও দেখাবে” — কেউ চাননি
Appropriate (মানানসই স্তর)এই স্তরের জন্য বিবরণটা কি ঠিক মাত্রায়?User requirement-এ database table-এর নাম
Unambiguous (দ্ব্যর্থহীন)দুজন পাঠক কি একই অর্থ বুঝবেন?“দ্রুত জানাবে” — কত দ্রুত?
Complete (সম্পূর্ণ)আর কিছু না জেনেই কি বোঝা যায়?“ফি ফেরত দেবে” — কত, কখন, কোন শর্তে?
Singular (একক)একটি বাক্যে কি একটিই চাওয়া?“বুক করবে এবং/অথবা বাতিল করবে”
Feasible (সম্ভব)সময়, বাজেট আর প্রযুক্তিতে কি করা যায়?“system কখনো বন্ধ হবে না”
Verifiable (যাচাইযোগ্য)Test, পরিদর্শন বা বিশ্লেষণে কি পাস-ফেল বলা যায়?“ব্যবহার সহজ হবে”
Correct (সঠিক)এটি কি stakeholder-এর আসল চাওয়াই বলছে?নীতি ২ ঘণ্টা, লেখা হয়েছে ২৪ ঘণ্টা
Conforming (নিয়মমাফিক)প্রতিষ্ঠানের ঠিক করা ছাঁচ ও শব্দ কি মানা হয়েছে?দলের ছাঁচ EARS, কিন্তু লেখা মুক্ত গদ্যে

পুরো সেটের গুণ: complete (কোনো চাওয়া বাদ পড়েনি, কোনো TBD ঝুলে নেই), consistent (দুটি requirement একে অপরের বিরোধী নয় — একটি বলে “বাতিলে পুরো ফেরত”, আরেকটি বলে “১০% কাটা যাবে” — এমন নয়), feasible (সব মিলিয়ে সময় ও বাজেটে সম্ভব), comprehensible (পাঠক বুঝতে পারেন system কী করবে) আর able to be validated (সব পূরণ হলে stakeholder-এর আসল প্রয়োজন মিটবে, তা দেখানো যায়)। পুরোনো IEEE 830-1998 প্রায় একই ধাঁচে একটি ভালো SRS-এর আটটি গুণ বলত: correct, unambiguous, complete, consistent, ranked for importance and/or stability, verifiable, modifiable আর traceable.

“shall”, “should”, “may” — কোন শব্দের কী ওজন

ইংরেজিতে লেখা SRS-এ ক্রিয়াপদই বলে দেয় কোনটি চুক্তির বাধ্যবাধকতা। 29148-এর প্রচলিত রীতি (আমাদের জানামতে): shall = বাধ্যতামূলক requirement; should = কাম্য লক্ষ্য বা পছন্দ, বাধ্যতামূলক নয়; may = অনুমতি বা ঐচ্ছিক; will = ঘটনার বিবরণ বা উদ্দেশ্য, requirement নয়। অনেক নির্দেশিকা “must” এড়াতে বলে, যাতে shall-এর সাথে গুলিয়ে না যায়। অন্য দিকে internet-এর প্রোটোকল-নথিতে (IETF) RFC 2119 (১৯৯৭) MUST, SHOULD, MAY-কে বড় হাতের অক্ষরে নির্দিষ্ট অর্থ দেয় — অর্থাৎ রীতিটা নথির শুরুতে ঘোষণা করে দেওয়াই আসল কথা।

বাংলায় SRS লিখলে “করবে” (বাধ্যতামূলক), “করা বাঞ্ছনীয়” (কাম্য), “করতে পারে” (ঐচ্ছিক) — এমন একটি শব্দ-তালিকা নথির শুরুতে স্থির করে নিন। সমস্যা হলো বাংলায় “করবে” ভবিষ্যৎ ঘটনার বিবরণও হতে পারে, তাই বাধ্যতামূলক বাক্যগুলোকে ID দিয়ে আলাদা করে রাখুন। অনেক দল requirement-এর বাক্য ইংরেজিতে আর ব্যাখ্যা বাংলায় রাখে।

অস্পষ্টতার পাঁচ ফাঁদ

  • Weak word: fast, quick, user-friendly, easy, flexible, efficient, robust, adequate, “যত দ্রুত সম্ভব”, “ইত্যাদি”। এগুলোর মাপ নেই, তাই পাস-ফেল বলা যায় না।
  • যাচাই করা যায় না এমন সর্বোচ্চ-সর্বনিম্ন: always, never, best, maximize, minimize, 100%. “কখনো crash করবে না” কোনো test দিয়ে প্রমাণ হয় না।
  • TBD: “search-এর সময় TBD সেকেন্ড।” খোলা প্রশ্ন থাকা স্বাভাবিক, কিন্তু সাথে কে ঠিক করবেন আর কবে, তা না থাকলে সেটি স্থায়ী গর্ত হয়ে যায়।
  • and/or আর যৌগিক বাক্য: “রোগী এবং/অথবা রিসেপশনিস্ট বাতিল করবেন” — দুজনই পারবেন, নাকি যেকোনো একজন, নাকি দুজন মিলে? যৌগিক বাক্য singular গুণও ভাঙে।
  • কর্তাহীন passive আর অস্পষ্ট সর্বনাম: “অ্যাপয়েন্টমেন্ট বাতিল করা হবে” — কে করবে, system নিজে, নাকি রোগী? “ডাক্তার অনুপস্থিত হলে it shall notify them” — it কে, them কারা?

এই লক্ষণগুলোকে বলা হয় requirement smell — কোডের code smell-এর মতো (পর্ব ৪২): লক্ষণ মানেই ভুল নয়, কিন্তু দেখে নেওয়া দরকার। ১৯৯০-এর দশকের শেষে NASA-র Software Assurance Technology Center-এর ARM (Automated Requirement Measurement) টুলের মতো প্রচেষ্টা এমন শব্দ গুনে SRS-এর মান আঁচ করত, আর এখন অনেক requirement-টুল একই কাজ করে। নিচের program একটি খুব ছোট নিয়মভিত্তিক linter — ছয়টি কাল্পনিক requirement-এ লক্ষণ খোঁজে আর প্রতি লক্ষণে ২৫ নম্বর কেটে একটি score দেয়।

// Requirement smell checker: a tiny rule-based linter (fictional hospital app).
const WEAK = ["fast", "quick", "user-friendly", "easy", "simple", "efficient",
  "flexible", "robust", "adequate", "etc", "normally", "seamless"];
const UNVERIFIABLE = ["always", "never", "best", "maximize", "minimize",
  "as soon as possible", "100%"];
const has = (t, w) => new RegExp("(^|[^a-z])" + w + "([^a-z]|$)").test(t);
function smells(text) {
  const t = text.toLowerCase(), out = [];
  for (const w of WEAK) if (has(t, w)) out.push("weak '" + w + "'");
  for (const w of UNVERIFIABLE) if (has(t, w)) out.push("unverifiable '" + w + "'");
  if (/shall be \w+ed by/.test(t)) out.push("passive 'shall be ...ed by'");
  if (t.includes("and/or")) out.push("compound 'and/or'");
  if (has(t, "tbd")) out.push("placeholder TBD");
  if (/(^|\s)(it|they|them|this)(\s|\.|,)/.test(t)) out.push("vague pronoun");
  if (!has(t, "shall")) out.push("no 'shall'");
  return out;
}
const reqs = {
  "FR-01": "The system shall send an SMS reminder 24 hours before each appointment.",
  "FR-02": "The booking screen should be fast and user-friendly.",
  "FR-03": "An appointment shall be cancelled by the patient and/or the receptionist.",
  "NFR-04": "The doctor search shall return results in TBD seconds.",
  "FR-05": "When a doctor is marked absent, it shall notify them as soon as possible.",
  "NFR-06": "The system shall serve 200 req/s with p95 latency below 800 ms.",
};
let total = 0;
for (const [id, text] of Object.entries(reqs)) {
  const s = smells(text);
  const score = Math.max(0, 100 - 25 * s.length);
  total += score;
  console.log(id.padEnd(7), String(score).padStart(3), s.length ? s.join(", ") : "clean");
}
console.log("set quality score:", (total / Object.keys(reqs).length).toFixed(1), "/ 100");

আউটপুট:

FR-01   100 clean
FR-02    25 weak 'fast', weak 'user-friendly', no 'shall'
FR-03    50 passive 'shall be ...ed by', compound 'and/or'
NFR-04   75 placeholder TBD
FR-05    50 unverifiable 'as soon as possible', vague pronoun
NFR-06  100 clean
set quality score: 66.7 / 100

FR-01 আর NFR-06 পরিষ্কার: একটি কর্তা (the system), একটি shall, সংখ্যা ও একক। FR-02-তে দুটি weak word আর “should” — অর্থাৎ বাধ্যতামূলকও নয়, মাপাও যায় না; score ২৫. FR-03-এ “shall be cancelled by” আর “and/or” — কে বাতিল করবেন, পরিষ্কার নয়। NFR-04-এ TBD. FR-05-এ “as soon as possible” আর একটি অস্পষ্ট সর্বনাম (program দুটি সর্বনাম it আর them থাকলেও লক্ষণটি একবার গোনে)। পুরো সেটের গড় ৬৬.৭.

সীমাবদ্ধতাও দেখুন: এই linter শুধু শব্দ দেখে, অর্থ বোঝে না। “The system shall be secure.” বাক্যে কোনো weak word তালিকায় না থাকলে এটি পরিষ্কার দেখাবে, অথচ বাক্যটি যাচাই করা যায় না। তাই এমন টুল মানুষের review-এর সহকারী, বিকল্প নয়।

৫ · EARS — requirement লেখার পাঁচটি ছাঁচ

মুক্ত গদ্যে requirement লিখলে প্রত্যেকে নিজের মতো বাক্য গড়েন, আর অস্পষ্টতা ঢোকে। আবার পুরোপুরি গাণিতিক (formal) ভাষায় লিখলে stakeholder পড়তে পারেন না। মাঝামাঝি পথ হিসেবে Rolls-Royce-এর বিমান-ইঞ্জিন নিয়ন্ত্রণ software-এর requirement নিয়ে কাজ করতে গিয়ে Alistair Mavin ও সহকর্মীরা ২০০৯ সালের IEEE International Requirements Engineering Conference (RE'09)-এ একটি প্রবন্ধে EARS (Easy Approach to Requirements Syntax) প্রস্তাব করেন। মূল ধারণা: প্রায় সব requirement কয়েকটি বাক্য-ছাঁচের কোনো একটিতে আঁটে, আর প্রতিটি ছাঁচের শুরুর শব্দই বলে দেয় requirement কখন খাটে।

[While <অবস্থা>,] [When <ঘটনা>,] the <system> shall <প্রতিক্রিয়া>
ছাঁচশুরুর শব্দকখন খাটেউদাহরণ (কাল্পনিক অ্যাপ)
Ubiquitous(কিছু নেই)সবসময়The appointment system shall store each booking with a unique booking ID.
Event-drivenWhenএকটি ঘটনা ঘটলেWhen a patient confirms a booking, the appointment system shall send an SMS with the booking ID.
State-drivenWhileএকটি অবস্থা যতক্ষণ থাকেWhile a doctor's daily quota is full, the appointment system shall hide that doctor's remaining slots.
Unwanted behaviourIf … thenঅনাকাঙ্ক্ষিত ঘটনা — ব্যর্থতা, ভুল ইনপুটIf the payment gateway does not respond within 10 s, then the appointment system shall cancel the hold on the slot.
Optional featureWhereনির্দিষ্ট feature থাকলেWhere the hospital enables video consultation, the appointment system shall show a video-call link 10 minutes before the slot.
Complexএকাধিক মিলিয়েঅবস্থা + ঘটনা ইত্যাদিWhile the system is in maintenance mode, when a patient opens the app, the appointment system shall show the planned end time.

EARS-এর একটি বড় উপকার হলো “If … then” ছাঁচটি নিজেই প্রশ্ন জাগায়: প্রতিটি event-driven requirement লেখার পর জিজ্ঞেস করুন, “এই ঘটনাটি ব্যর্থ হলে কী হবে?” — payment না এলে, SMS না গেলে, নেটওয়ার্ক কেটে গেলে। Requirement-এর বেশিরভাগ ফাঁক থাকে ঠিক এই অনাকাঙ্ক্ষিত পথে। নিচের program শুরুর শব্দ দেখে বাক্যের ছাঁচ চেনে।

// EARS pattern classifier (Mavin et al., 2009) for single requirement sentences.
function earsPattern(s) {
  const t = s.trim().toLowerCase();
  if (!/\bshall\b/.test(t)) return "NOT EARS (no 'shall')";
  const kw = [];
  if (/^where\b|, where\b/.test(t)) kw.push("optional");
  if (/^while\b|, while\b/.test(t)) kw.push("state");
  if (/^when\b|, when\b/.test(t)) kw.push("event");
  if (/^if\b.*\bthen\b/.test(t)) kw.push("unwanted");
  if (kw.length > 1) return "complex (" + kw.join(" + ") + ")";
  const names = { optional: "optional feature", state: "state-driven",
                  event: "event-driven", unwanted: "unwanted behaviour" };
  if (kw.length === 1) return names[kw[0]];
  if (/^the [\w -]+ shall\b/.test(t)) return "ubiquitous";
  return "NOT EARS (unknown opening)";
}
const sentences = [
  "The appointment system shall store each booking with a unique booking ID.",
  "When a patient confirms a booking, the appointment system shall send an SMS with the booking ID.",
  "While the doctor's daily quota is full, the appointment system shall hide that doctor's remaining slots.",
  "If the payment gateway does not respond within 10 s, then the appointment system shall cancel the hold on the slot.",
  "Where the hospital enables video consultation, the appointment system shall show a video-call link 10 minutes before the slot.",
  "While the system is in maintenance mode, when a patient opens the app, the appointment system shall show the planned end time.",
  "Patients can book appointments easily.",
];
sentences.forEach((s, i) => console.log("R" + (i + 1) + ": " + earsPattern(s)));

আউটপুট:

R1: ubiquitous
R2: event-driven
R3: state-driven
R4: unwanted behaviour
R5: optional feature
R6: complex (state + event)
R7: NOT EARS (no 'shall')

R1–R5 পাঁচটি মূল ছাঁচের একটি করে উদাহরণ; R6-এ While আর When দুটোই আছে, তাই complex. R7 “Patients can book appointments easily.” — এতে shall নেই, কর্তা system নয়, আর “easily” একটি weak word; এটি EARS নয়, আর requirement হিসেবেও দুর্বল। খেয়াল করুন, ছাঁচ মানা মানেই ভালো requirement নয়: “When the user logs in, the system shall be fast.” ছাঁচে ঠিক, কিন্তু যাচাই করা যায় না। EARS কাঠামো দেয়; সংখ্যা আর অর্থ দিতে হয় আপনাকে।

এবার পুরো কৌশলটি একসাথে। নিচের stepper একটি অস্পষ্ট বাক্যকে ধাপে ধাপে পরীক্ষাযোগ্য EARS requirement-এ রূপ দেয়।

বাতিলের requirement — হাসপাতাল অ্যাপ (কাল্পনিক)
মূল বাক্য
পাওয়া সমস্যা
REQ-CAN-1
REQ-CAN-2
REQ-CAN-3
যাচাইয়ের উপায়
  1. সমস্যা চিহ্নিত। বাক্যটিতে চারটি smell: “সবাই” অস্পষ্ট, “দ্রুত” weak word, “জানানো হবে” কর্তাহীন passive, আর এবং/অথবা। এখনো কেউ বলতে পারবেন না, system পাস করল নাকি ফেল।
  2. Stakeholder-কে জিজ্ঞেস। অনুমান না করে রিসেপশন-প্রধান আর একজন ডাক্তারকে জিজ্ঞেস করা হলো। উত্তর: “সবাই” মানে নির্ধারিত ডাক্তার আর অপেক্ষমাণ তালিকার প্রথম রোগী; ৬০ সেকেন্ডের মধ্যে জানালেই চলে, কারণ অপেক্ষমাণ রোগীর হাতে আসার সময় লাগে।
  3. একক (singular) করা। “slot খালি করা” আর “জানানো” দুটি ভিন্ন কাজ, ভিন্ন সময়সীমা, ভিন্ন test. তাই দুটি আলাদা requirement. এবং/অথবা প্রশ্নের উত্তর: দুটোই করতে হবে, কিন্তু আলাদা বাক্যে।
  4. REQ-CAN-1, event-driven ছাঁচে। ঘটনা (When a patient cancels…), কর্তা (the appointment system), একটি shall, একটি প্রতিক্রিয়া, একটি সময়সীমা (৫ সেকেন্ড)। এখন একটি test লেখা যায়।
  5. REQ-CAN-2. একই ঘটনা, ভিন্ন প্রতিক্রিয়া। এখানে দুজন প্রাপক “and” দিয়ে যুক্ত — একই কাজ, একই সময়সীমা, তাই একটি বাক্যে রাখা চলে। দুজনকে আলাদা সময়ে জানাতে হলে বাক্যটি আবার ভাঙতে হতো।
  6. REQ-CAN-3, unwanted behaviour. “SMS না গেলে কী হবে?” — এই প্রশ্ন মূল বাক্যে ছিলই না। If…then ছাঁচে ব্যর্থতার পথ লেখা হলো। এখন তিনটি requirement, প্রতিটির নিজস্ব test, আর মূল উদ্দেশ্য অক্ষুণ্ণ।

৬ · NFR-কে সংখ্যায় বাঁধা — fit criterion আর Planguage

Functional requirement-এ পাস-ফেল সাধারণত সহজ: SMS গেল কি না। NFR-এ কঠিন, কারণ “কতটা” প্রশ্নের উত্তর একটি সংখ্যা, আর সংখ্যার সাথে লাগে একক, মাপার পদ্ধতি আর পরিস্থিতি। Suzanne ও James Robertson-এর Mastering the Requirements Process (প্রথম সংস্করণ ১৯৯৯) আর তাঁদের Volere requirement template প্রতিটি requirement-এর সাথে একটি fit criterion লেখার কথা বলে — একটি মাপা যায় এমন শর্ত, যা পূরণ হলে requirement পূরণ হয়েছে ধরা হবে। পর্ব ০৩-এর quality scenario (source, stimulus, artifact, environment, response, response measure) একই লক্ষ্যে আরেকটি কাঠামো।

Planguage — Gilb-এর keyword

Tom Gilb বহু বছর ধরে বলে আসছেন, quality requirement-কে সংখ্যায় বাঁধা যায়, আর এজন্য তিনি Planguage নামে একটি keyword-ভিত্তিক কাঠামো প্রস্তাব করেন (বিস্তারিত তাঁর Competitive Engineering, ২০০৫)। পূর্ণ Planguage-এ অনেক keyword আছে; প্রচলিত মূল কয়েকটি (সংস্করণভেদে নাম ও ব্যবহার একটু আলাদা হতে পারে):

Keywordঅর্থহাসপাতাল অ্যাপ — ডাক্তার খোঁজা (কাল্পনিক)
Tagঅনন্য নামNFR-PERF-SEARCH
Gistএক লাইনে মূল কথাভিড়ের সময়ও ডাক্তার-খোঁজা দ্রুত
Scaleকী মাপা হবে, কোন এককেsearch অনুরোধের server-side latency-র p95, millisecond-এ
Meterকীভাবে মাপা হবেrelease-এর আগে ৩০ মিনিটের load test, ২০০ req/s; production-এ ৫ মিনিটের window
Mustন্যূনতম গ্রহণযোগ্য সীমা — এর নিচে ব্যর্থp95 < 800 ms
Planলক্ষ্যমাত্রা — যেখানে পৌঁছাতে চাইp95 < 400 ms
Pastআগের মাপা মান, তুলনার জন্যপুরোনো ফোন-লাইন ব্যবস্থায় গড়ে ৪ মিনিট অপেক্ষা

Must আর Plan আলাদা রাখার বুদ্ধিটা খেয়াল করুন: একটি সংখ্যা বলে কোথায় ব্যর্থ, আরেকটি বলে কোথায় সফল। মাঝের এলাকায় দল trade-off করতে পারে — হয়তো ৫০০ ms-এ রেখে অন্য feature-এ সময় দেওয়া। একটি মাত্র সংখ্যা দিলে সেটি লক্ষ্য না সীমা, তা নিয়েই বিতর্ক বাধে।

গড় নয়, percentile — আর পরিস্থিতিসহ। “গড় latency 400 ms” লিখলে ধীর ব্যবহারকারীরা গড়ের আড়ালে লুকিয়ে যান। “p95 < 800 ms” লিখুন, আর সাথে কোন ভারে (২০০ req/s), কোথায় মাপা (server-side নাকি ফোনে), কোন সময়ের window-তে। Percentile-এর গণিত System Design কোর্সের Latency, throughput আর percentile পর্বে আছে।

নিচের program “p95 latency < X ms at Y req/s” ধরনের fit criterion পড়ে নেয়, তারপর একটি কাল্পনিক load test-এর ২০০টি মাপের ওপর nearest-rank পদ্ধতিতে percentile বের করে পাস-ফেল বলে। মাপগুলো seed দেওয়া PRNG (mulberry32) থেকে বানানো, তাই প্রতিবার একই ফল আসবে।

// Is an NFR measurable? Parse a fit criterion and test it on a seeded sample.
function mulberry32(a) { return function () {
  a |= 0; a = a + 0x6D2B79F5 | 0; let t = Math.imul(a ^ a >>> 15, 1 | a);
  t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t; return ((t ^ t >>> 14) >>> 0) / 4294967296; }; }
const rnd = mulberry32(21);
// Fictional load test: 200 search requests at 200 req/s; 300 ms base + random tail
const sample = Array.from({ length: 200 }, () => Math.round(300 - 150 * Math.log(1 - rnd())));
const measuredLoad = 200;
const mean = Math.round(sample.reduce((a, b) => a + b) / sample.length);
console.log("mean =", mean, "ms, max =", Math.max(...sample), "ms");
function nearestRank(values, p) {                 // nearest-rank percentile
  const s = [...values].sort((x, y) => x - y);
  const rank = Math.ceil((p / 100) * s.length);   // 1-based rank
  return { rank, value: s[rank - 1] };
}
const RE = /^p(\d+) latency (<=|<) (\d+) ms at (\d+) req\/s$/;
const criteria = [
  "p95 latency < 800 ms at 200 req/s",
  "p99 latency <= 800 ms at 200 req/s",
  "p95 latency < 800 ms at 500 req/s",
  "search shall be fast",
];
for (const c of criteria) {
  const m = c.match(RE);
  if (!m) { console.log(`"${c}" -> NOT MEASURABLE (no scale, no meter)`); continue; }
  const [, p, op, limit, load] = m;
  if (Number(load) !== measuredLoad) { console.log(`"${c}" -> NO DATA at ${load} req/s`); continue; }
  const { rank, value } = nearestRank(sample, Number(p));
  const ok = op === "<" ? value < Number(limit) : value <= Number(limit);
  console.log(`"${c}" -> p${p} = ${value} ms (rank ${rank}/200) ${ok ? "PASS" : "FAIL"}`);
}

আউটপুট:

mean = 440 ms, max = 873 ms
"p95 latency < 800 ms at 200 req/s" -> p95 = 662 ms (rank 190/200) PASS
"p99 latency <= 800 ms at 200 req/s" -> p99 = 830 ms (rank 198/200) FAIL
"p95 latency < 800 ms at 500 req/s" -> NO DATA at 500 req/s
"search shall be fast" -> NOT MEASURABLE (no scale, no meter)

প্রথম লাইন: গড় ৪৪০ ms — শুনতে ভালো, কিন্তু গড় দিয়ে কিছু যাচাই হচ্ছে না। দ্বিতীয়: ২০০টি মান সাজালে ⌈০.৯৫ × ২০০⌉ = ১৯০তম মান 662 ms, যা 800-এর কম — PASS. তৃতীয়: একই নমুনায় p99 হলো ⌈০.৯৯ × ২০০⌉ = ১৯৮তম মান 830 ms, সীমা 800 — FAIL. একই system, একই মাপ; কোন percentile বেছে নিলেন তার ওপর রায় বদলে যায়। তাই percentile বাছাই নিজেই একটি stakeholder-সিদ্ধান্ত। চতুর্থ: criterion ৫০০ req/s-এর কথা বলে, কিন্তু মাপা হয়েছে ২০০ req/s-এ — কোনো রায় দেওয়া যায় না; Meter-এর পরিস্থিতি আর criterion-এর পরিস্থিতি মিলতে হবে। পঞ্চম: “search shall be fast”-এ কোনো scale বা meter নেই, তাই মাপা অসম্ভব।

Percentile বের করার আরও কয়েকটি পদ্ধতি আছে (যেমন দুটি মানের মাঝে interpolation), আর ছোট নমুনায় ফল একটু আলাদা হয়। তাই fit criterion-এ কোন পদ্ধতি, কত নমুনা — এটিও Meter-এর অংশ হিসেবে লিখে রাখা ভালো।

অন্য NFR-ও একই কৌশলে বাঁধা যায়। Usability: “প্রথমবারের ২০ জন রোগীর অন্তত ১৮ জন সাহায্য ছাড়া ৩ মিনিটে একটি অ্যাপয়েন্টমেন্ট বুক করতে পারবেন।” Maintainability: “নতুন একটি ফি-নিয়ম যোগ করতে একটির বেশি module বদলাতে হবে না।” Security: “লগইন ছাড়া কোনো রোগীর রিপোর্টের URL খুললে HTTP 401 বা 403 আসবে; প্রতি release-এ স্বয়ংক্রিয় scan-এ critical ফল শূন্য।” Portability: “Android 10 বা নতুন সংস্করণে মূল তিনটি কাজ সফল।” প্রতিটিতে আছে কী মাপা হবে, কীভাবে, আর কোন সীমায় পাস।

৭ · SRS — IEEE 830 থেকে ISO/IEC/IEEE 29148

Requirement-গুলো এক জায়গায় সাজিয়ে লেখা নথিকে বলে SRS (Software Requirements Specification). বহু বছর এর প্রচলিত নির্দেশিকা ছিল IEEE 830-1998 — “IEEE Recommended Practice for Software Requirements Specifications”. এটি একটি recommended practice, বাধ্যতামূলক মানদণ্ড নয়; তবু পাঠ্যবই, বিশ্ববিদ্যালয়ের project আর সরকারি-বেসরকারি চুক্তিতে এর তিন-অংশের কাঠামো আজও খুব পরিচিত। ২০১১ সালে ISO/IEC/IEEE 29148 IEEE 830-কে প্রতিস্থাপন করে, আর ২০১৮ সালে 29148-এর সংশোধিত সংস্করণ বেরোয়। 29148 শুধু SRS নয়, আরও কয়েকটি নথির বিষয়বস্তু বলে — যেমন stakeholder requirements specification (StRS) আর system requirements specification (SyRS) — আর requirement engineering-এর প্রক্রিয়াও বর্ণনা করে।

IEEE 830-1998 অনুযায়ী SRS-এর কাঠামো

Three main sections, plus appendixes and index

IEEE 830-1998 SRS outline: introduction, overall description, specific requirements ১ · Introduction — পরিচিতি 1.1 Purpose · 1.2 Scope 1.3 Definitions, acronyms, abbreviations 1.4 References · 1.5 Overview নথি কেন, কার জন্য, কোন সীমার software ২ · Overall description — বড় ছবি 2.1 Product perspective 2.2 Product functions · 2.3 User characteristics 2.4 Constraints 2.5 Assumptions and dependencies 2.6 Apportioning of requirements ৩ · Specific requirements — মূল অংশ 3.1 External interface requirements 3.2 System features / functional req. 3.3 Performance requirements 3.4 Design constraints 3.5 Software system attributes 3.6 Other requirements (+ logical database requirements, যেখানে লাগে) পরীক্ষাযোগ্য প্রায় সব requirement এখানে Appendixes · Index
ছবি ২১.২ — অংশ ৩ সাজানোর কয়েকটি বিকল্প নমুনা template IEEE 830-এ আছে (mode, user class, object, feature, stimulus ইত্যাদি অনুযায়ী), আর template-ভেদে উপ-অংশের নম্বর একটু আলাদা; এখানে feature অনুযায়ী সাজানো রূপের নম্বর দেখানো হয়েছে।

অংশ ১ আর ২ পাঠককে প্রেক্ষাপট দেয়: software কেন, কার জন্য, কোন বৃহত্তর ব্যবস্থার অংশ (product perspective), কারা ব্যবহার করবেন, কী কী অনুমান করা হয়েছে (যেমন “রোগীর কাছে SMS পাওয়ার মতো মোবাইল আছে”)। অংশ ৩-এ থাকে পরীক্ষাযোগ্য requirement — functional, performance, interface, constraint আর quality attribute (IEEE 830-এ “software system attributes”: reliability, availability, security, maintainability, portability). নিচের stepper-এ অংশ ৩.২-এর একটি feature-অংশ ধাপে ধাপে বানানো দেখুন।

SRS · হাসপাতাল অ্যাপয়েন্টমেন্ট অ্যাপ (কাল্পনিক) · v0.3
অবস্থান
3.2.4.1 বিবরণ ও priority
3.2.4.2 Stimulus → response
3.2.4.3 Functional requirement
REQ-BOOK-1-এর attribute
সংযোগ (trace)
  1. জায়গা ঠিক করা। SRS-এর অংশ ৩.২ এখানে feature অনুযায়ী সাজানো — প্রতিটি feature একটি উপ-অংশ। “Book appointment” চতুর্থ feature, তাই 3.2.4. নম্বর দেখেই পাঠক জানেন এটি পরীক্ষাযোগ্য requirement-এর অংশ।
  2. বিবরণ ও priority. দুই বাক্যে feature-টি কী আর কেন জরুরি। Priority “High (MVP)” — প্রথম সংস্করণে না থাকলে অ্যাপের কোনো মানে নেই। অগ্রাধিকার ঠিক করার পদ্ধতি (MoSCoW ইত্যাদি) পর্ব ২৪-এ।
  3. Stimulus → response ক্রম। IEEE 830-এর feature-ছাঁচে এই উপ-অংশ থাকে: ব্যবহারকারী কী করেন, system কী সাড়া দেয়। এখানে সফল পথ আর ব্যর্থ পথ (পরিশোধ ব্যর্থ) দুটোই লেখা হলো — পরের ধাপের requirement এখান থেকেই আসবে।
  4. Functional requirement, EARS ছাঁচে। প্রতিটি stimulus-response জোড়া থেকে একটি করে requirement, ID-সহ: hold (event-driven), নিশ্চিতকরণ (event-driven), ব্যর্থতায় ছেড়ে দেওয়া (unwanted behaviour). প্রতিটিতে একটি shall আর একটি পরীক্ষাযোগ্য প্রতিক্রিয়া।
  5. Attribute যোগ। REQ-BOOK-1-এর সাথে source (কে চেয়েছেন, কোথায়), rationale (কেন — দুই রোগী একই slot পেলে বিবাদ), status (Approved), priority আর যাচাইয়ের পদ্ধতি (test). Rationale থাকলে পরে কেউ “১০ মিনিট কেন?” জিজ্ঞেস করলে উত্তর খুঁজতে হয় না।
  6. সংযোগ। ওপরে user requirement UR-2, নিচে সাতটি test case, পাশে দুটি NFR (ডাক্তার-খোঁজার গতি অংশ ৩.৩-এ, পরিশোধের নিরাপত্তা অংশ ৩.৫-এ)। এখন requirement বদলালে কোন test আর কোন NFR ছুঁয়ে যাবে, দেখা যায় — পর্ব ২৪-এর traceability matrix-এর বীজ।

৮ · Requirement-এর ID, attribute আর Agile দলে SRS

ID আর attribute

প্রতিটি requirement-এর একটি স্থায়ী, অনন্য ID চাই — REQ-BOOK-1, NFR-PERF-SEARCH. ID কখনো আবার ব্যবহার করবেন না: একটি requirement বাতিল হলে তার ID “Deleted” চিহ্ন নিয়ে থেকে যায়, যাতে পুরোনো test, commit বা আলোচনায় সেই ID-র মানে বদলে না যায়। অনেকে ক্রমিক নম্বর (REQ-017) নেন, অনেকে feature-এর সংক্ষিপ্ত রূপ (BOOK, CAN, PAY) — দুটোই চলে, যতক্ষণ স্থিতিশীল।

ID-র পাশে কয়েকটি requirement attribute রাখা হয়। 29148 আর বিভিন্ন টুল কয়েক ডজন attribute-এর কথা বলে; প্রচলিত মূলগুলো:

Attributeকী বলেউদাহরণ
Priorityকতটা জরুরিMust / Should / Could; বা High–Medium–Low
Sourceকে বা কোন নথি থেকে এলোরিসেপশন-প্রধান; হাসপাতালের ফি-নীতি v2
Rationaleকেন দরকারদুই রোগী একই slot পেলে বিবাদ হয়
Statusজীবনচক্রের কোথায়Proposed → Approved → Implemented → Verified (বা Deleted)
Verification methodকীভাবে যাচাইTest, demonstration, inspection বা analysis
Owner, version, riskকে দায়িত্বে, কোন সংস্করণ, বদলের সম্ভাবনাProduct owner; v3; stability: low

খেয়াল করুন, যাচাইয়ের চারটি প্রচলিত পদ্ধতি — test, demonstration, inspection, analysis. সব requirement test-এ যাচাই হয় না: “রোগীর তথ্য দেশের সার্ভারে রাখতে হবে” যাচাই হয় নকশা ও চুক্তি পরিদর্শন (inspection) দিয়ে; “১০ বছরে ১০ লাখ রোগীর রেকর্ড রাখার জায়গা” যাচাই হয় হিসাব (analysis) দিয়ে। Requirement লেখার সময়েই পদ্ধতিটি ঠিক করা মানে verifiable গুণটি নিশ্চিত করা। Testing-এর স্তর আর verification-validation-এর বিস্তারিত পর্ব ৪৫-এ।

Agile দলে SRS — নথি ছোট, চিন্তা নয়

Agile Manifesto (২০০১) বলে “comprehensive documentation-এর চেয়ে working software”. অনেকে এটিকে “নথি লাগবে না” পড়েন — কিন্তু Manifesto নিজেই বলে, ডান দিকের জিনিসেরও মূল্য আছে, বাঁ দিকেরটির মূল্য বেশি। বাস্তবে Agile দলে requirement-এর রূপ বদলায়:

  • একটি বড় নথির বদলে জীবন্ত backlog: functional চাওয়াগুলো Product Backlog-এ user story হিসেবে, ক্রমাগত হালনাগাদ (পর্ব ০৫)। প্রতিটি story-র acceptance criteria-ই তার system requirement (পর্ব ২২)।
  • NFR গল্পের বাইরে থাকে না: যে NFR সব story-তে খাটে (যেমন “p95 < 800 ms”, “সব পাতা WCAG 2.2 AA”), সেটি Definition of Done-এ বা আলাদা “constraint” তালিকায় রাখা হয়, যাতে প্রতিটি story-র সাথে যাচাই হয়। নইলে NFR কোনো sprint-এরই কাজ হয় না।
  • হালকা কিন্তু স্থায়ী কাঠামো: অনেক দল একটি ছোট “product requirements” পাতা রাখে — উদ্দেশ্য, ব্যবহারকারী, অনুমান, constraint আর NFR — আর বাকিটা backlog-এ। Requirement-নথি Git repository-তে Markdown ফাইল হিসেবে রাখলে প্রতিটি বদল review আর history পায় (পর্ব ১৬-এর pull request প্রক্রিয়া)।
  • নিয়ন্ত্রিত ক্ষেত্রে আনুষ্ঠানিক SRS এখনো লাগে: চিকিৎসা যন্ত্র, বিমান, রেলের সংকেত বা ব্যাংকিংয়ের মতো ক্ষেত্রে নিয়ন্ত্রক সংস্থা প্রায়ই লিখিত, trace করা requirement চায় (যেমন চিকিৎসা-যন্ত্রের software-এর জন্য IEC 62304 মানদণ্ডে requirement-এর নথি প্রত্যাশিত; দেশ ও ক্ষেত্রভেদে শর্ত আলাদা)। সেখানে Agile দলও ছোট ধাপে কাজ করে, কিন্তু নথিটি প্রতি ধাপে হালনাগাদ রাখে।

আরও গভীরে: Requirement লেখার সবচেয়ে বিস্তারিত নির্দেশিকাগুলোর একটি INCOSE-এর Guide for Writing Requirements (systems engineering-এর সংগঠন; সংস্করণ সময়ে সময়ে হালনাগাদ হয়), যা 29148-এর গুণগুলোকে কয়েক ডজন লেখার নিয়মে ভাঙে। Karl Wiegers ও Joy Beatty-র Software Requirements (৩য় সংস্করণ, ২০১৩) হাতে-কলমে SRS লেখার জনপ্রিয় বই। “Non-functional” নামটিই বিভ্রান্তিকর — এই যুক্তিতে Martin Glinz-এর প্রবন্ধ “On Non-Functional Requirements” (RE'07, ২০০৭) quality requirement আর constraint-কে আলাদা করে দেখার প্রস্তাব দেয়। আর requirement থেকে স্বয়ংক্রিয় test বানানোর দিকটি BDD-তে (পর্ব ৪৮) দেখবেন।

পরীক্ষা ও ইন্টারভিউতে — বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় এ ধরনের প্রশ্ন আসতে পারে:

  • Functional আর non-functional requirement-এর পার্থক্য, উদাহরণসহ। FR বলে কী করবে (বুকিং নিশ্চিত হলে SMS); NFR বলে কতটা ভালো (২০০ req/s-এ p95 < 800 ms).
  • IEEE 830 অনুযায়ী SRS-এর কাঠামো লিখুন। Introduction, overall description, specific requirements; সাথে appendixes ও index.
  • ভালো SRS-এর গুণ কী কী? IEEE 830: correct, unambiguous, complete, consistent, ranked, verifiable, modifiable, traceable; 29148-এর তালিকাও উল্লেখ করা যায়।
  • “The system should be user-friendly” — সমস্যা কী, কীভাবে ঠিক করবেন? should বাধ্যতামূলক নয়, user-friendly মাপা যায় না; লিখুন shall আর একটি usability fit criterion.
  • Constraint কি NFR? লেখকভেদে মত আলাদা; অনেকে আলাদা ভাগ ধরেন, Sommerville organisational ও external NFR বলেন। উত্তরে কোন ধারা মানছেন বলুন।

৯ · AI-এর যুগে requirement লেখা

AI কয়েক সেকেন্ডে পুরো একটি SRS-এর খসড়া লিখে দিতে পারে — সুন্দর শিরোনাম, নম্বর দেওয়া অংশ, শত শত “shall”. বিপদ এখানেই: দেখতে নিখুঁত লেখা আপনাকে মনে করায় কাজ শেষ, অথচ stakeholder-কে কেউ জিজ্ঞেস করেননি। Requirement-এর কাজে AI-এর কয়েকটি সাধারণ ভুল:

AI যা করেকেন বিপজ্জনকযাচাইয়ের উপায়
নিজে থেকে সংখ্যা বসায় (“p95 < 200 ms”, “৯৯.৯৯% availability”), কোনো উৎস ছাড়াদেখতে মাপা যায়, কিন্তু stakeholder-এর চাওয়া নয়; খরচ বহুগুণ বাড়াতে পারেপ্রতিটি সংখ্যার source attribute চাওয়া; না থাকলে “অনুমান” চিহ্ন দিয়ে stakeholder-এর কাছে নেওয়া
মানদণ্ডের ধারা, সংস্করণ বা section নম্বর বানিয়ে বলে (যেমন 29148-এর “ধারা ৯.৭”)চুক্তি বা পরীক্ষায় ভুল সূত্র যায়মানদণ্ডের অফিসিয়াল সারাংশ বা বিশ্বস্ত পাঠ্যবই মিলিয়ে নেওয়া
Weak word-ই সুন্দর ভাষায় আবার লেখে (“seamless, intuitive experience”)যাচাই করা যায় না এমন requirement থেকে যায়Smell-checker চালানো; প্রতিটি NFR-এ scale, meter, সীমা আছে কি না দেখা
শুধু সফল পথ লেখে; ব্যর্থতা, ভুল ইনপুট, সীমানার মান বাদ দেয়সবচেয়ে বেশি bug যেখানে, সেখানেই requirement নেইপ্রতিটি When-এর জন্য একটি If…then প্রশ্ন করা
সাধারণ অ্যাপের ছাঁচ বসায়, ক্ষেত্রের domain requirement জানে নাচিকিৎসা বা আইনের শর্ত বাদ পড়েক্ষেত্রের বিশেষজ্ঞ ও আইনি পরামর্শকের review
প্রম্পটে আসল রোগীর তথ্য বা গোপন চুক্তির অংশ পেস্ট করলে তা বাইরে চলে যায়গোপনীয়তা ও আইনের লঙ্ঘনপেস্টের আগে তথ্য মুছে বা বানানো উদাহরণে বদলে নেওয়া

AI-কে requirement-এর সমালোচক হিসেবে ব্যবহার করুন — লেখক হিসেবে নয়। নিজের লেখা requirement দিন, কাঠামো আর শর্ত বেঁধে দিন:

আমি একটি কাল্পনিক হাসপাতালের অ্যাপয়েন্টমেন্ট অ্যাপের requirement লিখছি। নিচের প্রতিটি requirement পরীক্ষা করো: (১) ISO/IEC/IEEE 29148-এর কোন গুণ (unambiguous, singular, verifiable ইত্যাদি) ভাঙছে, কারণসহ বলো; (২) weak word, TBD, and/or, কর্তাহীন passive বা অস্পষ্ট সর্বনাম থাকলে চিহ্নিত করো; (৩) EARS ছাঁচে একটি নতুন রূপ প্রস্তাব করো; (৪) প্রতিটি When-requirement-এর জন্য অন্তত একটি "If ... then" ব্যর্থতার প্রশ্ন লেখো। শর্ত: কোনো সংখ্যা নিজে বসিও না — যেখানে সংখ্যা লাগবে সেখানে [stakeholder-কে জিজ্ঞাসা] লেখো। মানদণ্ডের ধারা নম্বর জানা না থাকলে উল্লেখ করো না। Requirement: FR-02 The booking screen should be fast and user-friendly. FR-05 When a doctor is marked absent, it shall notify them as soon as possible.

AI-এর দেওয়া requirement হাতে পেলে — যাচাইয়ের চেকলিস্ট

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন।

প্র ০১“Non-functional” নামটি কি ভুল? Functional আর non-functional-এর সীমারেখা আসলে কতটা পরিষ্কার?

নামটি নিয়ে আপত্তি পুরোনো, আর যুক্তিও শক্ত। “Non-functional” শুনলে মনে হয় এগুলো কোনো কাজ করে না, বা কম গুরুত্বপূর্ণ — অথচ বাস্তবে অনেক project ব্যর্থ হয় ঠিক এই requirement-এ। ঈদের আগের টিকিট-বিক্রির দিনে যে অ্যাপ বসে যায়, তার সব feature থাকলেও ব্যবহারকারীর কাছে সেটি অকেজো।

Martin Glinz ২০০৭ সালের RE সম্মেলনের প্রবন্ধ “On Non-Functional Requirements”-এ দেখান, পাঠ্যবই ও মানদণ্ডে “non-functional requirement”-এর সংজ্ঞা একে অপরের সাথে মেলে না — কেউ performance-কে NFR বলেন, কেউ আলাদা ভাগ; কেউ constraint-কে NFR-এর ভেতরে রাখেন, কেউ বাইরে। তিনি প্রস্তাব করেন requirement-কে তিনভাবে দেখতে: functional requirement, quality requirement (performance আর অন্যান্য গুণ) আর constraint — আর শ্রেণিবিন্যাসের চেয়ে requirement কোন দিক নিয়ে কথা বলছে, সেটিতে জোর দিতে।

সীমারেখা ঝাপসা হওয়ার একটি উদাহরণ এই পর্বের R4: “রোগীর রিপোর্ট শুধু রোগী ও চিকিৎসক দেখতে পারবেন।” গুণ হিসেবে এটি security; কিন্তু লেখার রূপে এটি একটি পরীক্ষাযোগ্য আচরণ — অন্য কেউ চাইলে system “না” বলবে। একইভাবে “পাসওয়ার্ড ভুল দিলে পাঁচবারের পর account ১৫ মিনিট আটকে থাকবে” একটি functional আচরণ, যার উদ্দেশ্য security. Performance-এর requirement “৩ সেকেন্ডের বেশি লাগলে progress bar দেখাবে”-ও আসলে একটি আচরণ। অর্থাৎ অনেক quality goal শেষ পর্যন্ত কয়েকটি functional requirement আর কয়েকটি সংখ্যাসহ সীমায় “নেমে আসে”।

তাহলে ভাগ করে লাভ কী? লাভ হলো খোঁজার তালিকা। ISO/IEC 25010-এর characteristic ধরে প্রশ্ন করলে (performance? security? accessibility? portability?) বাদ পড়া চাওয়া ধরা পড়ে। কোন খাতায় লিখলেন, তা নিয়ে তর্কের চেয়ে জরুরি হলো চাওয়াটি লেখা হলো, মাপা যায়, আর test আছে।

মূল উপলব্ধি: শ্রেণিবিন্যাস একটি চিন্তার হাতিয়ার, প্রকৃতির নিয়ম নয়। একটি চাওয়া কোন শ্রেণিতে পড়ল তার চেয়ে বড় প্রশ্ন — এটি বাদ পড়েনি তো, আর পাস-ফেল বলা যায় তো?

প্র ০২Mars Climate Orbiter (১৯৯৯) হারানোর পেছনে requirement-এর কোন ব্যর্থতা ছিল? “একক” লেখা কি সত্যিই এত জরুরি?

NASA-র Mars Climate Orbiter ১৯৯৯ সালের সেপ্টেম্বরে মঙ্গলের কক্ষপথে ঢোকার সময় হারিয়ে যায়। Mishap Investigation Board-এর প্রতিবেদন অনুযায়ী মূল কারণ ছিল: পৃথিবীতে চলা একটি ground software (যা মহাকাশযানের thruster চালানোর প্রভাব হিসাব করত) ফল দিচ্ছিল ইংরেজি এককে (pound-force second), অথচ সংশ্লিষ্ট interface specification অনুযায়ী তা হওয়ার কথা ছিল metric এককে (newton-second). প্রতিবার ভুলটি ছোট ছিল, কিন্তু মাসের পর মাস জমে মহাকাশযানের পথ এত নিচে নেমে যায় যে এটি সম্ভবত বায়ুমণ্ডলে ধ্বংস হয় বা মহাশূন্যে ছিটকে যায়।

মজার ব্যাপার হলো, এখানে requirement লেখা ছিল — interface specification metric একক চেয়েছিল। ব্যর্থতা ছিল তিন জায়গায়। প্রথমত, requirement-টি মানা হচ্ছে কি না, তা interface-এর দুই পাশে যাচাই হয়নি — verifiable গুণ কাগজে ছিল, প্রক্রিয়ায় ছিল না। দ্বিতীয়ত, তথ্যের প্রতিটি সংখ্যার সাথে এককটি যন্ত্রে পাঠযোগ্যভাবে যায়নি; শুধু সংখ্যা গেছে। তৃতীয়ত, প্রতিবেদন যোগাযোগ আর প্রক্রিয়ার দুর্বলতাও উল্লেখ করে — পথে অসংগতি কেউ কেউ খেয়াল করেছিলেন, কিন্তু আনুষ্ঠানিকভাবে সমাধান হয়নি।

এ থেকে requirement লেখার কয়েকটি বাস্তব শিক্ষা। Interface requirement (IEEE 830-এর অংশ ৩.১) শুধু “কোন তথ্য যাবে” নয়, প্রতিটি মানের একক, সীমা, নির্ভুলতা আর ক্রমও বলে। Fit criterion-এ একক না লিখলে “৮০০” মানে ৮০০ ms নাকি ৮০০ সেকেন্ড — সেটিও অস্পষ্ট। আর যাচাইয়ের পদ্ধতি (test, inspection) requirement-এর attribute হিসেবে না থাকলে সবাই ধরে নেন “অন্য কেউ দেখবেন”।

দৈনন্দিন উদাহরণও আছে: একটি কাল্পনিক অ্যাপে দাম পয়সায় রাখা হয়, আরেকটিতে টাকায়; বা তারিখ একটিতে দিন/মাস/বছর, আরেকটিতে মাস/দিন/বছর। তাহলে “03/05” মানে ৩ মে, নাকি ৫ মার্চ? অ্যাপয়েন্টমেন্টের রোগীর জন্য দুটি মোটেও এক নয়। Interface requirement-এ তারিখের format (যেমন ISO 8601) লিখে দিলেই প্রশ্নটি ওঠে না।

মূল উপলব্ধি: একটি সংখ্যা একক ছাড়া অর্ধেক requirement. আর লেখা requirement যাচাই না হলে সেটি কাগজের নিরাপত্তা — দুর্ঘটনার দিন কোনো কাজে আসে না।

প্র ০৩“shall” কি পুরোনো আইনি ভাষা? “must” বা সহজ বাংলা লিখলে কী সমস্যা?

“shall” শব্দটি ইংরেজি আইনি খসড়ার দীর্ঘ ঐতিহ্য থেকে এসেছে, আর সেখানেই এটি নিয়ে বিতর্ক সবচেয়ে বেশি। আইনি খসড়া-বিশেষজ্ঞদের একটি অংশ দেখিয়েছেন, পুরোনো আইনে “shall” কখনো বাধ্যবাধকতা, কখনো অনুমতি, কখনো ভবিষ্যৎ ঘটনা বোঝাতে ব্যবহৃত হয়েছে — ফলে আদালতে এর অর্থ নিয়ে মামলা পর্যন্ত হয়েছে। এজন্য মার্কিন সরকারের plain language নির্দেশিকা বাধ্যবাধকতার জন্য “must” ব্যবহারের পরামর্শ দেয়।

Requirement engineering-এ উল্টো রীতি টিকে আছে, কারণ সেখানে “shall” একটি ঘোষিত অর্থ পায়। ISO/IEC/IEEE 29148-এর রীতিতে shall বাধ্যতামূলক, should কাম্য, may ঐচ্ছিক, will ঘটনার বিবরণ — আর অনেক নির্দেশিকা must এড়াতে বলে, যাতে দুটি “বাধ্যতামূলক” শব্দ থেকে সূক্ষ্ম পার্থক্যের বিভ্রান্তি না জন্মায়। EARS-ও shall-কেন্দ্রিক। আবার IETF-এর RFC 2119 (Scott Bradner, ১৯৯৭) MUST, SHOULD, MAY বড় হাতের অক্ষরে লিখে অর্থ নির্দিষ্ট করে, আর পরে RFC 8174 (২০১৭) স্পষ্ট করে যে ছোট হাতের অক্ষরে লেখা হলে সেই বিশেষ অর্থ খাটে না।

অর্থাৎ সমস্যা শব্দটি নয়, অঘোষিত ও মিশ্র ব্যবহার। একই নথিতে কোথাও shall, কোথাও must, কোথাও will বাধ্যতামূলক অর্থে, আর কোথাও should — পাঠক বুঝতে পারেন না কোনটি চুক্তির শর্ত। চুক্তিভিত্তিক project-এ এই অস্পষ্টতা বিল নিয়ে বিবাদের কারণ হয়: সরবরাহকারী বলেন “should ছিল, তাই বাধ্য ছিলাম না”।

বাংলায় লিখলে একই সমস্যা আরও জটিল, কারণ “করবে” বাধ্যবাধকতা আর ভবিষ্যতের বিবরণ দুটোই হতে পারে। সমাধান একই: নথির শুরুতে শব্দ-তালিকা (যেমন “করবে = বাধ্যতামূলক; করা বাঞ্ছনীয় = কাম্য; করতে পারে = ঐচ্ছিক”), আর বাধ্যতামূলক বাক্যগুলোকে ID দিয়ে আলাদা রাখা, যাতে বিবরণের বাক্য ভুল করে requirement না হয়ে যায়।

মূল উপলব্ধি: কোন শব্দ বেছে নেবেন তার চেয়ে জরুরি হলো এক অর্থে, ঘোষণা করে, ধারাবাহিকভাবে ব্যবহার। requirement-এর ভাষা একটি ছোট চুক্তি — চুক্তির শব্দের মানে আগে ঠিক করতে হয়।

প্র ০৪Agile দলে কি SRS মৃত? কোথায় পুরো SRS লাগে, কোথায় backlog-ই যথেষ্ট?

Agile Manifesto (২০০১) “comprehensive documentation-এর চেয়ে working software”-কে বেশি মূল্য দেয়, কিন্তু একই বাক্যে স্বীকার করে ডান দিকের জিনিসেরও মূল্য আছে। সমস্যা ছিল বিশাল, আগে থেকে স্থির করা SRS — যা লেখা শেষ হওয়ার আগেই পুরোনো হয়ে যেত, আর যেটি পড়ে কেউ আসল প্রয়োজন বুঝত না। ১৯৯০-এর দশকের অনেক বড় project-এ শত শত পাতার নথি ছিল, তবু ব্যবহারকারী যা চাইতেন তা পাননি — কারণ requirement বদলেছিল, নথি বদলায়নি।

Agile-এর উত্তর ছিল requirement-কে ছোট টুকরায়, “just in time” বিস্তারিত করা: user story, acceptance criteria, আর প্রতি sprint-এ ব্যবহারকারীকে কাজ দেখিয়ে validation. এতে requirement-এর চিন্তা কমেনি, শুধু সময় আর রূপ বদলেছে। কিন্তু Agile দলের একটি পরিচিত দুর্বলতা হলো NFR আর সামগ্রিক ছবি হারিয়ে ফেলা: প্রতিটি story আলাদাভাবে ঠিক, কিন্তু কেউ লেখেননি যে ঈদের ভিড়ে সব story একসাথে ২০০ req/s সামলাবে। এজন্য অনেক দল NFR-কে Definition of Done বা একটি আলাদা constraint তালিকায় রাখে, আর একটি ছোট product-level নথি বজায় রাখে।

কোথায় পুরো SRS এখনো জরুরি? যেখানে (১) চুক্তি — বাইরের সরবরাহকারীকে নির্দিষ্ট দামে নির্দিষ্ট কাজ দিতে হয়; (২) নিয়ন্ত্রক — চিকিৎসা যন্ত্র (IEC 62304-এর মতো মানদণ্ড), বিমান (DO-178C), রেল বা গাড়ির নিরাপত্তা-software, যেখানে প্রতিটি requirement থেকে test পর্যন্ত traceability দেখাতে হয়; (৩) দীর্ঘ জীবন — যে software ২০ বছর চলবে, যার মূল দল অনেক আগেই চলে যাবে। এসব ক্ষেত্রেও আধুনিক দল ছোট ধাপে কাজ করে, কিন্তু নথিটিকে কোডের মতো version control-এ রেখে প্রতি ধাপে হালনাগাদ করে — “living document”.

কোথায় backlog-ই যথেষ্ট? একটি ছোট দল, সরাসরি ব্যবহারকারীর সাথে যোগাযোগ, দ্রুত বদলানো যায় এমন web অ্যাপ, ভুলের খরচ কম — সেখানে ভারী নথি নিজেই একটি অপচয় (lean-এর ভাষায় muda, পর্ব ০৬)।

মূল উপলব্ধি: প্রশ্নটি “SRS নাকি backlog” নয়, বরং “ঝুঁকি আর প্রেক্ষাপট অনুযায়ী কতটা আনুষ্ঠানিকতা” — আর যে রূপই হোক, requirement-কে লেখা, মাপা যায় এমন আর হালনাগাদ রাখা।

প্র ০৫স্বাভাবিক ভাষা নাকি formal specification? Requirement-এর অস্পষ্টতা কি কখনো পুরো দূর করা যায়?

স্বাভাবিক ভাষা স্বভাবতই দ্ব্যর্থক। “রোগী ডাক্তারকে ফি দেওয়ার পর বার্তা পাবেন” — বার্তা পাবেন রোগী, নাকি ডাক্তার? “সব রোগীর রিপোর্ট দেখা যাবে না” — কোনোটিই দেখা যাবে না, নাকি কয়েকটি দেখা যাবে না? Requirement engineering-এর গবেষকেরা (যেমন Daniel Berry ও সহকর্মীদের ambiguity নিয়ে কাজ) দেখিয়েছেন, শব্দের অর্থ, বাক্যের গঠন, সর্বনামের উল্লেখ আর প্রসঙ্গ — প্রতিটি স্তরে অস্পষ্টতা ঢোকে, আর লেখক নিজে প্রায় কখনো তা দেখতে পান না, কারণ তিনি জানেন তিনি কী বোঝাতে চেয়েছেন।

এর একটি চরম সমাধান হলো formal specification — গণিতভিত্তিক ভাষায় requirement লেখা, যেমন Z notation (১৯৭০-৮০-এর দশকে Jean-Raymond Abrial-এর কাজ থেকে, পরে Oxford-এ বিকশিত), VDM, বা Leslie Lamport-এর TLA+. Formal ভাষায় অর্থ একটাই, আর যন্ত্র দিয়ে অসংগতি খোঁজা যায়। শিল্পে এর একটি বহুল আলোচিত প্রকাশিত উদাহরণ Chris Newcombe ও সহকর্মীদের প্রবন্ধ “How Amazon Web Services Uses Formal Methods” (Communications of the ACM, ২০১৫), যেখানে লেখকেরা জানান TLA+ দিয়ে কয়েকটি distributed system-এর নকশায় এমন গভীর bug পাওয়া গেছে, যা review আর test-এ ধরা পড়েনি।

তবে formal ভাষার দাম আছে: লিখতে দক্ষতা লাগে, stakeholder পড়তে পারেন না, আর formal spec নিজেই ভুল চাওয়াকে নিখুঁতভাবে লিখতে পারে — validation-এর সমস্যা থেকে যায়। তাই বাস্তবে একটি স্তরবিন্যাস দেখা যায়: বেশিরভাগ requirement স্বাভাবিক ভাষায়, কিন্তু কাঠামোবদ্ধ (EARS, ছাঁচ, শব্দ-তালিকা, glossary); গুরুত্বপূর্ণ নিয়ম টেবিল বা state diagram-এ (পর্ব ২৩); আর সবচেয়ে ঝুঁকিপূর্ণ অংশ — concurrency, নিরাপত্তা-সংকটপূর্ণ নিয়ন্ত্রণ — formal model-এ। সাথে উদাহরণ: Given-When-Then আকারে কয়েকটি নির্দিষ্ট দৃষ্টান্ত (পর্ব ২২, ৪৮) প্রায়ই সবচেয়ে কার্যকর অস্পষ্টতা-নাশক।

অস্পষ্টতা কখনো শূন্য হয় না, কারণ requirement শেষ পর্যন্ত মানুষের চাওয়ার অনুবাদ, আর মানুষের চাওয়া নিজেই বদলায়। লক্ষ্য তাই “শূন্য অস্পষ্টতা” নয়, বরং “যে অস্পষ্টতা থাকলে ক্ষতি সবচেয়ে বেশি, তা আগে খুঁজে বের করা”।

মূল উপলব্ধি: অস্পষ্টতা কমানোর হাতিয়ার একটি সিঁড়ি — weak word বাদ দেওয়া, ছাঁচ, উদাহরণ, মডেল, formal spec. ঝুঁকি যত বেশি, তত ওপরের ধাপে উঠুন।

অনুশীলন

খাতা-কলম নিয়ে বসুন; নিজে লিখে বা হিসাব করে তারপর উত্তর মেলান।

  1. Requirement আবার লিখুন (নকশা ও সমালোচনা): একটি কাল্পনিক বাসের অনলাইন টিকিট অ্যাপের SRS-এ তিনটি বাক্য আছে। প্রতিটির সমস্যা চিহ্নিত করে EARS ছাঁচে পরীক্ষাযোগ্য রূপ লিখুন (সংখ্যা লাগলে যুক্তিসংগত অনুমান করুন আর “অনুমান” চিহ্ন দিন)। (ক) “The system should be fast during Eid.” (খ) “Seats shall be released and/or refunded if payment is not completed.” (গ) “The app shall never show wrong seat availability.”

    (ক) সমস্যা: should (বাধ্যতামূলক নয়), “fast” weak word, “during Eid” অস্পষ্ট সময়, কোন কাজ দ্রুত তা বলা নেই। নমুনা: “While the Eid sales window is open, the ticketing system shall return seat-search results with p95 latency below 800 ms at 1,000 req/s.” (সংখ্যা অনুমান; “Eid sales window” glossary-তে সংজ্ঞায়িত, যেমন ঈদের আগের ৭ দিন।)

    (খ) সমস্যা: কর্তাহীন passive, and/or (ছেড়ে দেওয়া আর টাকা ফেরত — দুটোই, নাকি একটি?), “not completed” কখন ধরা হবে বলা নেই। দুটি requirement-এ ভাগ: “If payment is not confirmed within 10 minutes of seat selection, then the ticketing system shall release the held seats.” আর “If a payment is confirmed after the hold has expired, then the ticketing system shall refund the full amount within 3 working days.” (সময় অনুমান।)

    (গ) সমস্যা: “never” যাচাই করা যায় না, “wrong” অস্পষ্ট। নমুনা: “When a seat is sold, the ticketing system shall show it as unavailable to all users within 2 seconds.” আর “The ticketing system shall not confirm the same seat on the same trip to two bookings.” দ্বিতীয়টি ubiquitous ছাঁচে, test-এ একই আসনে একসাথে দুটি বুকিং পাঠিয়ে যাচাই।

  2. শ্রেণিবিন্যাস: একটি কাল্পনিক বিশ্ববিদ্যালয়ের ফলাফল পোর্টালের ছয়টি requirement — FR, NFR (কোন গুণ) নাকি constraint? (১) শিক্ষার্থী রোল নম্বর দিয়ে নিজের ফল দেখতে পারবেন। (২) GPA হিসাব হবে বিশ্ববিদ্যালয়ের গ্রেডিং নীতির ছক অনুযায়ী। (৩) ফল প্রকাশের প্রথম ঘণ্টায় ৫০০ req/s-এ p95 latency 300 ms-এর কম। (৪) Portal বিশ্ববিদ্যালয়ের বিদ্যমান single sign-on ব্যবস্থা দিয়ে লগইন নেবে। (৫) পরীক্ষা-নিয়ন্ত্রক অনুমোদন না দিলে কোনো ফল প্রকাশ হবে না। (৬) নতুন একটি গ্রেডিং নিয়ম যোগ করতে একটির বেশি module বদলাতে হবে না।
    • (১) FR — ইনপুট (রোল নম্বর) আর আচরণ (ফল দেখানো)।
    • (২) FR, ভেতরে business rule আর domain requirement — গ্রেডিং নীতি বিশ্ববিদ্যালয়ের; নীতিটি আলাদা তালিকায় রেখে এখানে সূত্র দিন।
    • (৩) NFR — performance efficiency (time behaviour, capacity).
    • (৪) Constraint — platform ও interface (বিদ্যমান ব্যবস্থার সাথে যুক্ত হতেই হবে)। এর সাথে নিরাপত্তার দিকও আছে, কিন্তু মূল কথা হলো পথ বেঁধে দেওয়া।
    • (৫) FR — একটি business rule ও প্রবেশাধিকারের নিয়ম; EARS-এ: “While a result set is not approved by the controller of examinations, the portal shall not publish it.”
    • (৬) NFR — maintainability (modifiability ও modularity), fit criterion সহ।
  3. আউটপুট অনুমান করুন: নিচের JavaScript চালালে কী ছাপা হবে? কেন প্রথম আর দ্বিতীয় সংখ্যা আলাদা?
    const ms = [120, 95, 410, 130, 101, 88, 150, 99, 300, 115];
    const bad = [...ms].sort();
    const s = [...ms].sort((a, b) => a - b);
    const r = Math.ceil(0.9 * s.length);
    console.log("default:", bad[r - 1], "numeric:", s[r - 1]);
    console.log("mean =", ms.reduce((a, b) => a + b) / ms.length);
    console.log(s[r - 1] < 250 ? "PASS" : "FAIL");

    আউটপুট:

    default: 95 numeric: 300
    mean = 160.8
    FAIL

    JavaScript-এর sort() comparator ছাড়া মানগুলোকে লেখা (string) হিসেবে সাজায়: “101, 115, 120, 130, 150, 300, 410, 88, 95, 99” — তাই ৯ নম্বর অবস্থানে (r = ⌈০.৯ × ১০⌉ = ৯) আসে ৯৫. সংখ্যা হিসেবে সাজালে: 88, 95, 99, 101, 115, 120, 130, 150, 300, 410 — ৯ম মান 300, অর্থাৎ nearest-rank p90 = 300 ms. গড় 160.8 ms শুনতে ভালো, কিন্তু “p90 < 250 ms” criterion-এ রায় FAIL. ভুল sort দিয়ে মাপলে system মিথ্যা PASS পেত — fit criterion যাচাইয়ের program-ও review করতে হয়।

  4. হিসাব — fit criterion যাচাই: হাসপাতাল অ্যাপের একটি fit criterion: “১০০ req/s-এ search-এর p95 latency ≤ 800 ms.” ১০০ req/s-এ load test-এ ২০টি অনুরোধের latency (ms): 410, 380, 520, 395, 610, 450, 430, 700, 415, 390, 460, 1250, 405, 440, 470, 980, 425, 400, 435, 455. (ক) Nearest-rank পদ্ধতিতে p50, p90 আর p95 বের করুন; গড় কত? (খ) Criterion পাস না ফেল? (গ) পাস করতে হলে ২০টির মধ্যে অন্তত কতটি মান ৮০০ ms বা কম হতে হবে?

    (ক) সাজালে: 380, 390, 395, 400, 405, 410, 415, 425, 430, 435, 440, 450, 455, 460, 470, 520, 610, 700, 980, 1250. p50: ⌈০.৫০ × ২০⌉ = ১০ম মান = 435 ms. p90: ⌈০.৯০ × ২০⌉ = ১৮তম = 700 ms. p95: ⌈০.৯৫ × ২০⌉ = ১৯তম = 980 ms. গড় = ১০৪২০ / ২০ = 521 ms.

    (খ) p95 = 980 ms > 800 ms, তাই FAIL — যদিও গড় (৫২১) আর p90 (৭০০) দুটোই সীমার নিচে।

    (গ) p95 হলো ১৯তম মান; সেটি ≤ ৮০০ হতে হলে সবচেয়ে ছোট ১৯টি মান ≤ ৮০০ হতে হবে — অর্থাৎ ২০টির মধ্যে অন্তত ১৯টি। এখন ১৮টি (980 আর 1250 বাদে)। একটি ধীর অনুরোধ (যেমন 980-এরটি) ঠিক করলেই পাস। খেয়াল করুন, মাত্র ২০টি নমুনায় p95 আসলে “দ্বিতীয় সবচেয়ে খারাপ মান” — তাই Meter-এ নমুনার আকার বড় রাখা (যেমন কয়েক হাজার অনুরোধ) জরুরি।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমএকটি অস্পষ্ট চাওয়াকে পরীক্ষাযোগ্য requirement-এ রূপ দেওয়ার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. 🗣️ মূল বাক্যটি হুবহু লিখে weak word, and/or, TBD চিহ্নিত করা
  2. ❓ Stakeholder-কে জিজ্ঞেস করে অস্পষ্ট শব্দের অর্থ ও সংখ্যা জানা
  3. ✂️ একাধিক চাওয়া থাকলে আলাদা আলাদা requirement-এ ভাগ করা
  4. 🧩 প্রতিটিকে EARS ছাঁচে লেখা, ব্যর্থতার পথও (If…then)
  5. 🏷️ ID, source, priority, rationale আর যাচাইয়ের পদ্ধতি যোগ করে review

একটি কাল্পনিক হাসপাতাল অ্যাপের requirement: “অ্যাপটি হাসপাতালের বিদ্যমান PostgreSQL database ব্যবহার করবে।” এটি সাধারণত কোন শ্রেণিতে পড়ে?

  • Functional requirement
  • Performance requirement
  • Design ও implementation constraint
  • User requirement

“If the payment gateway does not respond within 10 s, then the appointment system shall cancel the hold on the slot.” — EARS-এর কোন ছাঁচ?

  • Event-driven
  • Unwanted behaviour
  • State-driven
  • Optional feature

ISO/IEC/IEEE 29148-এর প্রচলিত রীতিতে requirement-এ “should” শব্দটি কী বোঝায়?

  • বাধ্যতামূলক requirement
  • ভবিষ্যতে ঘটবে এমন বিবরণ
  • অনুমতি বা ঐচ্ছিক বিকল্প
  • কাম্য লক্ষ্য বা পছন্দ, বাধ্যতামূলক নয়

একটি load test-এ ২০০টি latency মাপ নেওয়া হয়েছে। Nearest-rank পদ্ধতিতে p95 হলো সাজানো তালিকার কততম মান?

  • ১৯০তম
  • ১৯৫তম
  • ১০তম
  • ২০০তম

IEEE 830-1998-এর SRS কাঠামোয় পরীক্ষাযোগ্য প্রায় সব requirement (functional, performance, design constraint, attribute) কোন অংশে থাকে?

  • ১ · Introduction
  • ২ · Overall description
  • ৩ · Specific requirements
  • Appendixes

“The patient and/or the receptionist shall be able to cancel and reschedule appointments.” — ISO/IEC/IEEE 29148-এর কোন গুণ সবচেয়ে স্পষ্টভাবে ভাঙছে?

  • Feasible
  • Singular
  • Necessary
  • Conforming

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. FR বলে কী করবে (আচরণ, ইনপুট-আউটপুট, business rule); NFR বলে কতটা ভালো; constraint বলে কোন পথে; domain requirement আসে ক্ষেত্র থেকে, যেকোনো শাখায় পড়তে পারে।
  2. একই চাওয়া দুই স্তরে: user requirement (ব্যবহারকারীর ভাষায়) → system requirement (পরীক্ষাযোগ্য বিস্তারিত), সংযোগ ID দিয়ে।
  3. ভালো requirement (29148): necessary, appropriate, unambiguous, complete, singular, feasible, verifiable, correct, conforming; shall বাধ্যতামূলক, should কাম্য, may ঐচ্ছিক।
  4. EARS: ubiquitous, When, While, If…then, Where (আর complex); প্রতিটি When-এর পাশে একটি If…then প্রশ্ন করুন।
  5. NFR-এ fit criterion: scale, meter, সীমা (Must) আর লক্ষ্য (Plan), percentile আর ভারের শর্তসহ; SRS = introduction, overall description, specific requirements, প্রতিটি requirement-এ ID ও attribute.

পরের পর্বে: Requirement লেখার আরেকটি ভাষা — use case আর user story. INVEST দিয়ে ভালো story চেনা, আর Given-When-Then দিয়ে acceptance criteria লেখা, যা সরাসরি test-এ রূপ নেয়।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান