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

Software quality — ISO/IEC 25010, maintainability, reliability আর quality মাপা

Software Quality — ISO/IEC 25010, Quality Scenarios, Fault–Error–Failure, MTBF/MTTR, Defect Density, DRE & Cost of Quality

Taught in Bangla, this lesson defines quality as conformance and fitness for use, walks through the ISO/IEC 25010 product quality characteristics and the older McCall and Boehm models, and turns vague goals into measurable quality scenarios. Worked examples and runnable code cover fault, error and failure, availability from MTBF and MTTR, defect density, defect removal efficiency, weighted trade-off scoring, verification versus validation and the cost of quality.

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

  • “ভালো software” কথাটির কয়েকটি স্বীকৃত সংজ্ঞা, আর ব্যবহারকারী ও ডেভেলপারের দৃষ্টিভঙ্গির পার্থক্য
  • ISO/IEC 25010-এর product quality model, quality in use, আর পুরোনো McCall ও Boehm মডেল
  • অস্পষ্ট চাওয়াকে মাপা যায় এমন quality scenario-তে রূপান্তর
  • Fault, error, failure-এর পার্থক্য; MTBF, MTTR, availability, defect density আর DRE-র হিসাব
  • Quality attribute-গুলোর trade-off, weighted score দিয়ে নকশা তুলনা আর cost of quality

১ · “ভালো software” বলতে আসলে কী বোঝায়

একটি কাল্পনিক দৃশ্য দিয়ে শুরু করি। একটি বিশ্ববিদ্যালয়ের ফলাফল পোর্টাল (কাল্পনিক) বানানো হলো। Requirement ছিল: “রোল নম্বর দিলে ফল দেখাবে।” ডেভেলপার দল সব test পাস করিয়ে জমা দিল। ফল প্রকাশের দিন সকাল ১০টায় হাজার হাজার শিক্ষার্থী একসাথে ঢুকলেন — পাতা খুলতে লাগল দুই মিনিট, অনেকে পেলেন শুধু error. আবার যাঁরা ফল পেলেন, তাঁদের কয়েকজনের ৮০ নম্বরে গ্রেড এলো A, অথচ নিয়মে A+ হওয়ার কথা।

Software টি কি “ভালো”? ডেভেলপার বলবেন, “সব requirement তো মেনেছি।” শিক্ষার্থী বলবেন, “যেদিন দরকার, সেদিনই কাজ করেনি।” দুজনেই আংশিক ঠিক। এই পর্বের মূল প্রশ্ন এটাই — software quality কী, আর সেটি কীভাবে মাপা যায়।

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

দুটি বিখ্যাত সংজ্ঞা

📏 Conformance to requirements

Philip Crosby তাঁর বই Quality Is Free-এ (১৯৭৯) quality-কে বলেছিলেন “requirement-এর সাথে মিল”। সুবিধা: মাপা যায় — মিলেছে কি মেলেনি। দুর্বলতা: requirement ভুল বা অসম্পূর্ণ হলে “নিখুঁত” software-ও অকেজো।

ডেভেলপার ও নির্মাতার দৃষ্টি

🎯 Fitness for use

Joseph Juran-এর পরিচিত সংজ্ঞা (তাঁর Quality Control Handbook-এর সাথে জড়িত, প্রথম সংস্করণ ১৯৫০-এর দশকের শুরুতে): পণ্যটি ব্যবহারকারীর আসল প্রয়োজন মেটায় কি না। সুবিধা: আসল উদ্দেশ্যের দিকে চোখ রাখে। দুর্বলতা: “কাজে লাগা” মাপা কঠিন, আর ব্যবহারকারীভেদে আলাদা।

ব্যবহারকারীর দৃষ্টি

১৯৮৪ সালে David Garvin একটি প্রবন্ধে quality দেখার পাঁচটি দৃষ্টিভঙ্গি দেখান — transcendent (দেখলেই চেনা যায়, সংজ্ঞায় আনা কঠিন), product-based (পণ্যের মাপা যায় এমন গুণ), user-based (ব্যবহারকারীর সন্তুষ্টি), manufacturing-based (spec মেনে তৈরি) আর value-based (দামের তুলনায় কতটা পাওয়া গেল)। পরে software engineering-এর লেখকেরা (যেমন Kitchenham ও Pfleeger, ১৯৯৬) এই পাঁচ দৃষ্টিভঙ্গি software-এ প্রয়োগ করে আলোচনা করেন। মূল শিক্ষা হলো: quality কোনো একটি সংখ্যা নয়; কে দেখছেন, তার ওপর নির্ভর করে কোন দিকটি জরুরি।

কে দেখছেনতাঁর কাছে quality মানেকোন গুণ চোখে পড়ে
ব্যবহারকারী (শিক্ষার্থী, ক্রেতা)কাজটা সহজে, দ্রুত, নির্ভুলভাবে হয়ে যায়usability, performance, reliability
ডেভেলপার ও maintainerকোড বোঝা, বদলানো আর test করা সহজmaintainability, testability, modularity
অপারেশন দলসহজে install, monitor আর পুনরুদ্ধার করা যায়availability, recoverability, installability
মালিক বা ব্যবসাখরচের তুলনায় লাভ, ঝুঁকি কমsecurity, cost of quality, time to market
মূল ধারণা

Software quality-কে তিন স্তরে ভাবা যায়: internal quality (কোডের ভেতরের গুণ — যেমন জটিলতা, coupling), external quality (চালানো অবস্থায় আচরণ — যেমন response time, crash) আর quality in use (আসল ব্যবহারকারী আসল কাজে কী অভিজ্ঞতা পান)। ভেতরের গুণ বাইরের আচরণকে প্রভাবিত করে, আর বাইরের আচরণ ব্যবহারের অভিজ্ঞতাকে। পর্ব ০১-এ (Software engineering কী) যে “টেকসই software”-এর কথা বলা হয়েছে, তার মাপকাঠি এগুলোই।

২ · ISO/IEC 25010 — quality-র একটি সাধারণ ভাষা

দলের একজন বলছেন “software টা ভালো না”, আরেকজন বলছেন “ভালোই তো”। দুজন হয়তো আলাদা জিনিসের কথা বলছেন — একজন গতির, আরেকজন কোডের পরিচ্ছন্নতার। এই বিভ্রান্তি কমাতে আন্তর্জাতিক মানসংস্থা ISO আর IEC মিলে quality-র একটি শ্রেণিবিন্যাস দাঁড় করিয়েছে: ISO/IEC 25010. এটি SQuaRE (Systems and software Quality Requirements and Evaluation) নামের ISO/IEC 25000 সিরিজের অংশ, আর আগের ISO/IEC 9126 (১৯৯১; চার খণ্ডে হালনাগাদ ২০০১–২০০৪) মডেলের উত্তরসূরি।

২০১১ সালের সংস্করণে product quality-কে আটটি quality characteristic-এ ভাগ করা হয়েছে, আর প্রতিটির নিচে কয়েকটি sub-characteristic. নিচের গাছটি দেখুন — প্রতিটি বাক্সে দুটি করে উদাহরণ দেওয়া আছে, পুরো তালিকা টেবিলে।

ISO/IEC 25010 product quality model (২০১১)

Eight characteristics, each with sub-characteristics (two shown per box)

ISO/IEC 25010 product quality model: আটটি characteristic ও তাদের কয়েকটি sub-characteristic Product quality পণ্যের গুণমান Functional suitability কাজের যথার্থতা completeness correctness Performance efficiency গতি ও সম্পদের ব্যবহার time behaviour resource utilization Compatibility অন্যের সাথে মিলে চলা co-existence interoperability Usability * ব্যবহারের সহজতা learnability accessibility Reliability নির্ভরযোগ্যতা availability fault tolerance Security নিরাপত্তা confidentiality integrity Maintainability রক্ষণাবেক্ষণের সহজতা modularity testability Portability * অন্য পরিবেশে নেওয়া adaptability installability ২০২৩ সংস্করণ: + Safety (নবম characteristic) * নাম বদল: interaction capability, flexibility
ছবি ৩.১ — ২০১১ সালের আটটি characteristic; ড্যাশ বাক্সে ২০২৩ সংস্করণের প্রধান পরিবর্তন (বিস্তারিত নিচের সতর্কতায়)।
Characteristicসহজ প্রশ্নSub-characteristic (২০১১)
Functional suitabilityযা করার কথা, তা পুরোটা আর ঠিকভাবে করে?functional completeness, functional correctness, functional appropriateness
Performance efficiencyকত দ্রুত, কত সম্পদ খরচ করে, কতটা ভার নেয়?time behaviour, resource utilization, capacity
Compatibilityঅন্য software-এর পাশে চলে, তথ্য আদান-প্রদান করতে পারে?co-existence, interoperability
Usabilityনির্দিষ্ট ব্যবহারকারী সহজে শিখে কাজ সারতে পারেন?appropriateness recognizability, learnability, operability, user error protection, user interface aesthetics, accessibility
Reliabilityনির্দিষ্ট পরিবেশে, নির্দিষ্ট সময় ধরে ঠিকঠাক চলে?maturity, availability, fault tolerance, recoverability
Securityঅনুমতি ছাড়া কেউ দেখতে, বদলাতে বা অস্বীকার করতে পারে না?confidentiality, integrity, non-repudiation, accountability, authenticity
Maintainabilityবোঝা, বদলানো আর test করা কতটা সহজ?modularity, reusability, analysability, modifiability, testability
Portabilityঅন্য hardware, OS বা পরিবেশে নেওয়া যায়?adaptability, installability, replaceability

২০২৩ সংস্করণ নিয়ে সতর্কতা। ISO/IEC 25010-এর একটি সংশোধিত সংস্করণ ২০২৩ সালে প্রকাশিত হয়েছে। আমাদের জানামতে প্রধান পরিবর্তনগুলো হলো: safety নামে নবম characteristic যোগ; usability-র নাম বদলে interaction capability (নতুন sub-characteristic যেমন inclusivity, user assistance, self-descriptiveness); portability-র নাম flexibility, যার ভেতরে scalability এসেছে; reliability-র maturity-র বদলে faultlessness; security-তে resistance যোগ; আর quality in use মডেল আলাদা মানদণ্ড ISO/IEC 25019-এ সরে গেছে। মানদণ্ডের পূর্ণ লেখা কিনে পড়তে হয়, তাই পরীক্ষা বা চুক্তির কাজে ISO-র অফিসিয়াল সূত্র মিলিয়ে নিন। বেশিরভাগ পাঠ্যবই ও পরীক্ষার প্রশ্ন এখনো ২০১১-র আটটি characteristic ধরেই চলে।

Quality in use — ব্যবহারের সময়ের গুণমান

