Dashboard می‌گوید هر ۹ مرحلهٔ چرخهٔ توسعه سبز است، چرخه فقط ۱۱ دقیقه طول کشیده و هیچ مورد حل‌نشده‌ای نداریم؛ آیا حلقهٔ کیفیت بسته شده است؟ نه. شاید Review انجام شده اما کسی نتیجه را نگرفته، Pipeline سبز است اما روی Build دیگری اجرا شده، Canary هشدار داده ولی Owner ندارد، یا Action ثبت شده اما هرگز Verification نشده است. «فعالیت انجام شد» با «بازخورد به تصمیم و اصلاح رسید» یکی نیست.

ادغام تست در چرخه حیات توسعه نرم‌افزار یعنی برای Risk و Decisionهای مهم، حلقه‌های بازخورد نسخه‌دار بسازیم: Event/Trigger → Quality Question → مناسب‌ترین Control در زودترین نقطهٔ توانمند → Observation/Evidence → Delivery/Acknowledgement → Action/Decision → Verification → Correction؛ سپس در نقطه‌ای دیرتر و نماینده‌تر، Blind spotهای کنترل زودهنگام را دوباره بسنجیم.

این راهنما تعریف عمومی تست نرم‌افزار، فهرست مراحل STLC یا دستور «تستر را زودتر به جلسه ببرید» نیست. واحد طراحی این صفحه Quality Feedback Loop است: کدام Signal، برای چه مصرف‌کننده‌ای، در چه زمان و با چه Evidence باید به Action برسد؟

پاسخ کوتاه: تست چگونه در SDLC ادغام می‌شود؟

ابتدا Flow تغییر و Decisionهای آن را رسم کنید، نه فقط نام فازها را. برای هر Risk، پرسش و Consequence دیررس‌بودن Signal را بنویسید. سپس زودترین نقطه‌ای را انتخاب کنید که آن پرسش را واقعاً می‌تواند پاسخ دهد؛ Control، Oracle، Subject و Evidence را تعریف کنید؛ Signal را به Owner و Decision authority برسانید؛ Action را Verify کنید؛ و در سطحی با Fidelity بیشتر دوباره Observation بگیرید. تست زودهنگام مکمل تست دیرتر است، نه جایگزین آن.

  • Earlier بدون قابلیت مشاهده، Oracle و مصرف‌کننده فقط Activity زودتر است.
  • Continuous به معنای اجرای همهٔ تست‌ها با هر Commit نیست؛ یعنی بازخورد مناسب در Event مناسب.
  • Shared quality مالکیت را حذف نمی‌کند؛ هر Loop به Response owner و Decision authority نیاز دارد.
  • Green stage وضعیت Loop نیست؛ Delivered، Acknowledged، Actioned و Verified باید جدا باشند.
  • Late feedback همیشه بد یا حذف‌شدنی نیست؛ بعضی رفتارها فقط در System، Canary یا Operation نماینده‌اند.

مرز این مقاله با Shift-left، Continuous Testing و Shift-right

موضوعپرسش اصلیمالک محتوایی
نقش تستر در فعالیت زودهنگامتستر چگونه Quality Question را به Interface و Evidence تبدیل کند؟نقش تستر در Shift-left
Feedback Lane در تحویلکدام Control در PR، Merge، Nightly یا Release اجرا شود؟Continuous Testing در CI/CD
Observation پس از استقرارCanary، Synthetic، Feature Flag و Rollback چگونه ایمن باشند؟Shift-right و Testing in Production
اتصال کل جریانSignal در نقاط SDLC چگونه تا Action، Verification و Correction بسته شود؟همین راهنما

چرا مدل «تست در انتها» ناکافی است؟

اگر تنها Control معنادار پس از تکمیل یک Batch بزرگ ظاهر شود، ابهام‌های Basis، تصمیم‌های Architecture، خطاهای Interface و نبود Testability مدت زیادی بدون Signal می‌مانند. هنگام Failure نیز Change set، Owner و Cause candidateها زیادند؛ Fix ممکن است Rework چند Artifact و Dependency بخواهد. مشکل اصلی «سمت راست نمودار» نیست؛ بزرگی فاصلهٔ Event تا Observation و Observation تا Action است.

بااین‌حال تشبیه‌های «فونداسیون ساختمان» را قانون اقتصادی نرم‌افزار ندانید. بعضی Findingهای دیرهنگام گران‌ترند، بعضی نه؛ Detection زودهنگام نیز هزینه، Skill، Environment و False signal دارد. Baseline محلی و نوع Failure مهم‌تر از ضریب‌های ثابت صد یا هزار برابر است.

چرا مدل «همه‌چیز را زودتر تست کن» هم ناکافی است؟

Control زودهنگام معمولاً سریع‌تر و ارزان‌تر است چون Subject کوچک و Dependency محدود دارد؛ ولی Fidelity کمتر و Blind spot بیشتری هم دارد. Review طراحی، رفتار Browser واقعی را مشاهده نمی‌کند؛ Component fake، Contract واقعی Vendor را ثابت نمی‌کند؛ Load model، رفتار Traffic ناشناخته را تضمین نمی‌کند. اگر همهٔ Evidence را چپ ببریم، خطر فقط از «کشف دیر» به «اطمینان زودرس» تبدیل می‌شود.

قاعدهٔ بهتر: earliest capable observation + later representative confirmation. هر پرسش را در اولین نقطه‌ای بسنجید که Control و Oracle معتبر دارد، سپس ادعا را در نقطه‌ای با Integration/Fidelity/Population مناسب دوباره محدود و تأیید کنید.

Quality Feedback Loop چیست؟

