یک Dashboard می‌گوید ۴۸۰ باگ پیدا شده، Automation به ۸۷٪ رسیده، Pass rate برابر ۹۸٪ است، فقط دو Defect به Production فرار کرده و NPS نیز ۹ واحد بهتر شده است. آیا این اعداد ثابت می‌کنند «QA مؤثر بوده»؟ نه. هنوز نمی‌دانیم چه تصمیمی در حال ارزیابی است، مخرج‌ها چیست، کدام کاربران واقعاً در معرض Change بوده‌اند، داده از کجا آمده، چه عوامل دیگری Outcome را تغییر داده‌اند و سهم ادعاشدهٔ QA دقیقاً چیست.

این راهنما برای عبارت‌های «معیارهای اثربخشی تضمین کیفیت»، «KPI تیم QA»، «چگونه عملکرد QA را بسنجیم» و «QA Effectiveness» نوشته شده است. خروجی آن یک فهرست تازه از KPI نیست؛ یک روش برای ساختن ادعای محدود، قابل‌ابطال و قابل‌اصلاح دربارهٔ مشارکت یک مداخلهٔ کیفیت در یک Outcome مشترک است.

پاسخ کوتاه: اثربخشی QA یک عدد نیست

  • از Decision و Evaluation Question شروع کنید، نه از داده‌ای که در ابزار حاضر است.
  • QA را یک مداخله در سیستم مشترک Product/Engineering/Operations بدانید، نه علت یگانهٔ Outcome.
  • Contribution Claim، Mechanism، Assumption و Alternative explanation را پیش از تفسیر عدد بنویسید.
  • برای هر Metric، Definition، Unit، Numerator، Denominator، Population، Window، Source و Late-data policy ثبت کنید.
  • Outcome را با Guardrail، Driver، شواهد کیفی و Confidence بخوانید؛ افراد را با Bug count یا Pass rate رتبه‌بندی نکنید.
  • هر نتیجه باید Expiry، Decision، Owner و Correction path داشته باشد.

این مقاله دقیقاً مالک کدام مسئله است؟

راهنمای متریک‌های تست نرم‌افزار کاتالوگ ۱۲ Metric و فرمول‌های آن‌هاست؛ راهنمای Dashboard تست رابط تصمیم و Semantic layer را پوشش می‌دهد؛ و چرخهٔ بهبود مستمر QA Signal را به Experiment و Standard/Rollback وصل می‌کند. این مقاله فقط مالک Evaluation یک Contribution claim است: آیا مداخلهٔ مشخص کیفیت، در Context و Window مشخص، به Outcome مورد نظر کمک کرده و با چه Confidence؟

Performance، Efficiency و Effectiveness را یکی نگیرید

مفهومپرسشنمونهچیزی که ثابت نمی‌کند
Activityچه کاری انجام شد؟Review، Check، Sessionارزش یا Outcome
Outputچه خروجی ساخته شد؟Finding، Evidence، Scenarioاثر روی کاربر
Efficiencyمنابع چگونه به Output تبدیل شد؟Cost per reviewed changeدرستی Outcome
Performanceسیستم در چند بعد چگونه عمل کرد؟Flow، reliability، learningعلت تغییر
Effectivenessمداخله تا چه حد به Outcome هدف کمک کرد؟Contribution claim محدودAttribution قطعی یا امتیاز فرد

صفحهٔ رسمی ISO 9001 monitoring، measurement، analysis و evaluation عملکرد و اثربخشی Quality Management System را کنار هم می‌آورد. این مقاله از همین جدایی مفهومی استفاده می‌کند، اما Contractها و Loop زیر متن رسمی ISO، تفسیر ممیزی یا ادعای انطباق/گواهی نیستند.

چرا Bug Count می‌تواند رفتار را منحرف کند؟

وقتی Target به «تعداد باگ هر تستر» وصل شود، Split کردن یک مسئله، ثبت Duplicate، انتخاب سطحی‌ترین Scope و پرهیز از پیشگیری عقلانی می‌شود. کاهش Bug count نیز دو تفسیر متضاد دارد: Product بهتر شده یا Observation ضعیف‌تر. عدد بدون Severity، Impact، Opportunity، Detection source، Duplicate policy، Population و Window فقط Count است.

پس تعداد باگ را دور بیندازیم؟

خیر. Count برای workload، Triage capacity، Defect profile یا تغییر Mix مفید است، اگر Identity و طبقه‌بندی پایدار باشد. در مدیریت Defect Portfolio می‌توان آن را با Origin، Detection، Impact، Age، Reopen و Resolution دید. خطا زمانی رخ می‌دهد که همان Count بدون Theory و مقایسهٔ معتبر به «اثربخشی QA» یا عملکرد فرد ترجمه شود.

QA یک Actor منفرد نیست؛ یک مداخله در سیستم است

Outcome محصول از Product decision، Design، Code، Review، Test، Platform، Operations، Support، Market، Season، User mix و Chance اثر می‌گیرد. «QA» نیز ممکن است Review requirement، طراحی Testability، Exploratory testing، Automation، Risk facilitation یا Evidence governance باشد. ابتدا Intervention را نام ببرید؛ سپس Contribution آن را بسنجید. عبارت کلی «QA باعث کیفیت شد» نه Subject دارد و نه قابلیت ابطال.