Product quality বলে software-এর নিজের গুণ। কিন্তু একই software একজন অভিজ্ঞ হিসাবরক্ষকের হাতে চমৎকার, আর প্রথমবার স্মার্টফোন হাতে নেওয়া একজন দোকানদারের হাতে বিভ্রান্তিকর হতে পারে। তাই ২০১১ সালের ISO/IEC 25010-এ আলাদা একটি quality in use মডেল আছে, যার পাঁচটি characteristic: effectiveness (কাজটা আসলে সম্পন্ন হলো কি না), efficiency (কত সময় ও শ্রম লাগল), satisfaction (ব্যবহারকারী সন্তুষ্ট ও আস্থাশীল কি না), freedom from risk (অর্থ, স্বাস্থ্য বা পরিবেশের ঝুঁকি কতটা কম) আর context coverage (ভিন্ন ভিন্ন পরিস্থিতিতেও কাজ করে কি না)।

ISO/IEC 25010 কোনো “চেকলিস্ট, সবগুলো সর্বোচ্চ করুন” নয়। এটি একটি শব্দভান্ডার — requirement লেখার সময় কোনো গুণ বাদ পড়ছে কি না দেখতে, আর দলের সবাই যেন একই শব্দে একই জিনিস বোঝেন। কোন গুণ কতটা জরুরি, সেটি project-ভেদে ঠিক করতে হয় (অংশ ৮)।

৩ · পুরোনো দুই মডেল — McCall আর Boehm

ISO-র আগেও quality-কে ভাগ করে দেখার চেষ্টা হয়েছে। পরীক্ষায় প্রায়ই এই দুই মডেলের তুলনা চাওয়া হয়, তাই সংক্ষেপে জেনে রাখুন।

McCall-এর মডেল (১৯৭৭)

Jim McCall ও সহকর্মীরা মার্কিন বিমানবাহিনীর জন্য করা এক প্রতিবেদনে ১১টি quality factor-কে তিন দৃষ্টিকোণে ভাগ করেন:

  • Product operation (চালানো): correctness, reliability, efficiency, integrity, usability
  • Product revision (বদলানো): maintainability, flexibility, testability
  • Product transition (অন্য পরিবেশে নেওয়া): portability, reusability, interoperability
factor → criteria → metric

Boehm-এর মডেল (১৯৭৮)

Barry Boehm ও সহকর্মীদের Characteristics of Software Quality (১৯৭৮) একটি স্তরভিত্তিক গাছ বানায়। সবচেয়ে ওপরে প্রশ্ন: software টি কি এখন যেমন আছে তেমন কাজে লাগে (as-is utility), বোঝা-বদলানো সহজ (maintainability), আর অন্য পরিবেশে নেওয়া যায় (portability)? নিচের স্তরে আরও সূক্ষ্ম গুণ — যেমন understandability, modifiability, testability, human engineering.

high-level → primitive characteristics

দুটি মডেলের মূল ধারণা একই: বড়, অস্পষ্ট গুণকে ভেঙে ছোট ছোট গুণে নামানো, যতক্ষণ না কোনো সংখ্যা দিয়ে মাপা যায়। ISO/IEC 9126 আর পরে 25010 এই ধারণাকে আন্তর্জাতিক ঐকমত্যে নিয়ে আসে। পর্ব ০২-এ (software crisis-এর ইতিহাস) দেখবেন, ১৯৭০-এর দশকে বড় সরকারি ও সামরিক project-এর অভিজ্ঞতা থেকেই এ ধরনের মডেলের চাহিদা তৈরি হয়েছিল।

৪ · Quality মাপা — metric আর quality scenario

“অ্যাপটা দ্রুত হতে হবে”, “ব্যবহার সহজ হতে হবে”, “নিরাপদ হতে হবে” — requirement-এর খাতায় এমন বাক্য প্রায়ই দেখা যায়। সমস্যা হলো, এগুলো test করা যায় না। ৫ সেকেন্ড দ্রুত, নাকি ৫০০ মিলিসেকেন্ড? কার জন্য সহজ? কখন দ্রুত — রাত ২টায়, নাকি ফল প্রকাশের সকালে? যা মাপা যায় না, তা নিয়ে ডেভেলপার আর গ্রাহকের বিবাদ মেটানোর কোনো উপায় থাকে না।

সমাধান হলো দুটি জিনিস। প্রথমত metric — একটি সংখ্যা, যার মাপার নিয়ম স্পষ্ট (কী গোনা হবে, কোন একক, কোথা থেকে তথ্য)। দ্বিতীয়ত quality scenario — একটি ছোট, কাঠামোবদ্ধ বাক্য, যাতে বলা থাকে কোন পরিস্থিতিতে কী ঘটলে software কী প্রতিক্রিয়া দেবে আর সেটি কোন সংখ্যা দিয়ে মাপা হবে। Software Engineering Institute (SEI)-র লেখকেরা (যেমন Bass, Clements ও Kazman-এর Software Architecture in Practice) এর ছয়টি অংশ ব্যবহার করেন: source, stimulus, artifact, environment, response আর response measure. নিচের stepper-এ একটি অস্পষ্ট চাওয়াকে ধাপে ধাপে scenario বানানো দেখুন।

Quality scenario কার্ড — ফলাফল পোর্টাল (কাল্পনিক)
মূল চাওয়া
Characteristic
Source ও stimulus
Environment
Response ও measure
যাচাইয়ের উপায়
  1. অস্পষ্ট চাওয়া। “পোর্টাল দ্রুত হতে হবে।” এটি পাস না ফেল, কেউ বলতে পারবেন না। প্রথম কাজ হলো বাক্যটি হুবহু লিখে রাখা, যাতে পরে মূল উদ্দেশ্য হারিয়ে না যায়।
  2. Characteristic চিনে নেওয়া। ISO/IEC 25010-এর ভাষায় এটি performance efficiency — বিশেষ করে time behaviour (প্রতিটি অনুরোধে কত সময়) আর capacity (একসাথে কত ভার)। নাম দিলেই বোঝা যায়, কোন ধরনের সংখ্যা লাগবে।
  3. Source ও stimulus. কে, কী চাইছেন, কত পরিমাণে? এখানে শিক্ষার্থীরা রোল নম্বর দিয়ে ফল চাইছেন, সব মিলিয়ে সেকেন্ডে ৫০০টি অনুরোধ। সংখ্যাটি অনুমান নয় — আগের বছরের log বা মোট শিক্ষার্থীর সংখ্যা থেকে হিসাব করে নিতে হয়।
  4. Environment. কোন অবস্থায়? ফল প্রকাশের দিনের প্রথম এক ঘণ্টা, যখন ভিড় সবচেয়ে বেশি — ঈদের আগে বাসের টিকিট কাউন্টারের মতো। “সব সার্ভার সচল” লেখা থাকায় বোঝা যায়, একটি সার্ভার বন্ধ থাকলে কী হবে তার জন্য আলাদা scenario লাগবে।
  5. Response ও response measure. Software কী করবে আর কত ভালোভাবে: ফলের পাতা দেখাবে; ৯৫ শতাংশ অনুরোধের উত্তর ৩০০ মিলিসেকেন্ডের মধ্যে (p95), আর error হাজারে একটির বেশি নয়। গড় নয়, percentile — কারণ গড় ধীর ব্যবহারকারীদের লুকিয়ে ফেলে।
  6. যাচাইয়ের উপায়। Release-এর আগে load test-এ সেকেন্ডে ৫০০টি অনুরোধ ৩০ মিনিট ধরে পাঠিয়ে মাপা হবে; আসল দিনে dashboard-এ একই metric দেখা হবে। এখন বাক্যটি পাস-ফেল বলা যায় এমন requirement — এটাই মাপা যায় এমন quality.

Percentile আর tail latency কেন গড়ের চেয়ে ভালো, তার বিস্তারিত গণিত System Design কোর্সের পর্ব ০৪ · Latency, throughput আর percentile-এ আছে। একই কৌশল অন্য গুণেও খাটে:

অস্পষ্ট চাওয়াCharacteristicমাপা যায় এমন রূপ (উদাহরণ)
“ব্যবহার সহজ হতে হবে”Usability → learnabilityপ্রথমবারের ২০ জন ব্যবহারকারীর অন্তত ১৮ জন কোনো সাহায্য ছাড়া ৩ মিনিটের মধ্যে টিকিট কাটতে পারবেন
“সবসময় চালু থাকবে”Reliability → availabilityমাসিক availability অন্তত ৯৯.৯% (মাসে সর্বোচ্চ প্রায় ৪৩ মিনিট বন্ধ), পরিকল্পিত রক্ষণাবেক্ষণ বাদে
“নিরাপদ হতে হবে”Security → confidentialityলগইন ছাড়া কোনো ব্যক্তিগত ফল দেখা যাবে না; প্রতি release-এ স্বয়ংক্রিয় security scan-এ কোনো “critical” ফল থাকবে না
“পরে বদলানো সহজ হবে”Maintainability → modifiabilityনতুন একটি গ্রেডিং নিয়ম যোগ করতে একটি module-এর বাইরে কোড বদলাতে হবে না; কাজটি গড়ে ২ দিনের মধ্যে হবে
“সব ফোনে চলবে”Portability / compatibilityAndroid 10 বা নতুন, আর সাম্প্রতিক দুটি প্রধান ব্রাউজার সংস্করণে মূল তিনটি কাজ সফল

এগুলোকে requirement-এর ভাষায় বলা হয় non-functional requirement বা quality requirement. কীভাবে SRS-এ লিখবেন, কীভাবে মাপার একক আর সীমা বাছবেন — পর্ব ২১-এ (Functional আর non-functional requirement) বিস্তারিত দেখবেন। System Design-এর দৃষ্টি থেকে একই বিষয় আছে Requirement আর trade-off পর্বে।

৫ · Reliability — fault, error, failure আর MTBF-MTTR

“Software-এ bug আছে” — কথাটা আমরা খুব ঢিলেঢালাভাবে বলি। কিন্তু reliability মাপতে হলে তিনটি জিনিস আলাদা করতে হয়: কোডের ভেতরের ভুল, চলার সময়ের ভুল অবস্থা, আর বাইরে দেখা দেওয়া ব্যর্থতা। দুঃখের বিষয়, শব্দগুলোর অর্থ নিয়ে দুটি প্রচলিত ধারা আছে — পরীক্ষায় লেখার সময় কোন ধারা মানছেন, সেটি উল্লেখ করা নিরাপদ।

শব্দIEEE শব্দকোষের ধারা (IEEE Std 610.12-1990; পরে ISO/IEC/IEEE 24765)Dependability-র ধারা (Avižienis, Laprie, Randell ও Landwehr, ২০০৪)
Errorমানুষের ভুল কাজ (অনেকে বলেন mistake), যেমন নিয়ম ভুল বোঝাsystem-এর ভেতরের ভুল অবস্থা — যেমন ভুল মান রাখা একটি ভ্যারিয়েবল
Fault (defect, bug)program-এর ভেতরে ভুল ধাপ, ভুল শর্ত বা ভুল তথ্যerror-এর কারণ; সক্রিয় না হওয়া পর্যন্ত “ঘুমিয়ে” (dormant) থাকে
Failureপ্রয়োজনীয় কাজ নির্দিষ্ট সীমার মধ্যে করতে না পারাদেওয়া সেবা সঠিক সেবা থেকে বিচ্যুত হওয়া — বাইরে থেকে দেখা যায়
মানুষের ভুল (mistake) → কোডে fault → নির্দিষ্ট ইনপুটে fault সক্রিয় → ভুল অবস্থা (error) → বাইরে দেখা দিলে failure

