এই পর্বে যা শিখবেন
- Cockburn-এর ছাঁচে একটি পূর্ণ use case লেখা — actor, scope, level, precondition, trigger, main success scenario, extension আর guarantee
- ভালো user story লেখা, ৩টি C বোঝা আর INVEST দিয়ে দুর্বল story চেনা
- নিয়মের তালিকা থেকে Given-When-Then উদাহরণ, আর Gherkin-এর Scenario Outline পড়া ও লেখা
- Epic → story → task ভাঙা, splitting pattern, Definition of Ready বনাম Definition of Done
- Story map আর release slice; কখন use case, কখন user story, কখন job story
১ · Requirement থেকে ব্যবহারকারীর গল্প
পর্ব ২০-এ দেখেছেন stakeholder খুঁজে কীভাবে তাঁদের কাছ থেকে চাহিদা বের করা হয় (elicitation), আর পর্ব ২১-এ দেখেছেন functional আর non-functional requirement কীভাবে মাপা যায় এমন বাক্যে লেখা হয়। কিন্তু “system অমুক কাজ করবে” ধরনের বাক্যের একটি লম্বা তালিকা পড়ে প্রায়ই বোঝা যায় না, একজন মানুষ আসলে কোন ক্রমে কী করবেন, আর মাঝপথে কিছু ভুল হলে কী হবে।
এই ফাঁক পূরণের দুটি জনপ্রিয় উপায় এই পর্বের বিষয়। Use case একটি লক্ষ্যকে কেন্দ্র করে পুরো কথোপকথন লেখে — সফল পথ আর ব্যর্থতার পথসহ। User story খুব ছোট একটি চাহিদা লেখে, যার বিস্তারিত আসে আলাপ আর acceptance criteria থেকে। দুটিই ব্যবহারকারীর চোখ দিয়ে system দেখে; পার্থক্য বিস্তারে আর ব্যবহারের সময়ে।
দর্জির দোকানের কথা ভাবুন। অর্ডারের স্লিপে লেখা থাকে মাত্র কয়েকটি কথা: “পাঞ্জাবি, সুতি, ঈদের আগে।” এটি একটি user story-র মতো — বাকিটা দর্জি আর ক্রেতার আলাপে ঠিক হয় (কলার কেমন, হাতা কত লম্বা), আর trial-এ মিলিয়ে দেখা হয় ঠিক হলো কি না। আবার বড় কারখানায় একটি নতুন নকশার পূর্ণ নির্দেশিকা থাকে: কাপড় কাটা থেকে বোতাম লাগানো পর্যন্ত প্রতিটি ধাপ, আর কাপড়ে দাগ থাকলে কী করতে হবে। এটি use case-এর মতো। কোনটি ভালো, তা নির্ভর করে কাজের আকার, দলের দূরত্ব আর ভুলের মূল্যের ওপর।
পুরো পর্বে একটি কাল্পনিক মোবাইল ওয়ালেট অ্যাপ ধরে এগোব। গ্রাহক অ্যাপে টাকা রাখেন, যেকোনো prepaid নম্বরে রিচার্জ (top-up) করেন, লেনদেনের তালিকা দেখেন। কোনো বাস্তব প্রতিষ্ঠানের নিয়ম বা সংখ্যা এখানে নেওয়া হয়নি; সব সীমা আর নিয়ম উদাহরণের জন্য বানানো।
২ · Use case — actor, লক্ষ্য, scope আর level
Use case-এর ধারণা এসেছে সুইডিশ প্রকৌশলী Ivar Jacobson-এর কাছ থেকে। তিনি ১৯৬০-এর দশকের শেষ দিক থেকে Ericsson-এ টেলিফোন সুইচিং system-এর কাজে “ব্যবহারের ঘটনা” ধরে requirement সাজানোর চিন্তা শুরু করেন বলে তাঁর নিজের লেখায় পাওয়া যায়। ১৯৮৭ সালের OOPSLA সম্মেলনে তাঁর প্রবন্ধে use case ধারণাটি বৃহত্তর পরিসরে আসে, আর ১৯৯২ সালের বই Object-Oriented Software Engineering: A Use Case Driven Approach একে জনপ্রিয় করে। পরে UML (১৯৯৭) use case diagram গ্রহণ করে। লেখার খুঁটিনাটি নিয়মে সবচেয়ে প্রভাবশালী বই হলো Alistair Cockburn-এর Writing Effective Use Cases (২০০০) — এই পর্বের ছাঁচ মূলত সেখান থেকে।
Use case-এর কেন্দ্রে একটি বাক্য: একজন actor একটি লক্ষ্য পূরণ করতে চান। বাকি সব এই লক্ষ্যকে ঘিরে।
- Actor: system-এর বাইরের কেউ, যে system-এর সাথে কাজ করে — মানুষ, অন্য software বা যন্ত্র। Actor একটি ভূমিকা, নির্দিষ্ট মানুষ নয়: একই রহিম সাহেব কখনো “গ্রাহক”, কখনো “এজেন্ট”। যাঁর লক্ষ্য পূরণে use case লেখা, তিনি primary actor; যে বাইরের system সেবা দেয় (যেমন অপারেটরের top-up সেবা, SMS সেবা), সে supporting actor.
- লক্ষ্য (goal): actor-এর চোখে কী অর্জন হবে — “মোবাইল রিচার্জ করা”, “PIN বদলানো”। Use case-এর নাম সাধারণত ক্রিয়া দিয়ে লেখা লক্ষ্যটিই।
- Scope: কোন system-এর সীমানা ধরে লেখা — পুরো প্রতিষ্ঠান (মানুষের কাজসহ), শুধু software system, নাকি তার একটি অংশ (component). সীমানা না বললে “system যাচাই করে” বাক্যে system কোনটি, তা অস্পষ্ট থাকে।
- Level: লক্ষ্যটি কত উঁচু স্তরের। Cockburn তিনটি প্রধান স্তর দেন, সমুদ্রের ছবি দিয়ে।
| Level | Cockburn-এর প্রতীক | চেনার উপায় | ওয়ালেটের উদাহরণ |
|---|---|---|---|
| Summary | ঘুড়ি (আরও ওপরে মেঘ) | কয়েকটি user-goal মিলে একটি বড় লক্ষ্য; দিন বা মাস জুড়ে চলতে পারে | “ওয়ালেট দিয়ে মাসের খরচ সামলানো” |
| User-goal | সমুদ্রপৃষ্ঠ (sea level) | একজন মানুষ এক বসায় শেষ করেন, আর শেষে সন্তুষ্ট হয়ে উঠে যেতে পারেন | “মোবাইল রিচার্জ করা” |
| Subfunction | মাছ (আরও নিচে ঝিনুক) | নিজে একা লক্ষ্য নয়, অন্য use case-এর অংশ | “PIN যাচাই করা”, “অপারেটর চেনা” |
সবচেয়ে কাজের স্তর user-goal. নতুনরা প্রায়ই subfunction-কে use case বানান (“Login”, “ডেটা সেভ করা”) — কেউ লগইন করার জন্য অ্যাপ খোলেন না, কিছু করার জন্য খোলেন। Cockburn-এর পরামর্শ: system-এর বেশিরভাগ use case user-goal স্তরে লিখুন, কয়েকটি summary use case দিয়ে বড় ছবি দেখান, আর subfunction শুধু তখনই আলাদা করুন যখন একাধিক use case একই ধাপগুলো ব্যবহার করে।
Use case কোনো UI-র বর্ণনা নয়। “গ্রাহক সবুজ বোতাম চাপেন” না লিখে লিখুন “গ্রাহক পরিমাণ নিশ্চিত করেন”. উদ্দেশ্য (intent) লিখলে use case টেকে; screen বদলালেও বদলাতে হয় না। Cockburn-এর আরেকটি নিয়ম: প্রতিটি ধাপে স্পষ্ট থাকুক কে কাজটি করছেন — actor, নাকি system.
৩ · একটি পূর্ণ use case লেখা
Cockburn দুই ধরনের রূপ বলেন: casual — কয়েক অনুচ্ছেদের সরল গদ্য, আর fully dressed — নির্দিষ্ট শিরোনামসহ পূর্ণ ছাঁচ। শুরুর দিকে casual যথেষ্ট; ঝুঁকি বা দলের দূরত্ব বেশি হলে fully dressed. ছাঁচের অংশগুলো:
| অংশ | কী লিখবেন |
|---|---|
| নাম ও নম্বর | ক্রিয়া দিয়ে লক্ষ্য: “UC-07 মোবাইল রিচার্জ করা” |
| Primary actor, scope, level | কার লক্ষ্য, কোন system-এর সীমানা, কোন স্তর |
| Stakeholder ও তাঁদের স্বার্থ | কাজটিতে কার কী স্বার্থ — এখান থেকেই ধরা পড়ে কোন যাচাই আর রেকর্ড লাগবে |
| Precondition | শুরুর আগে যা নিশ্চিতভাবে সত্য, আর system যা আবার যাচাই করবে না |
| Trigger | কোন ঘটনা use case শুরু করে |
| Main success scenario | ৩–৯টি নম্বর দেওয়া ধাপ, সবকিছু ঠিকঠাক চললে; প্রতিটি ধাপে কর্তা স্পষ্ট |
| Extension | কোন ধাপে কোন শর্তে কী ভিন্ন হয়: 4a মানে ধাপ ৪-এ প্রথম বিকল্প শর্ত, *a মানে যেকোনো ধাপে |
| Guarantee (postcondition) | Minimal guarantee — যেকোনোভাবে শেষ হলেও যা সত্য থাকবে; success guarantee — সফল হলে যা সত্য |
| অন্যান্য | প্রযুক্তি বা ডেটার ভিন্নতা, কত ঘন ঘন ঘটে, খোলা প্রশ্ন |
এবার ওয়ালেটের রিচার্জ use case ধাপে ধাপে লিখি — আগে মূল পথ, তারপর দুটি extension.
UC-07 মোবাইল রিচার্জ করা Primary actor: গ্রাহক Scope: ওয়ালেট system (অ্যাপ + server), black box Level: user-goal (এক বসায় শেষ হয়) Supporting: অপারেটরের top-up সেবা, SMS সেবা
Stakeholder ও স্বার্থ: গ্রাহক — সঠিক নম্বরে দ্রুত রিচার্জ; টাকা কাটলে রিচার্জ নিশ্চিত ওয়ালেট প্রতিষ্ঠান — প্রতিটি লেনদেনের নির্ভুল হিসাব, প্রতারণা রোধ Precondition: গ্রাহক লগইন করা আছেন, অ্যাকাউন্ট সক্রিয় Trigger: গ্রাহক রিচার্জের অপশন বেছে নেন
1. গ্রাহক মোবাইল নম্বর দেন 2. System নম্বর যাচাই করে অপারেটর চিনে দেখায় 3. গ্রাহক টাকার পরিমাণ দেন 4. System ব্যালান্স ও সীমা যাচাই করে সারাংশ দেখায় 5. গ্রাহক PIN দিয়ে নিশ্চিত করেন 6. System PIN যাচাই করে টাকা আটকে রাখে, অপারেটরকে অনুরোধ পাঠায় 7. অপারেটরের সেবা সফলতা জানায় 8. System লেনদেন চূড়ান্ত করে, রসিদ দেখায়, SMS পাঠায়
4a. ব্যালান্স পরিমাণের চেয়ে কম:
4a1. System বর্তমান ব্যালান্স আর ঘাটতি দেখায়
4a2. গ্রাহক কম পরিমাণ দেন → ধাপ 4-এ ফেরে
অথবা বাতিল করেন → use case ব্যর্থভাবে শেষ,
কোনো টাকা কাটা হয়নি
5a. PIN ভুল:
5a1. System জানায় PIN ভুল, বাকি চেষ্টার সংখ্যা দেখায়
5a2. গ্রাহক আবার PIN দেন → ধাপ 5-এ ফেরে
5a3. পরপর তিনবার ভুল হলে System অ্যাকাউন্ট
সাময়িক আটকে দেয়, গ্রাহককে জানায়
→ use case ব্যর্থভাবে শেষ
Minimal guarantee (যেকোনো অবস্থায়): টাকা আটকানো হলে হয় রিচার্জ সফল, নয়তো টাকা ফেরত; প্রতিটি চেষ্টার রেকর্ড থাকে Success guarantee (সফল হলে): নম্বরে রিচার্জ হয়েছে, ব্যালান্স ঠিক ততটাই কমেছে, রসিদ দেখানো আর SMS পাঠানো হয়েছে
| লেখা অংশ | |
| Extension | |
| শেষ হওয়ার পথ |
- শিরোনাম: কার লক্ষ্য, কোন সীমানা। নাম একটি ক্রিয়া-লক্ষ্য। Scope “black box” মানে ওয়ালেট system-এর ভেতরের অংশ (database, server) দেখানো হবে না, শুধু বাইরে থেকে আচরণ। Level user-goal, কারণ গ্রাহক এক বসায় কাজটি শেষ করেন।
- স্বার্থ, precondition আর trigger. প্রতিষ্ঠানের স্বার্থ “নির্ভুল হিসাব” থেকেই পরে বোঝা যাবে কেন টাকা আগে আটকে রাখতে হয়। Precondition “লগইন করা” — এটি আরেকটি use case-এর কাজ, তাই এখানে আবার যাচাই নয়।
- Main success scenario. আটটি ধাপ, প্রতিটিতে কর্তা স্পষ্ট (গ্রাহক, System বা অপারেটরের সেবা)। কোনো “যদি” নেই — সব শর্ত extension-এ যাবে। কোনো বোতাম বা screen-এর নাম নেই, শুধু উদ্দেশ্য।
- Extension
4a. ধাপ ৪-এ শর্ত ভিন্ন হলে কী হয়: ব্যালান্স কম। প্রতিটি extension হয় মূল পথের কোনো ধাপে ফেরে, নয়তো use case শেষ করে — কোথায় যায় তা লিখতেই হবে। এখানে টাকা কাটা হয়নি, তাই minimal guarantee সহজেই রক্ষা পায়। - Extension
5a. PIN ভুল হলে আবার চেষ্টা, পরপর তিনবার ভুল হলে অ্যাকাউন্ট সাময়িক আটকে যায় (সংখ্যাটি এই কাল্পনিক অ্যাপের নিয়ম)। এমন নিয়ম লিখতে গিয়েই প্রশ্ন ওঠে: আটকানো অ্যাকাউন্ট কীভাবে খুলবে? এটি নতুন একটি use case — use case লেখার এটাই বড় লাভ। - Guarantee. এখন তিনটি শেষ-পথ: সফল, ব্যালান্স কম বলে বাতিল, PIN আটকে যাওয়া। Minimal guarantee তিনটিতেই সত্য থাকতে হবে। “টাকা আটকানো হলে হয় রিচার্জ, নয়তো ফেরত” — এই বাক্যটিই পরে developer আর tester-এর সবচেয়ে গুরুত্বপূর্ণ নিয়ম হবে।
বাকি extension যোগ করলে পূর্ণ use case দাঁড়ায় এমন (একটি বাস্তব দল আরও কিছু যোগ করবে, যেমন দৈনিক সীমা):
UC-07 মোবাইল রিচার্জ করা
Primary actor: গ্রাহক Scope: ওয়ালেট system (black box) Level: user-goal
Supporting actors: অপারেটরের top-up সেবা, SMS সেবা
Stakeholders: গ্রাহক — সঠিক নম্বরে দ্রুত রিচার্জ, টাকা কাটলে রিচার্জ নিশ্চিত
ওয়ালেট প্রতিষ্ঠান — নির্ভুল হিসাব, প্রতারণা রোধ, অভিযোগের রেকর্ড
Precondition: গ্রাহক লগইন করা আছেন, অ্যাকাউন্ট সক্রিয়
Trigger: গ্রাহক রিচার্জের অপশন বেছে নেন
Main success scenario:
1. গ্রাহক মোবাইল নম্বর দেন
2. System নম্বর যাচাই করে অপারেটর চিনে দেখায়
3. গ্রাহক টাকার পরিমাণ দেন
4. System ব্যালান্স ও সীমা যাচাই করে সারাংশ দেখায়
5. গ্রাহক PIN দিয়ে নিশ্চিত করেন
6. System PIN যাচাই করে টাকা আটকে রাখে, অপারেটরকে অনুরোধ পাঠায়
7. অপারেটরের সেবা সফলতা জানায়
8. System লেনদেন চূড়ান্ত করে, রসিদ দেখায়, SMS পাঠায়
Extensions:
*a. গ্রাহক যেকোনো সময় বাতিল করেন: ধাপ 6-এর আগে হলে কিছুই বদলায় না
2a. নম্বর বৈধ নয় (১১ অঙ্ক নয়, বা অচেনা অপারেটর): System কারণ দেখায় → ধাপ 1
4a. ব্যালান্স কম: System ঘাটতি দেখায়; গ্রাহক পরিমাণ বদলান → ধাপ 4, বা বাতিল
4b. পরিমাণ সীমার বাইরে (১০ টাকার কম বা ১০০০ টাকার বেশি): System সীমা জানায় → ধাপ 3
5a. PIN ভুল: System বাকি চেষ্টা জানায় → ধাপ 5; পরপর তিনবার ভুল হলে অ্যাকাউন্ট সাময়িক আটকায়
7a. অপারেটর সময়মতো সাড়া দেয় না বা ব্যর্থ জানায়:
7a1. System আটকে রাখা টাকা ফেরত দেয়, গ্রাহককে জানায়; use case ব্যর্থভাবে শেষ
Minimal guarantee: টাকা আটকানো হলে হয় রিচার্জ সফল, নয়তো টাকা ফেরত; প্রতিটি চেষ্টার রেকর্ড থাকে
Success guarantee: রিচার্জ হয়েছে, ব্যালান্স ঠিক ততটাই কমেছে, রসিদ ও SMS গেছে
Variations: 1. নম্বর হাতে লেখা বা contact তালিকা থেকে বাছা যায়
Open question: অপারেটর দেরিতে সফলতা জানালে (টাকা ফেরতের পরে) কী হবে?খেয়াল করুন শেষ লাইনটি — “খোলা প্রশ্ন”. Extension লিখতে গেলে এমন প্রশ্ন বের হয়, যা কোড লেখার সময় বের হলে অনেক দামি হতো। Cockburn একটি কৌশল বলেন: প্রথমে প্রতিটি ধাপে কী কী বিগড়াতে পারে তার শুধু তালিকা করুন (brainstorm), পরে বাছাই করে কোনগুলো সত্যিই সামলাতে হবে তা লিখুন।
Include আর extend — সংক্ষেপে
অনেক use case একই ধাপ ব্যবহার করে — রিচার্জ, টাকা পাঠানো, বিল পরিশোধ সবই “PIN দিয়ে নিশ্চিত করা” চায়। এই ভাগ করা অংশ আলাদা subfunction use case হতে পারে, আর মূল use case তাকে প্রতিবার ব্যবহার করে — UML-এ এটি «include» সম্পর্ক, ড্যাশ তীর মূল use case থেকে ভাগ করা use case-এর দিকে। আবার কিছু আচরণ শুধু নির্দিষ্ট শর্তে আরেকটি use case-এর একটি নির্দিষ্ট জায়গায় যোগ হয় — যেমন রিচার্জ শেষে গ্রাহক চাইলে নম্বরটি প্রিয় তালিকায় রাখা। এটি «extend», তীর বাড়তি use case থেকে মূলটির দিকে, আর মূল use case জানেই না কে তাকে বাড়াচ্ছে। Cockburn-সহ অনেকে সতর্ক করেন, এই সম্পর্কের জটিল জাল বানানো সময় নষ্ট; লেখা use case-এ সাধারণ extension-ই যথেষ্ট। Diagram-এ এগুলো কীভাবে আঁকতে হয়, actor আর system boundary-সহ, তা পর্ব ২৩-এ।
৪ · User story — কার্ড, আলাপ আর নিশ্চিতকরণ
User story-র জন্ম Extreme Programming (XP)-এ। Kent Beck ১৯৯০-এর দশকের শেষ দিকে কাগজের ছোট index card-এ গ্রাহকের চাহিদা লেখার রীতি চালু করেন; ১৯৯৯ সালের বই Extreme Programming Explained-এ এর বর্ণনা আছে। ২০০১ সালে Ron Jeffries তিনটি C দিয়ে এর সারকথা বলেন। আজ যে ছাঁচটি সবাই চেনেন — “As a …, I want …, so that …” — তা লন্ডনের Connextra নামের একটি প্রতিষ্ঠানের দলে ২০০১ সালের দিকে চালু হয়েছিল বলে প্রচলিত (Rachel Davies-এর বিবরণে এমনটি পাওয়া যায়)। Mike Cohn-এর User Stories Applied (২০০৪) ছাঁচটিকে ব্যাপকভাবে জনপ্রিয় করে।
As a <role>, I want <goal>, so that <benefit>.
As a prepaid customer, I want to top up any mobile number from my wallet,
so that I can recharge my family's phones without visiting a shop.
তিনটি অংশেরই কাজ আছে। Role বলে কার জন্য — “As a user” লিখলে কিছুই বলা হয় না; গ্রাহক, এজেন্ট, হিসাবরক্ষক আলাদা মানুষ, আলাদা চাহিদা। অনেক দল নির্দিষ্ট persona ব্যবহার করে, যেমন “রিনা, যিনি গ্রামে মা-বাবার ফোনে রিচার্জ পাঠান”। Goal বলে কী চান, সমাধান কী হবে তা নয়। আর benefit বলে কেন — এটিই সবচেয়ে বেশি বাদ পড়ে, অথচ এটি থেকেই বোঝা যায় কোন সমাধান যথেষ্ট আর কোনটি বাড়াবাড়ি।
তিনটি C
🗂️ Card
কার্ডে অল্প কথা — শুধু মনে করিয়ে দেওয়ার মতো। কার্ড requirement-এর পূর্ণ দলিল নয়, আলাপের প্রতিশ্রুতি।
ছোট কার্ড, বড় আলাপ💬 Conversation
Product Owner, developer আর tester-এর আলাপে বিস্তারিত আসে: কোন নম্বর চলবে, সীমা কত, ভুল হলে কী।
মুখোমুখি বোঝাপড়া✅ Confirmation
আলাপের সিদ্ধান্ত লেখা হয় acceptance criteria-তে; এগুলো মিললেই story পূরণ হয়েছে বলে ধরা হয়।
যাচাইযোগ্য শর্তএই ৩টি C (Ron Jeffries, ২০০১) মনে রাখলে একটি সাধারণ ভুল এড়ানো যায়: story-কে ছোট SRS ভেবে কার্ডে সব লিখে ফেলা, অথবা উল্টো, শুধু কার্ড লিখে আলাপ না করেই কাজ শুরু করা। Story backlog-এ কীভাবে থাকে আর refinement-এ কীভাবে বড় item ভাঙা হয়, তা পর্ব ০৫-এ দেখেছেন; এখানে আমরা story-র মান নিয়ে কথা বলছি।
INVEST — ভালো story-র ছয় গুণ
২০০৩ সালে Bill Wake একটি লেখায় ভালো story-র গুণ মনে রাখার জন্য INVEST সংক্ষিপ্ত রূপটি দেন:
| অক্ষর | মানে | ভাঙলে যেমন দেখায় |
|---|---|---|
| Independent | অন্য story-র ওপর যত কম নির্ভর, তত ভালো — যেকোনো ক্রমে নেওয়া যায় | “S1 শেষ না হলে S2 শুরুই হবে না” |
| Negotiable | চুক্তি নয়, আলাপের জায়গা; সমাধানের খুঁটিনাটি খোলা | “dropdown-এ অপারেটর দেখাতে হবে, নীল রঙে” |
| Valuable | ব্যবহারকারী বা ক্রেতার কাছে মূল্য আছে | “As a developer, I want a database table…” |
| Estimable | দল মোটামুটি আকার বলতে পারে | অজানা বাইরের API — কেউ জানে না কত কাজ |
| Small | এক Sprint-এর ভেতরে, ভালো হয় কয়েক দিনে শেষ হলে | “সব বিল পরিশোধ” — ২১ point |
| Testable | শেষ হলো কি না যাচাই করা যায় | “রিচার্জ দ্রুত আর সহজ হবে” |
“দ্রুত” শব্দটি testable করতে হলে মাপ লাগে — যেমন “৯৫% রিচার্জে নিশ্চিতকরণ ৩ সেকেন্ডের মধ্যে” — আর এমন মাপ আসলে non-functional requirement, যা পর্ব ২১-এর বিষয়। অনেক দল এমন শর্ত আলাদা story না বানিয়ে সব story-র ওপর প্রযোজ্য constraint বা Definition of Done-এ রাখে।
INVEST বিচার মানুষের কাজ, কিন্তু কিছু লক্ষণ যান্ত্রিকভাবেও ধরা যায়। নিচের প্রোগ্রাম কাল্পনিক ওয়ালেটের পাঁচটি story-তে কয়েকটি সরল নিয়ম (heuristic) চালায়: নির্ভরতা আছে কি না, সমাধানের শব্দ (database, button) আছে কি না, “so that” আছে কি না, point দেওয়া হয়েছে কি না আর ৮-এর বেশি কি না, অস্পষ্ট শব্দ আছে কি না, acceptance criteria আছে কি না।
// Heuristic INVEST check of fictional mobile-wallet stories (a helper, not a judge).
const stories = [
{ id: "S1", text: "As a customer, I want to top up any prepaid number, so that I can recharge without visiting a shop", points: 3, dependsOn: [], ac: 3 },
{ id: "S2", text: "As a customer, I want to save frequent numbers", points: 2, dependsOn: ["S1"], ac: 2 },
{ id: "S3", text: "As a developer, I want a recharge table in the database, so that the API can store data", points: 2, dependsOn: [], ac: 0 },
{ id: "S4", text: "As a customer, I want top-up to be fast and easy, so that I enjoy the app", points: null, dependsOn: [], ac: 0 },
{ id: "S5", text: "As a customer, I want to pay all my utility bills, so that I never miss a due date", points: 21, dependsOn: [], ac: 1 },
];
const MAX_POINTS = 8; // team rule: bigger than this = split it
const VAGUE = ["fast", "easy", "user-friendly", "all", "etc"];
const DESIGN = ["database", "table", "api", "button", "dropdown"];
function check(s) {
const issues = [];
const words = s.text.toLowerCase().split(/[^a-z-]+/);
if (s.dependsOn.length) issues.push("I: depends on " + s.dependsOn.join(", "));
const design = DESIGN.filter(w => words.includes(w));
if (design.length) issues.push("N: fixes the solution (" + design.join(", ") + ")");
if (!/so that/i.test(s.text)) issues.push("V: no 'so that' - benefit unclear");
if (/^as a developer/i.test(s.text)) issues.push("V: role is the team, not a user");
if (s.points === null) issues.push("E: not estimated yet");
else if (s.points > MAX_POINTS) issues.push("S: " + s.points + " points > " + MAX_POINTS);
const vague = VAGUE.filter(w => words.includes(w));
if (vague.length) issues.push("T: vague words (" + vague.join(", ") + ")");
if (s.ac === 0) issues.push("T: no acceptance criteria");
return issues;
}
let ok = 0;
for (const s of stories) {
const issues = check(s);
if (issues.length === 0) ok++;
console.log(s.id + (issues.length ? " needs work" : " looks OK"));
issues.forEach(i => console.log(" " + i));
}
console.log(ok + " of " + stories.length + " pass the heuristic; people still decide.");আউটপুট:
S1 looks OK
S2 needs work
I: depends on S1
V: no 'so that' - benefit unclear
S3 needs work
N: fixes the solution (database, table, api)
V: role is the team, not a user
T: no acceptance criteria
S4 needs work
E: not estimated yet
T: vague words (fast, easy)
T: no acceptance criteria
S5 needs work
S: 21 points > 8
T: vague words (all)
1 of 5 pass the heuristic; people still decide.
S3 আসলে কোনো story নয়, একটি কারিগরি task — ব্যবহারকারী database table দেখেন না। সঠিক জায়গা S1-এর task তালিকা। S4-এর সমস্যা দুটি: অস্পষ্ট শব্দ আর অনুমানহীনতা; একে মাপা যায় এমন non-functional শর্তে বদলাতে হবে। S5-এর “all” আর ২১ point বলে দিচ্ছে এটি একটি epic, যাকে অংশ ৬-এ ভাঙব। S2-এর নির্ভরতা সবসময় ভুল নয় — নম্বর সেভ করা রিচার্জ ছাড়া অর্থহীন; INVEST-এর I মানে “যতটা সম্ভব”, পুরোপুরি নয়। আর লক্ষ করুন, প্রোগ্রাম “so that” আছে কি না দেখে, কিন্তু benefit-টি আসলে মূল্যবান কি না তা বোঝে না — S3-এর “so that the API can store data”-ও পরীক্ষা পাস করত, শুধু role দেখে ধরা পড়েছে। এজন্যই শেষ লাইন: সিদ্ধান্ত মানুষের।
৫ · Acceptance criteria আর Given-When-Then
Acceptance criteria হলো story-র “Confirmation”: কোন শর্তগুলো মিললে Product Owner কাজটি গ্রহণ করবেন। দুটি প্রচলিত রূপ আছে।
📋 নিয়মের তালিকা (rule-based)
ছোট, সরাসরি বাক্য: “ন্যূনতম ১০ টাকা”, “ব্যালান্সের বেশি হলে রিচার্জ হবে না”. লেখা দ্রুত, পড়া সহজ; তবে সীমার ঠিক মানে কী হবে, তা অনেক সময় অস্পষ্ট থাকে।
দ্রুত, সংক্ষিপ্ত🧪 উদাহরণ (scenario)
Given-When-Then: শুরুর অবস্থা, ঘটনা, প্রত্যাশিত ফল। নির্দিষ্ট সংখ্যা দিয়ে লেখা, তাই ভুল বোঝাবুঝি কম, আর সরাসরি test-এ রূপ নেয়।
নির্দিষ্ট, test-এর কাছাকাছিGiven-When-Then ছাঁচটি behaviour-driven development (BDD) থেকে এসেছে; Dan North ২০০৬ সালের একটি লেখায় BDD-র পরিচয় দেন, আর ছাঁচটির উদ্ভবে Chris Matts-এর ভূমিকার কথাও তিনি উল্লেখ করেন। এই উদাহরণ লেখার সবচেয়ে প্রচলিত ভাষা Gherkin, যা Cucumber (২০০৮-এর দিকে Aslak Hellesøy-এর শুরু করা) আর তার মতো আরও tool পড়তে পারে।
| Keyword | কাজ |
|---|---|
Feature: | ফাইলের শিরোনাম — কোন feature, সাথে কয়েক লাইন বিবরণ (অনেকে story-টি এখানে লেখেন) |
Background: | প্রতিটি scenario-র আগে যে Given ধাপগুলো চলে |
Scenario: (বা Example:) | একটি নির্দিষ্ট উদাহরণ |
Given / When / Then | শুরুর অবস্থা / ঘটনা বা কাজ / প্রত্যাশিত ফল |
And / But | আগের ধরনের আরেকটি ধাপ; পড়ার সুবিধার জন্য, অর্থ আগের keyword-এর মতোই |
Scenario Outline: + Examples: | <placeholder>-সহ একটি ছাঁচ; Examples টেবিলের প্রতিটি সারি থেকে একটি scenario |
Rule: | একটি ব্যবসায়িক নিয়মের নিচে কয়েকটি উদাহরণ রাখা (Gherkin-এর নতুন সংস্করণগুলোতে) |
এবার রিচার্জ story-র নিয়মের তালিকা থেকে ধাপে ধাপে Gherkin উদাহরণ বানাই। সীমাগুলো এই কাল্পনিক অ্যাপের: প্রতি রিচার্জে ন্যূনতম ১০, সর্বোচ্চ ১০০০ টাকা।
As a prepaid customer, I want to top up any mobile number, so that I can recharge my family's phones without a shop. ☐ পরিমাণ ন্যূনতম ১০, সর্বোচ্চ ১০০০ টাকা ☐ ব্যালান্সের বেশি হলে রিচার্জ হবে না, টাকা কাটবে না ☐ নম্বর ১১ অঙ্কের, 01 দিয়ে শুরু ☐ সফল হলে রসিদ দেখাবে, ব্যালান্স কমবে
Scenario: Not enough balance Given my wallet balance is 50 taka When I top up 100 taka to a prepaid number Then I should see "Not enough money" And my balance should be 50 taka
Scenario: Successful top-up Given my wallet balance is 500 taka When I top up 100 taka to a prepaid number Then I should see "Top-up successful" And my balance should be 400 taka But no SMS should be sent before the operator confirms
amount 9 → "Minimum is 10" balance 2000 থাকে amount 10 → "Top-up successful" balance 1990 amount 1000 → "Top-up successful" balance 1000 amount 1001 → "Maximum is 1000" balance 2000 থাকে + আগের দুটি scenario = ৬টি প্রায় একই scenario
Feature: Mobile top-up
Background:
Given I am logged in as a prepaid customer
Scenario Outline: Amount and balance rules
Given my wallet balance is <balance> taka
When I top up <amount> taka to a prepaid number
Then I should see "<message>"
And my balance should be <after> taka
Examples:
| balance | amount | message | after |
| 2000 | 9 | Minimum is 10 | 2000 |
| 2000 | 10 | Top-up successful | 1990 |
| 2000 | 1000 | Top-up successful | 1000 |
| 2000 | 1001 | Maximum is 1000 | 2000 |
| 500 | 100 | Top-up successful | 400 |
| 50 | 100 | Not enough money | 50 |
Scenario: Invalid number
When I top up 100 taka to "0170"
Then I should see "Enter an 11-digit number"
| লেখার রূপ | |
| আসল scenario সংখ্যা |
- শুরু: story আর চারটি নিয়ম। আলাপের পর নিয়মগুলো চেকলিস্টে লেখা হয়েছে। পড়তে সহজ, কিন্তু প্রশ্ন থেকে যায়: ঠিক ১০ টাকা চলবে তো? ব্যালান্স কম হলে কী দেখাবে?
- একটি নিয়মকে একটি উদাহরণে। “ব্যালান্সের বেশি হলে রিচার্জ হবে না” → নির্দিষ্ট সংখ্যা: ব্যালান্স ৫০, চাওয়া ১০০. Then বলে কী দেখা যাবে, And বলে ব্যালান্স অপরিবর্তিত — অর্থাৎ টাকা কাটেনি। ছোট উদাহরণেই নিয়মের দুই অংশ ধরা পড়ল।
- সফল পথ, And আর But. ৫০০ থেকে ১০০ গেলে ৪০০ থাকবে।
But-ও একটি Then-ধরনের ধাপ, শুধু “কিন্তু এটি নয়” বোঝাতে পড়তে সুবিধা। খেয়াল করুন, কোনো বোতাম বা screen-এর নাম নেই — এটি declarative ধাঁচ, যা UI বদলালেও টেকে। - সীমার উদাহরণ। সীমার ঠিক আগে-পরে (৯, ১০, ১০০০, ১০০১) উদাহরণ নেওয়া test design-এর boundary value কৌশল, যা পর্ব ৪৭-এ বিস্তারিত। এখন ছয়টি scenario, সবগুলোর গঠন এক — শুধু চারটি মান ভিন্ন। আলাদা আলাদা লিখলে একই লাইন ছয়বার।
- Scenario Outline. একই ধাঁচের ছয়টি উদাহরণ একটি Scenario Outline-এ, মানগুলো Examples টেবিলে; লগইনের Given সব scenario-তে লাগে বলে Background-এ গেল। নম্বর যাচাইয়ের উদাহরণের গঠন আলাদা, তাই আলাদা Scenario. মোট ৬ + ১ = ৭টি আসল scenario.
Tool কীভাবে Outline থেকে আসল scenario বানায়? নিচের ছোট প্রোগ্রামটি একটি Outline পড়ে, প্রতিটি <placeholder>-কে Examples-এর সেই কলামের মান দিয়ে বদলে দেয়। এটি আসল Gherkin parser নয় — Background, Rule, একাধিক Outline বা টেবিলে | escape সামলায় না — শুধু মূল ধারণা দেখায়।
// A tiny Gherkin reader: expand one Scenario Outline + Examples into concrete scenarios.
const feature = `Feature: Mobile top-up
Scenario Outline: Top-up amount rules
Given my wallet balance is <balance> taka
When I top up <amount> taka to a prepaid number
Then I should see "<message>"
And my balance should be <after> taka
Examples:
| balance | amount | message | after |
| 500 | 100 | Top-up successful | 400 |
| 500 | 5 | Minimum is 10 | 500 |
| 50 | 100 | Not enough money | 50 |`;
const lines = feature.split("\n").map(l => l.trim()).filter(l => l !== "");
let title = "", header = null;
const steps = [], rows = [];
for (const line of lines) {
if (line.startsWith("Scenario Outline:")) title = line.slice(17).trim();
else if (/^(Given|When|Then|And|But) /.test(line)) steps.push(line);
else if (line.startsWith("|")) {
const cells = line.split("|").slice(1, -1).map(c => c.trim());
if (header === null) header = cells; else rows.push(cells);
}
}
rows.forEach((row, i) => {
console.log("Scenario: " + title + " #" + (i + 1));
for (const step of steps) {
const filled = step.replace(/<([^>]+)>/g, (m, name) => row[header.indexOf(name)]);
console.log(" " + filled);
}
});
console.log(steps.length + " steps x " + rows.length + " rows -> " + rows.length + " scenarios");আউটপুট:
Scenario: Top-up amount rules #1
Given my wallet balance is 500 taka
When I top up 100 taka to a prepaid number
Then I should see "Top-up successful"
And my balance should be 400 taka
Scenario: Top-up amount rules #2
Given my wallet balance is 500 taka
When I top up 5 taka to a prepaid number
Then I should see "Minimum is 10"
And my balance should be 500 taka
Scenario: Top-up amount rules #3
Given my wallet balance is 50 taka
When I top up 100 taka to a prepaid number
Then I should see "Not enough money"
And my balance should be 50 taka
4 steps x 3 rows -> 3 scenarios
টেবিলের প্রথম সারি (header) কলামের নাম দেয়: balance, amount, message, after. বাকি তিনটি সারি তিনটি scenario. প্রতিটি ধাপে regular expression <([^>]+)> কোণ-বন্ধনীর ভেতরের নাম ধরে, header.indexOf(name) দিয়ে কলাম খোঁজে আর সেই সারির মান বসায়। আসল scenario-সংখ্যা সবসময় Examples-এর data সারির সংখ্যা — ধাপের সংখ্যা নয়। আসল tool এরপর প্রতিটি ধাপকে একটি “step definition” কোডের সাথে মেলায় আর test চালায়; সেই automation আর BDD-র পুরো চক্র পর্ব ৪৮-এ।
Gherkin-এর সবচেয়ে প্রচলিত অপব্যবহার হলো UI script লেখা: “When I click the green button, And I type 100 in the amount box, And I scroll down…”. এমন scenario ব্যবসার মানুষ পড়েন না, আর screen সামান্য বদলালেই সব ভেঙে যায়। নিয়ম ধরুন: একটি scenario একটি আচরণ, একটি When, আর ভাষা ব্যবসার — UI-র নয়।
Definition of Ready বনাম Definition of Done
| বিষয় | Definition of Ready | Definition of Done |
|---|---|---|
| প্রশ্ন | এই story কি Sprint-এ নেওয়ার মতো স্পষ্ট? | এই কাজ কি সত্যিই শেষ, Increment-এর যোগ্য? |
| কখন দেখা হয় | Sprint Planning-এর আগে, refinement-এ | কাজ শেষ বলার আগে |
| উদাহরণ | role-goal-benefit আছে; acceptance criteria লেখা; আকার অনুমান হয়েছে; বাইরের নির্ভরতা জানা | কোড review হয়েছে; test পাস; acceptance criteria মিলেছে; CI সবুজ; documentation হালনাগাদ |
| প্রযোজ্য | প্রতিটি story-তে একই চেকলিস্ট | প্রতিটি item-এ একই মান; acceptance criteria প্রতিটি story-র নিজস্ব |
| Scrum Guide 2020 | নেই — দলের নিজস্ব প্রথা | আছে — Increment-এর commitment |
Definition of Ready সাহায্য করে, কিন্তু সাবধান: একে কঠোর দরজা বানালে (“সব খুঁটিনাটি লেখা না হলে নেব না”) আবার ছোট waterfall ফিরে আসে, আর আলাপের জায়গা হারায়। অনেক অভিজ্ঞ coach তাই একে একটি নির্দেশিকা হিসেবে রাখার পরামর্শ দেন, চুক্তি হিসেবে নয়। Definition of Done-এর বিস্তারিত পর্ব ০৫-এ।
৬ · Epic থেকে story থেকে task — ভাঙার কৌশল
বিয়েবাড়ির আয়োজনের তালিকা ভাবুন। “বিয়ের অনুষ্ঠান” একটি epic. তার ভেতরে “গায়েহলুদ”, “বরযাত্রী আপ্যায়ন”, “বউভাত” — প্রতিটি আলাদাভাবে একটি পূর্ণ অনুষ্ঠান, অতিথিরা আলাদা করে উপভোগ করেন; এগুলো story. আর “৩০০ প্লেট অর্ডার”, “প্যান্ডেলের বাতি লাগানো” — এগুলো task, যা অতিথিরা আলাদা করে দেখেন না, কিন্তু না করলে অনুষ্ঠান হয় না।
সংক্ষেপে: epic হলো এমন বড় চাহিদা, যা এক Sprint-এ হয় না; story এক Sprint-এর ভেতরে শেষ হয় আর নিজে ব্যবহারকারীর কাছে মূল্য দেয়; task হলো story শেষ করার কারিগরি কাজ (table বানানো, API লেখা, test লেখা), সাধারণত এক দিন বা কম। Bill Wake একই ২০০৩ সালের লেখায় task-এর জন্য SMART (Specific, Measurable, Achievable, Relevant, Time-boxed) গুণের কথা বলেন। Epic আর task-এর মধ্যে কত স্তর থাকবে (theme, feature, initiative…), তা tool আর প্রতিষ্ঠান-ভেদে আলাদা; কোনো সার্বজনীন নিয়ম নেই।
উল্লম্ব ভাগ, স্তর ধরে নয়
বড় story ভাঙার সবচেয়ে সাধারণ ভুল হলো কারিগরি স্তর ধরে ভাগ: “UI story”, “API story”, “database story”. কোনো একটি টুকরো একা ব্যবহারকারীর কাজে লাগে না, আর শেষে জোড়া দেওয়ার সময় ঝুঁকি একসাথে ফাটে। ভালো story splitting কেকের মতো উল্লম্বভাবে কাটে — প্রতিটি টুকরোয় সব স্তরের একটু করে, কিন্তু শুরু থেকে শেষ পর্যন্ত কাজ করে। কোন রেখা ধরে কাটবেন, তার কিছু প্রচলিত pattern আছে; Richard Lawrence-এর “Patterns for Splitting User Stories” (২০০৯-এর দিকের লেখা, পরে Humanizing Work-এর নির্দেশিকা) এবং Mike Cohn-এর SPIDR (Spike, Path, Interface, Data, Rules) এগুলোর জনপ্রিয় সংকলন — নাম আর সংখ্যা উৎস-ভেদে একটু আলাদা।
| Pattern | কীভাবে কাটে | ওয়ালেটের উদাহরণ |
|---|---|---|
| Workflow step | আগে সবচেয়ে সরল শুরু-থেকে-শেষ পথ, পরে মাঝের ধাপগুলো সমৃদ্ধ করা | আগে স্ক্রিনে রসিদ, পরে SMS রসিদ |
| Business rule | একটি নিয়ম বা তার ভিন্ন রূপ আলাদা story | due date পার হলে বিলম্ব ফি |
| Data variation | ডেটার এক এক ধরন এক এক story | বিদ্যুৎ, গ্যাস, পানির বিল |
| Operations (CRUD) | তৈরি, দেখা, বদলানো, মুছে ফেলা আলাদা | বিলদাতা সেভ করা, নাম বদলানো, মুছে ফেলা |
| Happy / unhappy path | আগে happy path, পরে ভুল আর ব্যর্থতার পথ | বিলদাতার server বন্ধ থাকলে টাকা ফেরত |
| Interface | এক মাধ্যম বা যন্ত্র আগে, বাকিগুলো পরে | আগে Android অ্যাপ, পরে USSD |
| Spike | অজানা বিষয় আগে সময় বেঁধে খুঁজে দেখা, তারপর story অনুমান করা | প্রিপেইড মিটারের API কেমন, ২ দিনে বোঝা |
এবার একটি epic ধাপে ধাপে ভাঙি। পর্ব ০৫-এর refinement উদাহরণে workflow আর ধরন দিয়ে ভাঙা দেখেছেন; এখানে একাধিক pattern একসাথে, আর শেষে INVEST দিয়ে যাচাই।
E-3 As a customer, I want to pay my utility bills from the wallet,
so that I don't have to stand in a queue at the bank.
মোটা অনুমান: ~34 point → এক Sprint-এ হবে না
B1 পোস্টপেইড বিদ্যুৎ বিল: হিসাব নম্বর লিখে পুরো বকেয়া
পরিশোধ, স্ক্রিনে রসিদ
B8 SMS-এ রসিদ
E-3 (বাকি): অন্য বিল, নিয়ম, ব্যর্থতা, বিলদাতা সেভ
B1 পোস্টপেইড বিদ্যুৎ (সরলতম পথ) B4 গ্যাস বিল B5 পানির বিল B6 প্রিপেইড বিদ্যুৎ মিটার (টোকেন কেনা) B8 SMS-এ রসিদ E-3 (বাকি): নিয়ম, ব্যর্থতা, বিলদাতা সেভ
B3 due date পার হলে বিলম্ব ফি-সহ বকেয়া দেখানো
(B1-এ আপাতত due date-এর আগের বিলই)
E-3 (বাকি): ব্যর্থতা, বিলদাতা সেভ
B2 বিলদাতা সাড়া না দিলে টাকা ফেরত ও গ্রাহককে জানানো B7 বিলদাতা সেভ করা, নাম বদলানো, মুছে ফেলা
SP1 Spike: প্রিপেইড মিটারের API বোঝা — timebox ২ দিন
B1 পোস্টপেইড বিদ্যুৎ, পুরো বকেয়া, স্ক্রিনে রসিদ 5
B2 বিলদাতা সাড়া না দিলে টাকা ফেরত 3
B3 বিলম্ব ফি-সহ বকেয়া 3
B4 গ্যাস বিল 3
B5 পানির বিল 3
B6 প্রিপেইড মিটার (SP1-এর পরে) 5
B7 বিলদাতা সেভ / বদল / মুছে ফেলা 3
B8 SMS-এ রসিদ 2
মোট 27
| item সংখ্যা | |
| সবচেয়ে বড় item | |
| সব item INVEST মেলে? |
- একটি epic. Role, goal আর benefit স্পষ্ট, কিন্তু মোটা অনুমান ~৩৪ point আর দলের velocity ~১৫ — Small নয়, আর এত বড় অনুমানে ভুলের ঝুঁকিও বেশি।
- Workflow ধরে সরলতম পথ। প্রথম story এমন হোক যাতে একজন গ্রাহক সত্যিই একটি বিল দিতে পারেন: এক ধরনের বিল, হাতে লেখা হিসাব নম্বর, পুরো বকেয়া, স্ক্রিনে রসিদ। সমৃদ্ধ রসিদ (SMS) আলাদা story. বাকি অংশ এখনো epic-এ থেকে গেল — মোট ৩টি item.
- ডেটার ধরন ধরে ভাগ। গ্যাস, পানি আর প্রিপেইড মিটার প্রতিটি আলাদা story, কারণ বিলদাতা আর নিয়ম আলাদা। প্রতিটিই নিজে মূল্যবান — যিনি শুধু গ্যাস বিল দেন, তিনিও খুশি। এখন ৬টি item.
- ব্যবসায়িক নিয়ম আলাদা। বিলম্ব ফি-র হিসাব জটিল, তাই আলাদা story. B1-এ আপাতত শুধু সময়মতো বিল — এই সীমা B1-এর acceptance criteria-তে লেখা থাকবে। এখন ৭টি item.
- Unhappy path আর CRUD. বিলদাতার server বন্ধ থাকলে কী হবে — use case-এর extension-এর মতোই একটি আলাদা story. বিলদাতা সেভ করার তিনটি কাজ ছোট বলে একটি story-তে রাখা হলো। Epic-এর আর অবশিষ্ট নেই: ৮টি story. কিন্তু B6-এর API কেউ জানেন না, তাই একে Estimable বলা যায় না।
- Spike আর অনুমান। দুই দিনের timebox দেওয়া একটি spike বাইরের API বুঝবে; তার ফল জ্ঞান, feature নয়। এরপর দল সব story-র আকার দেয়: সবচেয়ে বড় ৫, প্রতিটি এক Sprint-এ আঁটে। মোট ৫ + ৩ + ৩ + ৩ + ৩ + ৫ + ৩ + ২ = ২৭, প্রথম মোটা অনুমান ৩৪ নয় — ভাঙার পর অনুমান বাড়তেও পারে, কমতেও। Story point আর planning poker পর্ব ৬০-এ, আর কোনটি আগে নেবেন সেই prioritization পর্ব ২৪-এ।
৭ · Story map — backbone, walking skeleton আর release slice
সাধারণ backlog একটি লম্বা এক-মাত্রিক তালিকা। সেখানে ২০০টি story থাকলে বোঝা কঠিন, কোনগুলো মিলে ব্যবহারকারী শুরু থেকে শেষ পর্যন্ত একটি কাজ করতে পারবেন। Jeff Patton এই সমস্যার উত্তরে story map জনপ্রিয় করেন (তাঁর ২০০৫ সালের দিকের লেখা থেকে, আর ২০১৪ সালের বই User Story Mapping-এ পূর্ণ রূপে)।
- Backbone: ওপরের সারিতে ব্যবহারকারীর প্রধান কাজ (activity), বাঁ থেকে ডানে তাঁর যাত্রার ক্রমে।
- Story: প্রতিটি activity-র নিচে তার story, ওপরে বেশি জরুরি, নিচে কম।
- Release slice: আড়াআড়ি রেখা টেনে ভাগ; রেখার ওপরের সব story মিলে একটি release.
- Walking skeleton: প্রথম slice — প্রতিটি activity-র অন্তত একটি সবচেয়ে সরল story, যাতে পুরো যাত্রা অন্তত কোনোভাবে চলে। শব্দটি Alistair Cockburn-এর লেখায় প্রচলিত হয়।
ওয়ালেট অ্যাপের story map
Backbone across, stories below by priority, release lines between slices
খেয়াল করুন, walking skeleton-এ PIN নেই — এটি বাস্তব গ্রাহকের হাতে দেওয়ার জন্য নয়, দলের ভেতরে প্রমাণ করার জন্য যে পুরো পথ (নিবন্ধন থেকে লেনদেন দেখা পর্যন্ত) সব স্তর পেরিয়ে চলে। গ্রাহকের হাতে যাবে Release 1 (MVP), যেখানে PIN যোগ হয়েছে। এভাবে শুরুতেই integration-এর ঝুঁকি ধরা পড়ে, শেষের দিকে নয়। নিচের প্রোগ্রাম ঠিক এই নিয়মে map কাটে: প্রতিটি backbone ধাপের সবচেয়ে বেশি অগ্রাধিকারের প্রথম story যায় walking skeleton-এ, বাকি story অগ্রাধিকার (১ must, ২ should, ৩ could) অনুযায়ী পরের slice-এ।
// Story map slicer: backbone steps + prioritised stories -> walking skeleton, then releases.
const backbone = ["Sign up", "Add money", "Top up", "History"];
const stories = [ // pri: 1 must, 2 should, 3 could; pts = story points
{ step: "Sign up", text: "Register with phone + OTP", pri: 1, pts: 3 },
{ step: "Sign up", text: "Set a PIN", pri: 1, pts: 2 },
{ step: "Sign up", text: "Verify identity with ID photo", pri: 2, pts: 5 },
{ step: "Add money", text: "Cash in at an agent", pri: 1, pts: 3 },
{ step: "Add money", text: "Add money from a bank account", pri: 2, pts: 8 },
{ step: "Top up", text: "Top up any number, fixed amounts", pri: 1, pts: 3 },
{ step: "Top up", text: "Detect the operator", pri: 2, pts: 3 },
{ step: "Top up", text: "Save favourite numbers", pri: 3, pts: 2 },
{ step: "History", text: "List last 10 transactions", pri: 1, pts: 2 },
{ step: "History", text: "Download a PDF statement", pri: 3, pts: 3 },
];
const slices = { "Walking skeleton": [], "Release 1 (MVP)": [], "Release 2": [], "Later": [] };
for (const step of backbone) {
const col = stories.filter(s => s.step === step).sort((a, b) => a.pri - b.pri);
if (col.length === 0) { console.log("WARNING: no story for step " + step); continue; }
slices["Walking skeleton"].push(col[0]); // thinnest end-to-end path
for (const s of col.slice(1)) {
const name = s.pri === 1 ? "Release 1 (MVP)" : s.pri === 2 ? "Release 2" : "Later";
slices[name].push(s);
}
}
let total = 0;
for (const [name, list] of Object.entries(slices)) {
const pts = list.reduce((a, s) => a + s.pts, 0);
total += pts;
console.log(name + " - " + list.length + (list.length === 1 ? " story, " : " stories, ") + pts + " points, total so far " + total);
list.forEach(s => console.log(" [" + s.step + "] " + s.text));
}আউটপুট:
Walking skeleton - 4 stories, 11 points, total so far 11
[Sign up] Register with phone + OTP
[Add money] Cash in at an agent
[Top up] Top up any number, fixed amounts
[History] List last 10 transactions
Release 1 (MVP) - 1 story, 2 points, total so far 13
[Sign up] Set a PIN
Release 2 - 3 stories, 16 points, total so far 29
[Sign up] Verify identity with ID photo
[Add money] Add money from a bank account
[Top up] Detect the operator
Later - 2 stories, 5 points, total so far 34
[Top up] Save favourite numbers
[History] Download a PDF statement
প্রতিটি কলাম অগ্রাধিকার ধরে সাজানো হয় (sort স্থিতিশীল, তাই সমান অগ্রাধিকারে আগের লেখা story আগে থাকে — “Register” “Set a PIN”-এর আগে)। প্রথমটি skeleton-এ: ৩ + ৩ + ৩ + ২ = ১১. Must-অগ্রাধিকারের বাকি একমাত্র story “Set a PIN” MVP-তে, মোট ১৩. Release 2-এ ৫ + ৮ + ৩ = ১৬, মোট ২৯; বাকি ২ + ৩ = ৫, মোট ৩৪ — ছবি ২২.১-এর সংখ্যার সাথে হুবহু মেলে। দলের velocity ধরুন ৮ হলে MVP পর্যন্ত ১৩ ÷ ৮ = ১.৬ → ২ Sprint. যদি কোনো backbone ধাপে একটিও story না থাকত, প্রোগ্রাম সতর্ক করত — কারণ তখন skeleton শুরু থেকে শেষ পর্যন্ত চলবে না।
৮ · Use case বনাম user story, আর job story
| দিক | Use case | User story |
|---|---|---|
| আকার | একটি পূর্ণ লক্ষ্য, সব সফল ও ব্যর্থ পথসহ | একটি ছোট মূল্যের টুকরো; একটি use case থেকে অনেক story হতে পারে |
| বিস্তারিত কোথায় | দলিলের ভেতরেই | আলাপে আর acceptance criteria-তে |
| শক্তি | ব্যতিক্রম আর প্রসঙ্গ এক জায়গায়; ফাঁক চোখে পড়ে | পরিকল্পনা, অনুমান আর ছোট ধাপে delivery সহজ |
| দুর্বলতা | লিখতে সময় লাগে; পরিকল্পনার একক হিসেবে বড় | বড় ছবি হারিয়ে যায়; ব্যতিক্রম বাদ পড়ে |
| যেখানে মানায় | নিয়ন্ত্রিত বা জটিল ক্ষেত্র (ব্যাংক, স্বাস্থ্য), দূরের বা চুক্তিভিত্তিক দল, বাইরের system-এর সাথে জটিল যোগাযোগ | একসাথে বসা ছোট দল, ঘন ঘন delivery, product আবিষ্কারের পর্যায় |
বাস্তবে দুটি একসাথেও চলে। অনেক দল জটিল লক্ষ্যের জন্য একটি হালকা use case লিখে প্রসঙ্গ আর extension ধরে রাখে, তারপর তার main success scenario আর extension থেকে story বানায় — যেমন অংশ ৬-এর B2 আসলে একটি extension-এর রূপ। Jacobson নিজেও ২০১১ সালে সহলেখকদের সাথে “Use-Case 2.0” নামে একটি নির্দেশিকা প্রকাশ করেন, যেখানে use case-কে ছোট “slice”-এ কেটে backlog item বানানোর পদ্ধতি দেওয়া আছে।
Job story — ভূমিকার বদলে পরিস্থিতি
When <situation>, I want to <motivation>, so I can <expected outcome>.
When my mother's phone runs out of balance late at night,
I want to send her a top-up in under a minute,
so I can be sure she can call me if she needs to.
Job story ছাঁচটি ২০১৩ সালের দিকে Intercom নামের একটি software প্রতিষ্ঠানের product দলের লেখায় আসে, পরে Alan Klement-এর লেখায় বিস্তৃত হয় বলে প্রচলিত; ভিত্তি Clayton Christensen-এর “jobs to be done” ধারণা। যুক্তি: একই ভূমিকার (গ্রাহক) দুজন মানুষের পরিস্থিতি একেবারে আলাদা হতে পারে, আর পরিস্থিতিই ঠিক করে কোন সমাধান কাজের। “রাত, তাড়া, মায়ের ফোন” পড়লেই বোঝা যায় এখানে প্রিয় নম্বর আর দ্রুত পথ গুরুত্বপূর্ণ। যেখানে ভূমিকা সত্যিই ফারাক তৈরি করে (যেমন এজেন্ট আর গ্রাহকের অনুমতি আলাদা), সেখানে user story-ই পরিষ্কার। কোনোটিই নিয়ম নয়; দলগুলো প্রয়োজনমতো মেশায়।
আরও গভীরে: Alistair Cockburn-এর Writing Effective Use Cases (২০০০) use case লেখার মূল বই; Mike Cohn-এর User Stories Applied (২০০৪) আর Jeff Patton-এর User Story Mapping (২০১৪) story-র দুটি ক্লাসিক। উদাহরণ দিয়ে requirement লেখার পুরো দর্শন পাবেন Gojko Adzic-এর Specification by Example (২০১১)-তে। আর ISO/IEC/IEEE 29148 প্রতিটি requirement-এর যে গুণ চায় (প্রয়োজনীয়, দ্ব্যর্থহীন, যাচাইযোগ্য…), তা use case বা story — যে রূপেই লিখুন, প্রযোজ্য।
পরীক্ষা ও ইন্টারভিউতে:
- Use case আর user story-র পার্থক্য কী? — Use case একটি লক্ষ্যের পূর্ণ বিবরণ, সফল ও বিকল্প পথসহ; story ছোট মূল্যের টুকরো, বিস্তারিত আলাপ আর acceptance criteria-তে।
- INVEST কী? — Independent, Negotiable, Valuable, Estimable, Small, Testable; Bill Wake, ২০০৩.
- Include আর extend-এর পার্থক্য? — Include: মূল use case প্রতিবার অন্যটি ব্যবহার করে; extend: শর্তসাপেক্ষে বাড়তি আচরণ মূলটিতে যোগ হয়, তীর বাড়তি use case থেকে মূলটির দিকে।
- Definition of Ready আর Done-এর পার্থক্য? — Ready: Sprint-এ নেওয়ার মতো স্পষ্ট কি না (দলের প্রথা); Done: কাজ সত্যিই শেষ কি না (Scrum Guide-এর commitment).
- একটি বড় story কীভাবে ভাঙবেন? — উল্লম্বভাবে: workflow, rule, data, CRUD, happy/unhappy path বা spike ধরে; স্তর ধরে নয়।
৯ · AI-এর যুগে use case আর user story
AI কয়েক সেকেন্ডে পঞ্চাশটি user story আর শ-খানেক Gherkin scenario লিখে দিতে পারে। দেখতে নিখুঁত, কিন্তু সেগুলো আপনার ব্যবহারকারীর সাথে কোনো আলাপ থেকে আসেনি — ৩টি C-এর মাঝের C-টিই বাদ। তাই AI-এর লেখা story-কে খসড়া ধরুন, আর stakeholder-এর সাথে মিলিয়ে নিন।
| AI প্রায়ই যা করে | কীভাবে ধরবেন |
|---|---|
| সব story “As a user…” দিয়ে, benefit অস্পষ্ট বা goal-এরই পুনরাবৃত্তি | প্রতিটিতে নির্দিষ্ট role আর আলাদা benefit আছে কি না দেখুন; INVEST চেকার চালান |
| বানানো ব্যবসায়িক নিয়ম (সীমা, ফি, সময়) acceptance criteria-তে বসিয়ে দেয় | প্রতিটি সংখ্যার উৎস জিজ্ঞেস করুন; উৎস নেই মানে Product Owner-এর কাছে প্রশ্ন |
| Gherkin-কে UI-ক্লিকের script বানায় | একটি scenario-তে একটি When, ব্যবসার ভাষা — বোতামের নাম নয় |
| শুধু happy path লেখে, extension বাদ দেয় | Main success scenario-র প্রতিটি ধাপে “কী বিগড়াতে পারে” নিজে তালিকা করুন |
| ভুল কৃতিত্ব দেয় (“INVEST Mike Cohn-এর”, “Scrum-এ user story বাধ্যতামূলক”) | মূল উৎস মেলান: Wake ২০০৩; Scrum Guide 2020 কোনো ফরম্যাট চায় না |
| Use case diagram-এ include/extend-এর তীর উল্টো আঁকে | UML-এর নিয়ম মিলিয়ে দেখুন (পর্ব ২৩) |
AI দিয়ে একটি use case-এর extension খোঁজা বা story ভাঙার খসড়া চাইতে পারেন — প্রসঙ্গ আর সীমা দিয়ে। গ্রাহকের আসল নাম, ফোন নম্বর, লেনদেনের তথ্য বা চুক্তির শর্ত prompt-এ দেবেন না:
Software engineering-এ AI ব্যবহারের চেকলিস্ট
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন।
প্র ০১Agile দলগুলো এখন প্রায় সবাই user story লেখে। তাহলে কি use case পুরোনো হয়ে গেছে?
ইতিহাস দেখলে উত্তরটি “না, তবে ভূমিকা বদলেছে”. Jacobson-এর use case জন্মেছিল টেলিফোন সুইচের মতো বিশাল, দীর্ঘজীবী system-এ, যেখানে হাজারো ব্যতিক্রম আর বাইরের system-এর সাথে যোগাযোগ আছে। ১৯৯০-এর দশকে UML আর Rational Unified Process-এর সাথে use case প্রায় সব বড় প্রকল্পের মানক অংশ হয়ে ওঠে। সমস্যাও দেখা দেয়: অনেক প্রতিষ্ঠান শত পৃষ্ঠার use case দলিল লিখত, include আর extend-এর জটিল diagram আঁকত, আর কোড শুরুর আগেই দলিল পুরোনো হয়ে যেত। Cockburn-এর ২০০০ সালের বই অনেকটা এই বাড়াবাড়ির বিরুদ্ধে লেখা — তিনি casual রূপ, পাঠযোগ্য ভাষা আর লক্ষ্যের স্তর নিয়ে জোর দেন।
XP আর Scrum-এর উত্থানে user story জনপ্রিয় হয় মূলত পরিকল্পনার সুবিধার জন্য: story ছোট, অনুমান করা যায়, এক Sprint-এ শেষ হয়। কিন্তু story-র দুর্বলতাও পরিচিত — বড় ছবি আর ব্যতিক্রম হারিয়ে যায়। ব্যাংকের লেনদেন, হাসপাতালের ওষুধ দেওয়া বা সরকারি অনুমোদনের মতো ক্ষেত্রে “টাকা আটকে গেলে কী হবে” প্রশ্নটি একটি story-র acceptance criteria-তে লুকিয়ে থাকলে চোখ এড়িয়ে যেতে পারে; use case-এর extension আর minimal guarantee এমন প্রশ্নকে সামনে আনে।
এজন্যই ২০১১ সালে Jacobson, Ian Spence আর Kurt Bittner “Use-Case 2.0” প্রকাশ করেন: use case থাকে প্রসঙ্গ আর পূর্ণতার জন্য, আর তার “slice” — একটি বা কয়েকটি পথ — backlog item হিসেবে Sprint-এ যায়। অর্থাৎ দুটি ধারণা প্রতিদ্বন্দ্বী নয়; একটি বোঝার হাতিয়ার, অন্যটি পরিকল্পনার। Story map-ও কিছুটা একই প্রয়োজন মেটায় — story-র বড় ছবি ফিরিয়ে আনে।
মূল উপলব্ধি: Use case ব্যতিক্রম আর প্রসঙ্গ ধরে রাখে, user story পরিকল্পনা সহজ করে। জটিল ও ঝুঁকিপূর্ণ লক্ষ্যে দুটিকে মিলিয়ে ব্যবহার করুন।
প্র ০২User story-র কার্ডে ইচ্ছা করে এত কম লেখা হয় কেন? দূরের দল বা outsourcing-এ কি এটি বিপদ নয়?
শুরুর XP দলগুলো সত্যিই কাগজের index card ব্যবহার করত, আর কার্ডের ছোট আকারটিই ছিল একটি নকশা-সিদ্ধান্ত: বেশি লেখা যায় না, তাই আলাপ করতেই হয়। Alistair Cockburn story-কে বলেছিলেন “a promissory note for a conversation” — আলাপের প্রতিশ্রুতিপত্র — বলে প্রচলিত। যুক্তিটি হলো, লিখিত দলিলে যত খুঁটিনাটি থাকুক, দুজন মানুষ একই বাক্যের আলাদা অর্থ করেন; মুখোমুখি আলাপে প্রশ্ন আর উদাহরণ দিয়ে সেই ফাঁক দ্রুত ধরা পড়ে। Ron Jeffries-এর ৩টি C ঠিক এই ভারসাম্য বলে: কার্ড অল্প, আলাপ বেশি, আর আলাপের সিদ্ধান্ত লিখিত confirmation-এ।
দূরের দলে বিপদটি বাস্তব। দুই দেশের, দুই সময়-অঞ্চলের দলে “আলাপ” মানে প্রায়ই কয়েকটি chat বার্তা, আর কার্ডের অল্প কথা থেকে প্রত্যেকে নিজের মতো ধরে নেন। চুক্তিভিত্তিক কাজে আরেকটি সমস্যা: কার্ডই যদি চুক্তির অংশ হয়, তাহলে Negotiable গুণটি হারায়, আর প্রতিটি বদল “change request” হয়ে যায়।
প্রতিকার দলিল বাড়ানো নয়, confirmation শক্ত করা। আলাপের সিদ্ধান্ত Given-When-Then উদাহরণে লিখুন — নির্দিষ্ট সংখ্যাসহ উদাহরণ ভাষার বাধা পেরোয়। Refinement-এ Product Owner, একজন developer আর একজন tester একসাথে story পড়ুন (অনেকে একে “Three Amigos” বলেন)। জটিল লক্ষ্যে একটি হালকা use case বা story map যোগ করুন, যাতে বড় ছবি সবার সামনে থাকে। আর প্রতিটি Sprint শেষে কাজ করা software দেখান — সবচেয়ে নির্ভরযোগ্য confirmation হলো ব্যবহারকারীর হাতে চালিয়ে দেখা।
মূল উপলব্ধি: কার্ড ছোট রাখা হয় আলাপ বাধ্য করতে। আলাপ কঠিন হলে কার্ড নয়, উদাহরণ আর যাচাই বাড়ান।
প্র ০৩অনেক দল শত শত Gherkin scenario লিখে পরে বলে, “এগুলো রক্ষণাবেক্ষণ করা দুঃস্বপ্ন।” BDD-র প্রতিশ্রুতি কোথায় হারায়?
Dan North ২০০৬ সালের “Introducing BDD” লেখায় BDD-কে মূলত একটি যোগাযোগের অনুশীলন হিসেবে বর্ণনা করেন: TDD শেখাতে গিয়ে তিনি দেখেন “test” শব্দটি মানুষকে ভুল দিকে নিয়ে যায়, তাই তিনি “behaviour” আর উদাহরণের ভাষায় কথা বলতে শুরু করেন। Given-When-Then ছিল ব্যবসা আর developer-এর একটি সাধারণ ভাষা। পরে Cucumber-এর মতো tool সেই ভাষাকে সরাসরি স্বয়ংক্রিয় test-এ রূপ দেয় — এখান থেকেই শক্তি, আর এখান থেকেই ফাঁদ।
প্রথম ফাঁদ: Gherkin-কে শুধু test automation-এর tool ভাবা। Tester একা বসে scenario লেখেন, ব্যবসার কেউ পড়েন না, আর scenario হয়ে যায় UI script — “click”, “type”, “scroll”. Screen বদলালেই শত scenario ভাঙে। দ্বিতীয় ফাঁদ: সব কিছু end-to-end scenario দিয়ে যাচাই করা। এগুলো ধীর আর অস্থির, অথচ বেশিরভাগ নিয়ম (যেমন ন্যূনতম ১০ টাকা) একটি unit test-এই যাচাই করা যায়। তৃতীয় ফাঁদ: step definition-এর জঙ্গল — একই কাজের দশ রকম বাক্য, দশটি আলাদা কোড।
প্রতিকার মূল ভাবনায় ফেরা। Scenario লেখা হোক আলাপে, তিন দৃষ্টিভঙ্গির মানুষ মিলে। প্রতিটি scenario একটি আচরণ, declarative ভাষায়। শুধু মূল উদাহরণগুলো স্বয়ংক্রিয় acceptance test হোক; সীমার সব খুঁটিনাটি নিচের স্তরের test-এ। Gojko Adzic-এর Specification by Example (২০১১) বহু দলের অভিজ্ঞতা থেকে দেখায়, উদাহরণের মূল্য সবচেয়ে বেশি আলাপের সময় — automation দ্বিতীয় লাভ। Test-এর স্তর আর pyramid নিয়ে বিস্তারিত পর্ব ৫১-এ, আর BDD-র automation পর্ব ৪৮-এ।
মূল উপলব্ধি: Gherkin আগে যোগাযোগের ভাষা, পরে test. আলাপ বাদ দিয়ে শুধু automation করলে উপকার কম, রক্ষণাবেক্ষণের বোঝা বেশি।
প্র ০৪দলগুলো কেন বারবার story-কে “frontend”, “backend”, “database” স্তরে ভাগ করে, যদিও সবাই উল্লম্ব ভাগের কথা বলেন?
কারণটি প্রায়ই প্রযুক্তিগত নয়, সাংগঠনিক। Melvin Conway ১৯৬৮ সালে বলেছিলেন, একটি system-এর গঠন তা যে প্রতিষ্ঠান বানায় তার যোগাযোগের গঠনের প্রতিচ্ছবি হয় — Conway's law. প্রতিষ্ঠানে যদি আলাদা frontend দল, backend দল আর database দল থাকে, তাহলে কাজও স্বাভাবিকভাবে সেই রেখায় ভাগ হয়; প্রত্যেক দল নিজের অংশের “story” চায়। আরেকটি কারণ অভ্যাস: স্তর ধরে ভাবা developer-এর কাছে সহজ, কারণ কোড সেভাবেই সাজানো।
কিন্তু খরচ বড়। স্তর-ভিত্তিক কোনো টুকরো একা ব্যবহারকারীর কাছে মূল্য দেয় না, তাই Sprint Review-তে দেখানোর কিছু থাকে না। প্রতিটি স্তর আলাদাভাবে “Done” হলেও আসল ঝুঁকি — স্তরগুলো একসাথে কাজ করবে কি না — শেষ পর্যন্ত লুকিয়ে থাকে; সেই integration-এর বিপদ নিয়ে পর্ব ১৭-এ “integration hell” প্রসঙ্গে কথা হয়েছে। আর মতামত আসে দেরিতে: পুরো feature জোড়া লাগার পর ব্যবহারকারী বলেন, “এটা আমি চাইনি।”
উল্লম্ব ভাগের সবচেয়ে কাজের কৌশল হলো walking skeleton: প্রথমেই সব স্তর পেরিয়ে একটি সরু পথ চালু করা, যত সাধারণই হোক। ওয়ালেটের উদাহরণে নিবন্ধন থেকে লেনদেন দেখা পর্যন্ত একটি পথ — UI, server, database, অপারেটরের সেবা সব ছুঁয়ে যায়। এরপর প্রতিটি story সেই কঙ্কালে মাংস যোগ করে। এতে দলকেও স্তর পেরিয়ে একসাথে কাজ করতে হয়; অনেক প্রতিষ্ঠান তাই feature-ভিত্তিক cross-functional দল গঠন করে — Conway's law-কে উল্টো দিক থেকে কাজে লাগানো, যাকে কেউ কেউ “inverse Conway maneuver” বলেন।
মূল উপলব্ধি: Story কীভাবে ভাগ হয়, তা প্রায়ই দলের গঠন বলে দেয়। মূল্যভিত্তিক উল্লম্ব ভাগ চাইলে দলের গঠনও সেদিকে নিতে হয়।
প্র ০৫একই অ্যাপের দুজন “গ্রাহক” — একজন শহরের তরুণ চাকরিজীবী, অন্যজন গ্রামের বয়স্ক মানুষ, যিনি পড়তে একটু কষ্ট পান। “As a customer” কি দুজনের কথা বলতে পারে?
পারে না, আর এখানেই role-ভিত্তিক story-র সীমা। “As a customer” বলে দেয় অনুমতির দিক থেকে কে, কিন্তু তাঁর পরিস্থিতি, দক্ষতা আর উদ্বেগ বলে না। Alan Cooper ১৯৯০-এর দশকে interaction design-এ persona ধারণা জনপ্রিয় করেন — গবেষণার ভিত্তিতে বানানো নির্দিষ্ট, কাল্পনিক মানুষ — ঠিক এই কারণে: “সাধারণ ব্যবহারকারী”-র জন্য নকশা করলে কারও জন্যই ভালো হয় না। “রিনা, ২৬, অফিসের ফাঁকে দ্রুত কাজ সারেন” আর “করিম চাচা, ৬৮, বড় অক্ষর আর কম ধাপ চান” — দুজনের জন্য একই রিচার্জ feature-এর acceptance criteria আলাদা হবে।
Job story আরেক দিক থেকে সমাধান খোঁজে। Clayton Christensen-এর “jobs to be done” ধারণা বলে, মানুষ কোনো পণ্য “নিয়োগ” করেন একটি কাজ সারতে, আর সেই কাজ পরিস্থিতি থেকে আসে। ২০১৩ সালের দিকে Intercom-এর product দল এবং পরে Alan Klement “When …, I want to …, so I can …” ছাঁচটি প্রচার করেন বলে প্রচলিত। “যখন রাতে মায়ের ফোনের ব্যালান্স শেষ” — এই পরিস্থিতি role-এর চেয়ে অনেক বেশি তথ্য দেয়।
বয়স্ক বা দৃষ্টিশক্তিতে সমস্যা আছে এমন ব্যবহারকারীর কথা আলাদা গুরুত্ব পায়, কারণ accessibility প্রায়ই story-তে বাদ পড়ে। একে প্রতিটি story-তে আলাদা লেখার বদলে অনেক দল WCAG-এর মতো নির্দেশিকা মেনে Definition of Done-এ যোগ করে, আর কিছু নির্দিষ্ট persona-র জন্য আলাদা acceptance criteria রাখে। বাংলাদেশে মোবাইল আর্থিক সেবার ব্যবহারকারীর বড় অংশ শহরের বাইরে — এমন সাধারণ ধারণা থাকলেও, নির্দিষ্ট সংখ্যা দিতে হলে নির্ভরযোগ্য জরিপ লাগবে; এখানে কোনো পরিসংখ্যান দাবি করা হচ্ছে না।
মূল উপলব্ধি: Role বলে কার অনুমতি, persona বলে কে মানুষটি, আর job story বলে কোন পরিস্থিতি। ভালো story-তে যেটি সিদ্ধান্তে ফারাক তৈরি করে, সেটি স্পষ্ট থাকে।
অনুশীলন
কাগজ-কলম নিয়ে বসুন — নিজে লিখে তারপর উত্তর মেলান।
-
একটি use case লিখুন: একটি কাল্পনিক পাড়ার পাঠাগারের অ্যাপ। সদস্য কাউন্টারে গিয়ে বই ধার নেন; গ্রন্থাগারিক সদস্য-কার্ড আর বইয়ের barcode স্ক্যান করেন। নিয়ম: একজন সদস্য একসাথে সর্বোচ্চ ৫টি বই রাখতে পারেন; বকেয়া জরিমানা থাকলে নতুন বই দেওয়া হয় না; ধারের মেয়াদ ১৪ দিন। “বই ধার দেওয়া” use case-টি লিখুন — primary actor, scope, level, precondition, trigger, main success scenario, অন্তত তিনটি extension আর দুই ধরনের guarantee.
UC-03 বই ধার দেওয়া. Primary actor: গ্রন্থাগারিক (সদস্যের পক্ষে কাজ করেন; সদস্য একজন stakeholder). Scope: পাঠাগার system (black box). Level: user-goal. Stakeholder: সদস্য — দ্রুত বই পাওয়া, ফেরতের তারিখ জানা; পাঠাগার — কোন বই কার কাছে তার নির্ভুল রেকর্ড. Precondition: গ্রন্থাগারিক লগইন করা. Trigger: সদস্য বই নিয়ে কাউন্টারে আসেন.
Main success scenario: ১. গ্রন্থাগারিক সদস্য-কার্ড স্ক্যান করেন। ২. System সদস্যকে চিনে তাঁর ধার করা বইয়ের সংখ্যা আর জরিমানার অবস্থা দেখায়। ৩. গ্রন্থাগারিক বইয়ের barcode স্ক্যান করেন। ৪. System বইটি পাওয়া যায় কি না যাচাই করে সদস্যের নামে লেখে, ফেরতের তারিখ (আজ + ১৪ দিন) হিসাব করে। ৫. আরও বই থাকলে ধাপ ৩ থেকে আবার। ৬. গ্রন্থাগারিক শেষ নিশ্চিত করেন। ৭. System রসিদ ছাপে বা SMS-এ ফেরতের তারিখ পাঠায়।
Extensions:
1aকার্ড পড়া যায় না: গ্রন্থাগারিক সদস্য নম্বর হাতে লেখেন → ধাপ ২.2aবকেয়া জরিমানা আছে: System পরিমাণ দেখায়; সদস্য পরিশোধ করলে → ধাপ ৩, না করলে use case শেষ, কোনো বই ধার হয়নি.4aসদস্যের কাছে আগেই ৫টি বই: System সীমা জানায়, বইটি ধার হয় না → ধাপ ৬.4bবইটি অন্য কারও নামে সংরক্ষিত (reserved): System জানায় → ধাপ ৫.*asystem বন্ধ হয়ে গেলে: আগে নিশ্চিত হওয়া বইগুলো রেকর্ডে থাকে।Minimal guarantee: প্রতিটি বই হয় পাঠাগারে, নয়তো ঠিক একজন সদস্যের নামে — কখনো দুজনের নামে বা কারও নামে নয় এমন অবস্থায় বাইরে নয়. Success guarantee: সব বই সদস্যের নামে, প্রতিটির ফেরতের তারিখ ঠিক, সদস্যের কাছে মোট বই ৫টির বেশি নয়, সদস্য তারিখ জেনেছেন। খেয়াল করুন, “সর্বোচ্চ ৫টি” নিয়মটি extension আর guarantee দুই জায়গাতেই এসেছে — একটিতে আচরণ, অন্যটিতে যা সবসময় সত্য থাকবে।
-
এই story ভাঙুন: একই পাঠাগারের একটি story: “As a member, I want to manage my reservations online, so that I can get popular books.” দল অনুমান করেছে প্রায় ২০ point, velocity ৮. (ক) INVEST-এর কোন গুণ ভাঙছে? (খ) অন্তত দুটি pattern ব্যবহার করে ৪–৬টি story-তে ভাঙুন। (গ) প্রথম story-র জন্য দুটি Given-When-Then লিখুন।
(ক) Small নয় (২০ point, velocity ৮), আর “manage” শব্দটি অস্পষ্ট বলে Testable-ও দুর্বল — manage মানে কী কী কাজ, তা বলা নেই।
(খ) CRUD আর rule/unhappy path ধরে একটি সম্ভাব্য ভাগ: (১) উপলব্ধ নেই এমন একটি বই সংরক্ষণ (reserve) করা — happy path; (২) নিজের সংরক্ষণের তালিকা দেখা; (৩) সংরক্ষণ বাতিল করা; (৪) বই ফেরত এলে লাইনের প্রথমজনকে SMS — workflow-এর পরের ধাপ; (৫) নিয়ম: একসাথে সর্বোচ্চ ৩টি সংরক্ষণ, আর ৩ দিনে না নিলে সংরক্ষণ বাতিল হয়ে পরের জনের কাছে যায় — business rule. প্রতিটি আলাদাভাবে সদস্যের কাজে লাগে (তবে (২)–(৫) স্বাভাবিকভাবেই (১)-এর পরে আসে — Independent পুরোপুরি সম্ভব নয়, তা মেনে নেওয়া যায়)।
(গ)
Given "Pather Panchali" has no copy on the shelf,When I reserve it,Then I should see "You are number 1 in the queue". দ্বিতীয়টি:Given a copy of "Pather Panchali" is on the shelf,When I try to reserve it,Then I should see "Available now - borrow it at the counter"And no reservation should be created. দুটিই ব্যবসার ভাষায়, কোনো বোতামের নাম নেই। -
আউটপুট অনুমান করুন: অংশ ৫-এর
gherkin_outline.jsপ্রোগ্রামে শুধুfeatureস্ট্রিংটি বদলে নিচেরটি দেওয়া হলো। কী ছাপা হবে? আগে হাতে লিখুন — একটি ফাঁদ আছে।Feature: Library Scenario Outline: Borrow limit Given a member already has <borrowed> books When the member borrows one more book Then the screen shows "<result>" But the fine stays <fine> taka Examples: | borrowed | result | | 2 | Allowed | | 5 | Limit reached |আউটপুট:
Scenario: Borrow limit #1 Given a member already has 2 books When the member borrows one more book Then the screen shows "Allowed" But the fine stays undefined taka Scenario: Borrow limit #2 Given a member already has 5 books When the member borrows one more book Then the screen shows "Limit reached" But the fine stays undefined taka 4 steps x 2 rows -> 2 scenariosদুটি data সারি, তাই দুটি scenario;
But-ও ধাপ হিসেবে গোনা হয়, তাই ৪টি ধাপ। When ধাপে placeholder নেই, তাই দুবারই হুবহু। ফাঁদ:<fine>নামের কোনো কলাম টেবিলে নেই।header.indexOf("fine")দেয়-1, আরrow[-1]JavaScript-এundefined— তাই “undefined taka”. আমাদের জানামতে আসল Cucumber এমন অমিল placeholder সাধারণত হুবহু (<fine>) রেখে দেয়, তারপর ধাপটি কোনো step definition-এর সাথে না মিললে জানায়; নিশ্চিত হতে নিজের সংস্করণে চালিয়ে দেখুন। শিক্ষা: Outline-এর প্রতিটি placeholder-এর একটি কলাম থাকা চাই। -
Story map-এর হিসাব: পাঠাগার অ্যাপের backbone: খোঁজা → ধার → ফেরত → জরিমানা. Story (অগ্রাধিকার ১ must, ২ should, ৩ could; point): খোঁজা — শিরোনামে খোঁজা (১, ৩), বই আছে কি না দেখানো (১, ২), লেখক দিয়ে ছাঁকা (২, ২); ধার — কাউন্টারে ধার (১, ৩), অনলাইনে সংরক্ষণ (২, ৫); ফেরত — কাউন্টারে ফেরত (১, ২), মনে করিয়ে দেওয়া SMS (২, ৩); জরিমানা — দেরির জরিমানা হিসাব (১, ৩), অনলাইনে জরিমানা পরিশোধ (৩, ৫). অংশ ৭-এর নিয়মে (প্রতিটি কলামে প্রথম সর্বোচ্চ-অগ্রাধিকারের story walking skeleton-এ) (ক) প্রতিটি slice-এ কোন story আর কত point? (খ) velocity ৮ হলে MVP আর পুরো map শেষ হতে কত Sprint?
(ক) Walking skeleton: শিরোনামে খোঁজা (৩), কাউন্টারে ধার (৩), কাউন্টারে ফেরত (২), জরিমানা হিসাব (৩) = ১১. Release 1 (MVP): বই আছে কি না দেখানো (২) → মোট ১৩. Release 2: লেখক দিয়ে ছাঁকা (২), অনলাইনে সংরক্ষণ (৫), SMS (৩) = ১০ → মোট ২৩. পরে: অনলাইনে পরিশোধ (৫) → মোট ২৮. (একই ডেটা দিয়ে
story_map_slices.jsচালালে এই সংখ্যাগুলোই আসে।)(খ) MVP: ১৩ ÷ ৮ = ১.৬২৫ → ২ Sprint. পুরো map: ২৮ ÷ ৮ = ৩.৫ → ৪ Sprint. ভগ্নাংশ ওপরের দিকে, কারণ আংশিক Sprint-ও পুরো Sprint-এর সময় নেয়। খেয়াল করুন, “শিরোনামে খোঁজা” আর “বই আছে কি না দেখানো” দুটিই must, কিন্তু প্রথমটি আগে লেখা বলে skeleton-এ — skeleton-এ প্রতিটি কলাম থেকে মাত্র একটি। বাস্তবে Product Owner চাইলে ক্রম বদলাতে পারেন; একটি টুকরো যথেষ্ট সরু কি না, সেটিই আসল প্রশ্ন।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমএকটি বড় চাহিদা থেকে ব্যবহারযোগ্য Increment পর্যন্ত ধাপগুলো সাধারণ ক্রমে সাজান (▲▼ চেপে সরান)
- 🧭 Epic চিহ্নিত করা — বড় চাহিদা, role-goal-benefit-সহ
- 🗺️ Story map-এ backbone আর story সাজানো
- ✂️ উল্লম্বভাবে INVEST story-তে ভাঙা
- 🧪 প্রতিটি story-র acceptance criteria Given-When-Then-এ লেখা
- 📋 Definition of Ready মিলিয়ে Sprint-এ নেওয়া
- ✅ Definition of Done মিলিয়ে Increment-এ যোগ
INVEST সংক্ষিপ্ত রূপে “N” কোন গুণ বোঝায়?
- Necessary — story অবশ্যই দরকারি
- Negotiable — সমাধানের খুঁটিনাটি আলাপের জন্য খোলা
- New — story আগে কখনো লেখা হয়নি
- Numeric — story-তে সংখ্যা থাকতে হবে
Alistair Cockburn-এর goal level অনুযায়ী “একজন গ্রাহক মোবাইল ওয়ালেট অ্যাপে এক বসায় একটি নম্বরে রিচার্জ করেন” — এই use case কোন স্তরের?
- Summary
- Subfunction
- User-goal
- System test level
একটি Gherkin Scenario Outline-এ ৫টি ধাপ আর ৩টি placeholder আছে। তার Examples টেবিলে একটি header সারি আর ৪টি data সারি। মোট কতটি আসল scenario তৈরি হবে?
- ৫
- ৩
- ২০
- ৪
User story map-এ “walking skeleton” কী?
- সব must-অগ্রাধিকারের story একসাথে
- প্রতিটি backbone activity থেকে অন্তত একটি সরল story নিয়ে শুরু থেকে শেষ পর্যন্ত চলে এমন সবচেয়ে সরু পথ
- Map-এর ওপরের সারির activity-গুলো
- শুধু database আর server-এর কাঠামো, UI ছাড়া
“As a developer, I want to create the transactions table in the database, so that the API can save data.” — INVEST অনুযায়ী এর প্রধান সমস্যা কী?
- এটি খুব বড় (Small নয়)
- এতে “so that” অংশ নেই
- ব্যবহারকারীর কাছে সরাসরি মূল্য নেই — এটি একটি task (Valuable নয়)
- এটি অনুমান করা যায় না (Estimable নয়)
UML use case-এ “প্রিয় নম্বর সেভ করা” আচরণটি শুধু গ্রাহক চাইলে “মোবাইল রিচার্জ করা”-র শেষে যোগ হয়, আর “মোবাইল রিচার্জ করা” এটি সম্পর্কে কিছু জানে না। কোন সম্পর্ক, আর ড্যাশ তীর কোন দিকে?
- «include», রিচার্জ থেকে প্রিয় নম্বরের দিকে
- «extend», রিচার্জ থেকে প্রিয় নম্বরের দিকে
- Generalization, প্রিয় নম্বর থেকে রিচার্জের দিকে
- «extend», প্রিয় নম্বর থেকে রিচার্জের দিকে
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- Use case (Jacobson ১৯৮৭/১৯৯২; Cockburn ২০০০): primary actor, scope, level (summary, user-goal, subfunction), precondition, trigger, main success scenario, extension (
4a,*a) আর minimal ও success guarantee. - User story: As a <role>, I want <goal>, so that <benefit>; ৩টি C — Card, Conversation, Confirmation (Jeffries, ২০০১)।
- INVEST (Wake, ২০০৩): Independent, Negotiable, Valuable, Estimable, Small, Testable; task story নয়, epic ভাঙতে হয় উল্লম্বভাবে।
- Acceptance criteria: নিয়মের তালিকা বা Given-When-Then; Gherkin-এ Scenario Outline-এর প্রতিটি Examples সারি একটি scenario. Ready ≠ Done.
- Story map (Patton, ২০১৪): backbone বাঁ থেকে ডানে, story ওপর থেকে নিচে, প্রথম slice walking skeleton; পরিস্থিতি গুরুত্বপূর্ণ হলে job story.
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ২৩ · Requirement modeling — domain model, use case diagram, activity আর state diagramপরবর্তী পর্বUse case diagram আর আচরণের মডেল।
- পর্ব ২১ · Functional আর non-functional requirementআগের পর্বSRS আর মাপা যায় এমন requirement — story-র “fast” শব্দটিকে সংখ্যায় আনা।
- পর্ব ০৫ · Agile আর Scrumফিরে দেখুনProduct Backlog, refinement আর Definition of Done.
- সফটওয়্যার ইঞ্জিনিয়ারিং ও Git · কোর্স হোম৭০টি পর্বপুরো কোর্সের রোডম্যাপ — কোন পর্ব কখন।
- System Design · Requirement আর trade-offপাশের ট্র্যাকবড় system-এর requirement থেকে নকশার সিদ্ধান্ত।