Feedback Loop یک زنجیرهٔ قابل ردیابی از رخداد تا تغییر تأییدشده است. گزارش یا Fail به‌تنهایی Loop نیست. اگر Signal تولید شود ولی به فرد توانمند نرسد، اگر Ack شود ولی Action نداشته باشد، یا Fix انجام شود ولی Verification نشود، Loop باز مانده است.

QualityFeedbackLoop
  loopId / version / supersedes / status
  flow / product / goal / outcome / risk
  decision / boundedQuestion / claimLimit
  trigger / eventAt
  earliestCapablePoint / laterRepresentativePoint
  control / immutableSubject / population
  environment / data / oracle
  observation / observedAt / evidence / unknowns
  emittedAt / receivedAt / acknowledgedAt / latencySLO
  responseOwner / action / dueAt / decisionAuthority
  verification / correction / affectedDecision
  blindSpots / retention / redaction
  costBaseline / missedFeedbackConsequence
  measure / guardrail / reviewDue

Stage Checklist با Feedback Loop فرق دارد

Stage checklistFeedback Loopخطر تفاوت
Requirement review انجام شدابهام R-۱۷ مشاهده، به Owner رسید، تصمیم شد و متن اصلاح‌شده Verify شدDone بدون اثر
Unit test سبز استClaim محدود روی Commit/Build مشخص با Evidence و Blind spotسبزی بی‌هویت
Security scan اجرا شدFinding معتبر Triage، مالک و SLA دارد و Fix/Exception Verify شدهArtifact انبارشده
Canary خوب استPopulation/Window/Guardrail معلوم و Decision/rollback authority پاسخ داده استنمونهٔ ناکافی
Retro برگزار شدفرضیهٔ Process به Experiment و نتیجهٔ سنجیده رسیدگفت‌وگوی بی‌تغییر

مرحله ۱: Flow و Decisionها را پیش از فازها رسم کنید

نام فازهای Analysis/Design/Code/Test/Deploy ممکن است واقعیت Flow را پنهان کند. از Event واقعی شروع کنید: ایده، تغییر Rule، Pull Request، Build، Deployment، Incident یا Feedback کاربر. سپس Decisionهایی را که باید گرفته شوند مشخص کنید: ادامهٔ Discovery، انتخاب Design، Merge، Promote، Rollout، Pause، Rollback، Fix یا Retire.

Flow: FLOW-CHECKOUT-21
Event: تغییر قرارداد idempotency در C21
Decision chain:
  clarify rule → accept design → merge → promote build
  → canary continue/pause → retain/adapt control
Decision authority: capability-based per decision
No claim: Flow map proves process quality or delivery success

مرحله ۲: Product Outcome و Risk را پین کنید

«بهبود کیفیت» برای انتخاب Loop کافی نیست. Product، Product Goal/Outcome، Risk registry snapshot و Test Strategy/Quality policy نسخه‌دار لازم‌اند. Risk باید Condition، consequence، affected subject و uncertainty داشته باشد. Loop برای Risk نام‌دار ساخته می‌شود؛ نه برای پرکردن همهٔ خانه‌های یک نمودار.

فیلدنمونهٔ ضعیفنمونهٔ قابل ممیزی
ProductفروشگاهSYN-CHECKOUT
Outcomeرضایت بیشترOUTCOME-۷: duplicate-effect rate در دامنهٔ مصنوعی
Riskممکن است خراب شودRISK-v10:R-IDEMP-۵ با condition/consequence
Policyکیفیت مهم استQUALITY-POL-v4 و decision threshold نسخه‌دار

مرحله ۳: Quality Question و Claim limit بسازید

Question باید آن‌قدر محدود باشد که Control بتواند Observation مرتبط بسازد. «آیا سیستم کیفیت دارد؟» پاسخ‌پذیر نیست. «آیا duplicate Callback با Event ID ثابت برای Attempt مشخص بیش از یک Ledger effect می‌سازد؟» Subject، رفتار و Observation را روشن می‌کند. Claim limit باید بنویسد PASS چه چیزهایی را نمی‌گوید.

question: duplicate Callback چه اثر قابل مشاهده‌ای می‌سازد؟
expected bounded claim:
  exactly one Ledger effect for tenant+attempt+event
claimLimit:
  - سایر modeهای event loss پوشش داده نشده‌اند
  - رفتار PSP واقعی یا Production نتیجه نمی‌شود
  - نبود باگ، کیفیت مالی و Release اثبات نمی‌شود

مرحله ۴: زودترین نقطهٔ توانمند را انتخاب کنید

زودترین نقطه با «اولین جلسه» یکی نیست. نقطه باید Subject قابل بررسی، Source، Oracle، Observer و امکان Action داشته باشد. ابهام Rule را شاید در Example review بتوان یافت؛ Race condition را شاید Model/Component harness؛ ناسازگاری واقعی Browser را فقط در محیط دارای Browser؛ و رفتار under-load را در Workload نماینده.

پرسشنقطهٔ زودهنگام توانمندچرا زودتر از آن نامعتبر است؟
ابهام Business ruleExample/requirement reviewبدون Basis هنوز Rule موضوع ندارد
Dependency cycleArchitecture model/static checkدر Idea خام ساختار وجود ندارد
Branch logicComponent/unit levelDesign prose Observation runtime نمی‌دهد
Contract compatibilityConsumer/provider contractUnit fake ممکن است Interface واقعی را مدل نکند
Cross-service behaviorIntegration environmentComponent isolation Interaction را حذف می‌کند
User/browser behaviorSystem/UI representative configAPI check rendering/input را نمی‌بیند
Operational emergent behaviorCanary/monitoring controlledPre-production population واقعی ندارد