QA Contribution Evaluation Loop

Goal / Decision
→ Evaluation Question
→ bounded Contribution Claim
→ Intervention + Exposure
→ Mechanism + Assumptions
→ Activity → Output → Intermediate Outcome → Outcome
→ Metric Contracts + Qualitative Evidence
→ Baseline / Comparison + Alternative Explanations
→ Confidence + Limitations
→ Decision / Action / Review
→ Correction / Supersession

این Loop سنتز عملی همین مقاله است، نه استاندارد رسمی ISO، DORA، SPACE یا Magenta Book. نام READY_FOR_CONTRIBUTION_REVIEW در آزمایش نیز فقط کامل‌بودن حداقل ساختار را نشان می‌دهد.

از تصمیم شروع کنید، نه از KPI موجود

DecisionEvaluation questionEvidence useAuthority
ادامه/اصلاح یک Reviewآیا Review ریسک X را زودتر قابل‌تصمیم کرد؟Mechanism و finding traceProcess owner
Scale یک Check laneآیا lane زمان بازخورد را با Guardrail ثابت کم کرد؟matched changes و attemptsEngineering owner
تخصیص ظرفیتکدام Constraint با Evidence محدود می‌شود؟flow و qualitative evidenceProduct/Engineering
Stopآیا Benefit مشاهده‌شده از Cost/Harm بیشتر است؟range و limitationsBudget/Risk owner

راهنمای رسمی DORA برای انتخاب Measurement Framework نیز «چرا اندازه می‌گیریم» و اینکه یافته قرار است کدام هدف و عمل را راهنمایی کند، مقدم می‌داند؛ همچنین Log-based data را ذاتاً objective نمی‌خواند. این guidance را در Context خودش به‌کار ببرید، نه به‌عنوان QA scorecard رسمی.

Evaluation Question Contract بنویسید

EvaluationQuestion
  id: EQ-042
  decision: CONTINUE | ADAPT | SCALE | STOP | INVESTIGATE
  evaluation_unit: service / change class / cohort
  intervention: risk workshop v3
  intended_outcome: earlier explicit money-state decisions
  population: checkout changes eligible in window
  window: 2026-07-01T00:00Z / 2026-07-28T00:00Z
  not_claimed: product quality, release safety, individual performance
  owner: quality-system owner
  decision_authority: engineering lead
  expiry: 2026-08-15T00:00Z

Question باید پیش از نگاه انتخابی به نمودار نوشته شود. اگر Question پس از دیدن یک جهش مطلوب عوض شود، HARKing و cherry-picking محتمل می‌شود؛ تغییر را version و دلیل آن را ثبت کنید.

Contribution را با Attribution قطعی اشتباه نگیرید

Attribution می‌پرسد Outcome به‌طور علّی و با چه اندازه‌ای از Intervention ناشی شده است. Contribution می‌پرسد آیا زنجیره‌ای معقول و شواهدمند وجود دارد که نشان دهد Intervention یکی از عوامل Outcome بوده، Assumptionها عمل کرده‌اند و Alternativeها بررسی شده‌اند. برای بسیاری از تغییرهای تیمی، Randomization یا Counterfactual قوی در دسترس نیست؛ پس زبان نتیجه باید با Design ارزیابی متناسب باشد.

Magenta Book Annex A دربارهٔ Contribution Analysis Theory of Change، اجرای Intervention، شواهد نتایج و Assumptionها و بررسی عوامل دیگر را لازم می‌داند و آن را اثبات قطعی اثر علّی معرفی نمی‌کند. این منبع برای ارزیابی سیاست دولتی است؛ الگوی زیر اقتباس مهندسی نرم‌افزار است، نه کاربرد رسمی همان روش یا ادعای Impact evaluation.

Contribution Claim را محدود و ابطال‌پذیر کنید

ContributionClaim
  claim: workshop v3 probably contributed to earlier explicit
         duplicate-callback decisions for eligible checkout changes
  mechanism: shared state model → earlier counterexample → recorded decision
  scope: build families b410–b417; synthetic/staging evidence
  population: 18 eligible changes; 15 exposed; 3 non-exposed
  expected_pattern: decision before implementation on exposed changes
  disconfirming_pattern: no exposure-response relation or mechanism trace
  alternatives: change mix, senior reviewer, PSP stub upgrade, seasonality
  claim_limit: no product-quality, financial-impact or individual claim
  expiry: 2026-08-15

Theory of Contribution را روی کاغذ بیاورید

زنجیرهنمونهEvidenceشکست ممکن
Inputوقت Reviewer و state modelversion/attendanceArtifact stale
ActivityRisk workshopsession recordمداخله اجرا نشد
OutputCounterexample و decisionstable IDsFinding بی‌Disposition
Intermediateتصمیم پیش از Codetimestamps/diffزمان نادرست
OutcomeRework تصمیمی کمترmatched change evidenceChange mix ساده‌تر
GuardrailReview delay/false alarmqueue/reject dataBenefit با Harm خنثی شد

