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

Software estimation — story point, planning poker, function point আর COCOMO II

Software Estimation — Story Points, Planning Poker, Function Points and COCOMO II

Taught in Bangla, this lesson covers software estimation: the cone of uncertainty, estimates versus targets and commitments, expert judgement, Wideband Delphi and three-point PERT estimates, story points, planning poker and velocity, a full function point count from UFP through VAF to AFP, use case points, and Basic, Intermediate COCOMO 81 and COCOMO II, with worked examples and calculators.

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

  • অনুমান কেন কঠিন, আর estimate, target ও commitment আলাদা রাখা কেন জরুরি
  • Expert judgement, analogy, Wideband Delphi আর PERT-এর তিন-বিন্দু অনুমান — হাতে-কলমে
  • Story point, planning poker, T-shirt sizing আর velocity দিয়ে release পরিকল্পনা
  • একটি পূর্ণ function point গণনা — UFP থেকে VAF হয়ে AFP
  • Basic, Intermediate COCOMO আর COCOMO II দিয়ে effort, সময় আর দলের আকার — পরীক্ষার ধাঁচে পূর্ণ সমাধান

১ · অনুমান কেন কঠিন — cone of uncertainty

একটি কাল্পনিক বিশ্ববিদ্যালয়ের রেজিস্ট্রার অফিস জানতে চাইল: “অনলাইন ফলাফল পোর্টাল বানাতে কত দিন লাগবে, খরচ কত?” তখনো কেউ জানে না পোর্টালে transcript থাকবে কি না, পুনর্মূল্যায়নের আবেদন লাগবে কি না, কত হাজার শিক্ষার্থী একসাথে ফল দেখবেন। তবু উত্তর চাই আজই। এটাই software estimation-এর মূল সমস্যা: সবচেয়ে কম জানার সময়েই সবচেয়ে গুরুত্বপূর্ণ সংখ্যাটি চাওয়া হয়।

বাড়ি বানানোর কথা ভাবুন। “তিনতলা বাড়ি বানাতে কত খরচ?” — নকশা ছাড়া রাজমিস্ত্রি একটা মোটা দাগের অঙ্ক বলতে পারেন, কিন্তু টাইলস কোন মানের, লিফট থাকবে কি না, মাটি নরম কি না না জেনে সেটা দ্বিগুণ বা অর্ধেক হতেই পারে। নকশা চূড়ান্ত হলে, মাটি পরীক্ষা হলে, মালামালের তালিকা হলে হিসাব ধীরে ধীরে নিখুঁত হয়। Software-এ এই “মাটি পরীক্ষা” হলো requirement আর নকশার সিদ্ধান্ত।

Barry Boehm ১৯৮১ সালের বই Software Engineering Economics-এ project-এর বিভিন্ন পর্যায়ে অনুমানের ভুলের পরিসর দেখিয়েছিলেন। পরে Steve McConnell (Software Project Survival Guide, ১৯৯৭; Software Estimation: Demystifying the Black Art, ২০০৬) এই ছবিকে “cone of uncertainty” নামে জনপ্রিয় করেন। McConnell-এর বইয়ে প্রচলিত সংখ্যাগুলো এমন:

Cone of uncertainty

Estimate range vs project milestone (log scale; values as popularized by McConnell)

Cone of uncertainty: পর্যায় যত এগোয়, অনুমানের পরিসর তত সরু 4x2x1x 0.5x0.25x ১২৩ ৪৫৬ ওপরের সীমা নিচের সীমা আসল মান ১ ধারণা · ২ product সংজ্ঞা · ৩ requirement শেষ ৪ UI নকশা · ৫ বিস্তারিত নকশা · ৬ software শেষ
ছবি ৬০.১ — ধারণার পর্যায়ে অনুমান আসল মানের এক-চতুর্থাংশ থেকে চার গুণ পর্যন্ত হতে পারে (মোট ১৬ গুণ পরিসর); requirement শেষে 0.67x–1.5x; বিস্তারিত নকশা শেষে 0.9x–1.1x. উল্লম্ব অক্ষ log স্কেলে, তাই ওপর-নিচ সমান দেখায়।

দুটি সতর্কতা। প্রথমত, এই চোঙা সবচেয়ে ভালো অবস্থার ছবি — দক্ষ অনুমানকারী এর চেয়ে ভালো করতে পারেন না, কিন্তু খারাপ করতে পারেন। দ্বিতীয়ত, চোঙা নিজে থেকে সরু হয় না; সরু হয় যখন দল সিদ্ধান্ত নেয় (কোন feature থাকবে, কোন প্রযুক্তি)। সিদ্ধান্ত ঝুলে থাকলে মাঝপথেও অনিশ্চয়তা শুরুর মতোই থাকে। সংখ্যাগুলোর প্রমাণভিত্তি নিয়েও বিতর্ক আছে (প্রশ্ন ০১ দেখুন) — তাই এগুলোকে নিখুঁত নিয়ম নয়, দিকনির্দেশ হিসেবে নিন।

অনিশ্চয়তার আরও কিছু উৎস আছে: requirement বদলায় (পর্ব ২৪-এর scope creep), মানুষ ভুলে যান যে test, review, deploy-ও কাজ, আর অনুমানকারী নিজেই আশাবাদী। মনোবিজ্ঞানী Daniel Kahneman ও Amos Tversky ১৯৭৯ সালের দিকে এই প্রবণতার নাম দেন planning fallacy: অতীতে বারবার দেরি হলেও মানুষ নিজের পরের কাজের সময় কম ধরে। Software-এর বাইরে, ঢাকার রাস্তায় “দশ মিনিটে আসছি” বলাও এর পরিচিত রূপ।

২ · Estimate, target আর commitment — তিনটি আলাদা কথা

McConnell Software Estimation (২০০৬) বইয়ের শুরুতেই তিনটি শব্দ আলাদা করেন। অনেক project-এর ঝগড়ার মূলে থাকে এই তিনটিকে গুলিয়ে ফেলা।

শব্দমানেফলাফল পোর্টালের উদাহরণ (কাল্পনিক)
Estimateবিশ্লেষণভিত্তিক পূর্বাভাস, অনিশ্চয়তাসহ“প্রায় অর্ধেক সম্ভাবনায় ৪০ কর্মদিবস, ৮৫% নিশ্চয়তায় ৫২ কর্মদিবস।”
Targetব্যবসার কাঙ্ক্ষিত তারিখ বা বাজেট“ফল প্রকাশ ৩০ কর্মদিবস পরে, তার আগে চাই।”
Commitmentনির্দিষ্ট কাজ নির্দিষ্ট তারিখে দেওয়ার প্রতিশ্রুতি“৩০ দিনে শুধু ফল দেখা আর PDF; পুনর্মূল্যায়নের আবেদন পরের ধাপে।”

খেয়াল করুন, target আর estimate মেলেনি — ৩০ বনাম ৪০–৫২. ভুল পথ হলো estimate-কে চাপ দিয়ে ৩০ বানানো; তাতে কাজ কমে না, শুধু সংখ্যাটা মিথ্যা হয়। সঠিক পথ হলো আলোচনা: scope কমানো, লোক বা সময় বাড়ানো (সাবধানে — অংশ ৮-এ Brooks), নাকি ঝুঁকি মেনে নেওয়া। Commitment সেই আলোচনার ফল। McConnell-এর ভাষায়, estimation-এর কাজ target পূরণের পরিকল্পনা নয়; target বাস্তবসম্মত কি না, তা যাচাই করা।

মূল ধারণা

একটি সৎ estimate-এ তিনটি জিনিস থাকে: একটি পরিসর বা সম্ভাবনা (“৮৫% নিশ্চয়তায় ৫২ দিন”), কী ধরে নেওয়া হয়েছে (scope, দল, প্রযুক্তি) আর কখন আবার হিসাব হবে। “৪২ দিন” — একটিমাত্র সংখ্যা শুনলে মানুষ সেটিকেই commitment ধরে নেন।

৩ · বিশেষজ্ঞ, তুলনা, Wideband Delphi আর তিন-বিন্দু অনুমান

সূত্র ছাড়া অনুমানের তিনটি প্রচলিত পথ আছে, আর বাস্তবে এগুলোই সবচেয়ে বেশি ব্যবহৃত:

🧑‍🏫 Expert judgement

অভিজ্ঞ developer কাজটি টুকরো করে প্রতিটির সময় বলেন। দ্রুত, কিন্তু একজন মানুষের আশাবাদ আর ভুলে যাওয়া কাজ (test, deploy) সরাসরি ঢুকে পড়ে। Expert judgement ভালো হয় যখন কাজ ছোট টুকরো করা হয়, আর অনুমানকারী নিজেই কাজটি করবেন।

📚 Analogy

“গত বছর ভর্তি পোর্টাল বানাতে ৬০ দিন লেগেছিল; এটা তার প্রায় দুই-তৃতীয়াংশ।” Analogy আসল তথ্যের ওপর দাঁড়ায়, তাই নিজের দলের পুরোনো project-এর রেকর্ড রাখা খুব কাজের।

🗳️ Wideband Delphi

কয়েকজন আলাদাভাবে, গোপনে অনুমান করেন; পরিচালক পরিসর দেখান, দল পার্থক্যের কারণ নিয়ে আলোচনা করে, তারপর আবার গোপনে অনুমান — পরিসর সরু না হওয়া পর্যন্ত।

“Delphi” পদ্ধতির জন্ম ১৯৫০-এর দশকে যুক্তরাষ্ট্রের RAND Corporation-এ, বিশেষজ্ঞদের মতামত থেকে পূর্বাভাস তৈরির জন্য; মূল রূপে বিশেষজ্ঞরা পরস্পরের সাথে কথা বলতেন না, শুধু লিখিত সারাংশ পেতেন। ১৯৭০-এর দশকে Barry Boehm ও John Farquhar একে software-এর জন্য বদলান — প্রতিটি রাউন্ডের মাঝে দলগত আলোচনা যোগ করেন, তাই “wideband” (বেশি তথ্যের আদান-প্রদান)। Wideband Delphi-র বিবরণ Boehm-এর ১৯৮১ সালের বইয়ে আছে। Planning poker (অংশ ৪) একে বলা যায় এর দ্রুত, হালকা রূপ।

তিন-বিন্দু অনুমান আর PERT

একটি সংখ্যার বদলে তিনটি নিন: O (optimistic — সব ঠিকঠাক গেলে), M (most likely — সবচেয়ে সম্ভাব্য), P (pessimistic — অনেক কিছু ভুল গেলে, তবে প্রলয় নয়)। এটাই three-point estimation. PERT (১৯৫০-এর দশকের শেষে যুক্তরাষ্ট্রের নৌবাহিনীর Polaris প্রকল্পে তৈরি) এই তিনটিকে একটি beta বণ্টনের মতো ধরে সরল সূত্র দেয়:

te = (O + 4M + P) / 6   ·   σ = (P − O) / 6

উদাহরণ: “নম্বর জমার মডিউল” — O = ৩, M = ৫, P = ১৩ দিন। গড় = (৩ + ২০ + ১৩) ÷ ৬ = ৩৬ ÷ ৬ = ৬ দিন; standard deviation σ = (১৩ − ৩) ÷ ৬ = ১.৬৭ দিন। খেয়াল করুন, গড় ৬ সবচেয়ে সম্ভাব্য মান ৫-এর চেয়ে বেশি — কারণ দেরির দিকের লেজ লম্বা (P অনেক দূরে)। Software-এর কাজ প্রায় সবসময় এমন: আগে শেষ হওয়ার সুযোগ সীমিত, দেরির সুযোগ অনেক।

