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

Requirement management — prioritization, validation, traceability আর scope creep

Requirements Management — Prioritization (MoSCoW, Kano, RICE, WSJF), Validation, Traceability, Change Control & Scope Creep

Taught in Bangla, this lesson covers managing requirements after they are written: prioritizing with MoSCoW, the Kano model, relative weighting, RICE and WSJF, and why they rank differently; validating requirements through reviews, inspections, prototypes and test cases; building a traceability matrix to find untested requirements and orphan tests; baselines, impact analysis and change control boards; and spotting scope creep, gold-plating and volatility, with hands-on calculators.

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

  • নির্দিষ্ট বাজেটে MoSCoW workshop চালানো আর Kano প্রশ্নপত্রের উত্তর থেকে feature-এর ধরন বের করা
  • RICE, WSJF আর relative weighting হাতে ও প্রোগ্রামে হিসাব করা, আর কেন এরা ভিন্ন ক্রম দেয় তা বোঝা
  • Requirement-এর verification আর validation আলাদা করা, আর validation-এর পাঁচটি কৌশল
  • Traceability matrix বানিয়ে test-হীন requirement, অনাথ test আর impact analysis বের করা
  • Change request-কে baseline, impact analysis আর CCB-র সিদ্ধান্ত পর্যন্ত নেওয়া; scope creep, gold-plating আর volatility চেনা

১ · Requirement management কী — চাহিদা লেখার পরের কাজ

এই মডিউলের আগের চারটি পর্বে requirement জোগাড় করা আর লেখার কাজ দেখেছেন: stakeholder খোঁজা আর elicitation (পর্ব ২০, requirement engineering), functional আর non-functional requirement আর SRS (পর্ব ২১, functional আর non-functional requirement), use case আর user story (পর্ব ২২, use case আর user story), আর diagram দিয়ে মডেল (পর্ব ২৩, requirement modeling). কিন্তু লেখা শেষ মানে কাজ শেষ নয়। এরপর চারটি প্রশ্ন আসে:

  1. কোনটি আগে? সময় আর টাকা সীমিত, চাহিদা অসীম — prioritization.
  2. যা লিখেছি, তা কি ঠিক? চাহিদাটি আসল প্রয়োজন ধরেছে কি না — requirement validation.
  3. কোন requirement কোথায় গেল? কোন নকশা, কোড আর test সেটি পূরণ করে — traceability.
  4. বদলালে কী করব? কে অনুমোদন দেবেন, খরচ কত, কোন version — change control.

এই চারটি মিলেই requirement management. পুরো কাজটি জীবনচক্র জুড়ে চলে — শুধু শুরুতে নয়।

বিয়েবাড়ির আয়োজনের তালিকার কথা ভাবুন। বাজেট তিন লাখ টাকা, চাহিদা তার চেয়ে বেশি — তাই আগে ঠিক করতে হয় কোনটি না হলেই নয় (খাবার), কোনটি থাকলে ভালো (ফুলের গেট), কোনটি এবার বাদ (আতশবাজি)। তারপর বাবুর্চির সাথে মেনু মিলিয়ে দেখা, হিসাবের খাতায় কোন খরচ কোন দোকানে তা লেখা, আর এক সপ্তাহ আগে “অতিথি আরও পঞ্চাশ জন” শুনলে কে সিদ্ধান্ত দেবেন, কোন খরচ কাটা হবে — তার নিয়ম। Software-এর requirement management ঠিক এই চারটি কাজ।

পুরো পর্ব জুড়ে একটি উদাহরণ চলবে: পাড়ার একটি মুদি দোকানের অনলাইন অর্ডার app (কাল্পনিক). দোকানের মালিক চান গ্রাহক মোবাইল থেকে অর্ডার দিন, cash on delivery বা মোবাইল ওয়ালেটে টাকা দিন, আর ঈদের আগে delivery-র সময় বেছে নিতে পারুন। প্রথম release-এর জন্য দলের হাতে আছে মোট ৪০ developer-দিন।

মূল ধারণা

Requirement জোগাড় আর লেখা হলো development-এর দিক; অগ্রাধিকার, validation, traceability আর change control হলো management-এর দিক — অনেক বই দুটিকে মিলিয়ে বলে requirement engineering. মূল প্রশ্ন: সীমিত সম্পদে, বদলাতে থাকা চাহিদার মধ্যে, কীভাবে প্রমাণসহ ঠিক জিনিসটি বানাবেন?

২ · অগ্রাধিকার কেন, আর MoSCoW