یک Arrow به معنی Cause نیست. برای هر Arrow، Assumption، Evidence قابل‌انتظار و نشانهٔ خلاف بنویسید. اگر Activity ثبت شده اما Mechanism دیده نشده، Outcome هم‌زمان را به Intervention نسبت ندهید.

Intervention و Exposure را قابل‌شناسایی کنید

«تیم تست بهتر کار کرد» Intervention نیست. نسخهٔ Workshop، Facilitator role، Artifact، Eligible rule، شدت Exposure، Start/End و Deviation لازم است. Attendance باینری کافی نیست: یک Change ممکن است قبل از Baseline وارد شده، فقط بخشی از Review را دیده یا Action آن اجرا نشده باشد. Exposure واقعی را از Intended rollout جدا کنید.

Assumption Register نگه دارید

Assumptionچرا لازم است؟EvidenceTrigger بازبینی
Changeها قابل‌مقایسه‌اندBaseline معنی‌دار بماندimpact/class profilemix shift
Timestampها یک semantics دارندTime metric معتبر باشدevent dictionarytool migration
Reviewer ظرفیت و اختیار داردFinding به Decision برسدrole/action tracerole change
Instrumentation پایدار استTrend مصنوعی نشودschema/source versioncollector update

Activity، Output و Outcome را جدا ثبت کنید

تعداد Session، Scenario و Check به‌ترتیب Activity/Output هستند. آن‌ها ممکن است Mechanism را پشتیبانی کنند، اما Outcome کاربر یا کسب‌وکار نیستند. همچنین Outcome مثل Churn یا Revenue دور از کنترل QA و آلوده به عوامل بسیار است. Intermediate outcome نزدیک‌تر—مثلاً زمان تا تصمیم معتبر یا سهم Riskهای تصمیم‌دار—اغلب برای Contribution claim قابل‌دفاع‌تر است.

Context و Evaluation Unit را قفل کنید

Service، Product version، Change class، Environment، Channel، Geography، Cohort، Window و Policy version را ثبت کنید. Unit می‌تواند Change، Release، Incident، User journey یا Team system باشد. Unit را وسط تحلیل از Change به Person عوض نکنید؛ Aggregateهای سطح Service برای ارزیابی فرد معتبر نمی‌شوند.

Baseline به‌تنهایی Counterfactual نیست

Before/after ساده ممکن است Seasonality، Learning، Regression to mean، تغییر Traffic، Build size، Team composition یا Instrumentation را به Intervention نسبت دهد. اگر ممکن است matched changes، phased rollout، interrupted time series یا comparison group مناسب بسازید؛ اگر نه، محدودیت را صریح کنید و Confidence را پایین نگه دارید.

Alternative Explanation را جدی آزمایش کنید

  • Changeها کوچک‌تر یا کم‌ریسک‌تر شدند؟
  • Reviewer باتجربه یا Product owner عوض شد؟
  • Environment، Stub، Logging یا Defect taxonomy تغییر کرد؟
  • Traffic و User mix یا Support classification جابه‌جا شد؟
  • یک Incident یا Freeze رفتار تیم را موقتاً تغییر داد؟
  • Data collection بعد از Intervention کامل‌تر شد و Trend مصنوعی ساخت؟

Metric Contract: هر عدد باید شناسنامه داشته باشد

MetricContract
  id: M-EARLY-DECISION-v2
  question_ref: EQ-042
  role: primary_outcome
  definition: eligible changes with a risk decision before implementation
  unit: proportion
  numerator: eligible changes meeting timestamp and decision rules
  denominator: all eligible changes with closed observation window
  population: checkout change class C2/C3
  window: rolling 28d; UTC event time
  exclusions: emergency path, cancelled-before-review
  source: decision-log v4 + repository events v3
  join_key: immutable change_id
  late_data: reopen window for 7d, then correction
  missing: UNKNOWN; never zero
  threshold: directional hypothesis, no universal target
  owner: measurement steward
  not_claimed: causality, product quality, person performance

Numerator و Denominator را قبل از Ratio تعریف کنید

Escaped defect rate می‌تواند Defectهای Production بر همهٔ Defectها، همهٔ Releaseها، همهٔ Changes یا User sessions باشد و هر تعریف پاسخ متفاوتی دهد. Pass rate نیز با Retry، Skipped، Blocked و Not Run تغییر می‌کند. Ratio بدون Eligible population و closed-status policy قابلیت مقایسه ندارد.

Population، Cohort و Exposure را هم‌نام نکنید

مجموعهتعریفنمونه
Target populationهمهٔ واحدهای مورد ادعاChangeهای Checkout C2/C3
Eligibleواحدهای مطابق ruleغیراضطراری و قبل از cutoff
Assignedقرار بود Intervention بگیرندWorkshop دعوت‌شده
Exposedواقعاً Intervention را دریافت کردندArtifact و action trace موجود
Analyzedدر تحلیل نهایی وارد شدندwindow بسته و identity معتبر

Window و زمان رویداد را مشخص کنید

Calendar month، Sprint و rolling ۲۸ days یکسان نیستند. Event time را از ingestion time جدا کنید؛ timezone و cutoff را بنویسید. Incident یا Defect ممکن است هفته‌ها بعد کشف شود، پس Window کوتاه به‌طور ساختاری Escape را کم‌نمایی می‌کند. Cohort maturity و observation lag باید کنار Trend باشد.