مرحله ۵: نقطهٔ دیرتر و نماینده‌تر را عمداً نگه دارید

هر Control زودهنگام یک مدل و Blind spot دارد. برای Risk مهم، confirmation point را از قبل تعیین کنید: Contract check با Integration sample، Component performance با system load، Design accessibility review با Keyboard/AT observation، یا synthetic pre-production با Canary guardrail. نتیجهٔ دیرتر باید به Loop اولیه Link شود تا Model calibration ممکن باشد.

اگر late confirmation با early Evidence ناسازگار بود، فقط Product را متهم نکنید؛ Model، Test data، Oracle، Environment و Sampling را هم Candidate cause بدانید. هدف حذف بازخورد دیر نیست؛ کاهش Surprise و کوتاه‌کردن پاسخ است.

مرحله ۶: Control را با Question جفت کنید

Control می‌تواند Review، Example mapping، Static analysis، Unit/Component/Contract/System test، Simulation، Scan، Monitoring یا Manual observation باشد. محبوبیت ابزار یا عنوان فاز انتخاب را تعیین نمی‌کند. Control باید همان Failure mode را تحریک/مشاهده کند و هزینه/Latency آن با Consequence متناسب باشد.

برای خطاهای بدون اجرای کد، تست استاتیک و Review می‌تواند Signal زودهنگام بسازد؛ اما Dynamic behavior را اثبات نمی‌کند. Dynamic testing هم تناقض‌های Basis را لزوماً پیدا نمی‌کند. این دو مکمل‌اند.

مرحله ۷: Subject، Build، Environment و Data را ثابت کنید

Signal بدون Subject تغییرناپذیر قابل مصرف نیست. «آخرین Requirement»، «main»، «nightly»، «staging» و «دادهٔ تست» بعداً معنای دیگری دارند. Document/version، Repository/Commit، Build/digest، Deployment، Environment/config، Dependency، Feature flag، Data pack/seed/namespace و Time window را ثبت کنید.

ArtifactIdentity لازمDrift نمونه
Requirement/ExampleBASIS-v8:R-IDEMP-5متن بعد از Review اصلاح شده
Sourcecheckout-api/C21main جلو رفته
BuildBUILD-R21 + digestnightly بازساخته شده
DeploymentDEPLOY-R21 + config snapshotFeature flag تغییر کرده
DataDATA-SYN-21 + seed/namespaceState مشترک مصرف شده

مرحله ۸: Oracle و Evidence را جدا تعریف کنید

Oracle قاعدهٔ تفسیر Observation است؛ Evidence Artifact قابل بررسی همان Observation. «Review شد» Oracle نیست و Screenshot بی‌هویت Evidence کافی نیست. Source/Rule/Tolerance/Window/Method را بنویسید؛ سپس Evidence را با Loop/Subject/Build/Run/time/provenance/digest پیوند دهید.

در تحلیل Basis، پرسش‌های Scope، مثال، Constraint، Risk و Testability را می‌توان با راهنمای تحلیل نیازمندی‌ها در STLC عمیق کرد. خروجی Review باید Finding و Disposition داشته باشد، نه فقط حضور در جلسه.

Verification و Validation را در Loopهای متفاوت ببینید

Verification می‌پرسد Artifact/Implementation با مشخصات و قاعدهٔ انتخاب‌شده سازگار است؛ Validation می‌پرسد راه‌حل در Context مصرف، نیاز واقعی را برآورده می‌کند. این دو را به «قبل و بعد» یا «QA و کاربر» تقلیل ندهید. هر دو می‌توانند در نقاط مختلف و با شواهد متفاوت رخ دهند.

جداسازی دقیق مفاهیم و مثال‌های عملی در راهنمای Verification و Validation آمده است. یک Loop ممکن است Verification زودهنگام داشته باشد و برای Validation به Observation دیرتر نیاز داشته باشد.

مرحله ۹: زمان‌های بازخورد را به یک Timestamp تقلیل ندهید

زمانمعناLatency قابل محاسبه
eventAtرخداد یا تغییر موضوعتا Observation
observedAtControl Signal را مشاهده کردDetection latency
emittedAtEvidence/پیام منتشر شدProcessing latency
receivedAtکانال به Consumer رساندDelivery latency
acknowledgedAtOwner دریافت و مسئولیت پاسخ را پذیرفتAcknowledgement latency
actionedAtAction/Decision انجام شدResponse latency
verifiedAtاثر Action دوباره مشاهده شدClosure latency

Pipeline سه دقیقه‌ای ممکن است Signal را دو روز بدون Owner رها کند. Dashboard «Test duration» چنین Bottleneckی را نشان نمی‌دهد. SLO را بر اساس Consequence برای Event→Observation، Observation→Ack و Ack→Verified جدا کنید.

مرحله ۱۰: وضعیت Loop را از سبز و قرمز جدا کنید

Statusمعنای عملیاتیشرط انتقال
OBSERVEDSignal با Evidence ساخته شدmanifest معتبر
DELIVEREDبه Consumer نام‌دار رسیدdelivery receipt
ACKNOWLEDGEDResponse owner پاسخ را پذیرفتack + next step
ACTIONEDAction/Decision ثبت شدaction evidence
VERIFIEDاثر Action با Observation تازه سنجیده شدverification evidence
CORRECTEDSignal/تفسیر قبلی با سابقه اصلاح شدcorrection/supersession
UNKNOWNEvidence برای State معتبر کافی نیستexplicit unknown + owner