এই শিকলের সবচেয়ে গুরুত্বপূর্ণ শিক্ষা: fault থাকলেই failure হয় না। একটি ছোট গ্রেডিং function দিয়ে দেখি। নিয়ম: ৮০ বা তার বেশি পেলে A+, ৭০ থেকে ৭৯ পেলে A. প্রোগ্রামার ভুল করে >=-এর জায়গায় > লিখেছেন।

1function grade(m) {2  if (m > 80) return "A+";  // spec: 80 বা বেশি3  if (m >= 70) return "A";4  return "B-";5}
চলার অবস্থা
কল
লাইন ২-এর সিদ্ধান্ত
ফেরত মান
Spec অনুযায়ী
অবস্থা
  1. Fault ঢুকে গেছে। লাইন ২-এ m >= 80 হওয়ার কথা, লেখা হয়েছে m > 80. এটি একটি fault — কিন্তু code review-তে কেউ খেয়াল করেননি, আর এখনো কোনো ব্যবহারকারী কিছু টের পাননি। Fault এখন ঘুমিয়ে আছে।
  2. grade(75) ডাকা হলো। লাইন ২: ৭৫ কি ৮০-র বেশি? না। এখানে ভুল শর্তটি চলল ঠিকই, কিন্তু ৭৫-এর জন্য ঠিক শর্ত (>=) দিলেও উত্তর একই “না” হতো। তাই fault সক্রিয় হয়নি।
  3. সঠিক ফল। লাইন ৩: ৭৫ কি ৭০ বা বেশি? হ্যাঁ, ফেরত এলো A — spec-ও তাই বলে। ভুল কোড চালিয়েও ঠিক ফল! এজন্যই অল্প কয়েকটি এলোমেলো ইনপুটে test করে fault খুঁজে পাওয়া কঠিন।
  4. grade(80) — fault জেগে উঠল। লাইন ২: ৮০ কি ৮০-র বেশি? না। ঠিক কোড হলে উত্তর হতো “হ্যাঁ”। Program এখন এমন অবস্থায়, যা spec অনুযায়ী হওয়ার কথা নয় — dependability-র ভাষায় এটাই error (ভুল অভ্যন্তরীণ অবস্থা)। বাইরে থেকে এখনো কিছু দেখা যাচ্ছে না।
  5. Error ছড়াচ্ছে। ভুল শাখা ধরে program লাইন ৩-এ এলো, ৮০ ≥ ৭০ সত্য, তাই ফেরতের জন্য A তৈরি হচ্ছে। ভুল অবস্থা এক ধাপ থেকে পরের ধাপে বয়ে যাচ্ছে।
  6. Failure. Function A ফেরত দিল, আর ফলাফল শিটে ছাপা হলো “80 → A”. শিক্ষার্থী নিয়ম জানেন, তিনি দেখলেন সেবা spec থেকে বিচ্যুত — এটাই failure. খেয়াল করুন: failure দেখা গেল শুধু ঠিক ৮০ নম্বরে; ৮১ থেকে ১০০ পর্যন্ত সব ঠিক।
  7. Fault সারানো। লাইন ২-এ m >= 80 করার পর grade(80) ফেরত দেয় A+. এমন সীমানার ভুল ধরার নিয়মিত কৌশল হলো boundary value test — ঠিক ৭৯, ৮০ আর ৮১ দিয়ে পরীক্ষা (পর্ব ৪৭-এ বিস্তারিত)।

কতবার failure দেখা যাবে, তা নির্ভর করে কে কোন ইনপুট দেন তার ওপর — একে বলে usage profile বা operational profile. নিচের program একই buggy function-কে দুই রকম শিক্ষার্থীর দল দিয়ে ১০০০ বার করে চালায়। এলোমেলো সংখ্যা আসে একটি seed দেওয়া PRNG (mulberry32) থেকে, তাই প্রতিবার একই ফল আসবে।

// A fault can sleep: it causes a failure only for some inputs.
// Spec: marks 80 or more -> "A+", 70..79 -> "A", below 70 -> "B or less".
function gradeBuggy(m) {
  if (m > 80) return "A+";        // FAULT: should be m >= 80
  if (m >= 70) return "A";
  return "B-";
}
function gradeSpec(m) {           // the oracle: what the spec says
  return m >= 80 ? "A+" : m >= 70 ? "A" : "B-";
}
function mulberry32(a) { return function () {
  a |= 0; a = a + 0x6D2B79F5 | 0; let t = Math.imul(a ^ a >>> 15, 1 | a);
  t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t; return ((t ^ t >>> 14) >>> 0) / 4294967296; }; }
const rnd = mulberry32(2026);
// Two usage profiles: uniform marks 0..100, and a class of strong students 75..100
const profiles = { "uniform 0-100": () => Math.floor(rnd() * 101),
                   "strong 75-100": () => 75 + Math.floor(rnd() * 26) };
for (const [name, draw] of Object.entries(profiles)) {
  let failures = 0, first = null;
  for (let i = 1; i <= 1000; i++) {
    const m = draw();
    if (gradeBuggy(m) !== gradeSpec(m)) { failures++; if (first === null) first = i; }
  }
  console.log(name.padEnd(14), "failures:", failures, "/ 1000, first at run", first);
}
console.log("gradeBuggy(80) =", gradeBuggy(80), " spec says", gradeSpec(80));

আউটপুট:

uniform 0-100  failures: 5 / 1000, first at run 8
strong 75-100  failures: 36 / 1000, first at run 3
gradeBuggy(80) = A  spec says A+

একই কোড, একই fault — কিন্তু সব রকম নম্বরের দলে ১০০০ বারে failure মাত্র ৫টি (০ থেকে ১০০-র ১০১টি মানের একটি হলো ৮০, তাই প্রত্যাশা প্রায় ১০টি; এলোমেলো নমুনায় এবার এসেছে ৫), আর ভালো ছাত্রদের দলে ৩৬টি (৭৫ থেকে ১০০-র ২৬টি মানের একটি, প্রত্যাশা প্রায় ৩৮)। অর্থাৎ reliability শুধু কোডের গুণ নয়, কোড আর ব্যবহারের ধরনের যৌথ গুণ। এজন্যই reliability-র সংজ্ঞায় “নির্দিষ্ট পরিস্থিতিতে” কথাটি থাকে।

এর একটি বিখ্যাত বাস্তব উদাহরণ Ariane 5 রকেটের প্রথম উড্ডয়ন (Flight 501, ১৯৯৬)। তদন্ত বোর্ডের প্রতিবেদন অনুযায়ী, Ariane 4-এর জন্য লেখা inertial reference software-এর একটি অংশ নতুন রকেটে পুনরায় ব্যবহার করা হয়েছিল। Ariane 5-এর বেশি অনুভূমিক গতির কারণে একটি 64-bit floating-point মানকে 16-bit পূর্ণসংখ্যায় রূপান্তরের সময় overflow হয়, আর নিয়ন্ত্রণ ব্যবস্থা ভেঙে পড়ে; উড্ডয়ন শুরুর প্রায় ৪০ সেকেন্ড পরে রকেটটি ধ্বংস হয়। পুরোনো রকেটের উড্ডয়ন-পথে ওই মান কখনো এত বড় হয়নি — fault ঘুমিয়ে ছিল, নতুন usage profile তাকে জাগিয়েছে।

MTBF, MTTR আর availability

Reliability মাপার দুটি পরিচিত সংখ্যা: MTBF (Mean Time Between Failures — দুটি failure-এর মাঝে গড়ে কত সময় system ঠিক চলে) আর MTTR (Mean Time To Repair বা Restore — failure-এর পর আবার চালু হতে গড়ে কত সময় লাগে)। এ দুটি থেকে দীর্ঘ সময়ের গড় availability:

Availability A = MTBF / (MTBF + MTTR)
বছরে প্রত্যাশিত বন্ধ সময় = (1 − A) × 8760 ঘণ্টা

পরিভাষা নিয়ে একটি সতর্কতা: কিছু বইয়ে MTBF মানে failure থেকে পরের failure পর্যন্ত পুরো চক্র (চলা + মেরামত), আর ঠিক চলার গড় সময়কে বলা হয় MTTF (Mean Time To Failure). সেই ধারায় সূত্রটি A = MTTF / (MTTF + MTTR). এখানে আমরা MTBF বলতে “চলার গড় সময়” ধরছি, যেমন অনেক পাঠ্যবই ধরে। প্রশ্নে সংজ্ঞা দেওয়া থাকলে সেটিই মানুন।

// Availability from MTBF and MTTR (steady state): A = MTBF / (MTBF + MTTR)
const HOURS_PER_YEAR = 365 * 24;                 // 8760 h
const systems = [                                // fictional systems, hours
  { name: "result-portal", mtbf: 720,  mttr: 4   },
  { name: "payment-api",   mtbf: 2000, mttr: 1   },
  { name: "chat-service",  mtbf: 200,  mttr: 0.1 },
  { name: "library-app",   mtbf: 8760, mttr: 8   },
];
for (const s of systems) {
  const A = s.mtbf / (s.mtbf + s.mttr);
  const downH = (1 - A) * HOURS_PER_YEAR;        // expected downtime per year
  const failures = HOURS_PER_YEAR / (s.mtbf + s.mttr);
  console.log(s.name.padEnd(14), (A * 100).toFixed(3) + "%",
    " down/yr " + downH.toFixed(2) + " h", " failures/yr " + failures.toFixed(1));
}
// Check one system by simulation: exponential up/down times, seeded PRNG
function mulberry32(a) { return function () {
  a |= 0; a = a + 0x6D2B79F5 | 0; let t = Math.imul(a ^ a >>> 15, 1 | a);
  t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t; return ((t ^ t >>> 14) >>> 0) / 4294967296; }; }
const rnd = mulberry32(42), expo = m => -m * Math.log(1 - rnd());
let up = 0, down = 0;
for (let i = 0; i < 100000; i++) { up += expo(720); down += expo(4); }
console.log("simulated result-portal A =", (100 * up / (up + down)).toFixed(3) + "%");

আউটপুট:

result-portal  99.448%  down/yr 48.40 h  failures/yr 12.1
payment-api    99.950%  down/yr 4.38 h  failures/yr 4.4
chat-service   99.950%  down/yr 4.38 h  failures/yr 43.8
library-app    99.909%  down/yr 7.99 h  failures/yr 1.0

শেষ লাইনে আসে simulated result-portal A = 99.449% — এক লাখ চক্রের simulation সূত্রের ৯৯.৪৪৮%-এর সাথে প্রায় হুবহু মেলে। এবার মাঝের দুটি সারি দেখুন: payment-api আর chat-service-এর availability একই, ৯৯.৯৫%, বছরে একই ৪.৩৮ ঘণ্টা বন্ধ। কিন্তু প্রথমটি বছরে ৪ বারের মতো পড়ে আর প্রতিবার এক ঘণ্টা বন্ধ থাকে; দ্বিতীয়টি বছরে ৪৪ বারের মতো পড়ে, প্রতিবার মাত্র ৬ মিনিট। একটি পেমেন্টের মাঝপথে বারবার ছোট বিভ্রাট যে ক্ষতি করে, একটি লম্বা বিভ্রাট তা করে না — আবার উল্টোটাও হতে পারে। Availability একা যথেষ্ট নয়; failure কত ঘন ঘন হয় (reliability) আর কত দ্রুত সারে (MTTR), দুটোই আলাদা করে দেখতে হয়।

৯৯.৯%, ৯৯.৯৯% (“nines”) থেকে বন্ধ সময়ের বাজেট, একাধিক অংশ series বা parallel-এ জুড়লে availability কীভাবে বদলায়, আর redundancy — এসব System Design কোর্সের পর্ব ০৫ · Availability আর reliability-এ পূর্ণ হিসাবসহ আছে; এখানে আর পুনরাবৃত্তি করছি না।

৬ · Defect density আর defect removal efficiency

Reliability চালানো system-এর গুণ। কিন্তু release-এর আগে, তৈরির সময়েই quality-র আভাস পেতে দুটি পুরোনো ও বহুল ব্যবহৃত metric আছে।

  • Defect density = defect-এর সংখ্যা / কোডের আকার। আকার সাধারণত মাপা হয় KLOC-এ (হাজার লাইন কোড)। কোন defect গোনা হবে — শুধু release-এর পরে পাওয়া, নাকি সব — সেটি আগে ঠিক করে নিতে হয়।
  • DRE (Defect Removal Efficiency) = release-এর আগে পাওয়া defect / (আগে পাওয়া + পরে পাওয়া defect). অর্থাৎ মোট defect-এর কত ভাগ ব্যবহারকারীর হাতে পৌঁছানোর আগেই ধরা গেল। Capers Jones-এর মতো লেখকেরা এই metric জনপ্রিয় করেছেন; “পরে পাওয়া” সাধারণত release-এর পর নির্দিষ্ট একটি সময় (যেমন ৯০ দিন) ধরে গোনা হয়।

মুদি দোকানের হিসাবের খাতা ভাবুন। মাস শেষে দোকানি নিজে খাতা মিলিয়ে ৮টি ভুল পেলেন, আর পরে ক্রেতারা এসে আরও ২টি ধরলেন। দোকানির “ভুল ধরার দক্ষতা” ৮ / ১০ = ৮০%. DRE ঠিক এই হিসাব — শুধু খাতার বদলে software, আর দোকানির বদলে review ও test.

একটি কাল্পনিক release ধরে ধাপে ধাপে DRE বের করি। কোডের আকার ১৬ KLOC.

Release v3.0 (কাল্পনিক) · 16 KLOC
Code review-এ পাওয়া
Unit ও integration test-এ
System test-এ
Release-এর আগে মোট (pre)
Release-এর পরে ৯০ দিনে (post)
মোট defect
DRE
Defect density
  1. Code review. দলের সদস্যরা একে অপরের কোড পড়ে ৪০টি defect পেলেন। এগুলো কোনো test চালানোর আগেই ধরা পড়েছে — সবচেয়ে সস্তায়।
  2. Unit ও integration test. আরও ৩৫টি defect. Release-এর আগে মোট এখন ৪০ + ৩৫ = ৭৫টি।
  3. System test. পুরো system একসাথে চালিয়ে আরও ২৫টি। Release-এর আগে মোট ১০০টি defect ধরা ও সারানো হলো।
  4. Release-এর পরে। প্রথম ৯০ দিনে ব্যবহারকারীরা আরও ২০টি defect জানালেন। এখন জানা মোট defect ১০০ + ২০ = ১২০টি। (৯০ দিনের পরে আরও পাওয়া যেতে পারে — তাই DRE সবসময় “এখন পর্যন্ত জানা” তথ্যের ওপর দাঁড়ানো একটি অনুমান।)
  5. DRE হিসাব। DRE = ১০০ / ১২০ = ০.৮৩৩, অর্থাৎ ৮৩.৩%. প্রতি ছয়টি defect-এর পাঁচটি ব্যবহারকারীর আগে ধরা গেছে, একটি পৌঁছে গেছে ব্যবহারকারীর কাছে।
  6. Defect density. মোট defect ধরে ১২০ / ১৬ = প্রতি KLOC-এ ৭.৫টি; শুধু release-এর পরের defect ধরে ২০ / ১৬ = ১.২৫টি। দুটি সংখ্যা ভিন্ন প্রশ্নের উত্তর দেয়, তাই রিপোর্টে কোনটি দিচ্ছেন স্পষ্ট লিখুন।

এক release-এর সংখ্যা দিয়ে খুব বেশি বলা যায় না; আসল তথ্য আসে প্রবণতা (trend) থেকে। নিচের program তিনটি কাল্পনিক release-এর হিসাব একসাথে করে।

// Defect density and Defect Removal Efficiency (DRE) per release.
// pre  = defects found BEFORE release (reviews + tests)
// post = defects reported by users in the first 90 days after release
const releases = [
  { v: "v1.0", kloc: 12, pre: 84,  post: 21 },
  { v: "v1.1", kloc: 15, pre: 120, post: 15 },
  { v: "v2.0", kloc: 22, pre: 150, post: 50 },
];
console.log("release KLOC total  total/KLOC post/KLOC  DRE");
for (const r of releases) {
  const total = r.pre + r.post;
  const dre = r.pre / total;                    // share caught before users
  console.log(r.v.padEnd(8) + String(r.kloc).padEnd(5) +
    String(total).padEnd(7) + (total / r.kloc).toFixed(2).padEnd(11) +
    (r.post / r.kloc).toFixed(2).padEnd(11) + (dre * 100).toFixed(1) + "%");
}
// Same numbers over all three releases together
const sum = k => releases.reduce((s, r) => s + r[k], 0);
const P = sum("pre"), Q = sum("post");
console.log("all     " + sum("kloc") + " KLOC, DRE = " + P + "/" + (P + Q) +
  " = " + (100 * P / (P + Q)).toFixed(1) + "%");

আউটপুট:

release KLOC total  total/KLOC post/KLOC  DRE
v1.0    12   105    8.75       1.75       80.0%
v1.1    15   135    9.00       1.00       88.9%
v2.0    22   200    9.09       2.27       75.0%
all     49 KLOC, DRE = 354/440 = 80.5%

মোট defect density তিন release-এ প্রায় সমান (৮.৭৫, ৯.০০, ৯.০৯) — অর্থাৎ দল মোটামুটি একই হারে defect তৈরি করছে। কিন্তু v2.0-তে DRE নেমে গেছে ৭৫%-এ, আর ব্যবহারকারীর হাতে পৌঁছানো defect প্রতি KLOC-এ ১.০০ থেকে বেড়ে ২.২৭। ব্যাখ্যা হতে পারে নানা কিছু: বড় release-এ test-এর সময় কম পড়েছে, নতুন ধরনের feature-এর জন্য test নেই, বা review তাড়াহুড়ায় হয়েছে। সংখ্যা প্রশ্ন তোলে; উত্তর খুঁজতে হয় দলের সাথে কথা বলে। খেয়াল করুন, তিন release মিলিয়ে DRE ৮০.৫% — শুধু এটি দেখলে v2.0-র অবনতি চোখেই পড়ত না।

Defect density দিয়ে মানুষ বা দলের তুলনা করবেন না। এক দল ছোট ছোট সমস্যাও defect হিসেবে লেখে, আরেক দল শুধু বড়গুলো; এক ভাষায় যে কাজ ১০০ লাইনে হয়, আরেক ভাষায় তা ৩০০ লাইনে। লাইন গোনার নিয়মও (comment, ফাঁকা লাইন ধরা হবে কি না) আলাদা। একই দলের একই নিয়মে মাপা সময়ের প্রবণতাই এই metric-এর নিরাপদ ব্যবহার।

৭ · Maintainability, usability-accessibility আর security

Maintainability — যে গুণ চোখে পড়ে না, কিন্তু খরচ ঠিক করে

একটি software তৈরিতে যত খরচ হয়, তার পরের বছরগুলোতে বদলানো, bug সারানো আর নতুন feature যোগে প্রায়ই তার চেয়ে বেশি খরচ হয় — এ কথা software engineering-এর বহু বইয়ে আছে, যদিও সঠিক অনুপাত নিয়ে বিভিন্ন সূত্রে ভিন্ন সংখ্যা পাওয়া যায়। তাই maintainability-কে কয়েকটি পরোক্ষ সূচক দিয়ে নজরে রাখা হয়:

সূচককী মাপেকোথায় বিস্তারিত
Cyclomatic complexity (McCabe, ১৯৭৬)একটি function-এর ভেতরে স্বাধীন পথের সংখ্যা — বেশি হলে বোঝা ও test করা কঠিনপর্ব ৫০ · Coverage আর complexity
Coupling ও cohesionmodule-গুলো একে অপরের ওপর কতটা নির্ভরশীল, আর একটি module-এর ভেতরের অংশগুলো কতটা একই কাজেরপর্ব ২৫ · Modularity, coupling আর cohesion
Test coveragetest চালালে কোডের কত ভাগ লাইন বা শাখা চলে — কম হলে বদলানো ঝুঁকিপূর্ণপর্ব ৫০ · Coverage আর complexity
Duplication, function-এর আকারএকই কোড কতবার কপি হয়েছে, function কত লম্বাপর্ব ৪২ · Code smell আর refactoring
Change lead timeএকটি ছোট পরিবর্তন চাওয়া থেকে চালু হতে কত দিন লাগেপর্ব ৫৯ · Continuous delivery আর DevOps

এর কোনোটিই একা maintainability নয় — এগুলো আভাস। ১০০% coverage-এর কোডও অর্থহীন test-এ ভরা থাকতে পারে, আর complexity কম হলেও নাম আর গঠন বিভ্রান্তিকর হতে পারে। Maintainability-র অবনতি দীর্ঘ সময়ে কীভাবে technical debt হয়ে জমে, তা পর্ব ৪৩-এ দেখবেন।

Usability আর accessibility

Usability মানে নির্দিষ্ট ব্যবহারকারী নির্দিষ্ট কাজ কতটা কার্যকরভাবে, দক্ষতার সাথে আর সন্তুষ্ট হয়ে করতে পারেন। এর একটি অংশ accessibility — দৃষ্টি, শ্রবণ, চলাচল বা বোধশক্তির প্রতিবন্ধকতা থাকা মানুষও যেন software ব্যবহার করতে পারেন। ওয়েবের জন্য সবচেয়ে প্রচলিত মানদণ্ড W3C-র WCAG (Web Content Accessibility Guidelines); লেখার সময়ে সর্বশেষ সংস্করণ WCAG 2.2 (২০২৩)। এর চারটি মূলনীতি সংক্ষেপে POUR: perceivable (বোঝা যায় এমনভাবে দেখানো), operable (keyboard-সহ নানা উপায়ে চালানো যায়), understandable (বোধগম্য) আর robust (screen reader-এর মতো সহায়ক প্রযুক্তিতেও কাজ করে)। বাস্তব HTML-এ কীভাবে করবেন, তা HTML & CSS কোর্সের অ্যাক্সেসিবিলিটি পর্বে আছে।

মেট্রো স্টেশনে সিঁড়ির পাশে লিফট আর ঢালু পথ রাখা হয় হুইলচেয়ারের জন্য — কিন্তু ভারী ব্যাগ হাতে যাত্রী, বয়স্ক মানুষ, শিশু নিয়ে মা-বাবা সবাই সেটি ব্যবহার করেন। Software-এ বড় লেখা, স্পষ্ট রঙের পার্থক্য, keyboard দিয়ে চালানোর ব্যবস্থাও তেমন — কম আলোয়, ভাঙা স্ক্রিনে বা এক হাতে ফোন ধরা অবস্থায় সবাই উপকৃত হন।

Security — quality-র একটি অংশ, পরে জোড়া দেওয়ার জিনিস নয়

ISO/IEC 25010 security-কে quality characteristic হিসেবেই রেখেছে। এর কেন্দ্রে তথ্য-নিরাপত্তার পরিচিত তিনটি লক্ষ্য, CIA triad: confidentiality (অনুমতি ছাড়া কেউ দেখতে পারবে না), integrity (অনুমতি ছাড়া কেউ বদলাতে পারবে না) আর availability (যাঁর অনুমতি আছে, তিনি দরকারের সময় পাবেন)। ISO-র sub-characteristic-এ আরও আছে authenticity (যিনি দাবি করছেন তিনিই কি না), accountability (কে কী করেছেন তার হিসাব) আর non-repudiation (করা কাজ পরে অস্বীকার করা যায় না)।

প্রতিরোধমূলক দৃষ্টিতে quality হিসেবে security মানে: requirement-এর সময়েই ঝুঁকি চিহ্নিত করা, সবচেয়ে কম প্রয়োজনীয় অনুমতি (least privilege), ইনপুট যাচাই, গোপন তথ্য (password, API key) কখনো কোডে বা Git history-তে না রাখা, আর dependency হালনাগাদ রাখা। Git-এ গোপন তথ্য ফাঁস ঠেকানোর ব্যবহারিক কৌশল পর্ব ৫৭-এ আছে।

৮ · Trade-off — সব গুণ একসাথে সর্বোচ্চ হয় না

প্রতিটি quality attribute কিছু না কিছু দাম চায়। কয়েকটি পরিচিত টানাপোড়েন:

  • Security বনাম usability: প্রতিবার OTP চাইলে নিরাপত্তা বাড়ে, কিন্তু ব্যবহারকারী বিরক্ত হন।
  • Performance বনাম maintainability: সর্বোচ্চ গতির জন্য লেখা কৌশলী কোড প্রায়ই পড়তে ও বদলাতে কঠিন।
  • Reliability বনাম খরচ ও সরলতা: প্রতিটি অংশের বাড়তি কপি (redundancy) রাখলে availability বাড়ে, কিন্তু খরচ আর জটিলতাও বাড়ে।
  • Portability বনাম performance: সব platform-এ চলার মতো সাধারণ কোড কোনো একটি platform-এর বিশেষ সুবিধা কাজে লাগাতে পারে না।

তাহলে দুটি নকশার মধ্যে কোনটি বাছবেন? একটি সহজ, বহুল ব্যবহৃত কৌশল হলো weighted scoring: দল প্রতিটি attribute-কে project-এর জন্য গুরুত্ব অনুযায়ী ওজন (weight) দেয়, তারপর প্রতিটি নকশাকে ১ থেকে ৫ নম্বর দেয়। মোট নম্বর = Σ (ওজন × নম্বর)। নিচে দুটি কাল্পনিক নকশা: X — একটি সার্ভার, সরল কোড; Y — একাধিক replica, বেশি নিরাপদ ও নির্ভরযোগ্য, কিন্তু জটিল।

// Weighted quality score: which design wins depends on the priorities.
// Scores 1..5 given by the team for two fictional design options.
const attrs = ["performance", "reliability", "security", "maintainability", "usability"];
const X = { name: "X: single server", s: [3, 2, 3, 5, 4] };
const Y = { name: "Y: replicated",    s: [4, 5, 4, 2, 4] };
const profiles = {                       // weights add up to 1.0
  "exam-day result portal": [0.30, 0.35, 0.15, 0.10, 0.10],
  "small internal tool":    [0.10, 0.10, 0.15, 0.45, 0.20],
  "balanced (all equal)":   [0.20, 0.20, 0.20, 0.20, 0.20],
};
const score = (opt, w) => opt.s.reduce((t, v, i) => t + v * w[i], 0);
for (const [p, w] of Object.entries(profiles)) {
  const x = score(X, w), y = score(Y, w);
  console.log(p.padEnd(24), "X=" + x.toFixed(2), "Y=" + y.toFixed(2),
    "-> winner " + (x > y ? "X" : "Y"));
}
// How robust is the balanced decision? Shake each weight by +-50 %.
function mulberry32(a) { return function () {
  a |= 0; a = a + 0x6D2B79F5 | 0; let t = Math.imul(a ^ a >>> 15, 1 | a);
  t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t; return ((t ^ t >>> 14) >>> 0) / 4294967296; }; }
const rnd = mulberry32(7), base = profiles["balanced (all equal)"];
let yWins = 0;
for (let k = 0; k < 1000; k++) {
  const w = base.map(v => v * (0.5 + rnd()));
  const sum = w.reduce((a, b) => a + b, 0), wn = w.map(v => v / sum);
  if (score(Y, wn) > score(X, wn)) yWins++;
}
console.log("balanced: Y still wins in", yWins, "of 1000 shaken weight sets");

আউটপুট:

exam-day result portal   X=2.95 Y=4.15 -> winner Y
small internal tool      X=4.00 Y=3.20 -> winner X
balanced (all equal)     X=3.40 Y=3.80 -> winner Y
balanced: Y still wins in 930 of 1000 shaken weight sets

একই দুটি নকশা, একই নম্বর — শুধু ওজন বদলাতেই বিজয়ী বদলে গেল। ফল প্রকাশের দিনের পোর্টালে reliability আর performance-এর ওজন বেশি (০.৩৫ ও ০.৩০), তাই Y জেতে (৪.১৫ বনাম ২.৯৫)। দশজনের দলের একটি ছোট অভ্যন্তরীণ tool-এ maintainability-ই প্রধান (০.৪৫), তাই সরল X জেতে (৪.০০ বনাম ৩.২০)। শেষ লাইনটি একটি sensitivity check: সমান ওজনের প্রতিটিকে ±৫০% পর্যন্ত এলোমেলো নাড়িয়েও ১০০০ বারের ৯৩০ বার Y জেতে — সিদ্ধান্তটি মোটামুটি মজবুত, তবে নিশ্চিত নয়। Weighted score সিদ্ধান্ত নেয় না; এটি দলের অগ্রাধিকারকে স্পষ্ট করে লিখতে বাধ্য করে। নম্বর আর ওজন দুটোই মানুষের বিচার, তাই কারণসহ লিখে রাখুন।

৯ · Verification, validation আর quality-র খরচ

Quality নিশ্চিত করার কাজকে দুই প্রশ্নে ভাগ করা হয়, যা Barry Boehm-এর পরিচিত বাক্যে ধরা আছে:

Verification

“Are we building the product right?” — আমরা কি spec ও নকশা অনুযায়ী ঠিকভাবে বানাচ্ছি? উদাহরণ: code review, unit test, static analysis. এটি Crosby-র conformance-এর কাছাকাছি।

Validation

“Are we building the right product?” — আমরা কি ঠিক জিনিসটিই বানাচ্ছি, যা ব্যবহারকারীর আসলে দরকার? উদাহরণ: acceptance test, ব্যবহারকারীর সাথে prototype যাচাই। এটি Juran-এর fitness for use-এর কাছাকাছি।

শুরুর ফলাফল পোর্টালের গল্পে ৮০ নম্বরে A দেখানো verification-এর ব্যর্থতা (spec মানা হয়নি); আর spec-এ ফল প্রকাশের দিনের ভিড়ের কথাই না থাকা validation-এর ব্যর্থতা (ঠিক জিনিস চাওয়া হয়নি)। V&V কীভাবে test-এর স্তরের সাথে মেলে, তা পর্ব ৪৫-এ (Testing-এর মৌলিক) দেখবেন; process-এর ভেতরে এর স্থান দেখাবে পরের পর্বের V-model (পর্ব ০৪)।

Cost of quality — quality-র দামের হিসাব

Quality-র খরচকে চার ভাগে দেখার প্রচলিত কাঠামো হলো PAF মডেল (prevention, appraisal, failure), যার শিকড় Armand Feigenbaum-এর মতো quality-বিশেষজ্ঞদের ১৯৫০-এর দশকের কাজে। Software-এ একে এভাবে পড়া যায়:

ভাগমানেSoftware-এ উদাহরণ
Prevention (প্রতিরোধ)defect যেন তৈরিই না হয়প্রশিক্ষণ, coding standard, requirement পরিষ্কার করা, ভালো tool ও template
Appraisal (যাচাই)defect খুঁজে বের করাcode review, test লেখা ও চালানো, static analysis, audit
Internal failurerelease-এর আগে পাওয়া defect-এর মাশুলকাজ আবার করা (rework), আবার test, release পিছিয়ে যাওয়া
External failureব্যবহারকারীর হাতে পৌঁছানো defect-এর মাশুলজরুরি hotfix, support-এর চাপ, টাকা ফেরত, চুক্তির জরিমানা, সুনামহানি

Cost of quality-এর মূল যুক্তি: প্রথম দুই ভাগে একটু বেশি খরচ করলে শেষ দুই ভাগের খরচ অনেক কমে। “পরে ধরা পড়া defect সারাতে বহুগুণ বেশি খরচ” — এই দাবি পুরোনো বইয়ে নির্দিষ্ট গুণিতক (যেমন ১০ বা ১০০ গুণ) দিয়ে লেখা থাকে। তবে পরবর্তী কিছু গবেষণা দেখিয়েছে, আধুনিক ছোট-ধাপের (iterative) প্রক্রিয়ায় এই বৃদ্ধি সব project-এ এত নাটকীয় নয়। তাই দিকটি মনে রাখুন (আগে ধরা সাধারণত সস্তা), কিন্তু নির্দিষ্ট গুণিতক মুখস্থ সংখ্যা হিসেবে চালাবেন না। Review কোন ভাগে পড়বে, তা নিয়েও লেখকভেদে মতভেদ আছে — অনেকে নকশার review-কে prevention ধরেন, কোডের review-কে appraisal.

আরও গভীরে: ISO/IEC 25010 দাঁড়িয়ে আছে SQuaRE সিরিজের ওপর — 25020/25023 সিরিজে quality মাপার পদ্ধতি আর metric, 25040-এ মূল্যায়নের প্রক্রিয়া। Reliability-র গাণিতিক দিক (failure intensity, reliability growth model) নিয়ে John Musa-র operational profile আর Software Reliability Engineering বই ক্লাসিক। Fault-error-failure-এর পূর্ণ শ্রেণিবিন্যাস পাবেন Avižienis, Laprie, Randell ও Landwehr-এর প্রবন্ধ “Basic Concepts and Taxonomy of Dependable and Secure Computing” (IEEE Transactions on Dependable and Secure Computing, ২০০৪)-এ। আর metric বাছাইয়ের একটি সুশৃঙ্খল পদ্ধতি হলো Victor Basili ও সহকর্মীদের Goal-Question-Metric (GQM).

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

  • ISO/IEC 25010-এর আটটি characteristic লিখুন। Functional suitability, performance efficiency, compatibility, usability, reliability, security, maintainability, portability (২০১১ সংস্করণ)।
  • Fault, error আর failure-এর পার্থক্য উদাহরণসহ। কোডের ভুল শর্ত fault; চলার সময় ভুল শাখা নেওয়া error; ফলাফলে ভুল গ্রেড দেখানো failure (কোন ধারার সংজ্ঞা, উল্লেখ করুন)।
  • MTBF ২০০০ ঘণ্টা, MTTR ১ ঘণ্টা — availability? ২০০০ / ২০০১ ≈ ৯৯.৯৫%, বছরে প্রায় ৪.৩৮ ঘণ্টা বন্ধ।
  • Release-এর আগে ৯০টি, পরে ১০টি defect — DRE? ৯০ / ১০০ = ৯০%.
  • Verification আর validation-এর পার্থক্য। “Building the product right” বনাম “building the right product” — spec মানা বনাম আসল প্রয়োজন মেটানো।

১০ · AI-এর যুগে software quality

AI এখন requirement-এর খসড়া, test, এমনকি পুরো module লিখে দেয়। এতে quality-র প্রশ্ন কমেনি, বরং বেড়েছে — কারণ AI এমন লেখা দেয় যা দেখতে নিখুঁত, কিন্তু যাচাই না করলে ভুল। Quality-র ক্ষেত্রে AI-এর কয়েকটি সাধারণ ভুল:

AI যা করেকেন বিপজ্জনকযাচাইয়ের উপায়
মানদণ্ডের সংস্করণ বা sub-characteristic বানিয়ে বলে (যেমন ২০১১-র তালিকায় ২০২৩-এর নাম মিশিয়ে দেয়)পরীক্ষা বা চুক্তিতে ভুল তথ্য যায়ISO-র অফিসিয়াল পাতা বা বিশ্বস্ত পাঠ্যবই মিলিয়ে নেওয়া
“৭০% project ব্যর্থ হয়”-এর মতো সূত্রহীন পরিসংখ্যান দেয়ভুল যুক্তিতে সিদ্ধান্ত হয়মূল সূত্র চাওয়া; না পেলে সংখ্যাটি বাদ দেওয়া
“দ্রুত”, “নিরাপদ”-এর মতো অস্পষ্ট requirement-ই সুন্দর ভাষায় আবার লেখেtest করা যায় না এমন requirement থেকে যায়প্রতিটি scenario-তে সংখ্যা, একক আর পরিবেশ আছে কি না দেখা
এমন test লেখে যা implementation-কেই নকল করে, বা কিছুই যাচাই করে নাcoverage বাড়ে, quality বাড়ে নাইচ্ছা করে কোডে ভুল ঢুকিয়ে দেখা test ফেল করে কি না (mutation testing)
Metric-এর সংখ্যা দেয়, কিন্তু মাপার নিয়ম বলে নাএক মাসের সংখ্যার সাথে আরেক মাসের তুলনা অর্থহীনকী গোনা হলো, কোন একক, কোথা থেকে — লিখে নেওয়া
প্রশ্নে আসল log, গ্রাহকের তথ্য বা password পেস্ট করলে তা বাইরে চলে যায়confidentiality-র লঙ্ঘনপেস্ট করার আগে তথ্য মুছে বা বানানো উদাহরণ দিয়ে বদলে নেওয়া

অস্পষ্ট requirement-কে quality scenario বানাতে AI ভালো সহকারী হতে পারে — যদি আপনি কাঠামো আর শর্ত বলে দেন, আর অনুমানগুলো আলাদা করে চিহ্নিত করতে বলেন:

আমি একটি কাল্পনিক বাসের অনলাইন টিকিট অ্যাপের requirement লিখছি। নিচের অস্পষ্ট চাওয়াগুলোকে ISO/IEC 25010:2011-এর characteristic আর sub-characteristic অনুযায়ী ভাগ করো, তারপর প্রতিটির জন্য একটি quality scenario লেখো — source, stimulus, environment, response আর মাপা যায় এমন response measure (সংখ্যা ও এককসহ)। চাওয়া: (১) ঈদের আগে ভিড়েও অ্যাপ দ্রুত চলবে, (২) নতুন ব্যবহারকারীর কাছে সহজ, (৩) পেমেন্ট নিরাপদ। শর্ত: যে সংখ্যা তুমি অনুমান করছ, সেটি "অনুমান" লিখে চিহ্নিত করো আর কোন তথ্য দিয়ে যাচাই করতে হবে বলো। ২০২৩ সংস্করণের নাম ব্যবহার করলে আলাদা করে উল্লেখ করো। কোনো পরিসংখ্যান দিলে সূত্র দাও, না জানলে দিও না।

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

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

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

প্র ০১Spec হুবহু মেনে চললেই কি software ভালো? Crosby আর Juran-এর মধ্যে কে ঠিক?

দুজনেই ঠিক, তবে ভিন্ন প্রশ্নের উত্তরে। Crosby-র “conformance to requirements” সংজ্ঞার শক্তি হলো এটি মাপা যায় — একটি চুক্তিতে বলা যায়, “এই ২০০টি requirement মিললে কাজ গ্রহণযোগ্য।” কারখানার উৎপাদনে, যেখানে নকশা আগে থেকে স্থির, এই দৃষ্টি খুব কার্যকর। কিন্তু software-এ requirement নিজেই প্রায়ই অসম্পূর্ণ বা ভুল, কারণ ব্যবহারকারী শুরুতে নিজের প্রয়োজন পুরোপুরি জানেন না।

Ariane 5-এর ঘটনা এর একটি চরম উদাহরণ। তদন্ত প্রতিবেদন অনুযায়ী, যে inertial reference software ব্যর্থ হয়েছিল, সেটি Ariane 4-এর উড্ডয়ন-পথের জন্য লেখা requirement মেনেই তৈরি এবং সেখানে বহু বছর সফলভাবে চলেছিল। সমস্যা হলো, নতুন রকেটের উড্ডয়ন-পথের তথ্য দিয়ে সেই requirement আর যাচাই করা হয়নি। কোডটি পুরোনো spec-এর সাথে “conform” করত, কিন্তু নতুন ব্যবহারের জন্য “fit” ছিল না।

উল্টো দিকে, শুধু fitness for use ধরে চললে চুক্তি, পরীক্ষা আর জবাবদিহি কঠিন হয়ে যায় — “ব্যবহারকারী খুশি নন” কথাটি কোনো test-এ ধরা যায় না। তাই পেশাদার চর্চায় দুটি একসাথে চলে: verification নিশ্চিত করে spec মানা হচ্ছে, validation নিশ্চিত করে spec নিজেই ঠিক। Agile পদ্ধতি (পর্ব ০৫) ছোট ছোট ধাপে ব্যবহারকারীকে কাজ দেখিয়ে validation-কে প্রক্রিয়ার ভেতরে নিয়ে আসে; ISO/IEC 25010-এর quality in use মডেলও একই কারণে product quality থেকে আলাদা রাখা হয়েছে।

আরেকটি সূক্ষ্ম কথা: spec-এ quality requirement (গতি, নিরাপত্তা, ব্যবহার-সহজতা) প্রায়ই অনুপস্থিত থাকে, কারণ মানুষ এগুলোকে “স্বাভাবিক” ধরে নেন। শুরুর ফলাফল পোর্টাল spec মেনেছিল, কিন্তু spec-এ ভিড়ের কথা ছিল না — তাই conformance-এর হিসাবে নিখুঁত, ব্যবহারে ব্যর্থ।

মূল উপলব্ধি: Conformance ছাড়া quality মাপা যায় না, আর fitness ছাড়া মাপা quality অর্থহীন। ভালো দল দুটিকেই প্রক্রিয়ার অংশ করে — spec লেখে মাপা যায় এমনভাবে, আর বারবার যাচাই করে spec নিজেই ঠিক আছে কি না।

প্র ০২দুটি system-এর availability একই, ৯৯.৯৫% — তারা কি সমান ভালো?

না, এবং এটি quality মাপার একটি গভীর শিক্ষা। উপরের হিসাবে payment-api (MTBF ২০০০ ঘণ্টা, MTTR ১ ঘণ্টা) আর chat-service (MTBF ২০০ ঘণ্টা, MTTR ৬ মিনিট) — দুটিরই availability ৯৯.৯৫%, বছরে প্রায় ৪.৩৮ ঘণ্টা বন্ধ। কিন্তু প্রথমটি বছরে ৪ বারের মতো, দ্বিতীয়টি ৪৪ বারের মতো পড়ে।

কোনটি ভালো, তা নির্ভর করে কাজের ধরনের ওপর। একটি chat অ্যাপে কয়েক মিনিটের বিভ্রাট অনেকে টেরই পান না — বার্তা একটু পরে যায়। কিন্তু একটি পেমেন্ট system-এ প্রতিটি failure মাঝপথে আটকে যাওয়া লেনদেন তৈরি করতে পারে, যার হিসাব মেলাতে মানুষের সময় লাগে। সেখানে failure-এর সংখ্যা কমানো (MTBF বাড়ানো) বেশি জরুরি। আবার একটি হাসপাতালের system-এ একটি লম্বা বিভ্রাট প্রাণঘাতী হতে পারে, তাই MTTR ছোট রাখাই সেখানে মূল লক্ষ্য।

আরও কয়েকটি ফাঁদ আছে। প্রথমত, availability-র গড় লুকিয়ে ফেলে কখন বিভ্রাট হলো — রাত ৩টার এক ঘণ্টা আর ফল প্রকাশের সকালের এক ঘণ্টা একই নয়। দ্বিতীয়ত, MTBF-কে প্রায়ই “এত দিন টিকবে” বলে ভুল পড়া হয়। একটি hard disk-এর MTBF দশ লাখ ঘণ্টা মানে এই নয় যে একটি disk ১১৪ বছর চলবে; এর অর্থ হলো বড় সংখ্যক disk-এর একটি সমষ্টিতে গড়ে কত ঘণ্টায় একটি নষ্ট হয়, আর সেটিও নির্দিষ্ট বয়স ও পরিবেশের সীমার ভেতরে। তৃতীয়ত, “system চালু” মানে কী — শুধু server সাড়া দিচ্ছে, নাকি ব্যবহারকারী আসলে লেনদেন শেষ করতে পারছেন? এই সংজ্ঞা না দিলে ৯৯.৯৫% সংখ্যাটি আসলে কিছুই বলে না।

এজন্যই আধুনিক অপারেশনে availability-র পাশাপাশি দেখা হয় failure-এর হার, পুনরুদ্ধারের সময় আর ব্যবহারকারীর দিক থেকে মাপা সাফল্যের হার (SLI-SLO, System Design কোর্সের observability পর্বে বিস্তারিত)।

মূল উপলব্ধি: একটি সারাংশ-সংখ্যা অনেক রকম বাস্তবতাকে একই রকম দেখায়। Quality মাপতে হলে সংখ্যাটি কী থেকে তৈরি আর কোন ব্যবহারকারীর কোন অভিজ্ঞতা সে ধরছে — তা খুলে দেখতে হয়।

প্র ০৩“Quality Is Free” — Crosby-র এই দাবি কি software-এ সত্যি? Quality-তে বিনিয়োগ কখন লাভজনক?

Crosby-র বইয়ের শিরোনামের অর্থ এই নয় যে quality-র জন্য কোনো খরচ নেই। তাঁর যুক্তি ছিল: ভুল করে আবার ঠিক করার খরচ (failure cost) এত বেশি যে, শুরু থেকেই ঠিকভাবে করার জন্য প্রতিরোধে যা খরচ হয়, তা নিজেকে ফেরত দিয়ে দেয়। Cost of quality-র PAF কাঠামো এই হিসাবটিকেই চার ভাগে দেখায়।

Software-এ external failure-এর খরচ কত বড় হতে পারে, তার একটি বহুল আলোচিত উদাহরণ Knight Capital (২০১২)। মার্কিন নিয়ন্ত্রক সংস্থা SEC-র পরবর্তী প্রতিবেদন অনুযায়ী, নতুন trading software deploy করার সময় একটি সার্ভারে নতুন কোড পৌঁছায়নি, আর পুরোনো, অব্যবহৃত একটি কোড-পথ পুনরায় সক্রিয় হয়ে যায়। এক ঘণ্টারও কম সময়ে প্রতিষ্ঠানটি কয়েকশো মিলিয়ন ডলার (সূত্রভেদে প্রায় ৪৪০ থেকে ৪৬০ মিলিয়ন) ক্ষতির মুখে পড়ে। এখানে deployment যাচাই, পুরোনো কোড সরানো আর স্বয়ংক্রিয় নিরাপত্তা-সুইচের মতো prevention ও appraisal-এর খরচ ক্ষতির তুলনায় নগণ্য হতো।

তবে উল্টো দিকও আছে। একটি সপ্তাহের জন্য বানানো প্রোটোটাইপে পূর্ণ test suite আর আনুষ্ঠানিক review-এর খরচ লাভের চেয়ে বেশি হতে পারে। quality-র লক্ষ্যমাত্রা তাই ঝুঁকির সাথে মিলিয়ে ঠিক করতে হয় — চিকিৎসা যন্ত্র বা বিমানের software-এ মানদণ্ড অনেক কঠোর (Therac-25 বিকিরণ যন্ত্রের ১৯৮০-র দশকের দুর্ঘটনাগুলো এর একটি ঐতিহাসিক কারণ), আর একটি অভ্যন্তরীণ রিপোর্টিং tool-এ তুলনামূলক শিথিল।

আরেকটি সতর্কতা: “পরে ধরা defect ১০০ গুণ দামি” ধরনের নির্দিষ্ট গুণিতক বহু বইয়ে উদ্ধৃত হলেও, তার মূল তথ্যভিত্তি পুরোনো ও সীমিত, আর পরবর্তী কিছু গবেষণা ছোট-ধাপের আধুনিক প্রক্রিয়ায় এত বড় বৃদ্ধি পায়নি। দিকটি সাধারণত সত্য, সংখ্যাটি প্রসঙ্গনির্ভর।

মূল উপলব্ধি: Quality বিনামূল্যে নয়, কিন্তু খারাপ quality প্রায়ই অনেক বেশি দামি। প্রশ্নটি “quality-তে খরচ করব কি না” নয়, বরং “কোন ঝুঁকির বিরুদ্ধে কোন ধাপে কত খরচ করলে মোট খরচ সবচেয়ে কম”।

প্র ০৪Metric-কে লক্ষ্য বানিয়ে দিলে কী হয়? Coverage ৯০% বা “শূন্য defect” টার্গেটের বিপদ কোথায়?

অর্থনীতিবিদ Charles Goodhart ১৯৭৫ সালে মুদ্রানীতি প্রসঙ্গে একটি পর্যবেক্ষণ দিয়েছিলেন, যা পরে (নৃবিজ্ঞানী Marilyn Strathern-এর ভাষায়) জনপ্রিয় রূপ পায়: “কোনো মাপকাঠি যখন লক্ষ্য হয়ে যায়, তখন সেটি আর ভালো মাপকাঠি থাকে না।” Software quality-তে এর উদাহরণ চারদিকে।

ধরুন ব্যবস্থাপনা নিয়ম করল, test coverage ৯০% না হলে কোড merge হবে না। দল দ্রুত শিখে যায়, এমন test লেখা যায় যা কোড চালায় কিন্তু কিছুই যাচাই করে না — assertion ছাড়া test. Coverage ৯০% হলো, quality একটুও বাড়ল না। একইভাবে “প্রতি release-এ defect ২০-র কম” লক্ষ্য দিলে অনেকে defect কম রিপোর্ট করতে শুরু করেন, বা কয়েকটি সমস্যাকে একটি টিকিটে জুড়ে দেন। লাইন-সংখ্যা দিয়ে উৎপাদনশীলতা মাপলে কোড অকারণে লম্বা হয়। প্রতিটি ক্ষেত্রে সংখ্যা ভালো হয়, আসল গুণ খারাপ হয়।

এর সমাধান metric ফেলে দেওয়া নয়, বরং সঠিকভাবে ব্যবহার। Victor Basili ও সহকর্মীদের Goal-Question-Metric (GQM) পদ্ধতি বলে: আগে লক্ষ্য (যেমন “ব্যবহারকারীর হাতে পৌঁছানো defect কমানো”), তারপর প্রশ্ন (“কোন ধরনের defect test এড়িয়ে যাচ্ছে?”), তারপরই metric (DRE, post-release defect density, defect-এর ধরন)। একাধিক metric একসাথে দেখা — যেমন coverage-এর পাশে mutation score (পর্ব ৫০) — একটিকে ঠকালে অন্যটিতে ধরা পড়ে। আর metric ব্যবহার করুন শেখার জন্য, ব্যক্তিকে শাস্তি দেওয়ার জন্য নয়; নইলে তথ্যই বিকৃত হয়ে যায়।

সংখ্যা ছাড়া চলাও বিপজ্জনক — তখন সিদ্ধান্ত হয় সবচেয়ে জোরে যিনি কথা বলেন তাঁর মতে। ভারসাম্য হলো সংখ্যাকে আলোচনার শুরু হিসেবে নেওয়া, শেষ হিসেবে নয়।

মূল উপলব্ধি: Metric হলো থার্মোমিটার, চিকিৎসা নয়। থার্মোমিটারকে ঠান্ডা পানিতে ডুবিয়ে জ্বর কমানো যায় না — আর metric-কে লক্ষ্য বানালে মানুষ ঠিক সেটাই করতে শুরু করে।

প্র ০৫Accessibility কি একটি বাড়তি “ভালো থাকলে ভালো” গুণ, নাকি quality-র মৌলিক অংশ?

ISO/IEC 25010:2011 accessibility-কে usability-র একটি sub-characteristic হিসেবে রেখেছে, আর ২০২৩ সংস্করণে (আমাদের জানামতে) এটি inclusivity ও user assistance নামে আরও বিস্তৃত হয়েছে। অর্থাৎ মানদণ্ডের দৃষ্টিতে এটি quality-র ভেতরের জিনিস, বাইরের অলংকার নয়।

ওয়েবের জন্য W3C-র WCAG-এর ইতিহাস দেখায় চিন্তাটি কীভাবে পরিপক্ব হয়েছে: WCAG 1.0 (১৯৯৯) ছিল মূলত HTML-কেন্দ্রিক নির্দেশনা; WCAG 2.0 (২০০৮) প্রযুক্তি-নিরপেক্ষ চারটি মূলনীতি (POUR) আর পরীক্ষা করা যায় এমন success criterion আনে; 2.1 (২০১৮) মোবাইল ও কম দৃষ্টিশক্তির জন্য নতুন শর্ত যোগ করে; 2.2 (২০২৩) আরও কিছু। বেশ কয়েকটি দেশে সরকারি বা জনসেবার ওয়েবসাইটের জন্য WCAG-ভিত্তিক শর্ত আইন বা নীতিতে আছে; ইউরোপীয় ইউনিয়নের European Accessibility Act বেসরকারি অনেক ডিজিটাল সেবাতেও শর্ত আরোপ করছে (দেশভেদে প্রয়োগ ও সময়সীমা আলাদা, প্রয়োজনে আইনি পরামর্শ নিন)।

প্রকৌশলের দিক থেকে যুক্তিটি আরও সরল। প্রথমত, accessibility শুরু থেকে নকশায় রাখলে খরচ কম; পরে যোগ করতে গেলে পুরো UI আবার লিখতে হতে পারে — cost of quality-র সেই পুরোনো কথা। দ্বিতীয়ত, “curb-cut effect”: ফুটপাতের ঢাল হুইলচেয়ারের জন্য বানানো হলেও উপকার পান সবাই। Video-র caption শব্দ বন্ধ রাখা বাসযাত্রীও ব্যবহার করেন; keyboard-বান্ধব form দ্রুত টাইপ করা কর্মীদের সময় বাঁচায়; স্পষ্ট রঙের পার্থক্য রোদের মধ্যে ফোন দেখতে সাহায্য করে। তৃতীয়ত, accessibility-র অনেক শর্ত মাপা যায় — রঙের contrast অনুপাত, keyboard দিয়ে প্রতিটি কাজ করা যায় কি না, ছবির বিকল্প লেখা আছে কি না — তাই এগুলো সহজেই quality scenario আর স্বয়ংক্রিয় test-এ পরিণত করা যায়।

পেশাগত নৈতিকতার দিকটি পর্ব ৬৪-এ আলোচনা হবে: যে software সমাজের একটি অংশকে বাদ দেয়, তা প্রযুক্তিগতভাবে যত নিখুঁতই হোক, তার quality in use সেই মানুষদের জন্য শূন্য।

মূল উপলব্ধি: Quality সবসময় “কার জন্য” প্রশ্নের সাথে বাঁধা। ব্যবহারকারীর সংজ্ঞা থেকে কাউকে বাদ দিলে quality-র হিসাবও ভুল হয়ে যায়।

অনুশীলন

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

  1. হিসাব — availability আর DRE: (ক) একটি কাল্পনিক অনলাইন বাজার অ্যাপের MTBF ৫০০ ঘণ্টা, MTTR ২ ঘণ্টা। Availability কত, আর বছরে (৮৭৬০ ঘণ্টা) প্রত্যাশিত বন্ধ সময় কত? (খ) একই MTBF রেখে availability অন্তত ৯৯.৯% করতে MTTR সর্বোচ্চ কত হতে পারে? (গ) অ্যাপের ২৫ KLOC-এর একটি release-এ আগে ১৮০টি আর পরে ৯০ দিনে ২০টি defect পাওয়া গেল। DRE আর post-release defect density কত?

    (ক) A = ৫০০ / (৫০০ + ২) = ৫০০ / ৫০২ ≈ ০.৯৯৬০২, অর্থাৎ প্রায় ৯৯.৬০%. বছরে বন্ধ = (১ − A) × ৮৭৬০ = ৮৭৬০ × ২ / ৫০২ ≈ ৩৪.৯০ ঘণ্টা।

    (খ) শর্ত: ৫০০ / (৫০০ + MTTR) ≥ ০.৯৯৯. সাজালে MTTR ≤ ৫০০ × (১ − ০.৯৯৯) / ০.৯৯৯ ≈ ০.৫০০৫ ঘণ্টা, অর্থাৎ প্রায় ৩০ মিনিট। মানে মেরামতের সময় চার ভাগের এক ভাগে নামাতে হবে — সাধারণত স্বয়ংক্রিয় পুনরুদ্ধার ছাড়া এটি কঠিন।

    (গ) DRE = ১৮০ / (১৮০ + ২০) = ১৮০ / ২০০ = ৯০%. Post-release defect density = ২০ / ২৫ = প্রতি KLOC-এ ০.৮টি (মোট ধরলে ২০০ / ২৫ = ৮টি)।

  2. নকশা ও সমালোচনা — scenario লিখুন: একটি কাল্পনিক বাসের অনলাইন টিকিট অ্যাপের SRS-এ লেখা আছে: “অ্যাপটি ঈদের আগেও দ্রুত ও নির্ভরযোগ্য থাকবে এবং সবার জন্য সহজ হবে।” বাক্যটির সমস্যাগুলো চিহ্নিত করুন, আর অন্তত তিনটি মাপা যায় এমন quality scenario লিখুন।

    সমস্যা: এক বাক্যে তিনটি ভিন্ন characteristic (performance efficiency, reliability, usability) মেশানো; “দ্রুত”, “নির্ভরযোগ্য”, “সহজ”-এর কোনো সংখ্যা বা একক নেই; “ঈদের আগে” কত দিন, কত ভিড় — বলা নেই; “সবার” মানে কারা — নতুন ব্যবহারকারী, বয়স্ক, screen reader ব্যবহারকারী? কীভাবে যাচাই হবে, তাও নেই।

    নমুনা scenario (সংখ্যাগুলো অনুমান, আগের বছরের তথ্য দিয়ে যাচাই করতে হবে):

    • Performance: ঈদের আগের ৭ দিনে, সেকেন্ডে ১০০০টি আসন-খোঁজার অনুরোধে, p95 response time ৫০০ ms-এর নিচে আর error ০.৫%-এর কম; load test দিয়ে যাচাই।
    • Reliability: ঐ ৭ দিনে availability অন্তত ৯৯.৯%; একটি সার্ভার বন্ধ হলে ২ মিনিটের মধ্যে বাকিরা ভার নেবে, আর কোনো নিশ্চিত হওয়া টিকিট হারাবে না।
    • Usability: প্রথমবারের ২০ জন ব্যবহারকারীর অন্তত ১৮ জন সাহায্য ছাড়া ৩ মিনিটে টিকিট কাটতে পারবেন; সব প্রধান পাতা WCAG 2.2 AA মানের contrast ও keyboard শর্ত পূরণ করবে।
  3. আউটপুট অনুমান করুন: নিচের JavaScript চালালে কী ছাপা হবে? কোনটি fault, আর কোন ইনপুটে failure হলো?
    function grade(m) { if (m > 80) return "A+"; if (m >= 70) return "A"; return "B-"; }
    const marks = [79, 80, 81, 100];
    let fails = 0;
    for (const m of marks) {
      const want = m >= 80 ? "A+" : m >= 70 ? "A" : "B-";
      if (grade(m) !== want) fails++;
    }
    console.log(marks.map(grade).join(" "), "| failures:", fails);

    আউটপুট:

    A A A+ A+ | failures: 1

    ৭৯ → A (ঠিক), ৮০ → A (spec বলে A+ — failure), ৮১ → A+, ১০০ → A+. Fault হলো m > 80 শর্ত, যেখানে হওয়ার কথা m >= 80. চারটি ইনপুটের মধ্যে শুধু ৮০-তে fault সক্রিয় হয়ে failure দেখা দিল — সীমানার ঠিক ওপরের মান দিয়ে test না করলে এটি ধরা পড়ত না।

  4. শ্রেণিবিন্যাস: একটি কাল্পনিক অনলাইন বাজার অ্যাপের ছয়টি অভিযোগ ISO/IEC 25010:2011-এর কোন characteristic (ও সম্ভব হলে sub-characteristic)-এ পড়ে? (১) “Cart-এ ১০টির বেশি পণ্য রাখলে মোট দাম ভুল দেখায়।” (২) “পুরোনো ফোনে অ্যাপ খুলতে ১৫ সেকেন্ড লাগে।” (৩) “অ্যাপটি অন্য একটি ব্যাংকিং অ্যাপ খোলা থাকলে crash করে।” (৪) “Screen reader বোতামের নাম পড়ে না।” (৫) “নতুন delivery চার্জের নিয়ম যোগ করতে দলের তিন সপ্তাহ লাগল, কারণ হিসাবটি ছয় জায়গায় কপি করা।” (৬) “অন্য ব্যবহারকারীর order history URL বদলে দেখা যায়।”
    • (১) Functional suitability → functional correctness.
    • (২) Performance efficiency → time behaviour (আর সম্ভবত resource utilization).
    • (৩) Compatibility → co-existence (একই পরিবেশে অন্য software-এর পাশে চলা)। Crash হওয়ায় reliability-ও জড়িত — একটি অভিযোগ একাধিক characteristic ছুঁতে পারে।
    • (৪) Usability → accessibility (২০২৩ সংস্করণে interaction capability → inclusivity, আমাদের জানামতে)।
    • (৫) Maintainability → modifiability ও modularity; ছয় জায়গায় কপি করা কোড একটি code smell (পর্ব ৪২)।
    • (৬) Security → confidentiality (অনুমতি যাচাইয়ের ঘাটতি)। এটি পাওয়া গেলে প্রতিষ্ঠানের দায়িত্বশীল প্রকাশ (responsible disclosure) পদ্ধতিতে জানাতে হয়।

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

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

ক্রমএকটি ভুল কীভাবে ব্যবহারকারীর চোখে পড়া ব্যর্থতায় পৌঁছায় — ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. 🧑‍💻 প্রোগ্রামার নিয়ম ভুল বোঝেন (মানুষের ভুল, mistake)
  2. 🐞 কোডে ভুল শর্ত থেকে যায় (fault)
  3. 🔢 নির্দিষ্ট একটি ইনপুটে ভুল শর্তটি সক্রিয় হয়
  4. ⚠️ Program ভুল অভ্যন্তরীণ অবস্থায় যায় (error)
  5. 📄 ব্যবহারকারী ভুল ফল দেখেন (failure)

একটি system-এর MTBF ৯৯ ঘণ্টা আর MTTR ১ ঘণ্টা। দীর্ঘ সময়ের গড় availability কত?

  • ৯৯.৯৯%
  • ৯৯%
  • ১%
  • ৯৮%

ISO/IEC 25010:2011-এ testability কোন characteristic-এর sub-characteristic?

  • Reliability
  • Functional suitability
  • Maintainability
  • Portability

একটি release-এ code review ও test মিলিয়ে ৯০টি defect ধরা পড়ল, আর release-এর পরে ব্যবহারকারীরা আরও ১০টি পেলেন। Defect removal efficiency (DRE) কত?

  • ৯০%
  • ১০%
  • ৯০০%
  • ১০০%

একটি function-এ m >= 80-এর জায়গায় m > 80 লেখা আছে, কিন্তু এখনো কেউ ঠিক ৮০ ইনপুট দেননি। Dependability-র পরিভাষায় এই অবস্থাকে কী বলে?

  • একটি failure ঘটেছে
  • একটি error ঘটেছে
  • Requirement-এর ভুল
  • একটি সুপ্ত (dormant) fault

নিচের কোনটি মাপা যায় এমন quality requirement?

  • পাতাটি অনেক দ্রুত লোড হবে
  • ২০০ জন একসাথে ব্যবহার করলে search-এর p95 response time ৪০০ ms বা কম
  • ব্যবহারকারীরা অ্যাপ নিয়ে খুশি থাকবেন
  • System-এ আধুনিক নিরাপত্তা থাকবে

Cost of quality-র PAF মডেলে release-এর আগে কোড review আর test চালানোর খরচ সাধারণত কোন ভাগে পড়ে?

  • Prevention
  • Internal failure
  • Appraisal
  • External failure

শব্দকোষ

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

মনে রাখুন

  1. Quality = spec মানা (conformance) + আসল কাজে লাগা (fitness for use); প্রথমটি verification, দ্বিতীয়টি validation দিয়ে যাচাই হয়।
  2. ISO/IEC 25010:2011-এর আটটি characteristic: functional suitability, performance efficiency, compatibility, usability, reliability, security, maintainability, portability; ২০২৩-এ safety যোগ আর কিছু নাম বদল।
  3. অস্পষ্ট চাওয়াকে quality scenario-তে রূপ দিন: source, stimulus, environment, response আর সংখ্যাসহ response measure.
  4. Fault → error → failure; fault ঘুমিয়ে থাকতে পারে। A = MTBF / (MTBF + MTTR), কিন্তু একই availability-র পেছনে ভিন্ন failure-হার থাকতে পারে।
  5. Defect density আর DRE প্রবণতা দেখায়, মানুষ তুলনার জন্য নয়; quality attribute-গুলোর মধ্যে trade-off আছে, আর quality-র খরচ = prevention + appraisal + failure.

পরের পর্বে: Quality কী, তা জানলেন। এবার দেখব software বানানোর কাজ কোন ধাপে, কোন ক্রমে সাজানো হয় — waterfall, V-model (যেখানে verification আর validation-এর জোড়া চোখে দেখা যায়), iterative, incremental আর spiral.

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

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