Source، Lineage و Join را قابل ممیزی کنید

نام ابزار کافی نیست. Schema/version، query، event semantics، join key، deduplication، timezone، access date و transformation digest را نگه دارید. اگر Defect با متن آزاد به Change وصل شود، false match ممکن است. Dashboard فقط Presentation است؛ Source of record و Semantic layer را جدا کنید.

Late Data، Backfill و Correction Policy داشته باشید

CorrectionPolicy
  provisional_until: window_end + 7d
  late_event_action: reopen cohort and recompute
  materiality: denominator ±2% or decision class changes
  correction_record: old_value / new_value / cause / affected_decision
  notify: evaluation owner + decision authority
  supersede: never silently overwrite published conclusion

Data lake backfill، taxonomy repair و late Incident می‌توانند نتیجه را عوض کنند. نتیجهٔ بدون provisional/final status و revision history، Evidence قابل‌اتکا نیست.

Missing، Unknown و Not Applicable را صفر نکنید

نبود Support ticket ممکن است «مشکلی نبود»، «کانال قطع بود»، «کاربر گزارش نکرد» یا «join شکست» باشد. Unknown را یک وضعیت مستقل نگه دارید و نرخ Completeness را گزارش کنید. Imputation باید Method و Sensitivity analysis داشته باشد؛ در Decisionهای پرریسک، Unknown می‌تواند سبب INVESTIGATE شود.

Threshold را از Context و Action بسازید

هدف جهانی «Coverage ۸۰٪»، «Pass ۹۵٪» یا «Escape صفر» وجود ندارد. Threshold باید Basis، Risk، Direction، deadband، minimum sample، Action، Authority و expiry داشته باشد. Target عددی را مستقیماً به پاداش وصل نکنید؛ Metric وقتی Goal می‌شود، فشار برای gaming و پنهان‌سازی Unknown بالا می‌رود.

Distribution و Uncertainty را پشت Average پنهان نکنید

Median به‌تنهایی tail را پنهان می‌کند؛ Mean به outlier حساس است. Count کم با Ratio پرنوسان می‌شود. N، quantile، range/interval، segmentation و missingness را نشان دهید. Confidence interval آماری با Confidence در Contribution claim یکی نیست: اولی uncertainty تخمین Metric است، دومی قوت کل زنجیرهٔ Evidence و Alternativeها.

Triangulation: یک نمودار، یک واقعیت نیست

EvidenceنقشضعفCountercheck
System eventsرفتار و زمانInstrumentation errorsample trace
Artifact/Finding traceMechanismDocumentation biasdiff/decision
Survey/interviewتجربه و توضیحrecall/social desirabilityanonymous sample
Support/IncidentField signalreporting/classification biaschannel completeness
Matched comparisonAlternative checkresidual confoundingsensitivity analysis

Leading، Intermediate و Lagging signal را کنار هم بخوانید

Review exposure یک Leading/implementation signal است؛ decision-before-code یک Intermediate outcome؛ field harm یک Lagging outcome. Leading signal سریع اما دور از ارزش است؛ Lagging signal نزدیک‌تر به اثر اما دیر و پرعامل. زنجیرهٔ هر سه به‌همراه Mechanism از انتخاب یک «مهم‌ترین KPI» دفاع‌پذیرتر است.

Primary Outcome، Guardrail و Driver را تفکیک کنید

Roleپرسشنمونه
Primary outcomeتغییر مطلوب چیست؟تصمیم Risk پیش از implementation
Guardrailچه Harm نباید رشد کند؟Review queue age / false alarm
DriverMechanism اجرا شد؟Exposure و question→decision trace
Contextچه چیزی تفسیر را عوض می‌کند؟Change impact mix
Data qualityآیا Measurement معتبر است؟join/missing/late rate

Metric Portfolio کوچک اما متوازن بسازید

برای یک Question معمولاً یک Primary، یک یا دو Guardrail، یک یا دو Driver و یک Data-quality measure کافی است. ده‌ها KPI Attention را پخش و امکان انتخاب پسینی نمودار مطلوب را زیاد می‌کند. Portfolio باید درون یک Evaluation Packet باشد، نه Scorecard دائمی همه‌منظوره.

Coverage چه می‌گوید و چه نمی‌گوید؟

Code/branch/requirement/risk coverage تعریف‌های متفاوت دارند. Coverage می‌گوید Control به Subject تعریف‌شده رسیده؛ درستی Oracle، کیفیت Scenario، absence of defect یا Contribution به Outcome را ثابت نمی‌کند. افزایش Coverage همراه با Duplicate Check، Flaky result یا کم‌شدن exploratory observation می‌تواند Guardrail را بدتر کند.

Pass Rate و Automation Percentage را Outcome ننامید

Pass rate به Result vocabulary، Retry، Quarantine، Skipped/Blocked و Build scope حساس است. Automation percentage نیز Denominator مبهم و maintenance cost پنهان دارد. چرخهٔ Automated Check و Evidence برای Subject/Oracle/Attempt/Flaky/Quarantine/Retirement است؛ آن داده می‌تواند Driver یا system-health signal باشد، نه گواهی اثربخشی QA.

Escape Rate را «شکست QA» نخوانید