PASS/FAIL Outcome یک Control است؛ OBSERVED/VERIFIED وضعیت Loop. ممکن است Test PASS باشد اما Loop هنوز DELIVERED نشده، یا Finding درست ACTIONED شده ولی Verification باقی باشد.

مرحله ۱۱: Delivery، Acknowledgement و Action را ثبت کنید

ارسال پیام در Chat یا درج Comment به معنای دریافت نیست. Canonical record باید Consumer، Channel، receipt، Ack، Response owner، Next action و Due را نگه دارد. کانال بر اساس فوریت و نیاز تصمیم انتخاب می‌شود: Inline review برای Diff، alert برای Gate بحرانی، Issue برای پیگیری و Decision record برای Trade-off.

FeedbackPacket
  feedbackId / loopId / evidenceRef
  observedFact / boundedInterpretation / unknowns
  riskAndConsequence / urgency
  responseOwner / decisionAuthority
  requestedAction / alternatives / dueAt
  deliveredAt / acknowledgedAt / nextCheckAt
  correctionLink / accessClassification

مرحله ۱۲: «کیفیت مسئولیت همگانی است» را عملیاتی کنید

Whole-team approach یعنی قابلیت‌های مختلف در ساخت کیفیت و Evidence مشارکت کنند؛ نه اینکه هیچ‌کس پاسخ‌گو نباشد. نقش رسمی سازمان را از Capability لازم جدا کنید. کسی باید Question/Oracle را Review کند، کسی Environment را نگه دارد، کسی Failure را Triage کند و فردی با اختیار Business/Risk تصمیم بگیرد.

الگوی تصمیم‌گیری و مرز پاسخ‌گویی در رهبری تضمین کیفیت و مالکیت همگانی آمده است. عنوان Tester، QA Coach، Developer یا Product Owner به‌تنهایی اختیار یا شایستگی را ثابت نمی‌کند.

مرحله ۱۳: Action را بدون Verification نبندید

Mergeشدن Fix، تغییر Requirement، افزودن Test یا خاموش‌کردن Alert Closure نیست. Verification باید روی Subject جدید، با Oracle مناسب و Evidence تازه انجام شود. اگر Action پذیرش Risk یا Defer است، Verification می‌تواند بررسی Guardrail، Expiry و شرط بازگشت باشد؛ نه جعل PASS.

Closure باید بگوید کدام Claim اکنون پشتیبانی می‌شود، چه Unknownهایی باقی‌اند و کدام Decision تحت تأثیر است. Defect closed، Loop closed و Risk closed سه وضعیت مستقل‌اند.

مرحله ۱۴: Correction و Supersession را طراحی کنید

اگر Signal به Build اشتباه متعلق بود، Oracle ناقص بود یا Dashboard Population را غلط محاسبه کرد، Record را بی‌صدا ویرایش نکنید. Correction باید Previous statement، Reason، corrected interpretation، affected Decision، notification و timestamp را ثبت کند. نسخهٔ جدید Loop یا Control با supersedes به قبلی وصل شود.

Correction
  correctionId: CORR-LOOP-21-2
  corrects: FEEDBACK-21-7
  reason: Evidence manifest belonged to BUILD-R20
  oldInterpretation: control verified on BUILD-R21
  newInterpretation: UNKNOWN for BUILD-R21
  affectedDecisions: [CANARY-DR-21]
  notifiedAt / owner / supersedingEvidence

نقشهٔ Loop در Discovery و تحلیل

در Discovery، Subject می‌تواند Problem statement، Outcome hypothesis، Persona assumption یا Business rule باشد. Controls شامل Example review، counterexample، prototype observation، data feasibility و risk workshop‌اند. Signal باید به تغییر Basis، Experiment، Scope یا Decision برسد. تعداد جلسه و سند، Outcome نیست.

EventQuestion/ControlAction نمونهConfirmation دیرتر
Rule جدیدExample/counterexample reviewرفع ambiguitybehavior check روی Build
فرض Outcomeprototype/usability observationadapt flowbounded production experiment
وابستگی دادهschema/data feasibilitychange requirementintegration observation

نقشهٔ Loop در Design و Architecture

در Design، Quality attribute scenario و Failure mode را به Architecture decision پیوند دهید. Review، Model، threat analysis، capacity estimate، interface contract و testability probe می‌توانند Signal بسازند. «Architecture approved» نتیجه نیست؛ Finding/Trade-off/Decision/Assumption و confirmation point لازم است.

برای مثال، idempotency design با Event key و state transition Review می‌شود؛ Component harness کنترل زودهنگام است؛ Integration با duplicate/reordered event و Canary synthetic confirmation دیرتر. هر سطح Claim محدود خودش را دارد.

نقشهٔ Loop در Implementation و Review

Commit/PR Event است. Static check، Unit/Component test، peer review و security/lint scan Observation می‌سازند. Gate باید Finding را به خط/Rule/Subject وصل کند و Override/Exception را با authority و expiry ثبت کند. Comment حل‌شده بدون Diff و Re-run Evidence Loop را نمی‌بندد.

همهٔ Controlها نباید Blocker باشند. Severity، confidence، cost of delay و reversible بودن تغییر تعیین می‌کند Signal advisory، required-action یا hard gate باشد. Noise زیاد موجب bypass می‌شود؛ Silence هم Blind spot را پنهان می‌کند.

نقشهٔ Loop در Build و Integration

Build باید Subject دقیق، Dependency graph، Config و Artifact digest داشته باشد. Contract/Integration/Component/System Controls بر اساس Change impact و Risk در Lane مناسب اجرا می‌شوند. Fail Product را از ERROR محیط/Runner و INCONCLUSIVE جدا کنید. Rerun نباید Failure اول را حذف کند.