প্রায় প্রতিটি project-এ চাহিদার তালিকা হাতের সময়ের চেয়ে বড় হয়। অগ্রাধিকার না দিলে দুটি জিনিস ঘটে: দল সহজ বা মজার কাজ আগে করে, অথবা যিনি সবচেয়ে জোরে কথা বলেন তাঁর কাজ আগে হয়। দ্বিতীয়টির একটি রসিক নাম আছে — HiPPO (Highest Paid Person's Opinion, সবচেয়ে বেশি বেতনের মানুষের মত)। অগ্রাধিকারের পদ্ধতিগুলোর কাজ হলো সিদ্ধান্তকে প্রকাশ্য আর যুক্তিনির্ভর করা।

MoSCoW-এর চারটি ঘর

MoSCoW নামের বড় হাতের অক্ষরগুলো চারটি ঘর; মাঝের ছোট “o” শুধু উচ্চারণের সুবিধার জন্য। পদ্ধতিটি সাধারণত Oracle UK-তে কাজ করা Dai Clegg-এর নামে উদ্ধৃত হয় (১৯৯৪ সালের দিকে), আর পরে এটি DSDM (Dynamic Systems Development Method) পদ্ধতির কেন্দ্রীয় অংশ হয় — পর্ব ০৪-এ (process model) দেখেছেন, RAD-এর কিছু চিন্তা DSDM হয়ে Agile-এ মিশেছে।

🔴 Must have

না থাকলে release অর্থহীন, বেআইনি বা অনিরাপদ। DSDM-এর একটি চলতি ব্যাখ্যা: MUST = “Minimum Usable SubseT”.

খাবার আর বসার জায়গা

🟠 Should have

গুরুত্বপূর্ণ, কিন্তু না থাকলেও release চলে — হয়তো কষ্টকর বিকল্প পথে।

ফুলের গেট

🔵 Could have

থাকলে ভালো; সময় কম পড়লে সবার আগে বাদ যায়। এটিই পরিকল্পনার নিরাপত্তা-জায়গা।

মিষ্টির বাড়তি পদ

⚪ Won't have (this time)

এই release-এ নয় — চিরকালের জন্য বাতিল নয়। লিখে রাখলে প্রত্যাশা পরিষ্কার থাকে।

আতশবাজি — পরের অনুষ্ঠানে

MoSCoW-এর আসল শক্তি একটি নিয়মে: DSDM-এর নির্দেশনায় (AgilePM-এর মতো পরের রূপেও) সাধারণত বলা হয়, Must-এর কাজ মোট পরিকল্পিত কাজের প্রায় ৬০%-এর বেশি না হওয়াই ভালো, আর বাকিটা Should ও Could — যাতে অনুমান ভুল হলে Could বাদ দিয়ে Must রক্ষা করা যায়। সংখ্যাটি নির্দেশনা, প্রাকৃতিক নিয়ম নয়; কিন্তু “সবকিছুই Must”-এর রোগ সারাতে এটি খুব কাজের। নিচের stepper-এ মুদি দোকানের app-এর প্রথম release-এর workshop দেখুন।

  1. তালিকা৯টি · ৫০ দিনঅনুমানসহ
  2. Must৩২ → ২৪Must-পরীক্ষা
  3. Should · Could১৩ + ৩বাজেট পূর্ণ
  4. মাঝপথেcart +৩ দিনCould বাদ
Release ১-এর হিসাব (developer-দিন, কাল্পনিক)
Must
Should
Could
Won't (এবার নয়)
Must-এর ভাগ
বাজেট
  1. তালিকা আর অনুমান। দল নয়টি চাহিদার প্রতিটির আনুমানিক খরচ লিখেছে: catalogue ও search ৬, cart ও checkout ১০, cash on delivery ৪, মোবাইল ওয়ালেট ৮, দোকানির stock আপডেট ৪, order tracking ৫, SMS জানানো ৩, loyalty point ৬, review ৪ দিন। মোট ৫০, বাজেট ৪০ — অন্তত ১০ দিনের কাজ এবার হবে না।
  2. প্রথম দফা — সবই জরুরি। দোকানের মালিক পাঁচটিকে Must বললেন: মোট ৩২ দিন, বাজেটের ৮০%. এখন যেকোনো অনুমান সামান্য ভুল হলেই একটি Must বাদ পড়বে — নিরাপত্তা-জায়গা প্রায় নেই।
  3. Must-পরীক্ষা। Facilitator প্রতিটি Must-এর জন্য জিজ্ঞেস করলেন: “এটি না থাকলে কি release বাতিল করবেন?” Wallet-এর উত্তর: “না, প্রথম মাসে cash on delivery দিয়েই চলবে।” তাই wallet হলো Should. Must এখন ২৪ দিন — ঠিক ৬০%.
  4. Should. Wallet (৮) আর order tracking (৫) — দুটিই গুরুত্বপূর্ণ, কিন্তু বিকল্প পথ আছে (ফোন করে খোঁজ নেওয়া)। পরিকল্পিত কাজ এখন ৩৭ দিন।
  5. Could আর Won't. হাতে থাকা ৩ দিনে SMS জানানো Could হলো। Loyalty point আর review এবার নয় — এগুলো “Won't have this time” হিসেবে লিখে রাখা হলো, যাতে মালিক জানেন এগুলো ভুলে যাওয়া হয়নি। পরিকল্পনা ৪০ ÷ ৪০.
  6. মাঝপথে অনুমান ভুল। Cart ও checkout-এ ১০-এর বদলে ১৩ দিন লাগল। কোনো Must বা Should কাটতে হলো না: নিয়ম অনুযায়ী প্রথমে Could বাদ — SMS জানানো পরের release-এ গেল। আসল খরচে Must-এর ভাগ দাঁড়াল ৬৭.৫%, তবু release সময়মতো। ৬০% নিয়মের উদ্দেশ্য ঠিক এটাই।

MoSCoW-এর প্রচলিত ভুল: (১) “Won't” মানে চিরকাল বাতিল ভাবা — DSDM বলে “this time”; (২) সময়ের ভিত্তি না বলে ভাগ করা — “এই release-এ Must” আর “পুরো product-এ Must” আলাদা কথা; (৩) চারটি ঘরের ভেতরে আর কোনো ক্রম না রাখা — দশটি Should থাকলে কোনটি আগে, তাও লাগবে।

৩ · Kano model — কোন feature খুশি করে, কোনটির অভাব শুধু কষ্ট দেয়

MoSCoW মানুষের মতামত সাজায়। কিন্তু গ্রাহক নিজে কোন feature-কে কীভাবে অনুভব করেন? ১৯৮৪ সালে জাপানি গুণমান-বিশেষজ্ঞ Noriaki Kano ও সহকর্মীরা জাপানের গুণমান সমিতির পত্রিকায় “Attractive quality and must-be quality” নামে একটি লেখা প্রকাশ করেন। মূল পর্যবেক্ষণ: সব feature সন্তুষ্টিকে একভাবে বাড়ায় না। এটিই Kano model.

শ্রেণিনা থাকলেথাকলেমুদি দোকানের app-এ উদাহরণ
Must-be (basic, মৌলিক)খুব অসন্তুষ্টসন্তুষ্ট নন, শুধু অভিযোগ নেইCash on delivery, ঠিক দামের হিসাব
One-dimensional (performance, কর্মক্ষমতা)অসন্তুষ্টযত ভালো, তত খুশিDelivery-র গতি, order tracking
Attractive (delighter, আনন্দদায়ক)অভাব টের পান নাঅবাক হয়ে খুশিবাজারের তালিকা থেকে রান্নার পরামর্শ
Indifferent (উদাসীন)কিছু যায় আসে নাকিছু যায় আসে নাপণ্যের review — এই পাড়ার গ্রাহকদের কাছে
Reverse (বিপরীত)খুশিবিরক্তনিজে থেকে চলা video বিজ্ঞাপন

Kano model-এর তিনটি প্রধান রেখা

Horizontal: how fully a feature is implemented; vertical: customer satisfaction

Kano model একদম নেই পুরোপুরি আছে খুব খুশি খুব অসন্তুষ্ট Indifferent (ড্যাশ) Attractive · আনন্দদায়ক Performance Must-be · মৌলিক Indifferent সময়ের সাথে: Attractive → Performance → Must-be
ছবি ২৪.১ — একই পরিমাণ কাজ ভিন্ন feature-এ ভিন্ন সন্তুষ্টি আনে। Must-be (লাল) না থাকলে খুব অসন্তুষ্ট, থাকলেও শুধু নিরপেক্ষ; performance (নীল) সরলরেখায় বাড়ে; attractive (সবুজ) না থাকলে কেউ টের পান না, থাকলে খুশি দ্রুত বাড়ে। Reverse শ্রেণি (যত বেশি, তত বিরক্তি) ছবিতে নেই। নিচের তীর: আজকের delighter কাল সাধারণ প্রত্যাশা হয়ে যায়।

প্রশ্নপত্র — একটি feature, দুটি প্রশ্ন

Kano-র কৌশলের মূল চালাকি হলো প্রতিটি feature নিয়ে দুটি প্রশ্ন: functional (“feature-টি থাকলে আপনার কেমন লাগবে?”) আর dysfunctional (“feature-টি না থাকলে কেমন লাগবে?”)। প্রতিটির উত্তর পাঁচটির একটি: ১ ভালো লাগবে, ২ এটাই তো স্বাভাবিক (প্রত্যাশিত), ৩ কিছু যায় আসে না, ৪ মেনে নেব, ৫ খারাপ লাগবে। দুই উত্তরের জোড়া নিচের মূল্যায়ন-টেবিলে বসিয়ে শ্রেণি পাওয়া যায়। টেবিলের এই রূপটি সাধারণত Berger ও সহলেখকদের ১৯৯৩ সালের একটি লেখা থেকে প্রচলিত; উত্তরের শব্দ আর টেবিলের খুঁটিনাটি উৎসভেদে একটু আলাদা।

Functional ↓ · Dysfunctional →১ ভালো২ প্রত্যাশিত৩ যায় আসে না৪ মেনে নেব৫ খারাপ
১ ভালোQAAAO
২ প্রত্যাশিতRIIIM
৩ যায় আসে নাRIIIM
৪ মেনে নেবRIIIM
৫ খারাপRRRRQ

M = must-be, O = one-dimensional, A = attractive, I = indifferent, R = reverse, Q = questionable (পরস্পরবিরোধী উত্তর — যেমন “থাকলেও ভালো, না থাকলেও ভালো”, যা সাধারণত প্রশ্ন বুঝতে ভুলের লক্ষণ)। উদাহরণ: একজন গ্রাহক cash on delivery নিয়ে বললেন “থাকলে — এটাই তো স্বাভাবিক (২)”, “না থাকলে — খারাপ লাগবে (৫)” → সারি ২, কলাম ৫ = M. নিচের প্রোগ্রাম আটজন গ্রাহকের উত্তর থেকে প্রতিটি feature-এর সবচেয়ে বেশিবার আসা শ্রেণি (mode) বের করে। প্রতিটি উত্তর দুই অঙ্কের লেখা: প্রথম অঙ্ক functional, দ্বিতীয় dysfunctional.

// Kano classifier: each answer pair (functional, dysfunctional) -> category.
// Answers: 1 like, 2 expect, 3 neutral, 4 live-with, 5 dislike
// Categories: M must-be, O one-dimensional (performance), A attractive,
//             I indifferent, R reverse, Q questionable (contradictory answer)
const TABLE = [            // rows: functional 1..5, columns: dysfunctional 1..5
  ["Q", "A", "A", "A", "O"],
  ["R", "I", "I", "I", "M"],
  ["R", "I", "I", "I", "M"],
  ["R", "I", "I", "I", "M"],
  ["R", "R", "R", "R", "Q"]
];
// answers[feature] = list of "fd" pairs, one per respondent (8 respondents)
const answers = {
  "cash on delivery":   ["25", "25", "15", "25", "35", "25", "15", "25"],
  "order tracking":     ["15", "15", "15", "25", "14", "15", "13", "15"],
  "recipe suggestions": ["13", "14", "13", "33", "13", "14", "15", "34"],
  "product reviews":    ["33", "34", "13", "33", "43", "33", "14", "33"],
  "auto-play video ad": ["51", "52", "53", "41", "33", "51", "52", "53"]
};
for (const [feature, list] of Object.entries(answers)) {
  const count = {};
  for (const pair of list) {
    const cat = TABLE[pair[0] - 1][pair[1] - 1];
    count[cat] = (count[cat] || 0) + 1;
  }
  const sorted = Object.entries(count).sort((a, b) => b[1] - a[1]);
  const tie = sorted.length > 1 && sorted[0][1] === sorted[1][1];
  console.log(feature.padEnd(19) + JSON.stringify(count).padEnd(26) + "-> " +
    sorted[0][0] + (tie ? " (tie with " + sorted[1][0] + ")" : ""));
}

আউটপুট:

cash on delivery   {"M":6,"O":2}             -> M
order tracking     {"O":5,"M":1,"A":2}       -> O
recipe suggestions {"A":5,"I":2,"O":1}       -> A
product reviews    {"I":6,"A":2}             -> I
auto-play video ad {"R":7,"I":1}             -> R

হাতে মিলিয়ে দেখুন। Cash on delivery: “25” পাঁচবার আর “35” একবার — সারি ২ ও ৩, কলাম ৫ = M, মোট ৬টি; “15” দুবার = O. তাই মৌলিক। Order tracking: “15” পাঁচবার = O; “14” আর “13” = A; “25” = M → performance. রান্নার পরামর্শ: A পাঁচটি → delighter. Review: “33”, “34”, “43” সব I → এই গ্রাহকদের কাছে উদাসীন। Video বিজ্ঞাপন: প্রথম অঙ্ক ৫ বা ৪ আর দ্বিতীয় অঙ্ক ১–৩ → R, সাতজন বিরক্ত। এখানে কোনো সমতা (tie) আসেনি; এলে প্রোগ্রাম “tie with” লিখত — তখন শুধু mode দিয়ে সিদ্ধান্ত না নিয়ে গ্রাহকদের দল ভাগ করে দেখা ভালো, কারণ হয়তো দুই ধরনের গ্রাহক আছেন।

Mode-এর বাইরে: অনেকে Berger ও সহলেখকদের “better-worse” সহগও হিসাব করেন: better = (A + O) ÷ (A + O + M + I), worse = −(O + M) ÷ (A + O + M + I). Order tracking-এ better = (২ + ৫) ÷ ৮ = ০.৮৭৫, worse = −(৫ + ১) ÷ ৮ = −০.৭৫ — থাকলে খুশি বাড়ে, না থাকলে অসন্তোষও অনেক। Kano MoSCoW-এর বদলি নয়: Kano বলে গ্রাহক কেমন অনুভব করেন; MoSCoW বলে এই release-এ দল কী অঙ্গীকার করবে। সাধারণ নিয়ম — সব must-be আগে, তারপর যথেষ্ট performance, আর অন্তত একটি delighter.

৪ · সংখ্যা দিয়ে অগ্রাধিকার — relative weighting, RICE, WSJF, ১০০ টাকা আর AHP

MoSCoW আর Kano শ্রেণিতে ভাগ করে; একই শ্রেণির ভেতরে ক্রম ঠিক করতে প্রায়ই সংখ্যা লাগে। তবে মনে রাখুন: প্রতিটি সূত্রের ভেতরের সংখ্যাগুলো অনুমান। সূত্র অনুমানকে স্পষ্ট করে — সত্য বানায় না।

Value বনাম cost — Wiegers-এর relative weighting

Requirement বিশেষজ্ঞ Karl Wiegers ১৯৯৯ সালের দিকে “First Things First” লেখায় আর পরে তাঁর Software Requirements বইয়ে একটি weighted scoring পদ্ধতি দেন। প্রতিটি feature-কে ১–৯ মাপে চারটি নম্বর: benefit (থাকলে লাভ), penalty (না থাকলে ক্ষতি), cost আর risk. Value = benefit × ওজন + penalty × ওজন; তারপর প্রতিটির শতকরা ভাগ নিয়ে:

Priority = value% ÷ (cost% × cost-এর ওজন + risk% × risk-এর ওজন)

উদাহরণে প্রায়ই ওজন দেওয়া হয় benefit ২, penalty ১, cost ১, risk ০.৫ — তবে দল নিজের ওজন বেছে নিতে পারে। তিনটি feature-এ হিসাব (নম্বরগুলো দলের অনুমান):

FeatureBenefitPenaltyValue (২B + P)Value%Cost (cost%)Risk (risk%)Priority
Cash on delivery৮৯২৫৪৮.১২ (১৬.৭)১ (১০.০)২.২২
ঈদের delivery slot৭৪১৮৩৪.৬৪ (৩৩.৩)৫ (৫০.০)০.৫৯
Loyalty point৪১৯১৭.৩৬ (৫০.০)৪ (৪০.০)০.২৫

যেমন cash on delivery: value = ২ × ৮ + ৯ = ২৫; মোট value ২৫ + ১৮ + ৯ = ৫২, তাই value% = ৪৮.১; priority = ৪৮.১ ÷ (১৬.৭ × ১ + ১০.০ × ০.৫) = ৪৮.১ ÷ ২১.৭ ≈ ২.২২. বেশি priority মানে প্রতি একক খরচ-ও-ঝুঁকিতে বেশি মূল্য।

RICE আর WSJF

RICE জনপ্রিয় হয় product-messaging কোম্পানি Intercom-এর একটি blog লেখা থেকে (Sean McBride, ২০১৬ সালের দিকে বলে উল্লেখ পাওয়া যায়)। চারটি অংশ:

RICE = Reach × Impact × Confidence ÷ Effort
  • Reach: নির্দিষ্ট সময়ে (যেমন এক quarter-এ) কতজন ব্যবহারকারী feature-টির ছোঁয়া পাবেন।
  • Impact: প্রত্যেকের ওপর প্রভাব, একটি নির্দিষ্ট মাপে — Intercom-এর লেখায় ৩ = বিশাল, ২ = বেশি, ১ = মাঝারি, ০.৫ = কম, ০.২৫ = খুব কম।
  • Confidence: অনুমানগুলোয় কতটা ভরসা — ১০০%, ৮০% বা ৫০%; অনুমাননির্ভর উচ্ছ্বাসে লাগাম।
  • Effort: কত person-month কাজ।

WSJF (Weighted Shortest Job First) আসে অন্য দিক থেকে: দেরির দাম. Donald Reinertsen তাঁর The Principles of Product Development Flow (২০০৯) বইয়ে বলেন, প্রতিটি কাজ দেরি হলে প্রতি সপ্তাহে কিছু মূল্য হারায় — এটি cost of delay. যে কাজের cost of delay বেশি আর সময় কম, সেটি আগে; তাঁর ভাষায় cost of delay ÷ duration. SAFe (Scaled Agile Framework) এটিকে আপেক্ষিক নম্বরে সহজ করে:

WSJF = (business value + time criticality + risk reduction/opportunity) ÷ job size

এখানে job size কাজের সময়ের প্রতিনিধি হিসেবে আপেক্ষিক আকার (সাধারণত ১, ২, ৩, ৫, ৮, ১৩, ২০ ধরনের সংখ্যা)। Time criticality হলো RICE-এ যা নেই: ঈদের আগে delivery slot না এলে ঈদের পরে এর মূল্য প্রায় শূন্য। নিচের প্রোগ্রাম একই আটটি feature দুই পদ্ধতিতে সাজায়।

// Same 8 features, two scoring models: RICE (Intercom) and WSJF (Reinertsen/SAFe).
// [id, name, reach/quarter, impact, confidence, effort(person-months),
//  business value, time criticality, risk reduction/opportunity, job size]
const F = [
  ["F1", "wallet payment",     1800, 2,    0.8, 3,  13, 8,  8, 8],
  ["F2", "cash on delivery",   2500, 1,    1.0, 1,  8,  5,  2, 2],
  ["F3", "product search",     3000, 1,    0.8, 2,  8,  3,  3, 5],
  ["F4", "order tracking",     1500, 1,    0.8, 2,  5,  2,  1, 3],
  ["F5", "Eid delivery slot",   900, 2,    0.8, 2,  8, 20,  3, 3],
  ["F6", "loyalty points",      600, 0.5,  0.5, 3,  3,  1,  2, 5],
  ["F7", "product reviews",    1200, 0.5,  0.8, 1,  2,  1,  1, 2],
  ["F8", "stock alert SMS",     700, 1,    0.5, 1,  3,  2,  8, 2]
].map(([id, name, r, i, c, e, bv, tc, rr, js]) =>
  ({ id, name, rice: r * i * c / e, wsjf: (bv + tc + rr) / js }));
const rank = key => [...F].sort((a, b) => b[key] - a[key]).map(f => f.id);
const rice = rank("rice"), wsjf = rank("wsjf");
console.log("pos  RICE (score)        WSJF (score)");
for (let p = 0; p < F.length; p++) {
  const a = F.find(f => f.id === rice[p]), b = F.find(f => f.id === wsjf[p]);
  console.log(String(p + 1).padStart(2) + "   " + (a.id + " " + a.rice.toFixed(0)).padEnd(19) +
              b.id + " " + b.wsjf.toFixed(2));
}
console.log("disagreements (position gap >= 3):");
for (const f of F) {
  const gap = rice.indexOf(f.id) - wsjf.indexOf(f.id);
  if (Math.abs(gap) >= 3) console.log("  " + f.id + " " + f.name + ": RICE #" +
    (rice.indexOf(f.id) + 1) + ", WSJF #" + (wsjf.indexOf(f.id) + 1));
}

আউটপুট:

pos  RICE (score)        WSJF (score)
 1   F2 2500            F5 10.33
 2   F3 1200            F2 7.50
 3   F1 960             F8 6.50
 4   F5 720             F1 3.63
 5   F4 600             F3 2.80
 6   F7 480             F4 2.67
 7   F8 350             F7 2.00
 8   F6 50              F6 1.20
disagreements (position gap >= 3):
  F3 product search: RICE #2, WSJF #5
  F5 Eid delivery slot: RICE #4, WSJF #1
  F8 stock alert SMS: RICE #7, WSJF #3

হাতে মিলিয়ে দেখুন: F1 wallet-এর RICE = ১৮০০ × ২ × ০.৮ ÷ ৩ = ৯৬০; F5 ঈদের slot-এর WSJF = (৮ + ২০ + ৩) ÷ ৩ = ১০.৩৩. তিনটি বড় অমিল, আর প্রতিটির কারণ সূত্রেই আছে। F5 ঈদের slot RICE-এ ৪ নম্বরে, কারণ reach মাত্র ৯০০; কিন্তু WSJF-এ ১ নম্বরে, কারণ time criticality ২০ — দেরি মানে মূল্য শেষ। F8 stock alert SMS RICE-এ ৭ নম্বরে (reach কম, confidence ৫০%), কিন্তু WSJF-এ ৩ নম্বরে, কারণ এর risk reduction ৮ — দোকানের stock ফুরিয়ে যাওয়ার ঝুঁকি কমায়, যা RICE-এ ধরা পড়ে না। F3 search RICE-এ ২ নম্বরে (reach ৩০০০) কিন্তু WSJF-এ ৫ নম্বরে, কারণ এর job size ৫ আর জরুরিতা কম। দুই পদ্ধতিই F2 cash on delivery-কে ওপরের দিকে আর F6 loyalty-কে একদম নিচে রেখেছে — এমন মিল পেলে সিদ্ধান্ত সহজ; অমিলের জায়গাগুলোতেই আলোচনা দরকার।

কোনটি কখন: RICE অনেক ব্যবহারকারীর product-এ “কতজনের কতটা লাভ” প্রশ্নে ভালো; WSJF ভালো যেখানে সময়সীমা, মৌসুম বা ঝুঁকি বড় — বাংলাদেশে ঈদ বা ভর্তি-মৌসুমের আগের কাজ যেমন। দুটিতেই নম্বর একটু বাড়িয়ে প্রিয় feature ওপরে তোলা যায়; তাই নম্বরের পাশে লিখিত যুক্তি রাখুন, আর কয়েকজন আলাদাভাবে নম্বর দিয়ে পরে মেলান। Effort বা job size-এর অনুমান পর্ব ৬০-এ (software estimation).

১০০ টাকার ভোট আর জোড়ায় জোড়ায় তুলনা

১০০ ডলারের পরীক্ষা (cumulative voting) — Dean Leffingwell ও Don Widrig-এর Managing Software Requirements বইসহ অনেক requirement-বইয়ে বর্ণিত একটি কৌশল — খুব সহজ: প্রত্যেক stakeholder-কে কাল্পনিক ১০০ টাকা দিন, যেভাবে খুশি feature-গুলোতে ভাগ করতে বলুন। আমাদের app-এ চারজন (মালিক, delivery-কর্মী, দুজন গ্রাহক) চারটি feature-এ টাকা দিলেন:

StakeholderSearchReviewঈদের slotLoyalty
মালিক৫০১০৩০১০
Delivery-কর্মী২০০৭০১০
গ্রাহক ১৪০৩০২০১০
গ্রাহক ২৬০২০০২০
মোট (৪০০-এর মধ্যে)১৭০৬০১২০৫০

ফল: search, তারপর ঈদের slot. সুবিধা — টাকা সীমিত বলে প্রত্যেককে আপস করতে হয়। দুর্বলতা — বারবার চালালে মানুষ কৌশল করেন (“প্রিয়টি এমনিতেই উঠবে, সব টাকা অন্যটিতে দিই”)। Delivery-কর্মীর ৭০ টাকা সত্যিকারের জরুরিতা কি না, আলোচনায় জিজ্ঞেস করুন।

জোড়ায় জোড়ায় তুলনা আর AHP: Thomas Saaty-র Analytic Hierarchy Process (১৯৭০-এর দশকের শেষে প্রস্তাবিত, তাঁর ১৯৮০ সালের বইয়ে বিস্তারিত) প্রতিটি জোড়া নিয়ে জিজ্ঞেস করে — “A আর B-এর মধ্যে কোনটি কত গুণ বেশি গুরুত্বপূর্ণ?” (১–৯ মাপে)। এরপর গণিত দিয়ে সব জোড়ার উত্তর থেকে ওজন বের হয়, আর একটি consistency ratio দেখায় উত্তরগুলো পরস্পরবিরোধী কি না (A > B, B > C অথচ C > A হলে অসংগত)। অসুবিধা: n-টি feature-এ তুলনা লাগে n(n − ১) ÷ ২টি — ৮টি feature-এ ২৮টি, ২০টিতে ১৯০টি। তাই AHP সাধারণত অল্প কয়েকটি বড় সিদ্ধান্তে (যেমন তিনটি architecture-এর মধ্যে বাছাই) ব্যবহার হয়।

৫ · Requirement validation — ঠিক জিনিস লিখেছি তো?

দর্জির কাছে পাঞ্জাবির মাপ দেওয়ার পরে ভালো দর্জি মাপের খাতাটি একবার পড়ে শোনান: “বুক ৪০, লম্বা ৪২, হাতা ২৪ — ঠিক আছে?” তখনই আপনি বলতে পারেন “না, লম্বা ৪৪ হবে।” কাপড় কাটার পরে বললে কাপড়ই নষ্ট। Requirement-এর ভুল কোড লেখার আগে ধরা সবচেয়ে সস্তা — পর্ব ০৪-এ দেখেছেন, দেরিতে আসা পরিবর্তন কত rework আনে।

Requirement-এর verification বনাম validation

Verification (requirement-এর ক্ষেত্রে): লেখাটি নিজে ভালো মানের কি না — স্পষ্ট, পরস্পরবিরোধী নয়, মাপা যায়, ফরম্যাট আর মান মেনে চলে, ওপরের স্তরের চাহিদার সাথে সামঞ্জস্যপূর্ণ। Validation: লেখাটি stakeholder-এর আসল প্রয়োজন ধরেছে কি না। “Cash on delivery-র সর্বোচ্চ সীমা ৫০০০ টাকা” — বাক্যটি স্পষ্ট ও মাপা যায় (verification-এ পাস), কিন্তু মালিক আসলে ৩০০০ টাকা চেয়েছিলেন (validation-এ ফেল)। দুটি আলাদা পরীক্ষা; একটি অন্যটির বদলি নয়। Testing-এর প্রেক্ষাপটে verification-validation আরও বিস্তারিত পর্ব ৪৫-এ।

ISO/IEC/IEEE 29148 (প্রথম সংস্করণ ২০১১, হালনাগাদ ২০১৮; পুরোনো IEEE 830-এর উত্তরসূরি) একটি ভালো requirement-এর গুণের তালিকা দেয় — ২০১৮ সংস্করণে necessary, appropriate, unambiguous, complete, singular, feasible, verifiable, correct আর conforming. এই তালিকাই একটি review checklist-এর ভিত্তি। পর্ব ২১-এ মাপা যায় এমন requirement লেখার কৌশল দেখেছেন; এখানে দেখি সেগুলো যাচাইয়ের পাঁচটি কৌশল।

কৌশলকীভাবেকী ধরা পড়ে
Review আর inspectionকয়েকজন (stakeholder, developer, tester) দলিল পড়েন; inspection-এ নির্দিষ্ট role (moderator, reader, recorder), প্রস্তুতি আর ভুলের লিখিত তালিকা থাকে — Michael Fagan IBM-এ ১৯৭৬ সালের লেখায় এর আনুষ্ঠানিক রূপ দেনঅস্পষ্টতা, দ্বন্দ্ব, বাদ পড়া চাহিদা
Prototypingকাগজে বা পর্দায় screen-এর নমুনা দেখিয়ে মতামত (পর্ব ০৪-এর throwaway prototype)“এটা চাইনি” — যা কথায় বোঝা যায়নি
Test case বানানোপ্রতিটি requirement থেকে এখনই একটি test case লেখার চেষ্টাযার test লেখা যায় না, সেটি অস্পষ্ট বা মাপা যায় না
Acceptance testStakeholder-এর সাথে বসে উদাহরণ লেখা: “৩২০০ টাকার অর্ডারে COD দেখাবে না”সীমার মান, নিয়মের ব্যতিক্রম
Checklistপ্রতিটি requirement-এ গুণের তালিকা মিলিয়ে দেখা“দ্রুত”, “সহজ”, “ইত্যাদি” ধরনের শব্দ; একসাথে দুটি চাহিদা

Test case বানানোর কৌশল সবচেয়ে সস্তা আর শক্তিশালী। “Checkout দ্রুত হবে” থেকে test লিখতে গেলেই প্রশ্ন ওঠে — কত দ্রুত? কোন নেটওয়ার্কে? কতজন একসাথে? উত্তর লিখলে requirement নিজেই মাপা যায় এমন হয়: “৩G নেটওয়ার্কে ৯৫% checkout ৩ সেকেন্ডের মধ্যে শেষ হবে।” পর্ব ২২-এর Given-When-Then আকারের acceptance criteria এই কাজটিকেই নিয়মিত অভ্যাসে পরিণত করে।

৬ · Traceability — requirement থেকে test পর্যন্ত সুতো

মুদি দোকানের হিসাবের খাতায় প্রতিটি খরচের পাশে রশিদ নম্বর লেখা থাকলে মাসের শেষে যেকোনো খরচ ধরে রশিদ পর্যন্ত যাওয়া যায়, আবার যেকোনো রশিদ ধরে খাতার লাইন পর্যন্ত। Software-এ এই সংযোগই traceability. Orlena Gotel আর Anthony Finkelstein-এর ১৯৯৪ সালের বহুল উদ্ধৃত লেখার সংজ্ঞাটি মোটামুটি এমন: একটি requirement-এর জীবনকে সামনের ও পেছনের — দুই দিকেই বর্ণনা করতে আর অনুসরণ করতে পারার ক্ষমতা।

  • Forward traceability: requirement → design → code → test. প্রশ্ন: “প্রতিটি requirement কি বানানো আর test হয়েছে?”
  • Backward traceability: test বা code → requirement → stakeholder-এর চাহিদা। প্রশ্ন: “এই কোড বা test কেন আছে? কার চাহিদায়?” যে কোডের কোনো requirement নেই, সেটি হয় অপ্রয়োজনীয়, নয়তো একটি না-লেখা requirement.
  • Bidirectional: দুই দিকই রাখা। বাস্তবে একই link দুই দিকে পড়া যায় — R2 → T3 লিখলে T3 → R2-ও জানা।

Traceability-র শিকল

Forward: need → requirement → design → code → test; backward: the same links read upward

Traceability chain Stakeholder-এর চাহিদা দোকানি: বাকির ঝুঁকি কমাতে চাই Requirement R2 COD সর্বোচ্চ ৫০০০ টাকা Design D-pay · D-order Code payment.js · order.js · cart.js Test T3: ৫০০১ টাকায় COD বন্ধ Forward ↓ (সামনে) Backward ↑ (পেছনে)
ছবি ২৪.২ — একটি requirement-এর পুরো শিকল। নিচে নামলে (forward) দেখা যায় চাহিদাটি কোথায় বানানো আর যাচাই হলো; ওপরে উঠলে (backward) দেখা যায় কোনো কোড বা test কেন আছে। কোনো আংটা ভাঙা থাকলে — test নেই, বা test-এর মালিক requirement নেই — matrix সেটি দেখিয়ে দেয়।

Requirements traceability matrix (RTM)

Requirements traceability matrix (RTM) একটি টেবিল: প্রতিটি সারিতে একটি requirement, কলামে তার design, code আর test. Spreadsheet-এ, requirement টুলে, অথবা issue tracker আর Git-এর ID দিয়ে রাখা যায়। নিচের stepper-এ release ১-এর শুরুর matrix সারি ধরে ধরে তৈরি হচ্ছে।

  1. R1–R2paymentdesign → code → test
  2. R3–R4search · orderভাগাভাগি করা design
  3. R5test নেইforward ফাঁক
  4. উল্টো পথেT6 · T7অনাথ test
RTM: requirement → design → code → test
R1 wallet
R2 COD ≤ ৫০০০
R3 বাংলায় search
R4 order tracking
R5 পাঠানোর SMS
উল্টো যাচাই
  1. R1 — মোবাইল ওয়ালেট। নকশার অংশ D-pay, কোড payment.js, আর দুটি test: T1 (সফল payment) ও T2 (বাতিল payment). সারিটি সম্পূর্ণ।
  2. R2 — COD সর্বোচ্চ ৫০০০ টাকা। দুটি নকশার অংশ লাগে: D-pay (payment-এর ধরন) আর D-order (অর্ডারের মোট দাম)। তাই কোড তিনটি file-এ, test T3. খেয়াল করুন, D-pay এখন R1 আর R2 দুজনের — এই ভাগাভাগিই পরে impact analysis-এ গুরুত্বপূর্ণ।
  3. R3 — বাংলায় search. D-search → search.js → T4. সহজ এক-এক সংযোগ।
  4. R4 — order tracking. D-order → order.js, cart.js → T5. D-order এখন R2 আর R4-এর মধ্যে ভাগাভাগি।
  5. R5 — পাঠানোর সময় SMS. নকশা আর কোড আছে (D-notify, sms.js), কিন্তু কোনো test নেই। এটি forward traceability-র ফাঁক: release-এর আগে কেউ প্রমাণ করেননি যে SMS আসলে যায়।
  6. উল্টো পথে যাচাই। এবার প্রতিটি test থেকে requirement-এ যাওয়া। T6 এমন R9-কে যাচাই করে, যা গত মাসে বাতিল হয়েছে; T7-এর কোনো requirement-ই নেই। এগুলো orphan test বা অনাথ test — হয় মুছে ফেলার, নয়তো একটি না-লেখা requirement খুঁজে লেখার সংকেত।

একই matrix প্রোগ্রামে রাখলে দুটি কাজ স্বয়ংক্রিয় হয়: ফাঁক খোঁজা, আর impact analysis — একটি requirement বদলালে কোন নকশা, কোন file, অন্য কোন requirement আর কোন কোন test-এর ওপর প্রভাব পড়বে। ধরুন মালিক বললেন R2-এর সীমা ৫০০০ থেকে ৩০০০ টাকা হবে।

// Requirements traceability: requirement -> design -> code -> tests, both directions.
const reqs = {
  R1: { text: "customer pays by mobile wallet", design: ["D-pay"] },
  R2: { text: "cash on delivery up to 5000 tk", design: ["D-pay", "D-order"] },
  R3: { text: "search products in Bangla",     design: ["D-search"] },
  R4: { text: "track order status",            design: ["D-order"] },
  R5: { text: "SMS when order is shipped",     design: ["D-notify"] }
};
const code = { "D-pay": ["payment.js"], "D-order": ["order.js", "cart.js"],
               "D-search": ["search.js"], "D-notify": ["sms.js"] };
const tests = {                       // test id -> requirement ids it verifies
  T1: ["R1"], T2: ["R1"], T3: ["R2"], T4: ["R3"], T5: ["R4"], T6: ["R9"], T7: []
};
// forward: requirement -> tests; backward: test -> requirement
for (const [id, r] of Object.entries(reqs)) {
  const ts = Object.keys(tests).filter(t => tests[t].includes(id));
  const files = r.design.flatMap(d => code[d]);
  console.log(id + " " + r.design.join("+").padEnd(15) + files.join(",").padEnd(28) +
              (ts.length ? ts.join(",") : "NO TEST"));
}
const orphans = Object.keys(tests).filter(t => !tests[t].some(r => r in reqs));
console.log("orphan tests (no valid requirement): " + orphans.join(", "));
// impact analysis: requirement R2 changes (COD limit 5000 -> 3000 tk)
function impact(id) {
  const designs = reqs[id].design;
  const files = [...new Set(designs.flatMap(d => code[d]))];
  const shared = Object.keys(reqs).filter(o => o !== id &&
                   reqs[o].design.some(d => designs.includes(d)));
  const retest = Object.keys(tests).filter(t =>
                   tests[t].some(r => r === id || shared.includes(r)));
  console.log("change " + id + " -> design " + designs.join(",") + " | files " +
              files.join(",") + "\n  also touches " + shared.join(",") +
              " | re-run tests " + retest.join(","));
}
impact("R2");

আউটপুট:

R1 D-pay          payment.js                  T1,T2
R2 D-pay+D-order  payment.js,order.js,cart.js T3
R3 D-search       search.js                   T4
R4 D-order        order.js,cart.js            T5
R5 D-notify       sms.js                      NO TEST
orphan tests (no valid requirement): T6, T7
change R2 -> design D-pay,D-order | files payment.js,order.js,cart.js
  also touches R1,R4 | re-run tests T1,T2,T3,T5

প্রথম পাঁচ লাইন stepper-এর matrix-ই; R5-এর পাশে “NO TEST”. Backward যাচাইয়ে T6 (বাতিল R9) আর T7 (খালি তালিকা) অনাথ। Impact analysis দেখায়, R2-এর এক লাইনের পরিবর্তন তিনটি file ছোঁয়, আর একই নকশা ভাগ করার কারণে R1 আর R4-ও ঝুঁকিতে — তাই শুধু T3 নয়, T1, T2, T3, T5 চারটি test আবার চালাতে হবে। Matrix না থাকলে দল হয়তো শুধু T3 চালাত, আর order tracking-এ নতুন bug চোখ এড়িয়ে যেত। এটিই traceability-র সবচেয়ে বড় ব্যবহারিক লাভ: পরিবর্তনের খরচ অনুমান করার ভিত্তি।

কতটা traceability? চিকিৎসা যন্ত্র (IEC 62304), বিমান (DO-178C) বা রেলের সংকেতের মতো নিয়ন্ত্রিত ক্ষেত্রে requirement থেকে test পর্যন্ত প্রমাণযোগ্য traceability সাধারণত বাধ্যতামূলক বলে জানা যায় — পর্ব ০৪-এর V-model এই কারণেই সেখানে জনপ্রিয়। সাধারণ web দলে হালকা পথ যথেষ্ট হতে পারে: প্রতিটি user story-র একটি ID (যেমন SHOP-42), commit বার্তা আর pull request-এ সেই ID, আর test-এর নামে বা tag-এ সেই ID — তাহলে Git history আর CI রিপোর্ট থেকেই matrix বানানো যায়। Matrix হাতে হালনাগাদ রাখা কঠিন; যেটি নিজে থেকে তৈরি হয়, সেটিই টেকে।

৭ · Baseline আর change control

পরিবর্তন খারাপ নয় — বাজার বদলায়, আইন বদলায়, ব্যবহারকারী নতুন কিছু শেখেন। সমস্যা হলো নিয়ন্ত্রণহীন পরিবর্তন: কেউ করিডোরে developer-কে বললেন, developer বদলে দিলেন, test দল জানল না, দাম আর সময়ের হিসাব কেউ করল না। এর ওষুধ তিনটি ধারণা।

  • Baseline: review করে সবাই মিলে অনুমোদন দেওয়া requirement-এর একটি নির্দিষ্ট version, যা পরের কাজের ভিত্তি; এরপর এটি শুধু আনুষ্ঠানিক পথে বদলায়। পরীক্ষার খাতার খসড়া আর ফেয়ার কপির মতো — ফেয়ার কপিতে কাটাকাটি করতে হলে নিয়ম মেনে।
  • Change request (CR): baseline বদলানোর লিখিত অনুরোধ — কে চাইলেন, কী, কেন, কতটা জরুরি।
  • Change control board (CCB): যাঁরা CR-এর ওপর সিদ্ধান্ত দেন — ছোট দলে হয়তো product owner আর tech lead মাত্র দুজন, বড় চুক্তিতে গ্রাহক, ব্যবস্থাপক আর প্রধান প্রকৌশলীদের একটি কমিটি। Configuration management-এর মান IEEE 828 এই ধরনের নিয়ন্ত্রণের কাঠামো দেয়।

মুদি দোকানের app-এ release ১-এর দ্বিতীয় সপ্তাহে মালিক একটি নতুন অনুরোধ আনলেন। নিচের stepper অনুরোধটিকে জমা থেকে সিদ্ধান্ত পর্যন্ত নিয়ে যায়। পরিকল্পনা তখন §২-এর workshop-এর পঞ্চম ধাপের মতো — ৪০ ÷ ৪০, SMS-সহ; cart-এর বাড়তি খরচ তখনো দেখা দেয়নি।

  1. জমাCR-07কে, কী, কেন
  2. ImpactRTM দেখেfile, test, খরচ
  3. বিকল্পক খ গ ঘtrade-off
  4. CCBঅনুমোদনসিদ্ধান্ত লিখিত
  5. Baselinev1.0 → v1.1Git tag
CR-07-এর অবস্থা (কাল্পনিক মান)
অবস্থা
প্রভাব
খরচ
Release-এর হিসাব
  1. জমা। মালিক লিখলেন: “ঈদের আগের দুই সপ্তাহে গ্রাহক যেন delivery-র সময় (সকাল, বিকেল, সন্ধ্যা) বেছে নিতে পারেন — গত ঈদে একসাথে সব অর্ডার আসায় delivery ভেঙে পড়েছিল।” Issue tracker-এ এটি CR-07; কে চাইলেন, কী, কেন আর শেষ সময় (ঈদের দুই সপ্তাহ আগে) লেখা।
  2. প্রাথমিক বাছাই। এটি কি bug (বলা কথা না মানা), অস্পষ্টতা দূর করা, নাকি নতুন চাহিদা? Baseline-এ delivery slot নেই — তাই নতুন scope, নতুন requirement R6. খরচের প্রশ্ন উঠবেই।
  3. Impact analysis. RTM দেখে দল বের করল: অর্ডারের নকশা D-order বদলাবে আর নতুন D-slot লাগবে; file — order.js, cart.js আর নতুন slot.js; D-order ভাগাভাগি করে R2 আর R4, তাই T3 আর T5 আবার চালাতে হবে, আর নতুন T8 লিখতে হবে। মোট খরচ ৬ দিন। সরাসরি যোগ করলে ৪৬ দিন — বাজেট ৪০.
  4. বিকল্প। (ক) ৬ দিন সময় বাড়ানো — কিন্তু তাহলে release ঈদের পরে, slot-এর মূল্যই শেষ। (খ) Should-এর wallet (৮ দিন) release ২-এ সরিয়ে slot যোগ — হাতে ২ দিন বাঁচে। (গ) Could-এর SMS (৩ দিন) বাদ দিয়েও ৩ দিন বাড়তি লাগে। (ঘ) বাতিল — ঈদের ভিড়ের ঝুঁকি থেকে যায়।
  5. CCB-র সিদ্ধান্ত। মালিক আর tech lead বিকল্প (খ) বেছে নিলেন: R6 Must, wallet “Won't (release ২)”। তাঁরা সচেতনভাবে মেনে নিলেন যে Must-এর ভাগ এখন ৩০ ÷ ৪০ = ৭৫% — ৬০% নির্দেশনার বেশি; হাতে মাত্র ২ দিন আর ৩ দিনের SMS-কে Could রেখে নিরাপত্তা-জায়গা। সিদ্ধান্ত, তারিখ আর কারণ CR-এ লেখা হলো।
  6. Baseline হালনাগাদ। Requirement দলিল v1.0 থেকে v1.1, RTM-এ R6 → D-slot → slot.js → T8 যোগ, আর সব stakeholder-কে জানানো — বিশেষ করে wallet চাওয়া গ্রাহকদের। নিচের Git উদাহরণে দেখবেন, দলিল যদি Markdown file হয়, এই ধাপটি একটি commit আর একটি tag.

Requirement-কে Git-এ রাখা

Requirement দলিল Word file-এ থাকলে “কোন version-এ কী বদলেছিল” বের করা কঠিন। সাধারণ লেখার ফরম্যাট Markdown-এ রাখলে মডিউল ২–৩-এর সব হাতিয়ার কাজে লাগে: git diff দিয়ে পার্থক্য (পর্ব ০৯, history আর পার্থক্য দেখা), pull request-এ review মানেই requirement review (পর্ব ১৬, pull request আর fork), আর annotated tag দিয়ে baseline (পর্ব ১৮, ভালো commit, tag আর release). নিচের উদাহরণ একটি নতুন repository-তে তৈরি, Git ২.৫৩-এ।

$ git add docs/requirements.md
$ git commit -q -m "docs(req): baseline requirements for release 1"
$ git tag -a req-v1.0 -m "Requirements baseline v1.0"
# CR-07 অনুমোদনের পরে docs/requirements.md বদলানো হলো
$ git commit -q -am "docs(req): apply CR-07, add delivery slot, move wallet to release 2" -m "Approved by CCB on 2026-01-15. Refs: CR-07"
$ git tag -a req-v1.1 -m "Requirements baseline v1.1"
$ git log --oneline --decorate
f1a9e14 (HEAD -> main, tag: req-v1.1) docs(req): apply CR-07, add delivery slot, move wallet to release 2
236f0b8 (tag: req-v1.0) docs(req): baseline requirements for release 1
$ git diff req-v1.0 req-v1.1
diff --git a/docs/requirements.md b/docs/requirements.md
index 28270db..4d4e43d 100644
--- a/docs/requirements.md
+++ b/docs/requirements.md
@@ -2,7 +2,8 @@

 | ID | Requirement | MoSCoW | Tests |
 |----|-------------|--------|-------|
-| R1 | Pay by mobile wallet | Should | T1, T2 |
+| R1 | Pay by mobile wallet | Won't (release 2) | T1, T2 |
 | R2 | Cash on delivery up to 5000 tk | Must | T3 |
 | R3 | Search products in Bangla | Must | T4 |
 | R4 | Track order status | Should | T5 |
+| R6 | Choose a delivery slot before Eid (CR-07) | Must | T8 |
$ git diff --word-diff req-v1.0 req-v1.1
…
| R1 | Pay by mobile wallet | [-Should-]{+Won't (release 2)+} | T1, T2 |
| R2 | Cash on delivery up to 5000 tk | Must | T3 |
| R3 | Search products in Bangla | Must | T4 |
| R4 | Track order status | Should | T5 |
{+| R6 | Choose a delivery slot before Eid (CR-07) | Must | T8 |+}
$ git log --oneline --grep=CR-07
f1a9e14 docs(req): apply CR-07, add delivery slot, move wallet to release 2

দুটি commit, দুটি annotated tag: req-v1.0 আর req-v1.1. git diff req-v1.0 req-v1.1 ঠিক CCB-র সিদ্ধান্তটিই দেখায় — R1-এর MoSCoW বদল আর নতুন R6. --word-diff সারির ভেতরে শুধু বদলানো শব্দটি [-…-]{+…+} চিহ্নে দেখায় — টেবিলের মতো লম্বা লাইনে এটি পড়া সহজ। Commit বার্তায় “Refs: CR-07” থাকায় যেকোনো সময় backward traceability পাওয়া যায়: git log --grep=CR-07. বড় দলে এই file-এর ওপর branch protection আর CODEOWNERS (পর্ব ১৬) দিয়ে নিয়ম করা যায় — CCB-র অনুমোদন ছাড়া merge নয়।

৮ · Scope creep, gold-plating আর volatility

Scope creep মানে project-এর পরিধি ধীরে ধীরে, নিয়ন্ত্রণ ছাড়া বেড়ে যাওয়া — প্রতিটি ছোট “এটাও একটু করে দিন” আলাদাভাবে নিরীহ, কিন্তু সময়, বাজেট বা অগ্রাধিকার না বদলে সব একসাথে project ডোবায়। লক্ষ্য করুন, CR-07 scope creep নয়: এটি লিখিত হয়েছে, প্রভাব মাপা হয়েছে, বিনিময়ে wallet সরেছে। পার্থক্য পরিবর্তনের আকারে নয়, পথে.

বৈধ পরিবর্তনScope creepGold-plating
কে আনেনStakeholder, CR দিয়েStakeholder, অনানুষ্ঠানিকভাবেদল নিজেই
প্রভাব মাপা হয়?হ্যাঁ — impact analysisনানা
সময়-বাজেট বদলায়?হ্যাঁ, বা অন্য কিছু সরেনা — “একই সময়ে”না — চুপচাপ
উদাহরণCR-07: slot যোগ, wallet সরল“Search-এ ছবি দিয়েও খোঁজা গেলে ভালো হয়” — করিডোরে বলাDeveloper নিজে থেকে dark mode আর animation যোগ করলেন

Gold-plating শুনতে নিরীহ — “বাড়তি কাজই তো করেছি” — কিন্তু এর দাম আছে: সময় যায় চাওয়া কাজ থেকে, নতুন কোডে নতুন bug, আর কেউ test-এর পরিকল্পনা করেননি (traceability matrix-এ এর কোনো requirement নেই — backward traceability এটি ধরে)। ভালো ধারণা থাকলে সেটি CR হিসেবে জমা দিন, নিজে নিজে বানাবেন না।

Requirement volatility — পরিবর্তন মাপা

কতটা পরিবর্তন “বেশি”? একটি প্রচলিত metric হলো requirement volatility:

Volatility = (যোগ + বাদ + বদল) ÷ সময়ের শুরুতে মোট requirement

সংজ্ঞা উৎসভেদে একটু আলাদা — কেউ ভাগ করেন baseline-এর মোট দিয়ে, কেউ সময়ের শেষের মোট দিয়ে, কেউ বদলের আকার অনুযায়ী ওজন দেন। যেটিই নিন, পুরো project-এ একই সংজ্ঞা রাখুন; তবেই প্রবণতা তুলনা করা যায়। নিচের প্রোগ্রামে ৪০টি requirement-এর baseline নিয়ে ছয়টি sprint-এর পরিবর্তন seeded PRNG দিয়ে তৈরি; চতুর্থ sprint-এ মালিকের নতুন একটি ধারণা আসে, তাই সেখানে বেশি যোগ-বদলের সুযোগ রাখা হয়েছে। ২০%-এর সতর্ক-রেখা দলের নিজের ঠিক করা, কোনো মান নয়।

// Requirements volatility per sprint = (added + deleted + modified) / total at sprint start.
let seed = 24; function rand() {   // mulberry32: small seeded PRNG
  seed = (seed + 0x6D2B79F5) | 0; let t = Math.imul(seed ^ (seed >>> 15), 1 | seed);
  t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t; return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
}
const pick = max => Math.floor(rand() * (max + 1));      // whole number 0..max
let total = 40;                                          // baseline: 40 requirements
const ALERT = 0.20;                                      // team's own warning line
console.log("sprint start  +add -del ~mod  volatility");
const vols = [];
for (let s = 1; s <= 6; s++) {
  const big = s === 4;                                   // sprint 4: owner's new idea
  const added = pick(big ? 8 : 3), deleted = pick(2), modified = pick(big ? 6 : 4);
  const v = (added + deleted + modified) / total;
  vols.push(v);
  console.log(String(s).padStart(4) + String(total).padStart(7) +
    String(added).padStart(6) + String(deleted).padStart(5) + String(modified).padStart(5) +
    (" " + (v * 100).toFixed(1) + "%").padStart(10) + (v > ALERT ? "  <- above 20%" : ""));
  total += added - deleted;
}
const avg = vols.reduce((a, b) => a + b, 0) / vols.length;
console.log("final total " + total + ", average volatility " + (avg * 100).toFixed(1) + "%");

আউটপুট:

sprint start  +add -del ~mod  volatility
   1     40     1    2    1     10.0%
   2     39     0    1    0      2.6%
   3     38     1    1    4     15.8%
   4     38     7    1    2     26.3%  <- above 20%
   5     44     0    1    3      9.1%
   6     43     1    2    4     16.3%
final total 42, average volatility 13.3%

Sprint ১: (১ + ২ + ১) ÷ ৪০ = ১০%. Sprint ৪: (৭ + ১ + ২) ÷ ৩৮ ≈ ২৬.৩% — সতর্ক-রেখার ওপরে, ঠিক যেখানে মালিকের নতুন ধারণা এসেছে। “বদল” মোট সংখ্যা বদলায় না, শুধু যোগ আর বাদ বদলায় — তাই sprint ৫ শুরু হয় ৩৮ + ৭ − ১ = ৪৪-এ। গড় ১৩.৩%. সংখ্যাটির কাজ শাস্তি দেওয়া নয়, প্রশ্ন তোলা: sprint ৪-এ কি নতুন কোনো বাজার-সুযোগ এসেছিল, নাকি elicitation-এ কিছু বাদ পড়েছিল (পর্ব ২০)? উঁচু volatility অনুমান আর পরিকল্পনার ঝুঁকি বাড়ায়; risk register-এ এটি কীভাবে ধরবেন, তা পর্ব ৬২-তে আসবে।

আরও গভীরে: ISO/IEC/IEEE 29148:2018 requirement engineering-এর প্রক্রিয়া, ভালো requirement-এর গুণ আর SRS-এর মতো দলিলের কাঠামো দেয়; SWEBOK-এর requirements অধ্যায় প্রায় একই বিষয়গুলো (prioritization, validation, traceability, change management) সাজায়। Gotel ও Finkelstein (১৯৯৪) traceability-কে requirement দলিলের আগের অংশ (pre-RS: চাহিদা কোথা থেকে এল) আর পরের অংশ (post-RS: কোথায় গেল) — দুই ভাগে দেখান, আর বলেন বেশিরভাগ সমস্যা আগের অংশে। Karl Wiegers ও Joy Beatty-র Software Requirements (৩য় সংস্করণ, ২০১৩) আর Gojko Adzic-এর Specification by Example (২০১১) এই পর্বের ব্যবহারিক দিকের ভালো সঙ্গী।

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

  • MoSCoW-এর চারটি অক্ষর কী বোঝায়? — Must, Should, Could, Won't (this time); DSDM-এ Must সাধারণত কাজের ৬০%-এর মধ্যে।
  • Reach ২০০০, impact ১, confidence ৮০%, effort ২ — RICE কত? — ২০০০ × ১ × ০.৮ ÷ ২ = ৮০০।
  • Requirement-এর verification আর validation-এর পার্থক্য কী? — verification: লেখাটি ভালো মানের ও সামঞ্জস্যপূর্ণ কি না; validation: আসল প্রয়োজন ধরেছে কি না।
  • Forward আর backward traceability কী? — requirement থেকে design, code, test-এ যাওয়া; আর উল্টো দিকে test বা code থেকে requirement-এ ফেরা।
  • Scope creep আর gold-plating-এর পার্থক্য কী? — scope creep stakeholder-এর নিয়ন্ত্রণহীন চাহিদা-বৃদ্ধি; gold-plating দলের নিজে থেকে না-চাওয়া feature যোগ।

৯ · Agile-এ requirement management

Agile দলে “requirement management” শব্দটি কম শোনা যায়, কিন্তু কাজগুলো আছে — শুধু রূপ আলাদা। Agile Manifesto-র একটি নীতিই বলে, development-এর দেরির ধাপেও বদলাতে থাকা চাহিদাকে স্বাগত জানান। তাই প্রশ্নটি “পরিবর্তন ঠেকাব কীভাবে” নয়, “পরিবর্তন সস্তা রাখব কীভাবে”।

কাজপ্রথাগত (দলিল-ভিত্তিক)Agile-এ
Requirement-এর ঘরSRS দলিল, baselineProduct Backlog — জীবন্ত, ক্রম অনুযায়ী সাজানো তালিকা (পর্ব ০৫)
অগ্রাধিকারশুরুতে একবার, পরে CR দিয়েProduct Owner প্রতিনিয়ত ক্রম বদলান; MoSCoW, WSJF ইত্যাদি এখানেও চলে
বিস্তারিত করাশুরুতেই সবBacklog refinement — যা শীঘ্রই আসবে শুধু সেটি বিস্তারিত
Validationদলিলের reviewপ্রতি Sprint Review-তে কাজ করা software দেখানো
Specificationলেখা বাক্যAcceptance criteria আর acceptance test — চালানো যায় এমন উদাহরণ
Change controlCCBSprint চলাকালে Sprint Goal রক্ষা; নতুন চাহিদা backlog-এ যায়, পরের Sprint Planning-এ সিদ্ধান্ত

Acceptance test-ই specification: পর্ব ২২-এর Given-When-Then আকারের acceptance criteria যদি স্বয়ংক্রিয় test হয়ে চলে, তবে সেগুলো একই সাথে requirement, test আর traceability-র link — একটি test ফেল করলে ঠিক কোন চাহিদা ভাঙল, তা নাম থেকেই বোঝা যায়। Gojko Adzic এই চর্চাকে বলেছেন specification by example. TDD আর BDD-তে এর কৌশল আসবে পর্ব ৪৮-এ।

“আমরা Agile, তাই documentation লাগে না” — এটি ভুল পড়া। Manifesto বলে কাজ করা software-কে বেশি মূল্য দিন বিস্তারিত দলিলের চেয়ে, দলিলকে মূল্যহীন বলে না। নিয়ন্ত্রিত ক্ষেত্রে Agile দলও traceability রাখে — শুধু হাতে নয়, story ID, commit, test আর CI রিপোর্ট জুড়ে স্বয়ংক্রিয়ভাবে।

১০ · AI-এর যুগে requirement management

AI এখন একটি meeting-এর নোট থেকে user story, acceptance criteria, এমনকি traceability matrix পর্যন্ত বানিয়ে দিতে পারে। এতে সময় বাঁচে, কিন্তু এই কাজে AI-এর ভুলগুলো খুব বিশ্বাসযোগ্য দেখায়।

AI-এর সাধারণ ভুলকীভাবে ধরবেন
RICE বা WSJF-এর নম্বর নিজে বানিয়ে, তারপর ভুল গুণ-ভাগপ্রতিটি নম্বরের উৎস জিজ্ঞেস করুন; সূত্রটি নিজে বা ছোট প্রোগ্রামে আবার চালান
ভুল ইতিহাস: “MoSCoW Scrum-এর অংশ”, ভুল বছর বা লেখকDSDM/Clegg, Kano ১৯৮৪, Reinertsen ২০০৯ — নির্ভরযোগ্য উৎসে মিলিয়ে নিন
বাতিল মানকে চলতি বলা (যেমন শুধু IEEE 830), বা মানের ধারা বানানোISO/IEEE-র অফিসিয়াল catalogue-এ সংস্করণ দেখুন
এমন test লেখে যা requirement-কে শুধু আবার বলে, আসলে কিছু যাচাই করে নাTest-টি ইচ্ছা করে ভুল কোডে চালান — ফেল না করলে test অকেজো
Traceability matrix-এ বানানো link — “সব requirement test-এ ঢাকা”প্রতিটি link-এর test সত্যিই আছে কি না repository-তে খুঁজুন; CI রিপোর্টের সাথে মেলান

Meeting-এর নোট থেকে requirement সাজাতে AI-কে এভাবে কাজ দিন — নোট থেকে গ্রাহকের নাম, ফোন নম্বর আর চুক্তির গোপন অংশ আগে মুছে নিন:

নিচে একটি কাল্পনিক মুদি দোকানের app নিয়ে মালিকের সাথে আলোচনার নোট দিলাম (ব্যক্তিগত তথ্য মুছে দেওয়া)। ১. নোট থেকে requirement-গুলো আলাদা করো; প্রতিটিতে একটি ID দাও আর পাশে লেখো নোটের কোন বাক্য থেকে এসেছে। নোটে নেই এমন কোনো requirement যোগ করবে না; কিছু অনুমান করলে আলাদা "অনুমান" তালিকায় লেখো। ২. প্রতিটি requirement ISO/IEC/IEEE 29148-এর গুণ (unambiguous, singular, verifiable ইত্যাদি) মেনে চলে কি না দেখো, আর অস্পষ্ট শব্দ চিহ্নিত করো। ৩. প্রতিটির জন্য Given-When-Then আকারে অন্তত একটি acceptance test লেখো, সীমার মানসহ। ৪. MoSCoW প্রস্তাব করো, কিন্তু প্রতিটি সিদ্ধান্তের পাশে কারণ লেখো আর বলো কোন তথ্য জানলে সিদ্ধান্ত বদলাবে। RICE বা WSJF-এর কোনো নম্বর নিজে বানাবে না — কোন নম্বর আমাকে দিতে হবে, তার তালিকা দাও।

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

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

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

প্র ০১MoSCoW workshop-এ প্রায় সবকিছু কেন “Must” হয়ে যায়, আর DSDM-এর ৬০% নির্দেশনা এর বিরুদ্ধে কীভাবে কাজ করে?

কারণটি মূলত মানুষের মনস্তত্ত্ব, পদ্ধতির দোষ নয়।

  • ক্ষতির ভয়: stakeholder-রা জানেন, “Should” বা “Could” মানে হয়তো কখনোই হবে না। নিজের চাহিদা রক্ষার সবচেয়ে নিরাপদ পথ তাই সবকিছুকে Must বলা। অনেক প্রতিষ্ঠানে আগের অভিজ্ঞতাও এটি শেখায় — একবার বাদ পড়া feature আর ফেরেনি।
  • সময়ের ভিত্তি অস্পষ্ট: “পুরো product-এ wallet লাগবেই” — সত্য। কিন্তু প্রশ্ন ছিল “প্রথম release-এ ছাড়া কি চলবে?” প্রশ্ন ভুলভাবে বললে উত্তরও ভুল আসে।
  • খরচ চোখে না পড়া: অনুমান টেবিলে না থাকলে সব Must-এর যোগফল যে বাজেট ছাড়িয়ে যাচ্ছে, তা কেউ দেখেন না।

DSDM-এর নির্দেশনা — Must মোট কাজের প্রায় ৬০%-এর বেশি নয়, বাকিটা Should ও Could — দুইভাবে সাহায্য করে। প্রথমত, এটি একটি বাইরের সীমা দেয়: “আপনার চাহিদা খারাপ নয়, কিন্তু Must-এর ঝুড়ি ভরে গেছে; কোনটি সরাবেন?” তর্ক তখন ব্যক্তি থেকে সরে সংখ্যায় যায়। দ্বিতীয়ত, এটি অনুমানের ভুলের জন্য বিমার মতো কাজ করে — Could-এর কাজগুলো এমন জায়গা, যা দরকার হলে ছেড়ে দিয়ে Must রক্ষা করা যায়, ঠিক যেমন stepper-এ cart-এর তিন দিন বাড়তি লাগায় SMS বাদ গেল। DSDM-এর আরেকটি চিন্তা এখানে জোড়া: সময় আর খরচ স্থির, পরিধি নমনীয় — পর্ব ০৪-এর timebox-এর মতো।

তবে ৬০% সংখ্যাটি কোনো প্রাকৃতিক নিয়ম নয়; খুব স্থির, পরিচিত কাজে দল হয়তো বেশি Must নিতে পারে, আর খুব অনিশ্চিত কাজে আরও কম নেওয়াই নিরাপদ। CR-07-এর ক্ষেত্রে CCB সচেতনভাবে ৭৫%-এ গেল — নিয়ম ভাঙা নয়, ঝুঁকি জেনে সিদ্ধান্ত।

মূল উপলব্ধি: অগ্রাধিকারের পদ্ধতির আসল কাজ মানুষের ভয় আর অস্পষ্টতাকে প্রকাশ্যে আনা; নির্দিষ্ট সীমা আর স্পষ্ট সময়ের ভিত্তি দিলে “সবই Must”-এর তর্ক সংখ্যার আলোচনায় পরিণত হয়।

প্র ০২Kano model বলে আজকের delighter কাল মৌলিক প্রত্যাশা হয়ে যায়। Product-এর পরিকল্পনায় এর অর্থ কী?

Kano ও সহকর্মীরা শুরু থেকেই লক্ষ করেছিলেন যে শ্রেণিগুলো স্থির নয় — পরে অনেক লেখায় একে quality-র “life cycle” বলা হয়েছে। প্রথমবার যখন কোনো পণ্যে নতুন কিছু আসে, গ্রাহক অবাক হন; কয়েক বছর পরে সবার কাছে থাকলে সেটি না থাকাই অভিযোগের কারণ।

দৈনন্দিন উদাহরণ ভাবুন। একসময় মোবাইল ফোনে ক্যামেরা ছিল চমক; আজ ক্যামেরা ছাড়া ফোন প্রায় অকল্পনীয় — must-be. অনলাইনে কেনাকাটায় অর্ডার নিশ্চিত হওয়ার SMS একসময় বাড়তি সুবিধা মনে হতো; এখন না এলে গ্রাহক ভাবেন অর্ডার হয়নি। ক্যামেরার মান অবশ্য এখনো performance — যত ভালো, তত খুশি। একই feature-এর ভেতরে বিভিন্ন দিক বিভিন্ন শ্রেণিতে থাকতে পারে।

পরিকল্পনায় এর তিনটি অর্থ:

  • Kano জরিপ পুরোনো হয়: দুই বছর আগের ফল আজ ভুল হতে পারে। শ্রেণিগুলো নির্দিষ্ট গ্রাহক-দল আর নির্দিষ্ট সময়ের জন্য; শহর আর গ্রামের গ্রাহক, নতুন আর অভিজ্ঞ ব্যবহারকারী আলাদা উত্তর দিতে পারেন।
  • Must-be-র তালিকা বাড়তে থাকে: প্রতিযোগীরা যা দেয়, তা ধীরে ধীরে আপনার must-be হয়ে যায়। শুধু must-be মেটালে অভিযোগ কমে, কিন্তু কেউ আপনাকে বেছে নেওয়ার কারণ পান না।
  • নতুন delighter খোঁজা চলমান কাজ: গ্রাহক সাধারণত delighter চেয়ে বলেন না — তাঁরা জানেন না যে এটি সম্ভব। তাই এগুলো আসে পর্যবেক্ষণ, prototype আর পরীক্ষা থেকে (পর্ব ২০-এর elicitation-এর কৌশল), সরাসরি প্রশ্নের উত্তর থেকে কম।

আরেকটি সূক্ষ্ম কথা: delighter-এ বেশি ভরসা করলে বিপদ। অনেক চমক যোগ করে must-be-তে ফাঁক রাখলে (ভুল দাম, অর্ডার হারানো) কোনো চমকেই গ্রাহক ফেরেন না। Kano-র ছবি এটিই দেখায় — লাল রেখা নিচে যতটা নামে, সবুজ রেখা ওপরে উঠে তা পূরণ করে না।

মূল উপলব্ধি: Requirement-এর অগ্রাধিকার একটি মুহূর্তের ছবি, চিরস্থায়ী সত্য নয়; গ্রাহকের প্রত্যাশা বদলায়, তাই prioritization-ও একটি নিয়মিত, পুনরাবৃত্ত কাজ।

প্র ০৩RICE বা WSJF-এর মতো সংখ্যার সূত্র কি সিদ্ধান্তকে নিরপেক্ষ করে? নাকি শুধু নিরপেক্ষ দেখায়?

সূত্র সিদ্ধান্তকে স্পষ্ট করে — কিন্তু নিজে থেকে নিরপেক্ষ করে না। কারণগুলো দেখুন।

  • ইনপুট মতামতই: Impact “২” না “৩”, time criticality “১৩” না “২০” — এগুলো মানুষের অনুমান। দশমিক পর্যন্ত লেখা স্কোর (৯৬০, ১০.৩৩) মিথ্যা নির্ভুলতার অনুভূতি দেয়। ইনপুটের সামান্য বদলে ক্রম উল্টে যেতে পারে: অনুশীলন ১-এ B-এর confidence ৫০% থেকে ১০০% করলেই সেটি ৭৫০ থেকে ১৫০০-তে উঠে প্রথম হয়।
  • যা মাপা হয়, তা নিয়েই খেলা হয়: অর্থনীতিবিদ Charles Goodhart-এর নামে প্রচলিত একটি পর্যবেক্ষণ আছে — কোনো মাপকে লক্ষ্য বানালে সেটি আর ভালো মাপ থাকে না। কেউ জানলে যে reach বেশি দেখালেই feature ওপরে ওঠে, reach-এর অনুমানও ফুলে ওঠে।
  • সূত্রের ভেতরেই মূল্যবোধ: RICE সংখ্যাগরিষ্ঠের লাভকে পুরস্কৃত করে; reach কম বলে দৃষ্টি-প্রতিবন্ধী ব্যবহারকারীর জন্য accessibility feature নিচে পড়ে যেতে পারে, অথচ সেটি হয়তো আইনি বা নৈতিক must. WSJF জরুরিতাকে পুরস্কৃত করে, তাই দীর্ঘমেয়াদি কিন্তু অ-জরুরি কাজ (যেমন technical debt কমানো) সবসময় পিছিয়ে যেতে পারে।

তাহলে সূত্র কেন? কারণ বিকল্প — খোলাখুলি না বলা অনুমান আর HiPPO — আরও খারাপ। সূত্র অনুমানগুলো লিখতে বাধ্য করে, আর লেখা অনুমান নিয়ে তর্ক করা যায়। ভালো অভ্যাস:

  • কয়েকজন আলাদাভাবে নম্বর দিন, তারপর বড় অমিলগুলো নিয়ে আলোচনা — planning poker-এর মতো (পর্ব ৬০)।
  • দুটি পদ্ধতি পাশাপাশি চালান; যেখানে দুটি একমত, সেখানে দ্রুত সিদ্ধান্ত, যেখানে অমিল (প্রোগ্রামের F3, F5, F8) সেখানে মনোযোগ।
  • নীতিগত বা আইনি বাধ্যবাধকতাকে স্কোরের বাইরে রাখুন — আগে থেকেই Must.
  • সিদ্ধান্তের পরে ফল মিলিয়ে দেখুন: অনুমান করা reach আর আসল ব্যবহার কতটা মিলল? এতে পরের অনুমান ভালো হয়।

মূল উপলব্ধি: অগ্রাধিকারের সূত্র বিচারকের আসন নয়, আলোচনার টেবিল; এর মূল্য নম্বরে নয়, নম্বরের পেছনের লেখা যুক্তি আর অমিলের জায়গা চিনিয়ে দেওয়ায়।

প্র ০৪নিয়ন্ত্রিত ক্ষেত্রে traceability matrix প্রায় বাধ্যতামূলক, অথচ অনেক web দল একে অপ্রয়োজনীয় আমলাতন্ত্র মনে করে। দুই পক্ষের যুক্তি কী, আর মাঝামাঝি পথ কোথায়?

দুই পক্ষই আংশিক ঠিক, কারণ ভুলের দাম দুই জায়গায় খুব আলাদা।

নিয়ন্ত্রিত ক্ষেত্রের যুক্তি: ওষুধ দেওয়ার pump, বিমানের নিয়ন্ত্রণ বা রেলের সংকেতের software-এ একটি না-যাচাই করা requirement প্রাণ নিতে পারে। চিকিৎসা যন্ত্রের software-এর মান IEC 62304 বা বিমানের DO-178C-র মতো নির্দেশনা সাধারণত প্রমাণ চায় যে প্রতিটি requirement নকশা, কোড আর test-এ পৌঁছেছে, আর উল্টো দিকে প্রতিটি কোডের পেছনে একটি requirement আছে — যাতে লুকানো, অপরীক্ষিত আচরণ না থাকে। পর্ব ০৪-এর V-model-এর জোড়াগুলো এই প্রমাণের কাঠামো। নিরীক্ষক (auditor) matrix দেখেই প্রশ্ন করেন।

Web দলের যুক্তি: সপ্তাহে কয়েকবার release হয়, requirement প্রতিদিন বদলায়, ভুলের দাম সাধারণত একটি দ্রুত rollback. হাতে রাখা spreadsheet-matrix এক মাসেই বাস্তবের সাথে মেলে না — আর ভুল matrix না থাকার চেয়েও খারাপ, কারণ মিথ্যা নিশ্চয়তা দেয়। তাঁদের অভিযোগ আসলে হাতে রাখা matrix নিয়ে, traceability-র ধারণা নিয়ে নয়।

মাঝামাঝি পথ — traceability-কে কাজের উপজাত বানানো:

  • প্রতিটি story বা requirement-এর স্থায়ী ID, issue tracker-এ।
  • Branch-এর নাম, commit বার্তা আর pull request-এ সেই ID (পর্ব ১৬ ও ১৮-এর অভ্যাস); অনেক platform ID দেখে issue আর PR জুড়ে দেয়।
  • Acceptance test-এর নামে বা tag-এ ID; CI প্রতিবার রিপোর্ট দেয় কোন ID-র test পাস করল।
  • একটি ছোট script এগুলো থেকে matrix বানায় — এই পর্বের প্রোগ্রামের মতো — আর test-হীন requirement বা অনাথ test পেলে সতর্ক করে।

এভাবে নিয়ন্ত্রিত ক্ষেত্রের দলও Agile-এ কাজ করতে পারে, আর web দলও ঝুঁকিপূর্ণ অংশে (payment, ব্যক্তিগত তথ্য) প্রমাণ রাখতে পারে। কতটা গভীরে যাবেন — শুধু requirement → test, নাকি design ও code-ও — তা ঠিক করুন ভুলের দাম দেখে।

মূল উপলব্ধি: Traceability-র মূল্য নির্ভর করে ভুলের দামের ওপর, আর এর খরচ নির্ভর করে এটি হাতে রাখা হয় নাকি কাজের ধারা থেকে নিজে তৈরি হয় তার ওপর।

প্র ০৫Requirement বদলানো কি project-এর ব্যর্থতার লক্ষণ? Fixed-price চুক্তি আর Agile Manifesto-র “পরিবর্তনকে স্বাগত” — দুটি কীভাবে মেলাবেন?

পরিবর্তন নিজে ব্যর্থতা নয়; বরং যে software ব্যবহার হয়, সেটি বদলাবেই। ১৯৭০-এর দশক থেকে Meir Lehman বড় system-এর বিবর্তন নিয়ে যে পর্যবেক্ষণগুলো দেন (পর্ব ৪৩-এ Lehman-এর সূত্র দেখবেন), তার মূল কথা — বাস্তব জগতে ব্যবহৃত software-কে নিয়মিত বদলাতে হয়, নইলে ধীরে ধীরে কম কাজের হয়ে পড়ে। ব্যবহারকারী software হাতে পেয়ে নতুন কিছু শেখেন, আর সেই শেখা থেকেই নতুন চাহিদা আসে।

ব্যর্থতার লক্ষণ হলো তিনটি জিনিস: (১) পরিবর্তনের প্রভাব না মেপে গ্রহণ — scope creep; (২) পরিবর্তনকে পুরোপুরি ঠেকানো — তখন চুক্তি মেনে এমন জিনিস তৈরি হয়, যা কেউ চান না; (৩) একই ধরনের পরিবর্তন বারবার আসা, যা দেখায় elicitation-এ (পর্ব ২০) কিছু বাদ পড়েছিল। Volatility metric এখানে কাজে লাগে — শুধু সংখ্যা নয়, পরিবর্তনের কারণ লিখে রাখলে বোঝা যায় কোনটি বাজার থেকে আর কোনটি নিজেদের ভুল থেকে।

Fixed-price চুক্তিতে এই দ্বন্দ্ব সবচেয়ে তীব্র। কয়েকটি প্রচলিত মিটমাট:

  • চুক্তিতেই change control: CR-এর পদ্ধতি, কে CCB-তে থাকবেন আর দাম কীভাবে ঠিক হবে — শুরুতেই লেখা। তখন পরিবর্তন বিবাদ নয়, পদ্ধতি।
  • অদলবদলের নিয়ম: সমান আকারের নতুন কাজ আনলে পুরোনো একটি কাজ সরে — CR-07-এ wallet সরার মতো। এতে দাম আর সময় স্থির থাকে, পরিধি নমনীয়।
  • পর্যায়ভিত্তিক চুক্তি: প্রথম পর্যায়ে ছোট, স্থির-দামের একটি অংশ; তার অভিজ্ঞতা দেখে পরের পর্যায়ের দাম — পর্ব ০৪-এর incremental চিন্তা।
  • MoSCoW চুক্তির ভাষায়: Must-এর অঙ্গীকার দৃঢ়, Could-এর অঙ্গীকার “যদি সময় থাকে” — DSDM-এর মূল চিন্তা।

Agile Manifesto-ও পরিবর্তনকে বিনা মূল্যে বলে না; সে বলে প্রক্রিয়া এমন রাখুন যাতে পরিবর্তন সস্তা হয় — ছোট release, স্বয়ংক্রিয় test, পরিষ্কার নকশা। পরের মডিউলে coupling আর cohesion (পর্ব ২৫) দিয়ে শুরু করে দেখবেন, নকশার মান কীভাবে পরিবর্তনের খরচ ঠিক করে।

মূল উপলব্ধি: পরিবর্তন অনিবার্য; পেশাদারি মানে পরিবর্তন ঠেকানো নয়, বরং প্রতিটি পরিবর্তনের দাম দৃশ্যমান করা আর সস্তা রাখার মতো প্রক্রিয়া ও নকশা গড়া।

অনুশীলন

হিসাব, পরিস্থিতি সামলানো, আউটপুট অনুমান আর সমালোচনা — চারটিই পরীক্ষা ও ইন্টারভিউর ধরনের।

  1. RICE আর WSJF হিসাব: একটি কাল্পনিক ফার্মেসি app-এর তিনটি feature. A — প্রেসক্রিপশনের ছবি upload: reach ২০০০, impact ১, confidence ৮০%, effort ২; business value ৫, time criticality ৩, risk reduction ২, job size ৩. B — রাতের জরুরি delivery: reach ৫০০, impact ৩, confidence ৫০%, effort ১; ৮, ১৩, ৫, job size ৫. C — স্বাস্থ্য-টিপসের blog: reach ৪০০০, impact ০.৫, confidence ১০০%, effort ৪; ৩, ২, ১, job size ৮. দুই পদ্ধতিতে স্কোর আর ক্রম বের করুন। B-এর confidence ১০০% হলে RICE-এর ক্রম কী হবে?

    RICE: A = ২০০০ × ১ × ০.৮ ÷ ২ = ৮০০; B = ৫০০ × ৩ × ০.৫ ÷ ১ = ৭৫০; C = ৪০০০ × ০.৫ × ১ ÷ ৪ = ৫০০. ক্রম: A → B → C.

    WSJF: A = (৫ + ৩ + ২) ÷ ৩ = ৩.৩৩; B = (৮ + ১৩ + ৫) ÷ ৫ = ৫.২০; C = (৩ + ২ + ১) ÷ ৮ = ০.৭৫. ক্রম: B → A → C.

    অমিলের কারণ: B-এর time criticality ১৩ — রাতের জরুরি ওষুধ দেরিতে পৌঁছালে মূল্য নেই; RICE এটি ধরে না, আর B-এর কম confidence (৫০%) RICE-এ শাস্তি দেয়। Confidence ১০০% হলে B-এর RICE = ৫০০ × ৩ × ১ ÷ ১ = ১৫০০, ক্রম B → A → C — দুই পদ্ধতি তখন একমত। শিক্ষা: অমিলটি এসেছে মূলত অনিশ্চয়তা থেকে; তাই আগে একটি ছোট পরীক্ষা (যেমন এক এলাকায় এক মাস রাতের delivery) চালিয়ে confidence বাড়ানো একটি যুক্তিসঙ্গত পরের ধাপ। C দুই পদ্ধতিতেই শেষে।

  2. এই change request সামলান: মুদি দোকানের app-এর release ১-এর তৃতীয় সপ্তাহ। পরিকল্পনা CR-07-এর পরের অবস্থায়: মোট ৩৮ ÷ ৪০ দিন, হাতে ২ দিন। মালিকের ভাই (একজন stakeholder) সরাসরি একজন developer-কে WhatsApp-এ বললেন, “১০০০ টাকার বেশি অর্ডারে delivery ফ্রি করা যায় না? এটা তো এক লাইনের কাজ।” Developer কাজটি শুরু করবেন কি? সঠিক পথ ধাপে ধাপে লিখুন, আর সম্ভাব্য সিদ্ধান্তগুলো বলুন।

    না — সরাসরি শুরু করলেই scope creep. সঠিক পথ:

    1. CR হিসেবে লিখুন: developer ভদ্রভাবে জানান যে অনুরোধটি issue tracker-এ CR-08 হিসেবে যাচ্ছে; কে চাইলেন, কী (১০০০ টাকার বেশি অর্ডারে delivery চার্জ শূন্য), কেন (বড় অর্ডার বাড়ানো), কবের মধ্যে।
    2. অস্পষ্টতা দূর করুন (validation): ১০০০ টাকা ছাড় দেওয়ার আগে না পরে? COD আর wallet দুটিতেই? দোকানের মালিক কি রাজি — কারণ delivery-র খরচ দোকানকেই বহন করতে হবে? Acceptance test লিখুন: “৯৯৯ টাকায় চার্জ আছে, ১০০১ টাকায় নেই।”
    3. Impact analysis: RTM দেখে — দামের হিসাব D-order (order.js, cart.js) বদলাবে; D-order ভাগ করে R2 (COD সীমা), R4 আর R6, তাই T3, T5, T8 আবার চালাতে হবে, নতুন test যোগ হবে। “এক লাইনের কাজ” আসলে ধরা যাক ১.৫ দিন, test-সহ।
    4. বিকল্প: (ক) হাতের ২ দিনের নিরাপত্তা-জায়গা থেকে নেওয়া — ঝুঁকি বাড়ে, Must-এর ভাগ আরও বাড়ে; (খ) SMS (Could, ৩ দিন) বাদ দিয়ে জায়গা করা; (গ) release ২-এ রাখা — ঈদের সাথে সময়-নির্ভর না হলে সবচেয়ে নিরাপদ; (ঘ) বাতিল।
    5. CCB-র সিদ্ধান্ত: সিদ্ধান্ত দেবেন মালিক আর tech lead — মালিকের ভাই নন, developer-ও নন। একটি যুক্তিসঙ্গত সিদ্ধান্ত (গ): এটি ব্যবসায়িক নীতি, সময়-সংকট নেই, আর ঈদের আগে নিরাপত্তা-জায়গা খরচ করা ঝুঁকিপূর্ণ।
    6. রেকর্ড আর জানানো: CR-08-এ সিদ্ধান্ত ও কারণ; গৃহীত হলে requirement file-এ নতুন requirement, RTM হালনাগাদ, baseline v1.2-এর tag. অনুরোধকারীকে উত্তর জানান।

    মূল কথা: developer-এর কাজ “না” বলা নয়, অনুরোধকে সঠিক পথে পাঠানো। “এক লাইনের কাজ” শুনলে সবসময় impact analysis করুন — এক লাইন কোড প্রায়ই অনেক test আর নীতির প্রশ্ন ছোঁয়।

  3. আউটপুট অনুমান করুন: নিচের প্রোগ্রামটি MoSCoW ক্রম অনুযায়ী (Must আগে, তারপর Should, তারপর Could) item নেয়, যতক্ষণ ৪০ দিনের বাজেটে আঁটে; না আঁটলে সেটি বাদ দিয়ে পরেরটি দেখে। JavaScript-এর sort stable — একই শ্রেণির item-গুলো মূল তালিকার ক্রমে থাকে। চালানোর আগে তিনটি লাইনের আউটপুট লিখুন, আর বলুন ফলাফলে MoSCoW-এর কোন নীতির সাথে অদ্ভুত কিছু ঘটেছে।
    const budget = 40;   // developer-days in the release
    const items = [["Must", 12, "cart"], ["Must", 10, "COD"], ["Should", 8, "search"],
      ["Could", 6, "reviews"], ["Must", 4, "login"], ["Could", 5, "points"],
      ["Should", 7, "tracking"]];
    const rankOf = { Must: 0, Should: 1, Could: 2 };
    let used = 0; const inRelease = [], out = [];
    for (const [p, days, name] of [...items].sort((a, b) => rankOf[a[0]] - rankOf[b[0]])) {
      if (used + days <= budget) { used += days; inRelease.push(name); } else out.push(name);
    }
    const must = items.filter(i => i[0] === "Must").reduce((s, i) => s + i[1], 0);
    console.log(inRelease.join(",") + " = " + used + " days");
    console.log("out: " + out.join(","));
    console.log("Must share: " + Math.round(must / budget * 100) + "%");
    cart,COD,login,search,reviews = 40 days
    out: tracking,points
    Must share: 65%

    কেন: sort-এর পরে ক্রম — cart (১২), COD (১০), login (৪), search (৮), tracking (৭), reviews (৬), points (৫)। Must তিনটি: ১২ + ১০ + ৪ = ২৬. Search যোগে ৩৪. Tracking যোগে ৪১ > ৪০, তাই বাদ। Reviews যোগে ৪০ — আঁটে। Points যোগে ৪৫ — বাদ। Must-এর ভাগ ২৬ ÷ ৪০ = ৬৫%, যা ৬০%-এর নির্দেশনার একটু বেশি।

    অদ্ভুত কী: একটি Should (tracking) বাদ পড়ল, অথচ একটি Could (reviews) ঢুকে গেল — কারণ এই “লোভী” (greedy) নিয়ম শুধু দেখে কোনটি আঁটে। MoSCoW-এর আত্মা অনুযায়ী Should আগে; তাই মানুষ হলে হয়তো reviews-এর বদলে tracking-কে ছোট করে (যেমন শুধু “পাঠানো হয়েছে/পৌঁছেছে” অবস্থা) আঁটানোর চেষ্টা করতেন। শিক্ষা: অগ্রাধিকারের ক্রম প্রোগ্রামে বসালে তার সীমাও বুঝতে হবে।

  4. সমালোচনা করুন: একটি দলের requirement তালিকা আর matrix এমন — R10 “App ব্যবহারবান্ধব হবে” (Must, test: নেই); R11 “Checkout দ্রুত হবে এবং দোকানি দৈনিক বিক্রির রিপোর্ট পাবেন” (Must, test: T20); এছাড়া test T30 আছে “dark mode ঠিকভাবে বদলায়”, যার কোনো requirement নেই, কারণ একজন developer নিজে থেকে dark mode বানিয়েছেন। তালিকার সব MoSCoW-এর ১০টির মধ্যে ৯টি Must. কমপক্ষে পাঁচটি সমস্যা চিহ্নিত করে প্রতিটির সংশোধন প্রস্তাব করুন।
    • R10 মাপা যায় না: “ব্যবহারবান্ধব” verifiable নয়, তাই test-ও নেই। সংশোধন: “নতুন একজন ব্যবহারকারী সাহায্য ছাড়া ৩ মিনিটের মধ্যে প্রথম অর্ডার দিতে পারবেন — ১০ জনের পরীক্ষায় অন্তত ৮ জন” — এখন একটি usability test লেখা যায়।
    • R11 একসাথে দুটি চাহিদা (singular নয়), আর “দ্রুত” অস্পষ্ট: দুটি আলাদা requirement করুন — R11a checkout-এর গতি সংখ্যায় (যেমন ৩G-তে ৯৫% checkout ৩ সেকেন্ডে), R11b দৈনিক রিপোর্ট। এখন একটি test (T20) দুটিকে যাচাই করছে বলে দাবি করছে, যা প্রায় অসম্ভব — প্রতিটির জন্য আলাদা test.
    • Forward traceability-র ফাঁক: R10-এর test নেই। Matrix-এ এটি স্পষ্টভাবে লাল চিহ্নিত থাকা উচিত, আর release-এর শর্তে রাখা উচিত।
    • অনাথ test আর gold-plating: T30-এর কোনো requirement নেই — backward traceability-তে ধরা পড়ে। Dark mode নিজে থেকে বানানো gold-plating. সংশোধন: হয় CR হিসেবে প্রস্তাব করে requirement লিখে অগ্রাধিকার দিন, নয়তো feature আর test সরান। ভবিষ্যতে নিয়ম: requirement ID ছাড়া PR merge হবে না।
    • সবই Must (৯০%): MoSCoW অর্থহীন হয়ে গেছে, কোনো নিরাপত্তা-জায়গা নেই। Must-পরীক্ষা চালান (“না থাকলে কি release বাতিল?”), আর Must-এর কাজ মোটামুটি ৬০%-এর মধ্যে আনুন।

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

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

ক্রমএকটি change request-এর সাধারণ পথ সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. 📝 Change request লিখিতভাবে জমা — কে, কী, কেন, কবের মধ্যে
  2. 🔍 প্রাথমিক বাছাই — bug, অস্পষ্টতা দূর করা, নাকি নতুন scope
  3. 🧭 Traceability দেখে impact analysis — নকশা, কোড, test, খরচ আর ঝুঁকি
  4. 🏛️ Change control board-এর সিদ্ধান্ত — গ্রহণ, অদলবদল, পিছিয়ে দেওয়া বা বাতিল
  5. 🏷️ Requirement দলিল, traceability matrix আর baseline-এর নতুন version
  6. 📣 Stakeholder-দের জানানো আর বাস্তবায়নের পরে যাচাই

DSDM পদ্ধতিতে MoSCoW-এর “W” কী বোঝায়?

  • Wish to have — ইচ্ছার তালিকা
  • Won't ever have — চিরকালের জন্য বাতিল
  • Won't have this time — এবারের পরিকল্পনায় নয়
  • Would like to have — থাকলে ভালো

একটি feature-এর reach প্রতি quarter-এ ১০০০ জন, impact ২, confidence ৫০%, আর effort ৪ person-month. এর RICE স্কোর কত?

  • ৫০০
  • ২৫০
  • ৪০০০
  • ১২৫

Kano প্রশ্নপত্রে একজন গ্রাহক একটি feature সম্পর্কে বললেন — থাকলে: “ভালো লাগবে”, না থাকলে: “খারাপ লাগবে”। মূল্যায়ন-টেবিল অনুযায়ী তাঁর কাছে feature-টি কোন শ্রেণির?

  • One-dimensional (performance)
  • Must-be (মৌলিক)
  • Attractive (delighter)
  • Questionable

একটি traceability matrix-এ দেখা গেল test T7-এর সাথে কোনো requirement যুক্ত নেই। এই ধরনের সমস্যা কোন যাচাইয়ে ধরা পড়ে, আর T7-কে কী বলা হয়?

  • Forward traceability; untested requirement
  • Impact analysis; regression test
  • Volatility metric; volatile test
  • Backward traceability; orphan test

কোনো গ্রাহক চাননি, তবু একজন developer নিজে থেকে app-এ animation আর dark mode যোগ করলেন। এটিকে সবচেয়ে ঠিকভাবে কী বলা যায়?

  • Scope creep
  • Gold-plating
  • একটি বৈধ change request
  • Kano-র delighter

একটি sprint-এর শুরুতে ৫০টি requirement ছিল। Sprint-এ ৩টি যোগ, ২টি বাদ আর ৫টি বদলানো হলো। Volatility = (যোগ + বাদ + বদল) ÷ শুরুর মোট ধরলে, volatility কত?

  • ১০%
  • ২%
  • ২০%
  • ১৬%

শব্দকোষ

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

মনে রাখুন

  1. Requirement management = অগ্রাধিকার + validation + traceability + change control; পুরো জীবনচক্র জুড়ে চলে।
  2. MoSCoW: Must, Should, Could, Won't (this time) — Must মোটামুটি ৬০%-এর মধ্যে রাখলে Could বাদ দিয়ে Must রক্ষা করা যায়। Kano: must-be, performance, delighter (আর indifferent, reverse) — functional/dysfunctional প্রশ্নের জোড়া থেকে।
  3. RICE = R × I × C ÷ E, WSJF = cost of delay ÷ job size; একই তালিকায় ভিন্ন ক্রম দিতে পারে — অমিলের জায়গাতেই আলোচনা। Wiegers-এর relative weighting value% ÷ (cost% আর risk%-এর ওজনযুক্ত যোগফল) মাপে।
  4. Verification দেখে requirement ভালো লেখা কি না, validation দেখে আসল প্রয়োজন ধরেছে কি না; review, inspection, prototype, test case আর checklist দিয়ে। RTM forward ও backward — test-হীন requirement, অনাথ test আর impact analysis.
  5. Baseline শুধু CR আর CCB-র পথে বদলায়; Markdown আর Git-এ commit, diff, PR আর tag দিয়ে। Scope creep নিয়ন্ত্রণহীন বৃদ্ধি, gold-plating না-চাওয়া বাড়তি কাজ; volatility = (যোগ + বাদ + বদল) ÷ মোট।

পরের পর্বে: মডিউল ৫ শুরু — নকশার মাপকাঠি। Modularity, coupling আর cohesion: কেন কিছু নকশায় একটি requirement বদলালে একটি file বদলায়, আর কিছুতে বিশটি।

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

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