Field Defect یک Signal مشترک Design/Code/Review/Test/Release/Operation است. Detection opportunity، user exposure، severity/impact، cohort maturity، reporting channel و Origin باید مشخص باشد. کاهش Escape ممکن است از Release کمتر، Traffic کمتر یا classification change آمده باشد؛ افزایش آن نیز شاید از Observability و reporting بهتر ناشی شود.

Cycle Time و MTTR مرزهای دقیق می‌خواهند

Test cycle time از request تا evidence-ready است یا فقط execution؟ Queue و blocked time داخل آن است؟ MTTR گاهی acknowledge-to-fix، detect-to-restore یا report-to-verify است. Start/stop، population و percentile را ثبت کنید. کاهش زمان اگر Unknown، Reopen یا residual harm بالا رود اثربخشی نیست.

NPS، CSAT، Churn و Revenue Attribution دوردست‌اند

این Outcomeها به قیمت، محتوا، رقابت، Support، UX، season و cohort وابسته‌اند. هم‌زمانی افزایش NPS با Automation، Contribution را ثابت نمی‌کند. اگر استفاده می‌شوند، Mechanism، exposed cohort، survey response bias، lag و Alternativeها لازم است؛ معمولاً آن‌ها Context/lagging signal هستند، نه KPI تیم QA.

Cost of Quality و Automation ROI را Range گزارش کنید

Time saved اغلب با capacity آزادشده اشتباه می‌شود و avoided defect یک Counterfactual نامطمئن است. Cost باید build، maintenance، triage، environment، false results، data، training، retirement و opportunity را شامل کند. Benefit را با low/base/high assumption، period، discount و sensitivity بنویسید؛ ROI تضمین‌شده یا علت یگانهٔ Revenue ادعا نکنید.

DORA Metricها QA KPI نیستند

DORA Metricها delivery performance یک Application/Service را در Throughput و Instability توصیف می‌کنند. آن‌ها را به فرد یا QA department نسبت ندهید و بین Contextهای ناهمگون Blend نکنید. می‌توانند Outcome مشترک یا Context باشند، اگر Contribution mechanism و سایر عوامل روشن باشد؛ فهرست و حدودشان در مقالهٔ سرعت و کیفیت از Bet تا Evidence آمده است.

Metric برای یادگیری است، نه رتبه‌بندی افراد

SPACE در صفحهٔ رسمی Microsoft Research تأکید می‌کند Developer productivity با یک Metric یا Dimension و صرف Activity فردی سنجیده نمی‌شود. هرچند SPACE چارچوب QA Effectiveness نیست، این boundary برای جلوگیری از تبدیل Bug count، Case count، Automation rate یا Review comment به People score مستقیم مفید است.

ارزیابی عملکرد فرد به Role expectation، Context، نمونهٔ کار، collaboration، learning و شواهد کیفی خصوصی نیاز دارد. سیستم عملیاتی رهبری QA این مرز را پوشش می‌دهد. Contribution Evaluation باید تا حد ممکن Product/Service/Intervention-level و برای بهبود سیستم باشد.

Goodhart، Selection و Survivorship را پیش‌بینی کنید

  • وقتی Bug count Target شد، تعداد بالا می‌رود بدون اینکه Risk knowledge بهتر شود.
  • وقتی Pass rate Target شد، Check سخت حذف یا Quarantine می‌شود.
  • وقتی Cycle time Target شد، Work سخت Split یا از Population خارج می‌شود.
  • وقتی فقط Completed item تحلیل شد، Queue و abandoned work ناپدید می‌شود.
  • وقتی فقط Success story انتخاب شد، Failure mechanism دیده نمی‌شود.

Evaluation Packet را از Dashboard جدا کنید

بخش Packetحداقل محتوا
Identityevaluation/version/as-of/supersedes
Decisionquestion/options/authority/expiry
Claimintervention/mechanism/scope/limit
Implementationeligible/assigned/exposed/deviation
Evidencemetric contracts/qualitative/lineage
Comparisonbaseline/design/alternatives
Interpretationconfidence/limitations/unknowns
Closuredecision/action/review/correction

Confidence را با Basis گزارش کنید

Levelمعنا در این راهنمارفتار تصمیم
INSUFFICIENTContract/Exposure/Data ناقصاندازه‌گیری یا Design را اصلاح کن
LOWPattern هست؛ Alternativeهای مهم بازندPilot/Investigate
MODERATEMechanism و چند Evidence همسو؛ محدودیت باقی استContinue محدود با Guardrail
HIGHDesign قوی، نتایج پایدار و Alternativeها ضعیف شده‌اندScale با monitoring

این Scale یک convention داخلی مقاله است، نه Scale رسمی منابع. Level بدون Basis، uncertainty، dissent و expiry ممنوع است. HIGH نیز Certainty یا اثبات دائمی نیست.

Decision فقط PASS/FAIL نیست

  • CONTINUE: همان Scope و monitoring ادامه یابد.
  • ADAPT: Mechanism/Exposure/Instrumentation تغییر کند.
  • SCALE: با Cohort و Guardrail تازه گسترش یابد.
  • STOP: Benefit/Cost/Harm یا evidence خلاف است.
  • INVESTIGATE: Unknown یا Alternative برای تصمیم زیاد است.
  • CORRECT: نتیجهٔ پیشین با دادهٔ تازه supersede شود.