Pipeline سبز فقط Evidence همان Gateهاست. Missing/Skipped/Quarantined، foreign Build، stale Evidence و unavailable Environment باید در Aggregation دیده شوند. «همهٔ Testها در CI» به اندازهٔ «هیچ Test تا آخر» می‌تواند ضدبازخورد باشد.

نقشهٔ Loop در System و Non-functional Testing

برخی Quality characteristicها را می‌توان زودتر در Component سنجید، اما System behavior و Interactionهای واقعی‌تر به Environment، Workload و Configuration نماینده نیاز دارند. Performance، Security، Reliability، Accessibility و Compatibility یک «فاز آخر» مشترک نیستند؛ هرکدام Question، Model و observation pointهای چندگانه دارند.

Result باید به Baseline و Population خود محدود بماند. Load lab سلامت Production را تضمین نمی‌کند؛ accessibility scanner جای Keyboard/AT و user observation را نمی‌گیرد؛ DAST جای threat/design/static/control verification را نمی‌گیرد.

نقشهٔ Loop در Release و Deployment

Release decision یک جمع‌بندی چند Evidence و Unknown تحت Policy و Authority است. Deployment event نیز Loopهای جدا برای health، config، migration، guardrail و rollback دارد. Test team نباید صرفاً با PASS rate مجوز Business بدهد؛ Decision authority باید Residual risk و reversibility را بپذیرد.

Progressive delivery می‌تواند Blast radius و response time را محدود کند، اما Canary بدون Population، Window، Guardrail، Owner و Rollback readiness فقط انتشار کوچک‌تر است. Pre-release Evidence را به Deploy/Canary Subject دوباره نسبت دهید.

نقشهٔ Loop در Operation، Incident و Maintenance

Log/metric/trace، synthetic transaction، support signal، incident و user feedback می‌توانند Blind spotهای قبل از انتشار را آشکار کنند. Production را Test environment بی‌قید نکنید؛ safety budget، data minimization، tenant isolation، rate limit، consent و rollback لازم‌اند. Signal عملیاتی باید به Risk/Test Basis/Control قبلی بازگردد.

Maintenance فقط Fix کد نیست. Requirement، Test, Oracle، Monitoring rule، Runbook، Dashboard و Training ممکن است نیاز به Adapt/Retire داشته باشند. Incident count را Success metric تست ندانید؛ Exposure و detection opportunity تغییر می‌کند.

مدل توسعه مهم است، اما Loop به Agile محدود نیست

Contextشکل Loopکنترل ویژه
Sequential/contractualreview/approval baseline با feedback window کوتاه و tracechange control و formal evidence
Iterative/AgileExample→implementation→review→increment→outcomesmall batch و frequent adaptation
DevOps/continuous deliverycommit→pipeline→deploy→operate→learningautomation، observability و rollback
Regulated/safety-criticalindependent review، evidence chain و authority gateseparation/trace/retention مطابق Policy
Legacy/low deploy frequencycharacterization، change impact و representative rehearsallimited testability و recovery

Agile و DevOps ابزارهای ممکن برای کوتاه‌کردن و خودکارکردن Loopها هستند، نه پیش‌شرط ادغام تست. حتی یک Flow ترتیبی می‌تواند Review زودهنگام، Feedback SLA و confirmation دیرتر داشته باشد.

هزینهٔ Finding دیرهنگام را چگونه صادقانه بسنجیم؟

به‌جای ضریب ثابت، Cost of feedback را به اجزا بشکنید: Detection/triage، rework Artifactها، تغییر Interface، migration، retest، deploy/rollback، support، exposure و opportunity cost. سپس هزینهٔ Control زودهنگام، False signal و نگهداشت آن را نیز وارد کنید. Counterfactual را بنویسید: بدون این Loop چه می‌شد و این فرض چگونه آزموده می‌شود؟

feedbackEconomics
  eventPopulation / baselineWindow
  detectionLatency / responseLatency / closureLatency
  controlBuildAndRunCost / triageAndMaintenanceCost
  observedRework / avoidedWorkHypothesis
  exposureAndConsequence / uncertaintyRange
  guardrails: falseSignal, interruptionLoad, escapedBlindSpots
  claimLimit: association is not causal proof

مبنای رسمی و محدودیت تفسیر Shift-left

ISTQB CTFL v4.0.1 Shift-left را انجام زودتر تست تعریف می‌کند و مثال‌هایی مانند Review specification، نوشتن Test پیش از کد، CI/CD، Static analysis و شروع زودتر تست غیرعملکردی ارائه می‌دهد. همان متن صریحاً می‌گوید تست دیرتر نباید نادیده گرفته شود و Shift-left ممکن است Training، effort و cost اولیهٔ بیشتری بخواهد.

این منبع آموزشی نسخهٔ سازمان، نقش اجباری، ROI، Tool stack یا نتیجهٔ پروژهٔ شما را تعیین نمی‌کند. «expected to save effort/cost later» تضمین نیست؛ Baseline و Evidence محلی لازم است.

اصل Agile چه می‌گوید و چه نمی‌گوید؟

اصول رسمی Agile Manifesto به تحویل زود و پیوسته، همکاری روزانه، توجه مستمر به تعالی فنی، سادگی و بازاندیشی منظم اشاره می‌کنند. این اصول با Loop کوتاه سازگارند؛ اما نقش Tester/QA، فهرست ابزار، درصد Automation، Test Pyramid، Pipeline stage، «همهٔ تست‌ها با هر Commit» یا تضمین Quality/Speed را تجویز نمی‌کنند.

Automation در Loop: حمل Signal، نه جایگزین تصمیم