কয়েকটি স্বাধীন কাজ যোগ করলে গড় যোগ হয়, আর variance (σ²) যোগ হয় — σ নয়। তাই মোটের σ = √(σ₁² + σ₂² + …). কাজগুলো একটির পর একটি নির্ভরশীল হলে কোন পথ সবচেয়ে লম্বা (critical path), আর নির্দিষ্ট তারিখে শেষ হওয়ার সম্ভাবনা কত — সেই হিসাব পর্ব ৬১ · Project planning-এ CPM আর PERT network দিয়ে। নিচে অংশ ৪-এর শেষের প্রোগ্রামে পাঁচটি কাজের যোগফল চালিয়ে দেখবেন।

(P − O) ÷ ৬ সূত্রটি ধরে নেয় O আর P প্রায় চরম প্রান্ত (গড় থেকে প্রায় তিন σ দূরে)। মানুষ সাধারণত P খুব কম ধরে, তাই বাস্তবে বিচ্যুতি প্রায়ই বেশি হয়। McConnell-সহ অনেকে পরামর্শ দেন: নিজের দলের অতীতের অনুমান আর আসল সময় মিলিয়ে দেখুন, P কতটা ছোট ধরা হচ্ছিল।

৪ · Agile অনুমান — story point, planning poker আর velocity

Agile দলগুলো সাধারণত ঘণ্টায় নয়, আপেক্ষিক আকারে অনুমান করে। Story point (পর্ব ০৫-এ পরিচয়) একটি কাজের জটিলতা, অনিশ্চয়তা আর পরিমাণ মিলিয়ে আপেক্ষিক আকার। যুক্তি: মানুষ “এটা কত ঘণ্টা” বলতে দুর্বল, কিন্তু “এটা ওটার প্রায় দ্বিগুণ” বলতে বেশ ভালো। দল একটি চেনা, শেষ হওয়া কাজকে reference story ধরে — ধরা যাক “লগইন পাতায় পাসওয়ার্ড ভুললে SMS” = ২ point — আর বাকিগুলো তার সাথে তুলনা করে।

Point-এর জন্য সাধারণত Fibonacci-র মতো একটি স্কেল ব্যবহার হয়: ১, ২, ৩, ৫, ৮, ১৩, ২০, ৪০, ১০০ (Mike Cohn-এর জনপ্রিয় করা “modified Fibonacci”; অনেকে ০ আর ½-ও রাখেন)। ফাঁকগুলো ইচ্ছা করে বড় হতে থাকে: বড় কাজে ১৩ আর ১৪-এর পার্থক্য কেউ নিশ্চিত বলতে পারেন না, তাই স্কেলেই সেই অনিশ্চয়তা বসানো। ২০ বা তার বেশি পেলে সাধারণত কাজটি ভাঙার সংকেত।

Planning poker — কেন একসাথে কার্ড উল্টানো

Planning poker-এর বর্ণনা James Grenning ২০০২ সালের একটি লেখায় দেন বলে সাধারণভাবে ধরা হয়; Mike Cohn-এর Agile Estimating and Planning (২০০৫) বই একে ব্যাপক জনপ্রিয় করে। নিয়ম সরল: প্রত্যেকের হাতে স্কেলের কার্ড; Product Owner story পড়েন, প্রশ্নোত্তর হয়; তারপর সবাই গোপনে একটি কার্ড বেছে একসাথে উল্টান। সবচেয়ে কম আর সবচেয়ে বেশি যিনি দিয়েছেন, তাঁরা কারণ বলেন; আবার ভোট — যতক্ষণ না কাছাকাছি একটি সংখ্যায় দল একমত হয়।

একসাথে উল্টানোর কারণ anchoring: প্রথম শোনা সংখ্যা পরের সবার অনুমান নিজের দিকে টানে (Tversky ও Kahneman, ১৯৭৪-এর গবেষণা থেকে পরিচিত)। দলের সবচেয়ে অভিজ্ঞ মানুষ আগে “৩” বললে নতুন সদস্য তাঁর মাথায় আসা “১৩” বলতে দ্বিধা করেন — অথচ সেই নতুন সদস্যই হয়তো জানেন যে পুরোনো database-এ বাংলা নাম ভাঙা অবস্থায় আছে। সবচেয়ে বড় লাভটা আসলে আলোচনায়: পার্থক্য লুকানো ঝুঁকি বের করে আনে।

StoryProduct Owner পড়লেন
“একজন শিক্ষার্থী হিসেবে আমি নিজের ফলের
 PDF ডাউনলোড করতে চাই, যাতে বৃত্তির
 আবেদনে জমা দিতে পারি।”
reference: পাসওয়ার্ড ভুললে SMS = 2 point
স্কেল: 1 2 3 5 8 13 20 40
রাউন্ড ১একসাথে উল্টানো
রাফি  মিতু  তানভীর  সুমি  অনিক
  5     3     13       2     8
পরিসর: 2 … 13  → ঐকমত্য নেই
আলোচনাসর্বনিম্ন আর সর্বোচ্চ বলেন
সুমি (2):    “শুধু একটা PDF library ডাকব।”
তানভীর (13): “বাংলা font PDF-এ ভাঙে;
             আর ফলের সাথে QR কোড লাগবে
             যাচাইয়ের জন্য — PO কি চান?”
PO: “QR লাগবে।” → নতুন তথ্য সবাই জানলেন
রাউন্ড ২আবার গোপনে, একসাথে
রাফি  মিতু  তানভীর  সুমি  অনিক
  5     5      8       3     8
পরিসর: 3 … 8  → এখনো দুই ধাপ ফাঁক
রাউন্ড ৩সবাই এক ধাপের মধ্যে
রাফি  মিতু  তানভীর  সুমি  অনিক
  5     5      8       5     8
নিয়ম: সব কার্ড পাশাপাশি দুই মানে → সবচেয়ে
      বেশিবার আসা মান = 5 point
রাউন্ডের অবস্থা
রাউন্ড
সর্বনিম্ন – সর্বোচ্চ
ঐকমত্য?
  1. Story আর reference. Product Owner story পড়েন, দল প্রশ্ন করে। তুলনার ভিত্তি একটি চেনা কাজ — “পাসওয়ার্ড ভুললে SMS” = ২ point. কার্ডের স্কেল ১ থেকে ৪০.
  2. রাউন্ড ১ — একসাথে উল্টানো. পাঁচজন গোপনে বেছে একসাথে দেখান: ৫, ৩, ১৩, ২, ৮. কেউ কারও সংখ্যা আগে শোনেননি, তাই কোনো anchoring হয়নি। পরিসর ২ থেকে ১৩ — খুব চওড়া, মানে মানুষ কাজটিকে আলাদাভাবে বুঝেছেন।
  3. আলোচনা — সর্বনিম্ন আর সর্বোচ্চ. সুমি (২) ভেবেছেন শুধু একটি library ডাকা। তানভীর (১৩) দুটি ঝুঁকি জানেন: PDF-এ বাংলা font ভাঙে, আর যাচাইয়ের QR কোড। Product Owner নিশ্চিত করেন QR লাগবে। এটাই planning poker-এর আসল লাভ — লুকানো কাজ বেরিয়ে এলো।
  4. রাউন্ড ২. নতুন তথ্য নিয়ে আবার গোপনে: ৫, ৫, ৮, ৩, ৮. পরিসর ৩ থেকে ৮ — সরু হয়েছে, কিন্তু স্কেলে এখনো দুই ধাপ ফাঁক (৩ → ৫ → ৮)। সর্বনিম্ন (৩) আর সর্বোচ্চ (৮) আবার সংক্ষেপে বলেন।
  5. রাউন্ড ৩ — ঐকমত্য. ৫, ৫, ৮, ৫, ৮ — সব কার্ড স্কেলের পাশাপাশি দুই মানে। এই দলের নিয়ম: তখন সবচেয়ে বেশিবার আসা মান নেওয়া, অর্থাৎ ৫ point. (অনেক দল উঁচু মানটি নেয়, বা আলোচনা করে ঠিক করে — নিয়মটা দলের আগে থেকে ঠিক করা থাকা দরকার।)

T-shirt sizing, velocity আর release পরিকল্পনা

Backlog-এ শত শত item থাকলে প্রতিটিতে planning poker অনেক সময় নেয়। তখন T-shirt sizing: XS, S, M, L, XL — দর্জির মাপের মতো মোটা দাগে। শুরুর দিকে বা epic স্তরে এটি যথেষ্ট; পরে Sprint-এর কাছাকাছি এলে point দেওয়া হয়। কোনো কোনো দল প্রতিটি সাইজের সাথে একটি point-এর পরিসর জুড়ে দেয়, তবে সেটি দলের নিজের চুক্তি।

Point থেকে সময় আসে velocity দিয়ে: বাকি backlog ২০০ point আর velocity ১৭–২৫ হলে release planning-এ ৮ থেকে ১২ Sprint-এর পরিসর। এই হিসাব, burndown আর Monte Carlo দিয়ে “৮৫% নিশ্চয়তায় কত Sprint” — সব পর্ব ০৫ · Agile আর Scrum-এ পূর্ণভাবে করা আছে; আর point ছাড়াই আসল cycle time-এর percentile দিয়ে পূর্বাভাস পর্ব ০৬ · Kanban আর lean-এ। এখানে শুধু মনে রাখুন: story point দলের নিজের একক, দুই দলের তুলনা চলে না, আর velocity-কে লক্ষ্য বানালে point ফুলে ওঠে (Goodhart’s law).

#NoEstimates বিতর্ক: ২০১২-র দিকে Woody Zuill-সহ কয়েকজন একটি hashtag দিয়ে আলোচনা শুরু করেন, পরে Vasco Duarte এ নিয়ে বই লেখেন (২০১৫ সালের দিকে)। #NoEstimates-এর মূল প্রশ্ন: বিস্তারিত অনুমানে যে সময় যায়, তার বদলে কাজ ছোট আর প্রায় সমান আকারে ভেঙে শুধু সংখ্যা গুনলে (সপ্তাহে কয়টি item শেষ) কি একই মানের পূর্বাভাস পাওয়া যায়? সমালোচকেরা বলেন, বাজেট, চুক্তি আর বিনিয়োগের সিদ্ধান্তে অনুমান লাগবেই — নাম বদলালেও গোনা নিজেই এক ধরনের অনুমান। দুই পক্ষের মধ্যে মিলের জায়গাটি হলো: কাজ ছোট করুন, আর যা মাপা যায় তার ভিত্তিতে পূর্বাভাস দিন।

এবার planning poker আর PERT একসাথে চালিয়ে দেখুন। প্রোগ্রামটি seed দেওয়া PRNG (mulberry32) দিয়ে পাঁচজনের প্রথম কার্ড তৈরি করে, যাতে প্রতিবার একই ফল আসে। আলোচনার পরের নিয়মটি ইচ্ছা করে সরল রাখা: প্রত্যেকে স্কেলে নিজের কার্ড আর দলের median কার্ডের মাঝামাঝি সরে যান; সব কার্ড এক ধাপের মধ্যে এলে সবচেয়ে বেশিবার আসা কার্ড। তারপর ফলাফল পোর্টালের পাঁচটি কাজের তিন-বিন্দু অনুমান যোগ করা হয়:

// Planning poker rounds (seeded) + three-point PERT for 5 tasks.
let seed = 2005;                                  // mulberry32: small seeded PRNG
function rand() {
  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 CARDS = [1, 2, 3, 5, 8, 13, 20, 40];
// round 1: each of 5 people secretly picks a card index around index 3 (= 5 points)
let idx = Array.from({ length: 5 }, () => Math.max(0, Math.min(7, 3 + Math.floor(rand() * 5) - 2)));
for (let round = 1; round <= 4; round++) {
  console.log("round " + round + ": " + idx.map(i => CARDS[i]).join(", "));
  if (Math.max(...idx) - Math.min(...idx) <= 1) {  // rule: all within one card -> agree
    const freq = {}; idx.forEach(i => freq[i] = (freq[i] || 0) + 1);
    const best = Object.keys(freq).map(Number).sort((a, b) => freq[b] - freq[a] || b - a)[0];
    console.log("  consensus -> " + CARDS[best] + " points"); break;
  }
  console.log("  lowest (" + CARDS[Math.min(...idx)] + ") and highest (" + CARDS[Math.max(...idx)] + ") explain");
  const med = [...idx].sort((a, b) => a - b)[2]; // after talking, move halfway to the median card
  idx = idx.map(i => Math.round((i + med) / 2));
}
// three-point estimates in days: [optimistic, most likely, pessimistic]
const tasks = { login: [2, 3, 6], marks: [3, 5, 13], pdf: [1, 2, 5], recheck: [2, 4, 8], tests: [2, 3, 4] };
let mean = 0, variance = 0;
for (const [name, [o, m, p]] of Object.entries(tasks)) {
  const te = (o + 4 * m + p) / 6, sd = (p - o) / 6;
  mean += te; variance += sd * sd;                 // variances add if tasks are independent
  console.log(name.padEnd(8) + " O=" + o + " M=" + m + " P=" + p + "  mean=" + te.toFixed(2) + "  sd=" + sd.toFixed(2));
}
const sdSum = Math.sqrt(variance);
console.log("total mean = " + mean.toFixed(2) + " days, sd = " + sdSum.toFixed(2));
console.log("about 84% chance within mean + 1 sd = " + (mean + sdSum).toFixed(1) + " days (normal approx.)");

আউটপুট:

round 1: 5, 3, 13, 2, 8
  lowest (2) and highest (13) explain
round 2: 5, 5, 8, 3, 8
  lowest (3) and highest (8) explain
round 3: 5, 5, 8, 5, 8
  consensus -> 5 points
login    O=2 M=3 P=6  mean=3.33  sd=0.67
marks    O=3 M=5 P=13  mean=6.00  sd=1.67
pdf      O=1 M=2 P=5  mean=2.33  sd=0.67
recheck  O=2 M=4 P=8  mean=4.33  sd=1.00
tests    O=2 M=3 P=4  mean=3.00  sd=0.33
total mean = 19.00 days, sd = 2.19
about 84% chance within mean + 1 sd = 21.2 days (normal approx.)

রাউন্ডগুলো ঠিক ওপরের stepper-এর সংখ্যা। রাউন্ড ১-এ কার্ডের অবস্থান (index) ৩, ২, ৫, ১, ৪; median ৩. প্রত্যেকে মাঝামাঝি সরলে (২ + ৩) ÷ ২ = ২.৫ → ৩, (৪ + ৩) ÷ ২ = ৩.৫ → ৪ ইত্যাদি, তাই রাউন্ড ২-এ ৫, ৫, ৮, ৩, ৮. রাউন্ড ৩-এ সব কার্ড ৫ আর ৮ — পাশাপাশি দুই মান — তাই ঐকমত্য, আর ৫ এসেছে তিনবার।

PERT অংশে প্রতিটি কাজের গড় M-এর চেয়ে বেশি, বিশেষ করে marks-এ (M = ৫, গড় ৬) — লম্বা দেরির লেজের কারণে। পাঁচটি গড় যোগ: ৩.৩৩ + ৬ + ২.৩৩ + ৪.৩৩ + ৩ = ১৯ দিন। মোট σ σ-গুলোর যোগফল (৪.৩৩) নয়; variance যোগ: ০.৪৪ + ২.৭৮ + ০.৪৪ + ১ + ০.১১ = ৪.৭৮, বর্গমূল ২.১৯. কাজগুলো স্বাধীন আর মোটের বণ্টন প্রায় normal ধরলে, গড় + ১σ ≈ ২১.২ দিনের মধ্যে শেষ হওয়ার সম্ভাবনা প্রায় ৮৪%. লক্ষ করুন, সবার M যোগ করলে মাত্র ১৭ দিন — সেটাকে commitment বানালে অর্ধেকের বেশি সম্ভাবনায় দেরি।

৫ · আকার মাপা — LOC-এর সমস্যা আর function point

Effort-এর সূত্র (COCOMO) চায় software-এর আকার। সবচেয়ে সহজ মাপ LOC (lines of code), হাজারে KLOC. কিন্তু এর তিনটি বড় সমস্যা:

  • শুরুতে জানা যায় না। কোড লেখার আগে লাইন গোনা যায় না — অনুমান করতে হয়, অর্থাৎ এক অনুমান দিয়ে আরেক অনুমান।
  • ভাষা আর ধরনের ওপর নির্ভরশীল। একই কাজ assembly-তে হাজার লাইন, Python-এ কয়েক ডজন। লাইন গোনার নিয়মও আলাদা (comment, ফাঁকা লাইন, এক লাইনে কয়টি statement).
  • উৎপাদনশীলতার উল্টো ছবি। LOC প্রতি person-month দিয়ে মাপলে নিম্নস্তরের ভাষার দলকে বেশি “উৎপাদনশীল” দেখায় — Capers Jones এই বিভ্রান্তি নিয়ে বহু লেখা লিখেছেন। লাইন বাড়িয়ে পুরস্কার পাওয়া গেলে মানুষ লাইন বাড়াবে।

১৯৭৯ সালে IBM-এর Allan Albrecht একটি বিকল্প প্রস্তাব করেন: function point — software ব্যবহারকারীকে কী কাজ দেয়, সেটা গুনে আকার। কোন ভাষায় লেখা, তাতে কিছু আসে যায় না, আর requirement পেলেই গোনা যায়। ১৯৮৬ সালে গঠিত IFPUG এখন গোনার নিয়ম (Counting Practices Manual) রক্ষা করে।

পাঁচ ধরনের function

প্রথম কাজ application boundary আঁকা — কোনটা আমাদের system, কোনটা বাইরে। তারপর দুই দলে পাঁচ ধরনের function:

Function point-এর পাঁচটি উপাদান

Transactions (EI, EO, EQ) cross the boundary; ILF lives inside, EIF belongs to another application

EI, EO, EQ সীমা পার হয়; ILF ভেতরে; EIF অন্য system-এর ব্যবহার কারী ফলাফল পোর্টাল (boundary) EI EO EQ ILF শিক্ষার্থী, নম্বর নিজে রাখে ও বদলায় ফি সিস্টেম (অন্য app) EIF ফি পরিশোধ শুধু পড়া
ছবি ৬০.২ — তিনটি transaction function (EI, EO, EQ) সীমা পার হয়। ILF পোর্টাল নিজে রাখে ও বদলায়; EIF অন্য application-এর data, পোর্টাল শুধু পড়ে (যেমন ফি পরিশোধ হয়েছে কি না)।
ধরনকীপোর্টালের উদাহরণWeight: low / avg / high
EI — External inputবাইরে থেকে data এনে সাধারণত ILF বদলায়নম্বর জমা, প্রোফাইল সম্পাদনা3 / 4 / 6
EO — External outputবাইরে data পাঠায়, সাথে হিসাব বা নতুন উৎপন্ন তথ্যCGPA হিসাব করা ফলাফলপত্র, মেধাতালিকা4 / 5 / 7
EQ — External inquiryখুঁজে হুবহু ফেরত দেয়, কোনো হিসাব নেইroll দিয়ে শিক্ষার্থী খোঁজা3 / 4 / 6
ILF — Internal logical fileনিজে রাখা, যুক্ত data-র দলশিক্ষার্থী, কোর্স, নম্বর7 / 10 / 15
EIF — External interface fileঅন্য app-এর data, শুধু পড়াফি সিস্টেমের পরিশোধ তথ্য5 / 7 / 10

প্রতিটি function low, average না high — তা IFPUG manual-এর ছক থেকে ঠিক হয়: transaction-এর জন্য কয়টি data element (DET) আর কয়টি file ছোঁয় (FTR), data function-এর জন্য DET আর record type (RET). পরীক্ষায় সাধারণত জটিলতা বলে দেওয়া থাকে। পাঁচটির weight সংখ্যা দিয়ে গুণ করে যোগ করলে unadjusted function point (UFP).

তারপর সমন্বয়: ১৪টি general system characteristic (GSC) — data communications, distributed data processing, performance, heavily used configuration, transaction rate, online data entry, end-user efficiency, online update, complex processing, reusability, installation ease, operational ease, multiple sites, facilitate change — প্রতিটিকে ০ (প্রভাব নেই) থেকে ৫ (অপরিহার্য)। মোট (ΣGSC, যাকে TDI-ও বলে) থেকে value adjustment factor:

VAF = 0.65 + 0.01 × ΣGSC   ·   AFP = UFP × VAF

ΣGSC ০ থেকে ৭০, তাই VAF 0.65 থেকে 1.35 — অর্থাৎ সমন্বয়ে আকার সর্বোচ্চ ৩৫% কমে বা বাড়ে। এবার পোর্টালের পূর্ণ গণনা ধাপে ধাপে:

গণনাboundary আর function-এর তালিকা
ধরন   low  avg  high
EI     4    3    1    নম্বর জমা, লগইন, CSV upload …
EO     2    3    1    ফলাফলপত্র, transcript PDF …
EQ     3    2    0    শিক্ষার্থী খোঁজা, ফল দেখা …
ILF    2    2    1    শিক্ষার্থী, কোর্স, নম্বর …
EIF    1    1    0    ফি সিস্টেম, বোর্ডের তথ্য
EI আর EOসংখ্যা × weight
EI : 4×3 + 3×4 + 1×6  = 12 + 12 + 6  = 30
EO : 2×4 + 3×5 + 1×7  =  8 + 15 + 7  = 30
EQ, ILF, EIFবাকি তিনটি
EQ : 3×3 + 2×4 + 0×6   =  9 +  8 +  0 = 17
ILF: 2×7 + 2×10 + 1×15 = 14 + 20 + 15 = 49
EIF: 1×5 + 1×7 + 0×10  =  5 +  7 +  0 = 12
UFPযোগফল
UFP = 30 + 30 + 17 + 49 + 12 = 138
১৪টি GSCপ্রতিটি 0–5
data comm 4  distributed 2  performance 4
heavy config 3  transaction rate 4
online entry 5  end-user eff. 4  online update 3
complex proc. 2  reusability 1  install 2
operational 3  multiple sites 0  change 1
ΣGSC = 38   →   VAF = 0.65 + 0.38 = 1.03
AFPচূড়ান্ত আকার
AFP = UFP × VAF = 138 × 1.03 = 142.14 FP
চলতি হিসাব
যোগ হয়েছে
চলতি যোগফল
VAF
আকার
  1. Boundary আর গণনা. পোর্টালের সীমা আঁকা হলো, প্রতিটি function চিহ্নিত করে ধরন আর জটিলতা (low/avg/high) ঠিক করা হলো। যেমন CSV ফাইলে একসাথে সব নম্বর upload — অনেক data element আর কয়েকটি file ছোঁয়, তাই high EI.
  2. EI আর EO. EI: ৪ × ৩ + ৩ × ৪ + ১ × ৬ = ১২ + ১২ + ৬ = ৩০. EO: ২ × ৪ + ৩ × ৫ + ১ × ৭ = ৮ + ১৫ + ৭ = ৩০. চলতি যোগফল ৬০.
  3. EQ, ILF আর EIF. EQ: ৯ + ৮ + ০ = ১৭. ILF: ১৪ + ২০ + ১৫ = ৪৯ — data function-এর weight বেশি, কারণ ফাইল রক্ষণাবেক্ষণের কাজ বেশি। EIF: ৫ + ৭ + ০ = ১২. চলতি যোগফল ৬০ + ১৭ + ৪৯ + ১২ = ১৩৮.
  4. UFP = ১৩৮. এটি সমন্বয়ের আগের আকার। খেয়াল করুন, ILF একাই ৪৯ — মোটের এক-তৃতীয়াংশের বেশি।
  5. ১৪টি GSC. Online data entry অপরিহার্য (৫), কিন্তু multiple sites নেই (০)। মোট ৪ + ২ + ৪ + ৩ + ৪ + ৫ + ৪ + ৩ + ২ + ১ + ২ + ৩ + ০ + ১ = ৩৮. VAF = ০.৬৫ + ০.০১ × ৩৮ = ১.০৩.
  6. AFP = ১৪২.১৪. ১৩৮ × ১.০৩ = ১৪২.১৪ adjusted function point. সমন্বয় আকার মাত্র ৩% বাড়াল, কারণ ΣGSC ৩৮ মাঝামাঝি (৩৫ হলে VAF ঠিক ১.০০ হতো)।

একই হিসাব Python-এ, প্রতিটি ধাপ ছাপিয়ে — নিজের সংখ্যা বসিয়ে চালাতে পারেন:

# Function point count for a fictional university result portal (IFPUG-style).
WEIGHTS = {"EI": (3, 4, 6), "EO": (4, 5, 7), "EQ": (3, 4, 6),
           "ILF": (7, 10, 15), "EIF": (5, 7, 10)}        # low, average, high
COUNTS = {"EI": (4, 3, 1),   # login, mark entry, profile edit, recheck form, CSV upload...
          "EO": (2, 3, 1),   # grade sheet, transcript PDF, merit list...
          "EQ": (3, 2, 0),   # search student, view result...
          "ILF": (2, 2, 1),  # student, course, marks...
          "EIF": (1, 1, 0)}  # fee system, national exam board data

ufp = 0
for kind, (lo, av, hi) in COUNTS.items():
    w = WEIGHTS[kind]
    sub = lo * w[0] + av * w[1] + hi * w[2]
    ufp += sub
    print(f"{kind:3}: {lo}x{w[0]} + {av}x{w[1]} + {hi}x{w[2]} = {sub}")
print("UFP (unadjusted) =", ufp)

GSC = {"data communications": 4, "distributed processing": 2, "performance": 4,
       "heavily used config": 3, "transaction rate": 4, "online data entry": 5,
       "end-user efficiency": 4, "online update": 3, "complex processing": 2,
       "reusability": 1, "installation ease": 2, "operational ease": 3,
       "multiple sites": 0, "facilitate change": 1}            # each 0..5
tdi = sum(GSC.values())
vaf = 0.65 + 0.01 * tdi
print(f"14 GSC ratings sum (TDI) = {tdi}")
print(f"VAF = 0.65 + 0.01 x {tdi} = {vaf:.2f}")
afp = ufp * vaf
print(f"AFP = {ufp} x {vaf:.2f} = {afp:.2f}")
print(f"VAF range check: {0.65 + 0.01*0:.2f} .. {0.65 + 0.01*70:.2f}")

আউটপুট:

EI : 4x3 + 3x4 + 1x6 = 30
EO : 2x4 + 3x5 + 1x7 = 30
EQ : 3x3 + 2x4 + 0x6 = 17
ILF: 2x7 + 2x10 + 1x15 = 49
EIF: 1x5 + 1x7 + 0x10 = 12
UFP (unadjusted) = 138
14 GSC ratings sum (TDI) = 38
VAF = 0.65 + 0.01 x 38 = 1.03
AFP = 138 x 1.03 = 142.14
VAF range check: 0.65 .. 1.35

প্রতিটি লাইন stepper-এর হিসাবের সাথে মেলে। শেষ লাইন মনে করিয়ে দেয় VAF-এর সীমা: সব GSC শূন্য হলে ০.৬৫, সব ৫ হলে ১.৩৫. :.2f দুই দশমিক পর্যন্ত দেখায়, তাই ভাসমান বিন্দুর ছোট ভুল (যেমন ১.০৩০০০০০০০১) চোখে পড়ে না। পরীক্ষায় হাতে করলে ঠিক এই ক্রম মেনে লিখুন — প্রতিটি ধরনের উপযোগফল, UFP, ΣGSC, VAF, তারপর AFP; নম্বর ধাপে ধাপে দেওয়া হয়।

সংস্করণের পার্থক্য: IFPUG-এর নতুন manual-এ (সংস্করণ ৪.৩ থেকে, ২০১০ সালের দিকে) VAF ঐচ্ছিক করা হয়েছে, আর ISO/IEC 20926 মানদণ্ডে IFPUG-এর functional size বলতে unadjusted আকারই বোঝায়। বহু পাঠ্যবই আর পরীক্ষা এখনো VAF-সহ পুরোনো পদ্ধতি চায়, তাই দুটোই জানুন; উত্তরে কোনটি করছেন তা লিখে দিন। Function point-এর আরও কয়েকটি রূপ আছে, যেমন COSMIC (ISO/IEC 19761).

৬ · Use case point আর backfiring — আকার থেকে লাইনে

Requirement যদি use case আকারে থাকে (পর্ব ২২), তাহলে Gustav Karner-এর ১৯৯৩ সালের use case point পদ্ধতি ব্যবহার করা যায়। প্রচলিত রূপে: প্রতিটি use case-কে transaction-এর সংখ্যা অনুযায়ী simple / average / complex ধরে weight ৫ / ১০ / ১৫ (যোগফল UUCW); actor-দের simple / average / complex ধরে ১ / ২ / ৩ (UAW). তারপর:

UCP = (UUCW + UAW) × TCF × ECF
TCF = 0.6 + 0.01 × TFactor · ECF = 1.4 − 0.03 × EFactor

TFactor আসে ১৩টি প্রযুক্তিগত গুণকের weight দেওয়া রেটিং থেকে, EFactor আসে ৮টি পরিবেশগত গুণক (দলের অভিজ্ঞতা, requirement-এর স্থিরতা ইত্যাদি) থেকে। ছোট উদাহরণ: ৮টি average use case (UUCW = ৮ × ১০ = ৮০) আর তিনজন average actor (UAW = ৩ × ২ = ৬); তাহলে ৮০ + ৬ = ৮৬. TCF = ১.০ আর ECF = ০.৯৫ হলে UCP = ৮৬ × ১.০ × ০.৯৫ = ৮১.৭. Karner প্রতি UCP-তে প্রায় ২০ person-hour প্রস্তাব করেছিলেন; সেই হারে ৮১.৭ × ২০ = ১,৬৩৪ ঘণ্টা। পরে অনেকে নিজেদের তথ্যে এই হার আলাদা পেয়েছেন — তাই হারটি নিজের দলের অতীত থেকে ঠিক করাই নিরাপদ।

Backfiring — function point থেকে KLOC

COCOMO 81 আকার চায় KLOC-এ। Function point থেকে KLOC-এ যাওয়ার মোটা দাগের পথ backfiring: ভাষাভিত্তিক একটি গড় অনুপাত — “এই ভাষায় এক function point-এ গড়ে কত লাইন” — দিয়ে গুণ। Capers Jones, QSM-সহ বিভিন্ন উৎস এমন ছক প্রকাশ করেছে; মোটা দাগে C-এর মতো ভাষায় অনুপাত একশোর ওপরে, Java-র মতো ভাষায় তার প্রায় অর্ধেক বা কম — কিন্তু উৎস আর দলভেদে সংখ্যাগুলো অনেক আলাদা। তাই সবসময় ধরে নেওয়া অনুপাতটি স্পষ্ট লিখুন।

ধরা যাক ফলাফল পোর্টালের ভাষার জন্য ৫০ LOC/FP (একটি অনুমান, কোনো মানদণ্ড নয়)। তাহলে ১৪২.১৪ × ৫০ = ৭,১০৭ লাইন ≈ ৭.১ KLOC. COCOMO II সরাসরি function point নিয়েও কাজ করতে পারে — ভেতরে এই রূপান্তরই করে।

৭ · COCOMO 81 — Basic আর Intermediate

Barry Boehm ১৯৮১ সালে Software Engineering Economics বইয়ে COCOMO (COnstructive COst MOdel) প্রকাশ করেন। প্রায় ৬৩টি project-এর তথ্য থেকে (মূলত TRW-তে, যেখানে Boehm কাজ করতেন) তিনি আকার আর effort-এর সম্পর্কের সূত্র বের করেন। Effort-এর একক person-month (PM) — একজন মানুষের এক মাসের কাজ।

তিনটি mode

Modeকেমন projectabcd
Organicছোট, অভিজ্ঞ দল, চেনা ধরনের কাজ, নমনীয় requirement (যেমন ফলাফল পোর্টাল)2.41.052.50.38
Semi-detachedমাঝারি; দলে অভিজ্ঞ-নতুন মিশ্রণ, কিছু কঠোর শর্ত (যেমন ব্যাংকের লেনদেন system)3.01.122.50.35
Embeddedকঠোর hardware, নিয়ম বা সময়ের বাঁধনে (যেমন রেলের সংকেত, বিমানের firmware)3.61.202.50.32
E = a × (KLOC)b person-month  ·  D = c × Ed মাস  ·  দল = E ÷ D জন

খেয়াল করুন, b সবসময় ১-এর বেশি। এর মানে diseconomy of scale: আকার দ্বিগুণ হলে effort দ্বিগুণের বেশি, কারণ বড় project-এ যোগাযোগ, integration আর সমন্বয়ের কাজ আকারের চেয়ে দ্রুত বাড়ে। আর সময়ের সূত্রে d ছোট (০.৩২–০.৩৮) — effort আট গুণ হলেও সময় মাত্র দুই গুণের মতো বাড়ে; বাকিটা আসে বেশি মানুষ থেকে।

ধাপ ১mode আর ধ্রুবক
আকার: 32 KLOC   mode: organic
a = 2.4   b = 1.05   c = 2.5   d = 0.38
ধাপ ২ঘাত
32^1.05 = e^(1.05 × ln 32)
        = e^(1.05 × 3.4657) = e^3.6390
        = 38.05
ধাপ ৩effort
E = 2.4 × 38.05 = 91.3 person-month
ধাপ ৪সময়
E^0.38 = 91.3^0.38 = 5.56
D = 2.5 × 5.56 = 13.9 মাস
ধাপ ৫দল আর উৎপাদনশীলতা
দল  = 91.3 ÷ 13.9 = 6.6 জন (গড়ে)
LOC/PM = 32000 ÷ 91.3 = 350
ধাপ ৬“৭ মাসে ১৩ জন দিয়ে?”
13.9 মাস → 7 মাস = 50% সময়
Boehm: nominal-এর প্রায় 75%-এর নিচে সংকোচন
       কার্যত অসম্ভব → 0.75 × 13.9 ≈ 10.4 মাস
       পর্যন্ত চেষ্টা করা যায়, বেশি খরচে
হিসাবের অবস্থা
KLOCb
E (PM)
D (মাস)
দল
  1. Mode বাছাই. ফলাফল পোর্টালের পরের সংস্করণ, আকার ৩২ KLOC, ছোট অভিজ্ঞ দল, চেনা ধরনের কাজ — organic. ধ্রুবক a = ২.৪, b = ১.০৫, c = ২.৫, d = ০.৩৮.
  2. ঘাত হিসাব. ক্যালকুলেটরে xy চাপুন, অথবা log দিয়ে: ln ৩২ = ৩.৪৬৫৭, × ১.০৫ = ৩.৬৩৯০, e-এর ঘাত = ৩৮.০৫. লক্ষ করুন, ৩৮.০৫ ৩২-এর চেয়ে বেশি — এটাই diseconomy of scale.
  3. Effort. E = ২.৪ × ৩৮.০৫ = ৯১.৩ person-month. অর্থাৎ একজন মানুষের প্রায় সাড়ে সাত বছরের কাজ।
  4. সময়. ৯১.৩০.৩৮ = ৫.৫৬; D = ২.৫ × ৫.৫৬ = ১৩.৯ মাস। এটি nominal (স্বাভাবিক) সময়সূচি।
  5. দল আর উৎপাদনশীলতা. গড় দল ৯১.৩ ÷ ১৩.৯ = ৬.৬ জন — বাস্তবে শুরুতে কম, মাঝে বেশি। প্রতি person-month-এ ৩২,০০০ ÷ ৯১.৩ = ৩৫০ লাইন।
  6. সময় কমানোর চাপ. ব্যবস্থাপক চান ৭ মাসে, ১৩ জন দিয়ে (৭ × ১৩ ≈ ৯১ PM — গুণফল মিলছে!)। কিন্তু person আর month বদলযোগ্য নয়। Boehm-এর মডেলে nominal সময়ের প্রায় ৭৫%-এর নিচে সংকোচন কার্যত অসম্ভব অঞ্চল ধরা হয় — এখানে প্রায় ১০.৪ মাস, তাও বেশি খরচে (COCOMO II-এ SCED গুণক ঠিক এটাই মাপে)। এর কারণ অংশ ৮-এর Brooks-এর সূত্রে।

তিনটি mode একসাথে, আর আকার দ্বিগুণ করলে কী হয় — প্রোগ্রামে দেখুন:

// Basic COCOMO (Boehm, 1981): effort, duration and average team size for 3 modes.
const MODES = {
  organic:       { a: 2.4, b: 1.05, c: 2.5, d: 0.38 },
  semidetached:  { a: 3.0, b: 1.12, c: 2.5, d: 0.35 },
  embedded:      { a: 3.6, b: 1.20, c: 2.5, d: 0.32 },
};
const KLOC = 32;                                   // estimated size: 32 thousand lines
console.log("size = " + KLOC + " KLOC");
console.log("mode           effort(PM)  time(months)  team  LOC/PM");
for (const [name, m] of Object.entries(MODES)) {
  const effort = m.a * Math.pow(KLOC, m.b);        // person-months
  const time = m.c * Math.pow(effort, m.d);        // calendar months
  const team = effort / time;                      // average people
  const prod = (KLOC * 1000) / effort;             // lines per person-month
  console.log(name.padEnd(14) + effort.toFixed(1).padStart(11) + time.toFixed(1).padStart(14) +
    team.toFixed(1).padStart(6) + prod.toFixed(0).padStart(8));
}
// Diseconomy of scale: what happens when size doubles?
for (const k of [16, 32, 64]) {
  const e = 2.4 * Math.pow(k, 1.05);
  console.log("organic " + String(k).padStart(2) + " KLOC -> " + e.toFixed(1) + " PM");
}

আউটপুট:

size = 32 KLOC
mode           effort(PM)  time(months)  team  LOC/PM
organic              91.3          13.9   6.6     350
semidetached        145.5          14.3  10.2     220
embedded            230.4          14.3  16.2     139
organic 16 KLOC -> 44.1 PM
organic 32 KLOC -> 91.3 PM
organic 64 KLOC -> 189.1 PM

একই ৩২ KLOC embedded হলে effort organic-এর প্রায় আড়াই গুণ (২৩০.৪ বনাম ৯১.৩), অথচ সময় প্রায় একই (১৪.৩ বনাম ১৩.৯ মাস) — বাড়তি effort আসে বড় দল থেকে (১৬.২ জন)। উৎপাদনশীলতা ৩৫০ থেকে ১৩৯ লাইনে নামে, কারণ কঠোর শর্তে প্রতিটি লাইনের পেছনে বেশি যাচাই। শেষ তিন লাইনে আকার ১৬ → ৩২ → ৬৪: effort ৪৪.১ → ৯১.৩ → ১৮৯.১, প্রতিবার দ্বিগুণের একটু বেশি (২১.০৫ ≈ ২.০৭ গুণ)। Embedded-এ b = ১.২০, সেখানে দ্বিগুণ আকারে effort প্রায় ২.৩ গুণ।

Intermediate COCOMO — ১৫টি cost driver

Basic COCOMO শুধু আকার দেখে। Intermediate COCOMO ১৫টি cost driver যোগ করে, চার দলে: product (RELY — প্রয়োজনীয় নির্ভরযোগ্যতা, DATA, CPLX), computer (TIME, STOR, VIRT, TURN), personnel (ACAP — analyst-এর দক্ষতা, AEXP, PCAP — programmer-এর দক্ষতা, VEXP, LEXP) আর project (MODP, TOOL, SCED). প্রতিটির রেটিং (very low থেকে extra high) একটি গুণক দেয়; সবগুলোর গুণফল EAF. সূত্র E = a × KLOCb × EAF, যেখানে a বদলে যায়: organic ৩.২, semi-detached ৩.০, embedded ২.৮; b আগের মতো।

উদাহরণ: ৩২ KLOC organic, RELY high (১.১৫), CPLX high (১.১৫), ACAP high (০.৮৬), TOOL low (১.১০), বাকি nominal (১.০০)। EAF = ১.১৫ × ১.১৫ × ০.৮৬ × ১.১০ = ১.২৫১; nominal effort ৩.২ × ৩৮.০৫ = ১২১.৮ PM; E = ১২১.৮ × ১.২৫১ = ১৫২.৪ PM; D = ২.৫ × ১৫২.৪০.৩৮ = ১৬.৯ মাস। দক্ষ analyst effort কমালেও উচ্চ নির্ভরযোগ্যতা, জটিলতা আর দুর্বল tool মিলে মোট ২৫% বাড়িয়ে দিল। (গুণকের মানগুলো Boehm-এর ১৯৮১ সালের ছক থেকে; পরীক্ষায় সাধারণত দেওয়া থাকে।)

৮ · COCOMO II — scale factor, effort multiplier আর schedule

১৯৮১ সালের মডেল তৈরি হয়েছিল mainframe আর waterfall-এর যুগে। Reuse, GUI builder, iterative উন্নয়ন এলে Boehm ও সহকর্মীরা ১৯৯০-এর দশকে নতুন মডেল তৈরি করেন; পূর্ণ বিবরণ ২০০০ সালের বই Software Cost Estimation with COCOMO II-এ। সবচেয়ে প্রচলিত ক্রমাঙ্কন (calibration) “COCOMO II.2000”. নিচের ধ্রুবকগুলো সেই model definition manual অনুযায়ী; গুরুত্বপূর্ণ কাজে মূল manual মিলিয়ে নিন। COCOMO II-এর তিনটি উপ-মডেল আছে (application composition, early design, post-architecture); এখানে post-architecture:

PM = A × SizeE × ΠEM  ·  E = B + 0.01 × ΣSF
TDEV = C × PMF  ·  F = D + 0.2 × (E − B)
A = 2.94 · B = 0.91 · C = 3.67 · D = 0.28

Size KSLOC-এ (হাজার source line; reuse আর বদলের জন্য সমন্বয় করা) বা function point থেকে রূপান্তর করে। Manual অনুযায়ী TDEV-এর সূত্রে PM হলো SCED গুণক বাদ দিয়ে হিসাব করা effort (PMNS); নিচের উদাহরণে SCED nominal (১.০০), তাই পার্থক্য নেই। মূল পরিবর্তন হলো exponent: COCOMO 81-এ এটি তিনটি স্থির মান, এখানে পাঁচটি scale factor থেকে হিসাব হয়:

Scale factorমানেVLLNHVHXH
PRECএমন কাজ আগে করা হয়েছে কি না6.204.963.722.481.240.00
FLEXrequirement-এ কতটা নমনীয়তা5.074.053.042.031.010.00
RESLarchitecture আর ঝুঁকি কতটা আগেভাগে মীমাংসা7.075.654.242.831.410.00
TEAMstakeholder ও দলের সমন্বয়5.484.383.292.191.100.00
PMATprocess maturity (CMM স্তরের ধারণা)7.806.244.683.121.560.00

সব nominal হলে ΣSF = ১৮.৯৭, E = ০.৯১ + ০.১৮৯৭ = ১.০৯৯৭ — তখনো ১-এর বেশি। সব extra high হলে E = ০.৯১ — বিরল ক্ষেত্রে economy of scale-ও সম্ভব। Scale factor exponent-এ বসে, তাই বড় project-এ এদের প্রভাব অনেক বেশি।

Exponent-এর বাইরে গুণক হিসেবে বসে ১৭টি effort multiplier (nominal = ১.০০): product (RELY, DATA, CPLX, RUSE, DOCU), platform (TIME, STOR, PVOL), personnel (ACAP, PCAP, PCON, APEX, PLEX, LTEX) আর project (TOOL, SITE, SCED). প্রোগ্রামে ব্যবহৃত মানগুলো: RELY high ১.১০, CPLX high ১.১৭, ACAP high ০.৮৫, TOOL high ০.৯০.

# COCOMO II.2000 post-architecture: effort and schedule (constants as published).
A, B, C, D = 2.94, 0.91, 3.67, 0.28
PMAT = {"VL": 7.80, "L": 6.24, "N": 4.68, "H": 3.12, "VH": 1.56, "XH": 0.00}

def cocomo2(ksloc, sf, em):
    E = B + 0.01 * sum(sf.values())           # size exponent
    pi_em = 1.0
    for v in em.values():
        pi_em *= v
    pm = A * ksloc ** E * pi_em                # person-months
    F = D + 0.2 * (E - B)                      # schedule exponent
    tdev = C * pm ** F                         # calendar months
    return E, pi_em, pm, F, tdev

size = 20                                      # KSLOC (fictional result portal v2)
sf = {"PREC": 3.72, "FLEX": 2.03, "RESL": 5.65, "TEAM": 3.29, "PMAT": 4.68}
em = {"RELY": 1.10, "CPLX": 1.17, "ACAP": 0.85, "TOOL": 0.90}  # other 13 = 1.00

E, pi_em, pm, F, tdev = cocomo2(size, sf, em)
print(f"sum SF = {sum(sf.values()):.2f}  ->  E = {E:.4f}")
print(f"product of EMs = {pi_em:.4f}")
print(f"PM   = 2.94 x {size}^{E:.4f} x {pi_em:.4f} = {pm:.1f}")
print(f"F    = 0.28 + 0.2 x ({E:.4f} - 0.91) = {F:.4f}")
print(f"TDEV = 3.67 x {pm:.1f}^{F:.4f} = {tdev:.1f} months, team ~ {pm / tdev:.1f}")

print("sensitivity: change only PMAT (process maturity)")
for rating, value in PMAT.items():
    E2, _, pm2, _, t2 = cocomo2(size, {**sf, "PMAT": value}, em)
    print(f"  PMAT {rating:2} ({value:.2f}): E={E2:.4f}  PM={pm2:6.1f}  TDEV={t2:4.1f}")

আউটপুট:

sum SF = 19.37  ->  E = 1.1037
product of EMs = 0.9846
PM   = 2.94 x 20^1.1037 x 0.9846 = 79.0
F    = 0.28 + 0.2 x (1.1037 - 0.91) = 0.3187
TDEV = 3.67 x 79.0^0.3187 = 14.8 months, team ~ 5.3
sensitivity: change only PMAT (process maturity)
  PMAT VL (7.80): E=1.1349  PM=  86.7  TDEV=15.7
  PMAT L  (6.24): E=1.1193  PM=  82.8  TDEV=15.2
  PMAT N  (4.68): E=1.1037  PM=  79.0  TDEV=14.8
  PMAT H  (3.12): E=1.0881  PM=  75.4  TDEV=14.4
  PMAT VH (1.56): E=1.0725  PM=  71.9  TDEV=14.0
  PMAT XH (0.00): E=1.0569  PM=  68.7  TDEV=13.6

Scale factor: PREC nominal (৩.৭২), FLEX high (২.০৩), RESL low (৫.৬৫ — architecture-এর ঝুঁকি এখনো খোলা), TEAM ও PMAT nominal; যোগ ১৯.৩৭, E = ১.১০৩৭. চারটি EM-এর গুণফল ১.১০ × ১.১৭ × ০.৮৫ × ০.৯০ = ০.৯৮৪৬ — দক্ষ analyst আর ভালো tool প্রায় পুরোটা পুষিয়ে দিয়েছে। PM = ২.৯৪ × ২০১.১০৩৭ × ০.৯৮৪৬ = ৭৯.০; F = ০.২৮ + ০.২ × ০.১৯৩৭ = ০.৩১৮৭; TDEV = ৩.৬৭ × ৭৯.০০.৩১৮৭ = ১৪.৮ মাস, গড় দল ৫.৩ জন।

Sensitivity অংশে শুধু PMAT বদলানো হয়েছে: very low থেকে extra high-এ effort ৮৬.৭ থেকে ৬৮.৭ — প্রায় ২১% কম, শুধু process-এর পরিপক্বতায়। ২০ KSLOC-এ exponent-এর ০.০৭৮ পার্থক্য effort-এ ২০০.০৭৮ ≈ ১.২৬ গুণ ফারাক আনে; একই পার্থক্য ২০০ KSLOC-এ ২০০০.০৭৮ ≈ ১.৫১ গুণ। বড় project-এ process আর architecture-এর ঝুঁকি মীমাংসা তাই আরও দামি।

Brooks-এর সূত্র — মানুষ আর মাস বদলযোগ্য নয়

COCOMO-র সময়ের সূত্র (D = c × Ed) আসলে Fred Brooks-এর পর্যবেক্ষণের গাণিতিক রূপ। The Mythical Man-Month (১৯৭৫) বইয়ে Brooks দেখান, দেরি হওয়া project-এ লোক বাড়ালে নতুনদের শেখাতে পুরোনোদের সময় যায়, আর যোগাযোগের পথ বাড়ে n(n − ১) ÷ ২ হারে — ৫ জনে ১০টি পথ, ১০ জনে ৪৫টি। এ কারণেই Brooks’s law: “Adding manpower to a late software project makes it later.” ইতিহাস আর প্রসঙ্গ পর্ব ০২-এ আছে। ঈদের আগে বাস টার্মিনালে টিকিট কাউন্টারে আরও দশজন নতুন কর্মী বসালেই লাইন কমে না, যদি তাঁরা টিকিটের system চেনেন না আর পুরোনোদের বারবার জিজ্ঞেস করেন।

আরও গভীরে: COCOMO 81-এর মূল উৎস Boehm-এর Software Engineering Economics (Prentice Hall, ১৯৮১); COCOMO II-এর Boehm ও সহলেখকদের Software Cost Estimation with COCOMO II (২০০০) আর University of Southern California-র প্রকাশিত model definition manual. COCOMO II.2000-এর ক্রমাঙ্কন প্রায় ১৬০টি project-এর তথ্যে বলে উল্লেখ আছে। Function point-এর আনুষ্ঠানিক নিয়ম IFPUG Counting Practices Manual আর ISO/IEC 20926-এ; অনুমানের মনস্তত্ত্ব আর বাস্তব কৌশলের জন্য McConnell-এর Software Estimation (২০০৬) একটি পরিচিত বই।

পরীক্ষা ও ইন্টারভিউতে:

  • Basic COCOMO-র organic mode-এর effort আর সময়ের সূত্র? — E = 2.4 × KLOC1.05 PM, D = 2.5 × E0.38 মাস, দল = E ÷ D.
  • VAF-এর সূত্র আর পরিসর? — VAF = 0.65 + 0.01 × ΣGSC; ১৪টি GSC, প্রতিটি ০–৫, তাই VAF 0.65 থেকে 1.35.
  • ILF আর EIF-এর পার্থক্য? — ILF মাপা application নিজের সীমার ভেতরে রাখে ও বদলায়; EIF অন্য application-এর, শুধু পড়া হয়।
  • COCOMO II-এ exponent কীভাবে আসে? — E = 0.91 + 0.01 × পাঁচটি scale factor-এর যোগফল (PREC, FLEX, RESL, TEAM, PMAT).
  • Planning poker-এ একসাথে কার্ড উল্টানো হয় কেন? — Anchoring এড়াতে, যাতে প্রথম বলা সংখ্যা বাকিদের অনুমান টেনে না নেয়।

৯ · AI-এর যুগে software estimation

AI মুহূর্তে COCOMO-র হিসাব করে দেয়, backlog-এ point বসিয়ে দেয়, এমনকি “এই project ১২০ দিনে শেষ হবে” বলে দেয়। কিন্তু অনুমানের সবচেয়ে মূল্যবান অংশ — আপনার দলের অতীত, আপনার codebase-এর লুকানো ঝুঁকি, গ্রাহকের অস্পষ্ট চাওয়া — AI দেখেনি। তাই AI-কে হিসাবের সহকারী হিসেবে ব্যবহার করুন, অনুমানকারী হিসেবে নয়।

AI প্রায়ই যা করেকীভাবে ধরবেন
COCOMO 81-এর a = 2.4 আর COCOMO II-এর exponent মিশিয়ে একটি “সূত্র” বানায়কোন মডেল আর কোন ক্রমাঙ্কন, তা জিজ্ঞেস করুন; মূল বই বা manual-এর ধ্রুবকের সাথে মেলান
ভুল FP weight দেয় (যেমন EIF-এর average ১০), বা VAF-এর সূত্রে 0.65 বাদ দেয়ছোট একটি গণনা নিজে হাতে করে AI-এর ফলের সাথে মেলান
“IFPUG 5.2” বা নেই এমন মানদণ্ডের নম্বর বানিয়ে বলেসংগঠনের প্রকাশিত তালিকায় সংস্করণটি খুঁজুন
একটিমাত্র নিখুঁত সংখ্যা দেয়, পরিসর বা অনুমানের ভিত্তি ছাড়াO, M, P আর কী ধরে নেওয়া হয়েছে তা চান; নিজের velocity বা cycle time দিয়ে পরিসর বের করুন
Story point দেয় অন্য দলের মাপে, অথবা point-কে ঘণ্টায় বদলে দেয়Point দলের নিজের planning poker-এ ঠিক হোক; AI শুধু প্রশ্ন আর ঝুঁকির তালিকা দিক

AI দিয়ে একটি COCOMO বা FP হিসাব যাচাই করাতে চাইলে সূত্র আর ধ্রুবক নিজে দিন, প্রতিটি ধাপ দেখাতে বলুন, আর গ্রাহকের গোপন তথ্য বা চুক্তির অঙ্ক prompt-এ দেবেন না:

আমি COCOMO II.2000 post-architecture মডেল দিয়ে একটি কাল্পনিক project-এর effort হিসাব করছি। সূত্র: PM = 2.94 × Size^E × ΠEM, E = 0.91 + 0.01 × ΣSF, TDEV = 3.67 × PM^F, F = 0.28 + 0.2 × (E − 0.91). Size = 20 KSLOC; scale factor: PREC 3.72, FLEX 2.03, RESL 5.65, TEAM 3.29, PMAT 4.68; EM: RELY 1.10, CPLX 1.17, ACAP 0.85, TOOL 0.90, বাকি 1.00. ১. প্রতিটি ধাপের মধ্যবর্তী মান চার দশমিক পর্যন্ত দেখাও। ২. আমার দেওয়া ধ্রুবক বদলাবে না; কোনো মান ভুল মনে হলে আলাদা করে বলো, কোন উৎসের ভিত্তিতে। ৩. ফলের সাথে বলো কোন তিনটি ধরে নেওয়া মান বদলালে effort সবচেয়ে বেশি বদলাবে। ৪. নিশ্চিত না হলে "নিশ্চিত নই" লেখো; কোনো মানদণ্ড বা বইয়ের নাম বানিয়ে বলবে না।

Software engineering-এ AI ব্যবহারের চেকলিস্ট

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

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

প্র ০১Cone of uncertainty-র “শুরুতে ৪ গুণ পর্যন্ত ভুল” সংখ্যাটি কতটা প্রমাণিত? আর চোঙা কি সময়ের সাথে নিজে থেকেই সরু হয়?

ধারণাটির শিকড় Boehm-এর ১৯৮১ সালের বইয়ে। সেখানে তিনি project-এর পর্যায় অনুযায়ী অনুমানের আপেক্ষিক পরিসরের একটি ছবি দেন, যা আংশিকভাবে তথ্য আর আংশিকভাবে অভিজ্ঞতাভিত্তিক বিচারের ওপর দাঁড়ানো। McConnell ১৯৯৭ ও ২০০৬ সালের বইয়ে একে “cone of uncertainty” নাম দিয়ে জনপ্রিয় করেন, আর ০.২৫x–৪x, ০.৫x–২x এমন সংখ্যা বহুল প্রচারিত হয়। পরে Laurent Bossavit তাঁর The Leprechauns of Software Engineering বইয়ে (২০১২ সালের দিকে) প্রশ্ন তোলেন: এই নিখুঁত সংখ্যাগুলোর পেছনে কতটা প্রকাশিত তথ্য আছে? তাঁর বক্তব্য ছিল, ছবিটি বহুবার উদ্ধৃত হতে হতে “প্রমাণিত সত্য” হয়ে গেছে, অথচ মূল উৎস তত শক্ত নয়। Todd Little-এর মতো কয়েকজন বাস্তব project-এর তথ্যে দেখিয়েছেন, অনেক দলে অনুমানের ভুল সময়ের সাথে আদর্শ চোঙার মতো মসৃণভাবে কমে না।

তাহলে ধারণাটি কি বাদ? না — মূল কথাটি টেকে: শুরুতে অজানা বেশি, তাই একটিমাত্র সংখ্যা বিপজ্জনক। McConnell নিজেও জোর দিয়ে বলেছেন, চোঙা নিজে থেকে সরু হয় না; সরু হয় যখন অনিশ্চয়তার উৎসগুলো সিদ্ধান্তে বদলায় — কোন feature থাকবে, কোন architecture, কোন বাইরের system-এর সাথে যুক্ত হবে। কেউ সিদ্ধান্ত না নিলে ছয় মাস পরেও অনিশ্চয়তা প্রথম দিনের মতো থাকতে পারে, বা requirement বদলালে আবার চওড়া হতে পারে। চোঙাটি সবচেয়ে ভালো অবস্থার সীমাও; দক্ষতা দিয়ে এর ভেতরে থাকা যায়, বাইরে আরও ভালো করা যায় না।

ব্যবহারিক শিক্ষা: অনুমানের সাথে পর্যায় বলুন (“ধারণা পর্যায়ের অনুমান, তাই পরিসর চওড়া”), গুরুত্বপূর্ণ সিদ্ধান্ত দ্রুত নিন, আর প্রতিটি বড় সিদ্ধান্তের পর আবার অনুমান করুন। COCOMO II-এর RESL scale factor ঠিক এই চিন্তাকেই সংখ্যায় ধরে — ঝুঁকি যত আগে মীমাংসা, exponent তত ছোট।

মূল উপলব্ধি: চোঙার সংখ্যাগুলো দিকনির্দেশ, প্রাকৃতিক নিয়ম নয়; অনিশ্চয়তা কমে সিদ্ধান্তে, সময় পেরোলেই নয়।

প্র ০২Albrecht লাইন না গুনে “function” গোনার কথা কেন ভাবলেন? আর function point-এর নিজের দুর্বলতা কী?

১৯৭০-এর দশকে IBM-এর একটি বিভাগ বিভিন্ন ভাষায় (COBOL, PL/I ইত্যাদি) লেখা বহু ব্যবসায়িক application-এর উৎপাদনশীলতা তুলনা করতে চাইছিল। লাইন দিয়ে মাপলে অদ্ভুত ফল আসে: যে ভাষায় একই কাজে বেশি লাইন লাগে, সেই দলকে বেশি উৎপাদনশীল দেখায়। Allan Albrecht ১৯৭৯ সালে একটি সম্মেলনে (IBM, SHARE ও GUIDE-এর যৌথ application development symposium) প্রস্তাব করেন: ব্যবহারকারী যা পান তা গুনুন — কয়টি input, output, inquiry আর কয়টি file. এটি ভাষা-নিরপেক্ষ, আর requirement পেলেই গোনা যায়, কোড লেখার আগেই। ১৯৮৩ সালে Albrecht ও Gaffney পদ্ধতিটি আরও বিস্তারিত প্রকাশ করেন, আর ১৯৮৬ সালে IFPUG গঠিত হয়। Capers Jones পরে বহু বছর ধরে দেখান, LOC দিয়ে মাপলে উচ্চস্তরের ভাষায় যাওয়ার উপকারিতা উল্টো দেখায়, কারণ লাইন কমলেও নকশা, test আর documentation-এর মতো নির্দিষ্ট খরচ কমে না।

তবে function point-এরও সীমা আছে। প্রথমত, গোনা সময়সাপেক্ষ আর প্রশিক্ষণ লাগে; একই requirement দুজন গুনলে পার্থক্য হতে পারে, যদিও প্রশিক্ষিত গণনাকারীদের মধ্যে মিল ভালো বলে জানা যায়। দ্বিতীয়ত, এটি তৈরি হয়েছিল ব্যবসায়িক data-ভিত্তিক application-এর জন্য; কঠিন algorithm, বৈজ্ঞানিক হিসাব বা embedded নিয়ন্ত্রণের জটিলতা এতে কম ধরা পড়ে — এজন্যই পরে COSMIC-এর মতো রূপ এসেছে। তৃতীয়ত, ১৪টি GSC আর VAF নিয়ে সমালোচনা ছিল যে এগুলো আকার নয়, গুণমান আর পরিবেশ মেশায়; ফলে IFPUG-এর নতুন manual আর ISO মানদণ্ডে VAF ঐচ্ছিক বা বাদ। আর Agile দলে বিস্তারিত requirement আগে না থাকায় পূর্ণ FP গণনা কঠিন।

তবু চুক্তিভিত্তিক কাজে, বিশেষ করে outsourcing-এ, function point এখনো কাজে লাগে — কারণ দুই পক্ষের কাছে একটি নিরপেক্ষ আকারের মাপ থাকে, “প্রতি FP-তে খরচ” ধরে দাম আলোচনা করা যায়, আর মাঝপথে scope বদলালে কতটা বদলাল তা মাপা যায়।

মূল উপলব্ধি: Function point মাপে ব্যবহারকারীর পাওয়া কাজ, লেখা লাইন নয় — সেটাই এর শক্তি; কিন্তু algorithm-ভারী বা দ্রুত বদলানো কাজে এটিও মোটা দাগের মাপ।

প্র ০৩COCOMO-র exponent কেন ১-এর বেশি? Brooks-এর যোগাযোগের হিসাবের সাথে এর সম্পর্ক কী, আর বড় project-কে ছোট দলে ভাগ করলে কি সমস্যা মেটে?

COCOMO-র exponent কোনো তত্ত্ব থেকে নয়, তথ্য থেকে এসেছে: Boehm যখন project-এর আকার আর effort log স্কেলে আঁকলেন, ঢাল ১-এর একটু বেশি পেলেন। অর্থাৎ বড় project-এ প্রতিটি লাইনের পেছনে বেশি effort. এর ব্যাখ্যা Brooks ১৯৭৫ সালেই দিয়েছিলেন। IBM-এর OS/360 প্রকল্পের অভিজ্ঞতা থেকে তিনি লেখেন, কাজকে ভাগ করা গেলেও ভাগগুলোর মধ্যে যোগাযোগ লাগে; n জনের দলে সম্ভাব্য যোগাযোগের পথ n(n − ১) ÷ ২. পাঁচজনে ১০, পনেরোজনে ১০৫. প্রতিটি পথে মিটিং, ভুল বোঝাবুঝি, interface নিয়ে আলোচনা। Brooks-এর বিখ্যাত উদাহরণ: একজন মা নয় মাসে একটি শিশু জন্ম দেন, কিন্তু নয়জন মা এক মাসে পারেন না — কিছু কাজ ভাগ করা যায় না।

COCOMO II এই চিন্তাকে আরও সূক্ষ্ম করেছে: exponent স্থির নয়, TEAM (সমন্বয়), RESL (architecture-এর ঝুঁকি মীমাংসা) আর PMAT (process-এর পরিপক্বতা) দিয়ে বদলায়। ভালো architecture আর পরিষ্কার interface থাকলে দলগুলো কম কথা বলে কাজ করতে পারে, তাই diseconomy কমে। এটাই Conway-এর সূত্র আর আধুনিক “ছোট স্বাধীন দল”-এর ধারণার সাথে যোগসূত্র: system-কে এমনভাবে ভাগ করুন যাতে প্রতিটি দল নিজের অংশ প্রায় স্বাধীনভাবে বদলাতে পারে।

কিন্তু ভাগ করলেই সমস্যা মেটে না। প্রথমত, ভাগগুলো জোড়া দেওয়ার (integration) কাজ নিজেই বড়; continuous integration (পর্ব ৫৮) সেই ঝুঁকি ছোট টুকরোয় ভাগ করে। দ্বিতীয়ত, ভুল জায়গায় ভাগ করলে প্রতিটি feature-এ তিনটি দলের সমন্বয় লাগে — তখন যোগাযোগ বাড়ে, কমে না। তৃতীয়ত, সময়ের সূত্রে d ছোট হওয়ার মানে: দশ গুণ effort-এর project-ও দশ গুণ দ্রুত শেষ হয় না। বড় project-এ তাই প্রায়ই সবচেয়ে ভালো কৌশল হলো scope কমিয়ে ছোট ছোট release.

মূল উপলব্ধি: Exponent ১-এর বেশি মানে আকারের সাথে যোগাযোগের খরচ; ভালো architecture আর ছোট release সেই খরচ কমায়, লোক বাড়ানো সাধারণত বাড়ায়।

প্র ০৪Story point আর ঘণ্টা — কোনটি ভালো? আর #NoEstimates-এর সমর্থকেরা কি ঠিক বলেন যে অনুমানই অপচয়?

Story point-এর ইতিহাস XP-র সাথে জড়িত। Ron Jeffries পরে লিখেছেন, শুরুর দিকে তাঁরা “ideal day” ব্যবহার করতেন — বাধাহীন একটি দিনে কতটা কাজ — কিন্তু ব্যবস্থাপকেরা “তিন ideal day” শুনে তিন ক্যালেন্ডার দিন ধরে নিতেন, আর দেরি হলে প্রশ্ন তুলতেন। তাই একটি এককহীন সংখ্যা — point — এলো, যাতে তুলনা আপেক্ষিক থাকে আর velocity দিয়ে বাস্তব সময় বেরিয়ে আসে। Jeffries নিজেই পরে বলেছেন, point-এর অপব্যবহার দেখে তিনি দুঃখিত — দলগুলোর তুলনা, velocity-কে লক্ষ্য বানানো, point-কে আবার ঘণ্টায় রূপান্তর।

ঘণ্টার পক্ষে যুক্তি: বাজেট, বেতন আর চুক্তি সবই সময়ে চলে, আর ছোট কাজ (এক-দুই দিনের) ঘণ্টায় অনুমান করা তুলনামূলক সহজ। Point-এর পক্ষে যুক্তি: আপেক্ষিক তুলনায় মানুষ ভালো, আর দক্ষ ও নতুন developer-এর “ঘণ্টা” আলাদা হলেও একটি কাজ যে আরেকটির দ্বিগুণ, তাতে প্রায়ই একমত হন। গবেষণায় কোনোটির সর্বজনীন শ্রেষ্ঠত্ব প্রমাণিত নয়; দলের প্রেক্ষাপট আর সৎ ব্যবহারই বড় বিষয়।

#NoEstimates আলোচনা শুরু হয় ২০১২-র দিকে Woody Zuill-সহ কয়েকজনের লেখায়, পরে Vasco Duarte এ নিয়ে বই লেখেন। তাঁদের মূল দাবি “কখনো অনুমান নয়” নয়; বরং: অনুমান কোন সিদ্ধান্তে লাগছে তা জিজ্ঞেস করুন, আর অনেক ক্ষেত্রে কাজ ছোট ও প্রায় সমান করে শুধু গোনা (throughput) দিয়েই একই মানের পূর্বাভাস পাওয়া যায় — যা পর্ব ০৬-এর Kanban পূর্বাভাসের ধারণার কাছাকাছি। সমালোচকেরা (Steve McConnell-সহ) বলেন, বিনিয়োগ, চুক্তি আর অগ্রাধিকারের সিদ্ধান্তে অনুমান অনিবার্য, আর “গোনা” নিজেও এক ধরনের অনুমান।

মূল উপলব্ধি: প্রশ্নটা point বনাম ঘণ্টা নয় — অনুমান কোন সিদ্ধান্তে লাগবে, আর কোন পদ্ধতিতে সবচেয়ে কম খরচে যথেষ্ট ভালো পূর্বাভাস মেলে।

প্র ০৫COCOMO-র ধ্রুবকগুলো এসেছে কয়েক দশক আগের project থেকে। আজকের একটি দল কি এগুলো সরাসরি ব্যবহার করতে পারে?

COCOMO 81-এর তথ্যভাণ্ডারে ছিল প্রায় ৬৩টি project, মূলত ১৯৬০ ও ৭০-এর দশকের, বেশিরভাগ যুক্তরাষ্ট্রের প্রতিরক্ষা ও মহাকাশ খাতের ঠিকাদার TRW-এর — ভাষা FORTRAN, COBOL, assembly; পদ্ধতি waterfall. COCOMO II.2000 নতুন করে ক্রমাঙ্কিত হয় প্রায় ১৬০টি project-এর তথ্যে, Bayesian পদ্ধতিতে বিশেষজ্ঞ মত আর তথ্য মিলিয়ে। তবু সেগুলোও প্রধানত বড় প্রতিষ্ঠানের, আর আজকের cloud, open-source library আর AI-সহায়তায় লেখা কোডের যুগের আগের।

Boehm নিজেই বলেছেন, মডেলটি সবচেয়ে ভালো কাজ করে যখন প্রতিষ্ঠান নিজের তথ্যে ক্রমাঙ্কন করে — বিশেষ করে A ধ্রুবক। COCOMO II-এর বইয়ে local calibration-এর পদ্ধতি দেওয়া আছে: নিজের শেষ হওয়া কয়েকটি project-এর আসল আকার আর effort নিয়ে A এমনভাবে ঠিক করুন যাতে মডেলের ফল আসল ফলের কাছে থাকে। ক্রমাঙ্কন ছাড়া মডেলের ফল প্রায়ই অনেকটা দূরে থাকে বলে বিভিন্ন গবেষণায় দেখা গেছে; আর ক্রমাঙ্কনের পরও একটি project-এর ক্ষেত্রে বড় ভুল সম্ভব।

আজকের প্রেক্ষাপটে আরও কিছু সমস্যা: Size-এর ধারণাই ঝাপসা — framework আর library-র লক্ষ লাইন আপনি লেখেননি; AI-এর লেখা কোডের লাইন সহজে বাড়ে, কিন্তু তা পর্যালোচনা আর test-এর খরচ বাড়ায়। Agile দলে শুরুতে পুরো আকার জানা থাকে না। তাই অনেক প্রতিষ্ঠান COCOMO-কে মূল অনুমান হিসেবে নয়, “sanity check” হিসেবে ব্যবহার করে: planning poker বা analogy থেকে পাওয়া সংখ্যা যদি COCOMO-র চেয়ে তিন গুণ কম হয়, তাহলে কোথাও কিছু বাদ পড়েছে কি না দেখা। আর পরীক্ষা ও ইন্টারভিউতে COCOMO এখনো জনপ্রিয়, কারণ এটি diseconomy of scale, সময়-সংকোচনের সীমা আর cost driver-এর প্রভাব খুব পরিষ্কারভাবে শেখায়।

মূল উপলব্ধি: COCOMO-র কাঠামো আজও শিক্ষণীয়, কিন্তু ধ্রুবকগুলো নিজের তথ্যে ক্রমাঙ্কন না করে সরাসরি commitment-এর ভিত্তি বানানো ঝুঁকিপূর্ণ।

অনুশীলন

ক্যালকুলেটর আর কাগজ-কলম নিয়ে বসুন — হিসাব নিজে করে তারপর উত্তর মেলান। আরও numerical পর্ব ৬৬-এ।

  1. Function point (পরীক্ষার ধাঁচে): একটি কাল্পনিক লাইব্রেরি ব্যবস্থাপনা system-এ সব function average জটিলতার: EI = ১০, EO = ৭, EQ = ৬, ILF = ৪, EIF = ২. ১৪টি GSC-র মোট রেটিং ৪৫. (ক) UFP, (খ) VAF, (গ) AFP বের করুন। (ঘ) ৬০ LOC/FP অনুপাত ধরে আকার কত KLOC?

    (ক) Average weight: EI ৪, EO ৫, EQ ৪, ILF ১০, EIF ৭. UFP = ১০ × ৪ + ৭ × ৫ + ৬ × ৪ + ৪ × ১০ + ২ × ৭ = ৪০ + ৩৫ + ২৪ + ৪০ + ১৪ = ১৫৩.

    (খ) VAF = ০.৬৫ + ০.০১ × ৪৫ = ০.৬৫ + ০.৪৫ = ১.১০.

    (গ) AFP = ১৫৩ × ১.১০ = ১৬৮.৩ FP.

    (ঘ) ১৬৮.৩ × ৬০ = ১০,০৯৮ লাইন ≈ ১০.১ KLOC. উত্তরে লিখুন যে ৬০ LOC/FP একটি ধরে নেওয়া অনুপাত; বাস্তবে ভাষা আর দলভেদে আলাদা।

  2. COCOMO (পরীক্ষার ধাঁচে): একটি কাল্পনিক ব্যাংকিং লেনদেন system, আকার ৫০ KLOC, semi-detached. (ক) Basic COCOMO-তে effort, সময় আর গড় দলের আকার বের করুন। (খ) Intermediate COCOMO-তে EAF = ১.২০ হলে effort আর সময় কত? (গ) ব্যবস্থাপক বলছেন, “(ক)-এর effort ২৪ জন দিয়ে ভাগ করলে ১০ মাসেই হবে।” আপনার উত্তর কী?

    (ক) a = ৩.০, b = ১.১২, c = ২.৫, d = ০.৩৫. ৫০১.১২ = ৭৯.৯৬; E = ৩.০ × ৭৯.৯৬ = ২৩৯.৯ PM. E০.৩৫ = ২৩৯.৯০.৩৫ = ৬.৮১; D = ২.৫ × ৬.৮১ = ১৭.০ মাস। দল = ২৩৯.৯ ÷ ১৭.০ ≈ ১৪.১ জন।

    (খ) Intermediate-এ semi-detached-এর a = ৩.০ (Basic-এর সমান), তাই nominal ২৩৯.৯ PM; E = ২৩৯.৯ × ১.২০ = ২৮৭.৮ PM. D = ২.৫ × ২৮৭.৮০.৩৫ = ১৮.১ মাস।

    (গ) ২৪ × ১০ = ২৪০ — গুণফল মেলে, কিন্তু এটি person আর month-কে বদলযোগ্য ধরে নেওয়া। ১০ মাস nominal ১৭ মাসের মাত্র ৫৯%; Boehm-এর মডেলে প্রায় ৭৫%-এর (≈ ১২.৮ মাস) নিচে সংকোচন কার্যত অসম্ভব অঞ্চল। বাড়তি লোক শেখা আর যোগাযোগে সময় নেবেন (Brooks). বিকল্প: scope কমিয়ে প্রথম release ১০ মাসে, বাকি পরে; অথবা ১৩–১৪ মাসের লক্ষ্য, বাড়তি খরচ মেনে।

  3. আউটপুট অনুমান করুন: নিচের JavaScript কোড চালালে কী ছাপা হবে? আগে হাতে হিসাব করুন, আর তৃতীয় মানটির অর্থ ব্যাখ্যা করুন।
    const o = 4, m = 6, p = 14;
    const te = (o + 4 * m + p) / 6, sd = (p - o) / 6;
    console.log(te, sd.toFixed(2), te > m);

    আউটপুট: 7 1.67 true

    te = (৪ + ২৪ + ১৪) ÷ ৬ = ৪২ ÷ ৬ = ৭ — পূর্ণসংখ্যা, তাই JavaScript 7 ছাপে (দশমিক ছাড়া)। sd = (১৪ − ৪) ÷ ৬ = ১.৬৬৬…, toFixed(2) দেয় "1.67". তৃতীয় মান true, কারণ ৭ > ৬: P অনেক দূরে (দেরির লেজ লম্বা), তাই PERT গড় সবচেয়ে সম্ভাব্য মানের চেয়ে বেশি। M-কে commitment বানালে অর্ধেকের বেশি সম্ভাবনায় দেরি।

  4. সমালোচনা করুন: একটি কাল্পনিক সফটওয়্যার প্রতিষ্ঠানে sales manager গ্রাহকের সাথে বৈঠকে একজন developer-কে জিজ্ঞেস করলেন, “মোটামুটি কত দিন লাগবে?” Developer বললেন, “হয়তো দুই মাস, ঠিক জানি না।” পরদিন চুক্তিতে লেখা হলো: “সম্পূর্ণ system, নির্দিষ্ট মূল্যে, ৬০ দিনে হস্তান্তর; দেরি হলে প্রতিদিন জরিমানা।” তখনো requirement-এর তালিকা হয়নি। কোথায় কোথায় ভুল, আর কীভাবে করা উচিত ছিল?

    অনুমানকে commitment বানানো: “হয়তো দুই মাস, ঠিক জানি না” — একটি অনিশ্চিত, মুখে বলা guess, যা কোনো বিশ্লেষণ ছাড়াই চুক্তির commitment হয়ে গেল। Estimate, target আর commitment গুলিয়ে ফেলা হয়েছে।

    Cone of uncertainty উপেক্ষা: Requirement-এর তালিকাই হয়নি — ধারণা পর্যায়। এখানে ভুলের সম্ভাব্য পরিসর বিশাল (প্রচলিত ছবিতে ০.২৫x–৪x). একটিমাত্র সংখ্যা, তার ওপর জরিমানা, ঝুঁকি পুরোটাই একপক্ষে চাপায়।

    একজনের মুখের কথা: একজন developer, কোনো টুকরো করা তালিকা নেই, test-deploy ধরা হয়নি, দলের মত নেই — planning fallacy আর ভুলে যাওয়া কাজের পুরো ঝুঁকি।

    কীভাবে করা উচিত: (১) বৈঠকে শুধু পরিসর আর পর্যায় বলা: “ধারণা পর্যায়ে, ছয় সপ্তাহ থেকে ছয় মাস — requirement পেলে সরু হবে।” (২) একটি ছোট, আলাদা মূল্যের আবিষ্কার পর্যায় (requirement, প্রাথমিক নকশা)। (৩) তারপর দলগত অনুমান — Wideband Delphi বা planning poker, তিন-বিন্দু অনুমান, function point বা analogy দিয়ে cross-check. (৪) Commitment দেওয়া পরিসরের সম্ভাবনা মেনে (যেমন ৮৫% নিশ্চয়তা), আর scope-এর নমনীয়তা বা পর্যায়ভিত্তিক চুক্তিতে। ঝুঁকির তালিকা (risk register) পর্ব ৬২-এ, আর সৎ অনুমান দেওয়ার পেশাগত দায়িত্ব পর্ব ৬৪-এ।

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

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

ক্রমIFPUG ধাঁচে (VAF-সহ) function point গোনার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. 🧱 Application boundary নির্ধারণ
  2. 🔎 EI, EO, EQ, ILF, EIF চিহ্নিত করে জটিলতা (low/avg/high) ঠিক করা
  3. ➕ সংখ্যা × weight যোগ করে UFP
  4. 🎚️ ১৪টি GSC-কে ০–৫ রেটিং দিয়ে ΣGSC
  5. 🧮 VAF = 0.65 + 0.01 × ΣGSC
  6. ✅ AFP = UFP × VAF

একটি system-এর UFP = ২০০, আর ১৪টি general system characteristic-এর মোট রেটিং ৩০. Adjusted function point কত?

  • ২০০
  • ৬০
  • ১৯০
  • ২৩০

একটি কাজের তিন-বিন্দু অনুমান: O = ২, M = ৫, P = ১৪ দিন। PERT অনুযায়ী প্রত্যাশিত সময় আর standard deviation কত?

  • ৭ দিন, σ = ৪
  • ৬ দিন, σ = ২
  • ৫ দিন, σ = ২
  • ৬ দিন, σ = ৪

Basic COCOMO 81-এর কোন mode-এ effort-এর exponent (b) সবচেয়ে বড়, আর তার মান কত?

  • Organic, 1.05
  • Semi-detached, 1.12
  • Organic, 0.38
  • Embedded, 1.20

Planning poker-এ সবাই গোপনে কার্ড বেছে একসাথে উল্টান কেন?

  • যাতে প্রথম বলা সংখ্যা বাকিদের অনুমান টেনে না নেয় (anchoring এড়ানো)
  • যাতে আলোচনা ছাড়াই দ্রুত শেষ হয়
  • যাতে সবার কার্ডের গড় নেওয়া যায়
  • যাতে Product Owner শেষ সিদ্ধান্ত নিতে পারেন

“ফল প্রকাশের তারিখের আগে, ৩০ দিনে পোর্টাল চালু চাই” — রেজিস্ট্রারের এই কথা McConnell-এর পরিভাষায় কী?

  • Estimate
  • Commitment
  • Target
  • Velocity

COCOMO II.2000 মডেলে পাঁচটি scale factor-এর যোগফল ১৯ হলে size-এর exponent E কত (B = ০.৯১)?

  • ০.৯১
  • ১.১০
  • ২.৮১
  • ১.০৫

শব্দকোষ

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

মনে রাখুন

  1. অনুমান = পরিসর + ধরে নেওয়া শর্ত: শুরুতে অনিশ্চয়তা বেশি (cone of uncertainty), আর তা কমে সিদ্ধান্তে; estimate, target আর commitment আলাদা রাখুন।
  2. PERT: te = (O + 4M + P) ÷ ৬, σ = (P − O) ÷ ৬; যোগ করলে variance যোগ হয়, σ নয়।
  3. Agile: story point আপেক্ষিক ও দলের নিজের; planning poker anchoring এড়ায় আর লুকানো কাজ বের করে; velocity থেকে পরিসর (পর্ব ০৫)।
  4. Function point: EI 3/4/6, EO 4/5/7, EQ 3/4/6, ILF 7/10/15, EIF 5/7/10 → UFP; VAF = 0.65 + 0.01 × ΣGSC (0.65–1.35); AFP = UFP × VAF.
  5. COCOMO: Basic E = a·KLOCb, D = 2.5·Ed; COCOMO II PM = 2.94 × SizeE × ΠEM, E = 0.91 + 0.01 × ΣSF, TDEV = 3.67 × PMF. Exponent > ১ — আর person ও month বদলযোগ্য নয় (Brooks).

পরের পর্বে: অনুমান পেলেন — এবার সেটিকে পরিকল্পনায় বদলানো। পর্ব ৬১-এ project planning: কাজকে WBS-এ ভাঙা, Gantt chart আঁকা, CPM দিয়ে critical path আর slack, আর PERT network দিয়ে নির্দিষ্ট তারিখে শেষ হওয়ার সম্ভাবনা।

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

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