Contribution Evaluation جایگزین تصمیم آمادگی انتشار و پذیرش ریسک نیست. Evidence دربارهٔ اثر یک مداخله، مجوز Release یا اثبات «کیفیت کافی» نمی‌دهد.

Authority و استقلال نسبی Evaluation را روشن کنید

Roleاختیارنباید
Intervention ownerاجرا و Evidence implementationتنها Evaluator باشد
Measurement stewardContract/lineage/correctionThreshold کسب‌وکار را بسازد
EvaluatorAlternative/confidence/limitationsRisk را بپذیرد
Decision authorityContinue/Scale/Stop و منابعData را silently override کند
Risk/domain ownerHarm/exception decisionبه QA واگذار شود

Cadence را با Lag و هزینه تنظیم کنید

Data-quality و Driver ممکن است روزانه دیده شوند؛ Intermediate outcome پس از هر Cohort؛ Contribution review پس از mature شدن Window. گزارش ماهانه/فصلی نسخهٔ جهانی نیست. Cadence باید Decision deadline، observation lag، sample، correction window و cost of delay را لحاظ کند. Re-review trigger از تقویم مهم‌تر است: Scope، Policy، Instrumentation یا Context change.

امنیت، حریم خصوصی و Retention دادهٔ اندازه‌گیری

Metric warehouse ممکن است نام کارمند، ایمیل، Commit، Ticket، User event، Support text یا Incident detail را Join کند. Purpose limitation، minimization، aggregation، access control، retention، deletion، redaction، audit و incident response لازم است. دادهٔ Product/People را برای هدف تازه بدون Authority و بررسی مناسب reuse نکنید؛ این مقاله مشاورهٔ حقوقی یا Privacy compliance نیست.

AI در Measurement: دستیار، نه Evaluator خودمختار

AI می‌تواند Draft taxonomy، خوشه‌بندی پاسخ کیفی، anomaly candidate یا خلاصهٔ Evidence بسازد. اما prompt/model/version، source refs، sample review، false merge/split، زبان فارسی، dissent و redaction باید ثبت شوند. مدل نباید Performance فرد، causal attribution، Risk acceptance یا Scale/Stop را خودکار صادر کند. تغییر مدل نیز Instrumentation change است و Trend break می‌سازد.

آزمایش تکرارپذیر: پنج عدد سبز، Contribution نامعلوم

Fixture مصنوعی زیر ۴۸۰ باگ، Automation برابر ۸۷٪، Pass rate برابر ۹۸٪، دو Escape و رشد ۹ واحدی NPS دارد و QA_EFFECTIVE اعلام می‌کند. Auditor به عددها امتیاز نمی‌دهد؛ حداقل Contract ارزیابی Contribution را می‌سنجد.

{
  "evaluation_id": "",
  "context": {"product": "", "service": "checkout", "change": "", "window": "", "cohort": ""},
  "question": {"decision": "", "intended_outcome": "", "evaluation_unit": "", "not_claimed": []},
  "contribution": {"intervention": "", "mechanism": "", "assumptions": [], "implementation_evidence": [], "exposure": ""},
  "primary_metric": {"name": "escaped_defects", "definition": "", "unit": "", "numerator": "", "denominator": "", "population": "", "window": "", "source": "", "late_data": ""},
  "guardrails": [],
  "baseline": {"value": null, "source": "", "comparability": ""},
  "alternatives": [],
  "evidence_chain": {"activity": "", "output": "", "intermediate": "", "outcome": "", "qualitative": ""},
  "authorities": {"measure_owner": "", "evaluator": "", "decision_owner": ""},
  "confidence": {"level": "", "basis": []},
  "correction": {"trigger": "", "method": ""},
  "people_scoring": true,
  "dashboard": {"bugs_found": 480, "automation_percent": 87, "pass_percent": 98, "escaped_defects": 2, "nps_change": 9},
  "declared": "QA_EFFECTIVE"
}
const fs = require('node:fs');
const r = JSON.parse(fs.readFileSync(process.argv[2], 'utf8'));
const f = [];
const need = (ok, rule, path) => { if (!ok) f.push({ rule, path }); };

need(r.evaluation_id, 'IDENTITY', 'evaluation_id');
for (const key of ['product', 'change', 'window', 'cohort'])
  need(r.context?.[key], 'CONTEXT', `context.${key}`);
for (const key of ['decision', 'intended_outcome', 'evaluation_unit'])
  need(r.question?.[key], 'QUESTION', `question.${key}`);
need((r.question?.not_claimed || []).length, 'BOUNDARY', 'question.not_claimed');
for (const key of ['intervention', 'mechanism', 'exposure'])
  need(r.contribution?.[key], 'CONTRIBUTION', `contribution.${key}`);
need((r.contribution?.assumptions || []).length, 'ASSUMPTION', 'contribution.assumptions');
need((r.contribution?.implementation_evidence || []).length, 'IMPLEMENTATION', 'contribution.implementation_evidence');
for (const key of ['definition', 'unit', 'numerator', 'denominator', 'population', 'window', 'source', 'late_data'])
  need(r.primary_metric?.[key], 'METRIC_CONTRACT', `primary_metric.${key}`);