Automation می‌تواند Trigger، Control، Evidence collection، routing، SLA alert و re-check را سریع کند. اما اگر Question، Oracle، Subject یا Owner غلط باشد، فقط Signal غلط را سریع‌تر پخش می‌کند. هر اتوماسیون باید Failure mode و fallback داشته باشد: missed event، duplicate event، stale cache، foreign Build، delayed queue، unavailable owner و corrupted evidence.

  • Schema/identity/time/freshness را پیش از انتشار Signal validate کنید.
  • Dedup و idempotency را برای Event routing تعریف کنید.
  • ERROR/UNKNOWN را به PASS تبدیل نکنید.
  • Alert aggregation نباید رخداد بحرانی یا Population را پنهان کند.
  • Automated action پرخطر به Authority، guardrail، audit و rollback نیاز دارد.

AI در حلقهٔ بازخورد: Draft و Triage محدود

AI می‌تواند Findingها را خوشه‌بندی، Summary را Draft، Candidate owner را پیشنهاد یا تغییرهای مشابه را پیدا کند. Prompt/model/version، Source refs، transformation و Reviewer باید ثبت شوند. Summary احتمالی جای Evidence خام، Rule deterministic یا Decision authority را نمی‌گیرد.

AI نباید Observation را جعل، Unknown را پر، Cause را بدون Evidence تأیید، Finding را بی‌ردپا suppress، Risk را قبول یا Release را تصویب کند. دادهٔ حساس، Source access، retention و احتمال Prompt injection در Log/Issue نیز باید کنترل شوند.

آزمایش بازتولیدپذیر: ۹ مرحلهٔ سبز در برابر ۷۷ Finding

برای آزمون ادعا، Fixture کاملاً مصنوعی و آفلاین SYN-QUALITY-FEEDBACK-LOOP-01 با Node.js v24.۱۸.۰ ساخته شد. Dashboard سطحی فقط دید ۹ مرحله از ۹ مرحله سبز است، چرخه ۱۱ دقیقه طول کشیده و unresolved برابر صفر است؛ بنابراین PASS داد.

{
  "superficial": {
    "status": "PASS",
    "message": "9/9 lifecycle stages green; 11-minute cycle; zero unresolved"
  },
  "contractAudit": {
    "status": "HOLD",
    "findingCount": 77
  }
}

ممیزی دقیق ۷۷ Failure یافت: دوازده Flow/Product/Goal/Outcome/Risk/Strategy/Policy/Basis/Repository/Commit/Build/Deployment identity کهنه یا متحرک؛ Loop ID تکراری و version/supersedes/Decision/Question/Risk/Trigger ناقص؛ نبود earliest capable و later representative point؛ Control/Subject/Population/Environment/Data/Oracle/Observation/Evidence/Unknown؛ هفت زمان و Latency SLO؛ Owner/Action/Due/Authority/Verification/Correction/Claim limit/Blind spot/Retention/Redaction/Cost/Consequence/Measure/Guardrail/Review/status؛ Vocabulary و Stage map؛ و ۲۳ ادعای مطلق دربارهٔ فقط-زودهنگام، حذف تست دیرتر، انتقال همه‌چیز به ابتدا/CI، Full suite، هزینهٔ نمایی/هزاربرابر، پیشگیری/تضمین، مالکیت مبهم، نقش‌های ثابت، ابزار/Automation، Agile/DevOps و نتیجهٔ Release/Trust/Speed/Wellbeing.

خطای طراحی آزمایش و اصلاح صادقانهٔ آن

اجرای اول نشان داد Rule set فقط ۷۶ Finding دارد، نه عدد ۷۷ مورد انتظار. هیچ عددی منتشر نشد و Counter دستکاری نشد. یک نقص واقعی در Model پیدا شد: اعتبار وضعیت lifecycle خود Loop کنترل نمی‌شد. Rule مستقل OBSERVED/DELIVERED/ACKNOWLEDGED/ACTIONED/VERIFIED/CORRECTED/UNKNOWN افزوده و کل Fixture دوباره اجرا شد؛ سپس دقیقاً ۷۷ Finding حاصل شد.

نسخهٔ اصلاح‌شدهٔ آزمایش

نسخهٔ اصلاح‌شده FLOW-CHECKOUT-۲۱/SYN-CHECKOUT/PG-۱۴/OUTCOME-۷/RISK-v10/TEST-STRAT-v6/QUALITY-POL-v4/BASIS-v8/checkout-api/C21/BUILD-R21/DEPLOY-R21 را پین کرد. Loop idempotency نسخهٔ ۴، Decision/Question/Trigger، earliest component observation و later canary confirmation، Control/Subject/Population/Environment/Data/Oracle، Observation/Evidence/Unknown، زمان‌ها/SLO، Owner/Action/Authority/Verification/Correction، Blind spot/Retention/Cost/Measure/Guardrail و Review را کامل کرد.

Stage map سه نقطهٔ Discovery/Design، Component/Build و Canary/Operate را به همان Loop وصل کرد و همهٔ ادعاهای مطلق حذف شدند. Validator با صفر Finding وضعیت READY_FOR_LOOP_REVIEW داد. این نتیجه عمداً حقیقت یا کفایت Source/Oracle/Evidence، Coverage، رابطهٔ علّی، نبود باگ، کیفیت Product یا Release را ثابت نمی‌کند.

آزمایشگاه Checkout فارسی و ایرانی

دامنه یک Checkout کاملاً جدا از شبکه با Order، PaymentAttempt، PSP Stub جعلی، Callback، Ledger Stub و Reconciliation مصنوعی است. Loop روی timeout پیش/پس از fake commit، duplicate/late/reordered Callback، retry و Tenant isolation تمرکز دارد. همهٔ Entity، زمان، پول و Evidence ساختگی‌اند.