need((r.guardrails || []).length, 'GUARDRAIL', 'guardrails');
need(r.baseline?.value !== null, 'BASELINE', 'baseline.value');
need(r.baseline?.source, 'BASELINE', 'baseline.source');
need(r.baseline?.comparability, 'BASELINE', 'baseline.comparability');
need((r.alternatives || []).length, 'ALTERNATIVE', 'alternatives');
for (const key of ['activity', 'output', 'intermediate', 'outcome', 'qualitative'])
  need(r.evidence_chain?.[key], 'EVIDENCE_CHAIN', `evidence_chain.${key}`);
for (const key of ['measure_owner', 'evaluator', 'decision_owner'])
  need(r.authorities?.[key], 'AUTHORITY', `authorities.${key}`);
need(r.confidence?.level, 'CONFIDENCE', 'confidence.level');
need((r.confidence?.basis || []).length, 'CONFIDENCE', 'confidence.basis');
need(r.correction?.trigger, 'CORRECTION', 'correction.trigger');
need(r.correction?.method, 'CORRECTION', 'correction.method');
need(r.people_scoring === false, 'NO_PEOPLE_SCORING', 'people_scoring');

const computed = f.length ? 'HOLD' : 'READY_FOR_CONTRIBUTION_REVIEW';
if (r.declared !== computed) f.push({ rule: 'DECISION_MISMATCH', path: 'declared' });
console.log(JSON.stringify({ computed, count: f.length, findings: f }, null, 2));
process.exitCode = f.length ? 2 : 0;

نسخهٔ ناقص باید HOLD و ۴۱ Finding بدهد: Identity، چهار Context، چهار Question/boundary، پنج Contribution، هشت Metric field، Guardrail، سه Baseline، Alternative، پنج Evidence-chain field، سه Authority، دو Confidence، دو Correction، ممنوعیت People scoring و Decision mismatch. Dashboard سبز هیچ Finding را نمی‌بندد.

پس از ثبت Evaluation، Context/Cohort/Window، Question و not-claimed، Intervention/Mechanism/Assumption/Exposure، Metric contract و Guardrail، Baseline و Alternativeها، Evidence chain، Authority، Confidence، Correction و people_scoring=false، اجرای دوباره باید count=۰ و READY_FOR_CONTRIBUTION_REVIEW بدهد. این فقط کامل‌بودن ساختار را می‌سنجد؛ Truth داده، کیفیت Measurement، اثر علّی، Outcome محصول یا اثربخشی QA را ثابت نمی‌کند.

آزمایشگاه فارسی و آفلاین: Checkout ریالی ساختگی

یک Dataset کاملاً ساختگی از ۱۸ Change در Checkout بسازید: ۱۵ Change واقعاً Workshop v3 را دیده و سه Change مطابق rollout ندیده‌اند. Order، PaymentAttempt، PSP Stub، Callback، Ledger و Reconciliation فقط fake باشند. مبلغ canonical را IRR و تومان را presentation label بنویسید؛ رقم فارسی/عربی/لاتین، ی/ی، ک/ک، RTL/LTR، UTC event time، Asia/Tehran display و تاریخ جلالی صرفاً نمایشی را در Data-quality check بگنجانید.

برای هر Change، Impact/Class/Build، eligibility/assignment/exposure، Artifact/decision timestamps، duplicate/late/out-of-order Callback concern، Review output، rework event و missing/late flag ثبت کنید. هیچ شبکه، Production، شرکت/کاربر/سفارش/پرداخت واقعی، PSP/بانک واقعی، نام، موبایل، ایمیل، IP، account، PAN/CVV2/OTP، Cookie، Token، Credential، Log یا Screenshot استفاده نشود. این Lab ادعای بانکی، مالی، قانونی، امنیتی، آماری یا نمایندگی بازار ایران ندارد.

Pilot سی‌روزه برای QA Contribution Evaluation

روزکارخروجیStop/Review
۱–۳Decision/Question/claim limitEvaluation Charterبدون Authority توقف
۴–۷Theory/assumption/alternativesContribution mapMechanism نامشخص
۸–۱۲Contract و source auditMetric dictionaryJoin/missing نامعتبر
۱۳–۲۰یک Cohort کوچکexposure/evidence tracePrivacy/Harm/queue guardrail
۲۱–۲۵comparison/triangulationalternative analysisWindow نابالغ
۲۶–۲۸Confidence/DissentEvaluation PacketEvidence متعارض
۲۹–۳۰Decision/Correction triggerContinue/Adapt/Stopexpiry ثبت شود

Metric Review جلسهٔ دفاع از عدد نیست

جلسه را با Decision و Unknownها آغاز کنید. Measurement steward Contract و data quality را می‌گوید؛ Intervention owner implementation/deviation را؛ Evaluator Alternative و Confidence را؛ Domain/Risk owner Harm را. نتیجه، Action/Owner/Due/Verification است. نمودار بدون Action یا Decision فقط اطلاع‌رسانی است.

Anti-patternهای رایج