بعدقرارداد آزمایشگاهیمحدودیت
پولمقدار canonical ساختگی بر حسب IRR؛ تومان فقط view برچسب‌دارنه ادعای مالی/بانکی ایران
متن و رقمارقام فارسی/عربی/لاتین، Unicode normalization، RTL/LTR و stable Latin IDنه پوشش کامل locale
زمانISO instant/UTC؛ view در Asia/Tehran؛ جلالی فقط presentationنه قاعدهٔ حقوقی/تسویه
هویتTenant/Order/Attempt/Event/Ledger/Run/Build/Deploy/Evidence جدانه تراکنش یا مشتری واقعی

هیچ Network، Production، شرکت، کاربر، پرداخت، بانک، PSP، نام، موبایل، ایمیل، IP، حساب، PAN، CVV2، OTP، Cookie، Token، Credential، Screenshot یا Log واقعی وجود ندارد. این Lab توصیهٔ بانکی، مالی، حقوقی، مالیاتی، امنیتی، حریم خصوصی یا Compliance ایران نیست.

امنیت، حریم خصوصی و ایمنی Feedback

  • فقط دادهٔ لازم برای Decision را جمع کنید و Purpose/Access/Retention داشته باشید.
  • Secret/PII را پیش از Log، Trace، Screenshot، Issue و AI prompt حذف یا Redact کنید.
  • Feedback کانال عمومی نباید Vulnerability یا دادهٔ مشتری را افشا کند.
  • Webhook/Event را authenticate، deduplicate و replay-safe کنید.
  • Automated rollback/flag change به scope، rate limit، authority و recovery test نیاز دارد.
  • Correction و access audit را نگه دارید؛ حذف بی‌ردپا اعتماد را از بین می‌برد.

متریک‌های Loop با Countermetric

Measureتعریف لازمCountermetric
Detection latencyeventAt تا observedAt برای Population واجد شرایطFalse signal و Blind spot
Acknowledgement latencyreceivedAt تا ack با Owner واقعیinterrupt load و meaningless ack
Closure latencyEvent تا Verification، نه صرفاً Fix mergeReopen و verification quality
Loop completionVerified/Corrected بر eligible LoopهاUnknown، risk acceptance و premature close
Evidence freshnessEvidence معتبر برای Subject/Decision در SLArun/storage cost
Late-surprise rateFinding دیرتر که early model ندیده، با taxonomyFidelity و opportunity تفاوت دارد
Action effectivenessاثر Action در Verification بعدیcausal uncertainty و side effect
Feedback costbuild/run/review/triage/response/maintenanceconsequence و value of information

تعداد Test، Bug، Alert، Meeting یا Stage سبز را برای رتبه‌بندی فرد/تیم به‌کار نبرید. سرعت Loop بدون Signal quality تیم را به Ack صوری، حذف Unknown و بستن زودهنگام تشویق می‌کند.

Pilot سی‌روزهٔ Quality Feedback Loop

بازهکارخروجی/گیت
روز ۱–۵یک Flow/Decision/Risk پرمصرف و Baseline latency/cost را انتخاب کنیدLoop brief و non-goals
روز ۶–۱۰Question، Claim limit، earliest capable و later representative point را طراحی کنیدDesign review با Blind spot
روز ۱۱–۱۵Subject/Data/Oracle/Evidence و Event routing را پیاده کنیدآزمایش duplicate/delay/foreign-subject
روز ۱۶–۲۰Owner/SLO/Ack/Action/Authority/Verification را تمرین کنیدGame day و failure report
روز ۲۱–۲۵Correction، retention، redaction و recovery را آزمون کنیدCorrected record بدون silent edit
روز ۲۶–۳۰Latency/Signal quality/cost/guardrail و late surprise را Review کنیدKeep/Adapt/Stop/Scale decision

موفقیت Pilot یعنی یک Signal مرتبط، قابل ردیابی و به‌موقع به Action تأییدشده رسیده است؛ نه اینکه Pipeline، Dashboard یا تعداد Automation بیشتر شده باشد.

۳۰ ضدالگوی ادغام تست در SDLC

  • تست=فاز آخر؛ Shift-left=حذف تست آخر؛ همه‌چیز را در Discovery تست کن؛ Late feedback همیشه بی‌ارزش.
  • همهٔ Testها با هر Commit؛ Full suite=Continuous؛ Automation شاه‌کلید؛ Tool list به‌جای Loop design.
  • Stage سبز=Loop بسته؛ پیام ارسال شد=Ack؛ Fix merge=Verified؛ unresolved صفر با حذف Unknown.
  • latest/main/staging به‌جای Subject؛ Evidence خارجی/کهنه؛ Dashboard بدون cutoff؛ Screenshot بدون identity.
  • Question کلی؛ Control بی‌Risk؛ Oracle از همان SUT؛ Claim بدون limit؛ Blind spot پنهان.
  • فقط یک timestamp؛ Test duration به‌جای Event-to-action؛ SLO بدون consequence؛ Avg بدون distribution.
  • shared responsibility بدون Owner؛ QA Coach اجباری؛ Unit فقط Developer؛ E2E فقط QA؛ Authority از عنوان.
  • همهٔ Findingها hard gate؛ Retry و suppress برای سبزی؛ Quarantine بی‌Expiry؛ alert بدون runbook.
  • هزینهٔ ثابت صد/هزاربرابر؛ early always cheaper؛ ROI/quality/speed/trust/wellbeing تضمینی.
  • Agile/DevOps به‌عنوان پیش‌شرط؛ یک Loop برای همهٔ Contextها؛ Production observation غیرضروری.
  • PII/Secret در Artifact؛ webhook بی‌auth/dedup؛ Retention همیشگی؛ correction بی‌تاریخچه.
  • AI summary=Evidence؛ Cause احتمالی=واقعیت؛ Risk/Release خودکار؛ Ranking فرد با Bug/Test/Latency.