Anti-patternخطراصلاح
یک KPI طلاییتقلیل سیستم پیچیدهportfolio کوچک متوازن
Bug/Case per testerGaming و آسیب به همکاریsystem-level learning
Green=effectiveUnknown contextclaim/evidence/alternative
Before/after خامConfoundingcomparison و limitations
NPS=QA impactAttribution دوردستmechanism/cohort/lag
Missing=zeroخوش‌بینی مصنوعیUNKNOWN/completeness
Average-onlyTail و segment پنهانN/distribution/segment
Silent backfillDecision بدون ردپاcorrection/supersession
Dashboard=sourceLineage مبهمsource/semantic/view separation
AI causal verdictخطای غیرقابل‌پاسخ‌گوییhuman authority/evidence refs

چک‌لیست Owner پیش از انتشار نتیجه

  1. Evaluation ID/version/as-of و Decision مشخص است.
  2. Question، Unit، Population، Window و not-claimed ثبت شده‌اند.
  3. Intervention و Exposure واقعی قابل‌ردیابی‌اند.
  4. Mechanism و Assumptionها ابطال‌پذیرند.
  5. Activity/Output/Intermediate/Outcome جدا هستند.
  6. Primary، Guardrail، Driver و Data-quality role روشن است.
  7. هر Metric Contract کامل و versioned است.
  8. Missing، late data، backfill و Correction policy تعریف شده‌اند.
  9. Baseline/Comparison و comparability بررسی شده‌اند.
  10. Alternative explanation و Evidence خلاف جست‌وجو شده است.
  11. Quantitative و qualitative evidence triangulate شده‌اند.
  12. N/distribution/segment/uncertainty دیده می‌شود.
  13. People scoring و Outcome attribution افراطی حذف شده است.
  14. Privacy/access/retention/redaction کنترل شده‌اند.
  15. Confidence با Basis/limitations/dissent/expiry ثبت شده است.
  16. Decision/Action/Owner/Due/Verification مشخص است.
  17. نتیجهٔ قبلی silent overwrite نمی‌شود.

جمع‌بندی: از Scorecard به Claim قابل‌بررسی

معیار معنادار، عدد جذاب یا Benchmark جهانی نیست؛ اندازه‌ای است که برای یک Question و Decision تعریف شده، Population/Window/Source دارد، با Guardrail و Unknown خوانده می‌شود و در یک Contribution story محدود جای می‌گیرد. QA مؤثر را نمی‌توان از Bug count، Pass rate، Coverage، Automation percentage، Escape، NPS یا ROI به‌تنهایی نتیجه گرفت.

مسیر عملی این است: Intervention را دقیق کنید، Mechanism و Assumption را بنویسید، Metric Contract و Comparison بسازید، Alternativeها را امتحان کنید، Confidence و claim limit را اعلام کنید و تصمیم را با Correction path ببندید. آن‌گاه Measurement به ابزار یادگیری و تخصیص بهتر منابع تبدیل می‌شود—نه کارخانهٔ امتیاز و قطعیت کاذب.

پرسش‌های متداول درباره معیارهای اثربخشی QA

بهترین KPI برای سنجش اثربخشی QA چیست؟

KPI واحد و جهانی وجود ندارد. ابتدا Decision و Evaluation Question را تعریف کنید؛ سپس یک Primary outcome، Guardrail، Driver و Data-quality measure با Contract کامل انتخاب کنید. Metric مناسب برای Release risk، Process intervention و Customer outcome یکسان نیست.

آیا Defect Escape Rate مهم‌ترین معیار QA است؟

Escape یک Field signal مهم است، اما «شکست QA» یا مهم‌ترین معیار همهٔ Contextها نیست. تعریف Detection/Origin، Severity/Impact، Opportunity، release cohort، observation lag، reporting channel و denominator لازم است و تغییر آن باید همراه Change mix و سایر عوامل تفسیر شود.

آیا می‌توان Bug Count یا Test Case Count را برای ارزیابی تستر استفاده کرد؟

برای رتبه‌بندی یا پاداش مستقیم خیر؛ این Countها به Scope، Risk، ابزار، Split/Duplicate policy و فرصت Observation وابسته‌اند و رفتار را منحرف می‌کنند. برای capacity/profile می‌توان آن‌ها را در سطح سیستم و همراه Context استفاده کرد؛ ارزیابی فرد به Role expectation و شواهد چندبعدی نیاز دارد.

هر چند وقت یک‌بار معیارهای QA را مرور کنیم؟

فرکانس ثابت روزانه، Sprint، ماهانه یا فصلی پاسخ عمومی نیست. Cadence را با Decision deadline، data lag، cohort maturity، sample size، correction window و cost تنظیم کنید. Driver/Data quality ممکن است زودتر و Contribution claim پس از بسته‌شدن Window مرور شود.

چگونه ثابت کنیم QA باعث بهبود Outcome شده است؟

واژهٔ «ثابت» فقط با Design علّی متناسب و محدودیت‌های آن قابل‌دفاع است. در بسیاری از تیم‌ها بهتر است Contribution claim بسازید: Theory/Mechanism، اجرای واقعی، Evidence chain، comparison، Alternative explanation، triangulation و Confidence. نتیجه را به Scope/Window محدود و Attribution قطعی را ادعا نکنید.

دیدگاهتان را بنویسید