چک‌لیست ۲۴ نقطه‌ای ممیزی Loop

  • Flow/Product/Goal/Outcome/Risk/Strategy/Policy/Basis نسخه‌دار است.
  • Repository/Commit/Build/Deployment/Environment/Data تغییرناپذیرند.
  • Loop ID/version/supersedes و lifecycle status معتبر است.
  • Decision، bounded Question و Claim limit روشن‌اند.
  • Trigger و Consequence تأخیر/فقدان Signal ثبت شده‌اند.
  • Earliest capable point با Control/Oracle واقعی انتخاب شده است.
  • Later representative point و Blind spotهای کنترل زودهنگام معلوم‌اند.
  • Control با Failure mode و Risk همان پرسش متناسب است.
  • Subject، Population/Sample، Environment و Data contract ثبت شده‌اند.
  • Oracle Source/Rule/Method/Tolerance/Window دارد.
  • Observation و Evidence دارای provenance، identity، time و integrity‌اند.
  • Unknown و INCONCLUSIVE به PASS/سبز تبدیل نشده‌اند.
  • event/observed/emitted/received/ack/action/verified time جدا هستند.
  • SLO برای Detection/Ack/Response/Closure با Consequence تعریف شده است.
  • Delivery receipt و Acknowledgement واقعی ثبت می‌شوند.
  • Response owner، Action، Due و Decision authority نام‌دارند.
  • Action با Observation تازه Verify می‌شود.
  • Correction/Supersession و affected Decision پیوند دارند.
  • Automation failure، duplicate، delay و foreign Subject آزموده شده‌اند.
  • Access/Retention/Redaction و Secret/PII policy اعمال می‌شوند.
  • Cost baseline، Measure، Guardrail و causal limitation وجود دارند.
  • Stage activity به‌جای Loop outcome گزارش نمی‌شود.
  • Shared quality مالکیت و اختیار را حذف نکرده است.
  • هیچ تضمین Quality، absence of defects، ROI، Speed یا Release استنتاج نشده است.

جمع‌بندی: تست را پخش نکنید؛ Loop را ببندید

ادغام کیفیت در SDLC با افزودن QA به همهٔ جلسه‌ها، اجرای ابزار در همهٔ Stageها یا سبزکردن Dashboard حاصل نمی‌شود. از یک Decision و Risk شروع کنید، Question محدود بسازید، در زودترین نقطهٔ توانمند Signal بگیرید، Blind spot را در نقطهٔ نماینده‌تر بسنجید و مسیر Evidence تا Owner، Action، Verification و Correction را قابل ردیابی کنید.

هدف «حذف تست در انتها» نیست؛ هدف این است که هیچ Decision مهمی تا انتها بدون Signal مناسب نماند و هیچ Signal مهمی بدون پاسخ و یادگیری رها نشود. اگر فقط Stage را سبز کرده‌اید، هنوز باید Loop را پیدا کنید.

سوالات متداول تست در چرخه حیات توسعه نرم‌افزار

آیا Shift-left یعنی تست‌های انتهای چرخه را حذف کنیم؟

خیر. Shift-left یعنی پرسش را در زودترین نقطه‌ای مطرح کنیم که Control و Oracle معتبر دارد. System، acceptance، non-functional یا production observation ممکن است Fidelity و Population منحصربه‌فرد داشته باشند. کنترل زودهنگام باید با confirmation دیرترِ نماینده تکمیل شود.

آیا Continuous Testing یعنی اجرای همه تست‌ها با هر Commit؟

نه. Control باید بر اساس Risk، Change impact، سرعت، هزینه، Environment و Consequence در Trigger/Lane مناسب اجرا شود. Full suite در هر Commit می‌تواند Queue و Noise بسازد. Continuous یعنی Feedback مناسب و قابل مصرف در سراسر Flow، نه تکرار بی‌هدف همه‌چیز.

از کجا بفهمیم یک حلقه بازخورد واقعاً بسته شده است؟

Evidence به Subject درست متصل است، Consumer آن را دریافت کرده، Owner پاسخ را Ack کرده، Action/Decision با Authority و Due ثبت شده و اثر Action با Observation تازه Verify شده است. در صورت خطا نیز Correction/Supersession وجود دارد. ارسال Report یا Merge Fix به‌تنهایی Closure نیست.

آیا کشف زودتر باگ همیشه ارزان‌تر است؟

نه به‌صورت قانون قطعی. هزینه به نوع Failure، Artifactهای درگیر، Exposure، Rework، Migration و Context بستگی دارد؛ Control زودهنگام نیز Build/Training/False-signal/Maintenance cost دارد. هزینه‌ها و Counterfactual را با Baseline محلی و بازهٔ عدم قطعیت بسنجید، نه ضریب ثابت.

مسئول کیفیت در SDLC چه کسی است؟

کیفیت از مشارکت چند Capability ساخته می‌شود، اما هر Loop و Decision مالک روشن می‌خواهد. Question/Oracle reviewer، Control/Environment owner، Response owner و Decision authority ممکن است افراد متفاوتی باشند. «همه مسئول‌اند» نباید به «هیچ‌کس پاسخ‌گو نیست» تبدیل شود.

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