یک استارتاپ در ماه ۲۴ بار Deploy کرده، Change lead time را به پنج ساعت رسانده و هیچ باگ Critical ثبت نکرده است. مدیرعامل می‌گوید «تعادل سرعت و کیفیت عالی است». اما معلوم نیست تغییرها چه Outcomeی را آزموده‌اند، چه Harmهایی اصلاً پایش شده، چند کاربر در معرض بوده‌اند، نبودِ باگ نتیجهٔ کیفیت است یا کم‌گزارشی، Rollback واقعاً کار می‌کند یا چه بدهی‌ای پشت Waiverها جمع شده است.

این راهنما یک Startup Speed–Quality Decision Loop می‌سازد: Outcome Bet → Change Class → Harm Floor → Quality Envelope → Evidence Minimum → Small Batch → Rollout/Rollback → Outcome & Guardrails → Debt/Exception → Continue/Adapt/Stop/Repay. هدف یافتن یک نقطهٔ جادویی میان «سریع» و «با‌کیفیت» نیست؛ هدف تصمیمی محدود، قابل‌بازگشت و قابل‌اصلاح زیر ظرفیت واقعی استارتاپ است.

پاسخ کوتاه: سرعت و کیفیت در استارتاپ چگونه متعادل می‌شوند؟

ابتدا بگویید کدام Outcome یا عدم‌قطعیت باید تا چه تاریخی روشن شود. سپس Harmهای غیرقابل‌معامله، کیفیت لازم برای همان Change، دامنهٔ Exposure، Evidence پیش از Rollout، قابلیت بازگشت و معیار توقف را تعیین کنید. Change کوچک را به گروه محدود بدهید، Outcome و Guardrail را با مخرج و پنجرهٔ ثابت بخوانید و دربارهٔ ادامه، گسترش، اصلاح، توقف یا بازپرداخت بدهی تصمیم بگیرید. سرعت یعنی کوتاه‌شدن زمان تا Evidence قابل‌تصمیم، نه صرفاً افزایش Ticket یا Deploy.

  • Outcome Bet: تغییر برای چه گروهی، از چه سازوکاری، چه اثر قابل‌سنجشی را دنبال می‌کند.
  • Harm Floor: مرزهایی که صرفه‌جویی زمان مجوز عبور از آن‌ها نیست.
  • Quality Envelope: ویژگی‌های لازم و حدشان برای همین Scope و مرحله.
  • Evidence Minimum: کمترین بستهٔ شواهدی که تصمیم بعدی را پشتیبانی می‌کند، نه کمترین Test count.
  • Reversibility: توان توقف، محدودکردن Exposure و بازگرداندن State با زمان و مالک مشخص.
  • Debt/Exception: Gap آگاهانه با Risk، مالک، موعد، Trigger بازپرداخت و Expiry.

مسئله «سرعت در برابر کیفیت» نیست

سرعت و کیفیت دو سر یک خط واحد نیستند. Change بزرگ و دیرآزمون می‌تواند هم کند و هم پرخطر باشد؛ Batch کوچک، Test feedback سریع و Rollout محدود می‌تواند تحویل را هم سریع‌تر و هم کم‌ریسک‌تر کند. در مقابل، افزایش Deployment frequency بدون Outcome یا Guardrail فقط جابه‌جایی سریع‌تر Change است. تصمیم باید چندبعدی باشد، نه انتخاب شعار «کیفیت اول» یا «سرعت اول».

سه نوع سرعت را جدا اندازه بگیرید

نوع سرعتشروع و پایانچیزی که ثابت نمی‌کند
Build speedشروع کار تا Artifact قابل اجراارزش یا آمادگی انتشار
Delivery speedCommit تا استقرار موفق در دامنهٔ تعریف‌شدهOutcome کاربر یا کیفیت کل
Learning speedفرض تصمیم تا Evidence معتبر و Decision receiptدرستی قطعی فرضیه
Recovery speedتشخیص impairment تا بازیابی معیار خدمتنبود Harm باقی‌مانده

ممکن است Delivery سریع شود اما Learning کند بماند، چون Instrumentation دیر داده می‌دهد یا Decision owner در دسترس نیست. ممکن است Deploy کم باشد اما تیم با Prototype کم‌خطر سریع یاد بگیرد. Metric را با سؤال تصمیم هم‌راستا کنید.

کیفیت یک امتیاز واحد نیست

کیفیت برای Checkout مالی می‌تواند شامل درستی مبلغ، Idempotency، محرمانگی، دسترس‌پذیری، قابلیت بازیابی و فهم‌پذیری باشد؛ برای صفحهٔ آزمایشی محتوا ممکن است مجموعهٔ دیگری لازم باشد. Pass rate، Coverage یا صفر Critical جای این Claimها را نمی‌گیرد. برای هر Change، Quality attribute، subject، condition، measure، threshold، evidence و validity window را بنویسید.

مرحلهٔ استارتاپ Context است، نه مجوز کیفیت پایین

مرحلهعدم‌قطعیت غالبواحد یادگیری مناسبچیزی که حذف نمی‌شود
Discoveryمسئله/گروه/نیازمصاحبه، Prototype یا Concierge محدودرضایت، حریم خصوصی و منع آسیب
MVPارزش و استفادهٔ واقعیSlice قابل‌استفاده با Exposure محدوددرستی Claimهای حیاتی و Recovery
Early growthتکرارپذیری و ظرفیتCohort/rollout مرحله‌ایIsolation، Observability و support path
Scaleتاب‌آوری و هزینهٔ تغییرPlatform/control experimentSLO، dependency و rollback discipline
حوزهٔ پرپیامدایمنی/حقوق/پول/دادهآزمایش تخصصی و کنترل‌شدهالزام قابل‌اعمال و اختیار متخصص

جدول نسخهٔ عمومی Policy نیست. Domain، قرارداد، تعهد قانونی، نوع داده و گروه آسیب‌پذیر می‌تواند آستانه را تغییر دهد؛ برای امور حقوقی، ایمنی، امنیت یا مالی از صاحب‌صلاحیت همان حوزه استفاده کنید.

MVP یعنی کوچک‌ترین آزمون ارزش، نه محصول کم‌کیفیت

ویژگی کمتر، مسیر کوتاه‌تر یا عملیات دستی پشت صحنه می‌تواند Scope را کم کند؛ اما نمایش مبلغ غلط، از دست‌دادن داده، رضایت مبهم یا نبود راه برگشت «حداقل» نیست. MVP باید Claim محدود و مرز استفادهٔ روشن داشته باشد. اگر سؤال با Prototype یا Fake-door اخلاقی و شفاف پاسخ می‌گیرد، ساخت سامانهٔ کامل اتلاف ظرفیت است؛ اگر اقدام برگشت‌ناپذیر است، Prototype سطح Evidence لازم را تأمین نمی‌کند.

Harm Floor را پیش از فشار Deadline تعیین کنید

Harm floor فهرست ریسک‌هایی است که تیم نمی‌تواند صرفاً برای سرعت Waive کند یا فقط با KPI تجاری جبران‌شده بداند. نمونه‌ها می‌توانند افشای داده، انتقال پول نادرست، حذف برگشت‌ناپذیر، دورزدن کنترل دسترسی، فریب کاربر، آسیب ایمنی یا نقض الزام قابل‌اعمال باشند. دامنه و Authority هر مورد باید در Policy محلی تصویب شود؛ این مقاله فهرست حقوقی جهانی ارائه نمی‌کند.

harm_floor_id: HF-CHECKOUT-IRR-v3
scope: checkout-price-preview
valid_from: 2026-08-01
floors:
  - claim: charged_amount == confirmed_amount
    disposition_if_unmet: BLOCK
  - claim: no real charge in experiment cohort
    disposition_if_unmet: BLOCK
  - claim: deletion requires explicit confirmation and recovery path
    disposition_if_unmet: BLOCK
exceptions: none_for_this_scope
policy_owner_role: product-risk-owner
specialist_review: [security, privacy, finance-domain]

Quality Envelope را برای هر Bet بسازید

Attribute/ClaimScopeThresholdEvidenceValidity
CorrectnessIRR total برای rule-set v18exact reconciliationproperty + example matrixBuild b391
Reliabilityprice-preview endpointSLI/SLO مصوبtelemetry با مخرج eligiblerollout window
Recoverabilityflag و cache staterollback ≤ ۱۰ دقیقهrehearsal trace۳۰ روز
Usabilityنمایش IRR/تومانtask-specific criterionمطالعهٔ محدودUI revision 6
Security/privacycohort assignment/loggingpolicy-specificspecialist reviewconfig + vendor version

Envelope تعهد «محصول باکیفیت» نیست؛ مجموعه‌ای از Claimهای لازم برای یک تصمیم و Scope است. NFR و Measurement contract را می‌توانید در راهنمای تست غیرعملکردی عمیق‌تر طراحی کنید.

Outcome Bet را نسخه‌دار کنید

bet_id: BET-IRR-042
decision: expand | adapt | stop
population: SEG-RETURNING-BUYER
problem_evidence: EVID-PREVIEW-CONFUSION-v2
change: show canonical IRR and explicitly labelled toman
mechanism_hypothesis: reduce unit ambiguity before confirmation
primary_outcome: valid_confirmation_without_unit_correction
guardrails: [incorrect_amount, abandonment, support_contact, latency]
not_claimed: [revenue, loyalty, market_fit, causality_without_comparison]
decision_due: 2026-09-01
owner_role: product-owner
risk_owner_role: checkout-risk-owner

«ویژگی را سریع عرضه کنیم» Bet نیست. باید گروه، مسئله، Change، Mechanism، Outcome، Guardrail و چیزهایی که ادعا نمی‌شوند معلوم باشد. تصمیم نهایی می‌تواند فقط «آزمایش بعدی» باشد، نه Scale یا موفقیت محصول.

Change را بر اساس Risk و Reversibility طبقه‌بندی کنید

بعدپرسشاثر بر Evidence
Impactبدترین پیامد معتبر چیست؟شدت بیشتر، بررسی تخصصی‌تر
Exposureچه تعداد/گروه/داده و چه مدت؟دامنهٔ بیشتر، rollout محافظه‌کارتر
Detectabilityپیش از Harm با چه signalی می‌فهمیم؟Detection ضعیف، پیش‌تست/مهار بیشتر
Reversibilityکد و State در چه زمانی برمی‌گردد؟برگشت‌ناپذیر، آستانهٔ Evidence بالاتر
Noveltyکدام dependency/behavior ناشناخته است؟Probe و Observation window
CouplingFailure به کجا منتشر می‌شود؟Contract/integration/recovery evidence

ضرب چند امتیاز دلخواه، Risk را دقیق نمی‌کند. Profile و Unknownها را حفظ کنید؛ یک Harm شدید را میانگین نگیرید و با Deployment frequency جبران نکنید.

Reversible بودن را اثبات کنید

Feature flag به‌تنهایی Reversibility نیست. باید Code path قدیم هنوز سازگار، State migration قابل‌بازگشت یا forward-fix، cache قابل پاک‌سازی، event schema سازگار، flag دارای مالک و دسترسی، و rollback rehearsal دارای Evidence باشد. زمان بازیابی را از تشخیص تا بازگشت SLI بسنجید، نه فقط زمان اجرای دستور.

Evidence Minimum را از Change Class مشتق کنید

کلاس نمونهEvidence پیش از Exposureکنترل هنگام Exposureپس از Exposure
متن/ظاهر برگشت‌پذیرreview، render/accessibility smokeflag یا انتشار محدودerror/feedback guardrail
منطق محاسبهcontract/property/boundary/reconciliationshadow یا cohort + invariantledger/aggregate reconciliation
schema/state changecompatibility، migration rehearsal، backup testdual-read/write یا staged cutoverconsistency و recovery check
auth/privacy/securitythreat/claim review و specialist evidenceleast exposure + alert/killaccess/anomaly review
dependency جدیدcontract/fault/timeout/retry/circuit behaviortraffic cap و fallbacklatency/error/cost drift

این‌ها الگو هستند، نه Minimum جهانی. Test mix را بر سؤال، Fidelity، هزینه و Risk تنظیم کنید؛ نسبت جادویی Unit/Integration/E2E وجود ندارد. هرم تست در عمل طراحی سبد Evidence را پوشش می‌دهد.

Batch کوچک، Risk را حذف نمی‌کند اما قابل‌مدیریت‌تر می‌کند

تغییر کوچک‌تر فهم، Review، Test، Rollback و Attribution را آسان‌تر می‌کند؛ به شرطی که Slice مستقل و قابل‌مشاهده باشد. خردکردن مصنوعی یک تغییر اتمیک یا پنهان‌کردن dependency می‌تواند Risk را بیشتر کند. Batch را بر واحد Outcome/State/rollback ببرید، نه بر تعداد Story point.

WIP و Queue، دشمن پنهان سرعت یادگیری‌اند

اگر ده Bet هم‌زمان باز باشد، Context switching، انتظار Review، محیط، داده و تصمیم زیاد می‌شود. Lead time را به Process time و Queue time بشکنید. محدودکردن WIP ممکن است Utilization ظاهری را کم کند اما زمان تا Evidence را کوتاه کند. Idle محلی همیشه اتلاف نیست؛ ظرفیت Slack برای Review، Incident و بازپرداخت بدهی لازم است.

Automation یک Option است، نه پاسخ پیش‌فرض

Check پرتکرار، پایدار و دارای Oracle می‌تواند Feedback را سریع کند؛ Check کم‌ارزش یا Flaky، Queue و نگهداشت می‌سازد. هزینهٔ طراحی، اجرا، Triage، داده، محیط، تعمیر و Retirement را بسنجید. برای چرخهٔ کامل، راهنمای چرخهٔ Evidence اتوماسیون را ببینید.

Error Budget کجا مفید است؟

فصل رسمی Google SRE دربارهٔ پذیرش Risk توضیح می‌دهد که هدف Reliability صددرصدی عموماً هزینه و Opportunity cost دارد و Error budget از SLO برای هم‌راستاکردن سرعت Change و تحمل عدم‌قابلیت‌اعتماد استفاده می‌کند. اگر SLI، SLO، Window، data quality و policy ندارید، عدد «بودجه» فقط استعاره است.

error_budget = 1 - SLO_target
budget_consumed = bad_events / eligible_events
remaining = allowed_bad_events - observed_bad_events

Required:
  SLI semantics + eligible denominator
  SLO target + window
  exclusions and late-data policy
  burn thresholds
  allowed actions and authority
  reset/carry-over rule

این فرمول نمونه برای Reliability است. «Bad event» باید دقیق تعریف شود و دادهٔ تأخیردار اصلاح شود. باقی‌بودن Error budget به‌تنهایی مجوز Release، پذیرش Privacy/Security harm یا اثبات ارزش محصول نیست.

Error Budget را به بودجهٔ همهٔ کیفیت‌ها تبدیل نکنید

قابلیت دسترس‌پذیری می‌تواند در Window مشخص Budget داشته باشد؛ افشای داده یا مبلغ نادرست را نمی‌توان صرفاً با چند دقیقه uptime بیشتر «جبران» کرد. برای هر Quality attribute semantics مستقل لازم است. Harm floor قبل از Budget اعمال می‌شود و Risk acceptance به Authority تعیین‌شده نیاز دارد.

Policy واکنش به Burn را پیشاپیش بنویسید

وضعیت نمونهاقدام مجازاستثنا
Budget سالم + Guardrail سالمRollout طبق PlanHarm floor همچنان مقدم است
Burn سریعPause، reduce exposure یا rollbackرفع علت impairment طبق Authority
Budget تمام‌شدهکاهش Change risk و تمرکز ReliabilitySecurity/emergency fix با plan جدا
SLI نامعتبر/داده دیرHOLD یا تصمیم محافظه‌کارانهWaiver زمان‌دار با Unknown روشن
Outcome بی‌اثر و Guardrail سالمSTOP/ADAPT؛ نه Scale خودکارWindow ناکافی با دلیل تمدید شود

این جدول Policy پیشنهادی است، نه نسخهٔ Google. تیم باید Threshold، اختیار و Exception خود را تصویب کند. صفحهٔ بهترین‌روش‌های سرویس Google SRE نمونهٔ توقف Change هنگام مصرف Budget را شرح می‌دهد، اما سازمان شما باید آن را با Context خود Tailor کند.

DORA چه چیزی را می‌سنجد؟

راهنمای رسمی و به‌روز سنجه‌های عملکرد تحویل نرم‌افزار DORA پنج Metric را در دو خانواده می‌آورد: Throughput شامل Change lead time، Deployment frequency و Failed deployment recovery time؛ Instability شامل Change fail rate و Deployment rework rate. DORA نیز هشدار می‌دهد Context سرویس‌ها را مخلوط نکنید، یک Metric را هدف مطلق نسازید و از چند سنجهٔ دارای تنش سالم استفاده کنید.

DORA Metric برابر Product Quality نیست

این پنج سنجه عملکرد فرایند تحویل را توصیف می‌کنند. Deployment سریع نمی‌گوید تیم مسئلهٔ درست را حل کرده؛ Change fail rate پایین، Harm کشف‌نشده یا Defect پیش از Deploy را نفی نمی‌کند؛ Recovery سریع خسارت برگشت‌ناپذیر را پاک نمی‌کند. Outcome، Harm، SLO، Debt و Evidence quality را جدا کنار آن‌ها بگذارید.

Metric Contract بنویسید

metric_id: CHANGE-LEAD-CHECKOUT-v2
question: is commit-to-successful-production delivery getting shorter?
start_event: first_commit_on_change
end_event: successful_production_deploy
unit: change
population: checkout changes merged to main
window: rolling_28d
statistic: median_and_p85
excluded: [revert_only, test_fixture_only]
late_event_policy: recompute_7d
source: git_and_deploy_events_v4
owner_role: delivery-analytics-owner
not_claimed: [customer_value, product_quality, developer_productivity]

بدون شروع/پایان، Population، percentile، exclusion و source، «Lead time پنج ساعت» قابل مقایسه نیست. Average می‌تواند Tail را پنهان کند؛ Median و percentile هم بدون توزیع و Sample count کافی نیستند.

سرعت یادگیری را با Outcome Evidence بسنجید

Metricمخرج/قراردادCountermetric
Time to decision evidenceBet approved تا Evidence window completeنرخ Decision با دادهٔ ناکافی
Valid learning rateDecisionهای reviewed / Betهای سررسیدشدهOutcome تکرارنشدنی یا Correction rate
Exposure efficiencyEvidence کافی / کاربر-زمان در معرضHarm و sample bias
Stop disciplineBet بی‌اثر متوقف / Bet بی‌اثرتوقف زودهنگام false-negative
Debt repaymentGap verified-closed / Gap سررسیدشدهFeature delay و replacement debt

تعداد Experiment یا Decision را KPI پاداش ندهید؛ تیم می‌تواند Bet را خرد یا Evidence ضعیف را «یادگیری» اعلام کند. Outcome quality و Correction را کنار Throughput نگه دارید.

Guardrail را پیش از دیدن نتیجه ثابت کنید

Guardrail باید تعریف، Population، Window، Threshold، data delay، stop action و owner داشته باشد. اگر Primary outcome بهتر شد اما مبلغ نادرست، latency، شکایت پشتیبانی یا نرخ برگشت بالا رفت، تصمیم Scale خودکار نیست. تغییر پس از دیدن داده باید به‌عنوان تحلیل اکتشافی ثبت و در دور تازه تأیید شود.

Rollout Contract را قابل اجرا کنید

rollout_id: RO-BET-IRR-042
artifact: b391
config: price-unit-v6
cohort_rule: stable_hash(account_synthetic_id) % 100 < 5
initial_exposure: 5_percent
excluded: [high_risk_accounts, unsupported_locale]
observation_window: 24h
promotion_requires:
  - harm_floor == pass
  - guardrails == within_threshold
  - primary_measure_data_quality == valid
stop:
  - incorrect_amount > 0
  - p95_latency > threshold_for_10m
rollback_owner_role: oncall-release-owner
rollback_evidence: rehearsal/ro-042/v1
max_rollback_time: 10m

Cohort باید Stable و قابل توضیح باشد؛ Exposure واقعی را از assignment جدا کنید. Exclusion می‌تواند Bias بسازد و باید در Claim نتیجه دیده شود. Rollout محدود Evidence همان Population است، نه مجوز تعمیم به همه.

Observation و Rollback بخشی از کیفیت‌اند

اگر تیم پس از Deploy نمی‌تواند بفهمد کدام Build/Config/Cohort چه رفتاری دارد، سریع‌بودن Pipeline سود محدودی دارد. Telemetry باید subject، denominator، timestamp، traceability و data quality داشته باشد. Alert بدون Action یا On-call بدون Authority یک کنترل کامل نیست.

Technical Debt را از Defect و Risk جدا کنید

Technical debt انتخابی است که امروز زمان می‌خرد و هزینه یا محدودیت آینده می‌سازد؛ هر کد بد، Defect یا Requirement تغییرکرده بدهی نیست. Debt باید principal، interest mechanism، affected change paths و repayment option داشته باشد. Harm فعال را صرفاً «بدهی» ننامید تا عادی نشود.

Debt/Exception Register بسازید

فیلدنمونهچرا لازم است
Gap/decisionintegration matrix فقط ۱۲/۲۴ rule pairدانستن چیزی که عمداً ناقص است
Benefit nowآزمون cohort یک هفته زودترقابل نقد بودن trade-off
Interest mechanismهر Rule جدید نیازمند manual pair reviewمشاهدهٔ هزینهٔ آینده
Risk/exposureفقط preview؛ charge غیرفعالجلوگیری از تعمیم
Owner/authoritypricing owner / risk ownerپاسخ‌گویی و پذیرش
Due/trigger/expiryپیش از charge enable یا ۱۴ روزجلوگیری از Waiver دائمی
Repayment evidence۲۴ pair + fault witnessClosure واقعی

Debt Budget پول واقعی نیست

می‌توانید WIP یا ظرفیت محدود برای Debt تعریف کنید، اما جمع‌کردن Severityهای ناهمگون در یک عدد توهم قابلیت مبادله می‌سازد. Aging، interest signal، blocked change و Harm exposure را جدا ببینید. Debt سقف‌خورده باید Trigger توقف Bet جدید یا تخصیص ظرفیت داشته باشد.

ظرفیت را میان Feature، Reliability، Debt و Learning شفاف کنید

درصد ثابت جهانی وجود ندارد. Demand، Incident load، SLO burn، debt aging، runway و Betهای استراتژیک را در Portfolio review بیاورید. بودجه‌بندی Portfolio سرمایه‌گذاری کیفیت مالک انتخاب Build/Buy/Pilot و TCO است؛ این مقاله فقط قرارداد تصمیم روزمرهٔ سرعت–Risk را می‌سازد.

Opportunity Cost را Rangeدار گزارش کنید

«دو هفته تأخیر برابر از دست‌دادن بازار است» معمولاً ادعای قطعی نیست. گزینه‌ها را با Time-to-evidence، ظرفیت نفر-روز، dependency، window فرصت، زیان موردانتظارِ Rangeدار و Unknown مقایسه کنید. زیان مالی همهٔ Harmها را نمایندگی نمی‌کند و نباید ارزش انسانی، اعتماد یا الزام را به‌طور خودکار پولی کند.

گزینه‌ها را فراتر از Ship یا Delay بسازید

OptionیادگیریRisk controlهزینه/محدودیت
Prototypeفهم‌پذیری/تقاضای اولیهبدون عملیات واقعیBehavior واقعی محدود
Shadowرفتار محاسبه روی traffic کپیبدون اثر کاربرSide-effect باید مسدود شود
Internal/dogfoodWorkflow و operabilityPopulation محدودنمایندگی کاربر کم
Canary/cohortProduction evidence محدودcap، guardrail، killآمار/تعیم محدود
Manual conciergeارزش مسیر با عملیات انسانیحجم پایین و reviewمقیاس و رفتار automation نامعلوم
Delay + risk reductionEvidence فنی بیشترGap مشخص بسته می‌شودOpportunity window ممکن است کم شود
Do nothing/stopظرفیت آزاد می‌شودRisk تغییر حذفمسئلهٔ اصلی باقی می‌ماند

Decision Packet را کوتاه اما کامل نگه دارید

decision_id: SQD-042
as_of: 2026-08-25T12:00:00+03:30
bet: BET-IRR-042
change_class: reversible_medium_exposure
options: [prototype, shadow, cohort_5, delay, stop]
harm_floor: HF-CHECKOUT-IRR-v3
quality_envelope: QE-042-v2
evidence_manifest: EM-042-v4
unknowns: [late_callback_behavior]
selected: cohort_5
rationale: strongest bounded evidence before opportunity window
rollback: RO-BET-IRR-042
debt_exceptions: [DEBT-042-01]
decision_owner_role: product-owner
risk_acceptor_role: checkout-risk-owner
review_due: 2026-09-01
correction_policy: append_only

Product owner می‌تواند ارزش و Option را تصمیم بگیرد، اما به‌طور خودکار صاحب پذیرش همهٔ Riskها نیست. QA Evidence و Gap را گزارش می‌کند و به‌تنهایی «کیفیت» یا Release را امضا نمی‌کند. تصمیم انتشار عمومی با جزئیات بیشتر در چارچوب Good Enough Quality آمده است.

Authority Map جلوی Gatekeeper مبهم را می‌گیرد

نقشتصمیمتصمیمی که ندارد
Product ownerOutcome Bet و اولویتWaive خودکار Harm floor تخصصی
Engineering ownerطرح فنی، batch و rollback feasibilityاعلام ارزش محصول
Quality/Test ownerEvidence profile، limitation و findingتضمین کیفیت یا Risk acceptance
SRE/OperationsSLI/SLO evidence و operabilityتصمیم نهایی محصول
Domain risk ownerپذیرش Risk در دامنهٔ اختیارپذیرش Risk خارج دامنه
On-call release ownerPause/rollback طبق Policyتغییر مخفی Threshold

تعارض سرعت و کیفیت را به گزینه و Evidence تبدیل کنید

به‌جای «QA مانع است» یا «محصول بی‌ملاحظه است»، اختلاف را دقیق کنید: کدام Deadline، کدام Outcome، کدام Gap، چه Exposure و چه اختیار؟ حداقل سه Option با اثر بر زمان، Evidence و Risk ارائه کنید. مدیریت انتظارات و قرارداد Quality با ذی‌نفع را در راهنمای مدیریت انتظارات QA ببینید.

موفقیت Pilot با Scale readiness یکی نیست

در Cohort پنج‌درصدی ممکن است Dependency، Support، Abuse، locale یا Peak load نمایان نشود. Result را با Scope همان Pilot ثبت کنید و پیش از Scale، Coverage delta، capacity، monitoring، rollback at scale و cohort shift را بررسی کنید. برنامه‌های نوآوری را می‌توان با الگوی مسئله تا Scale یا Stop مدیریت کرد.

شرایط ایران را در Contract آشکار کنید

دسترسی ناپایدار یا محدود به SaaS، پرداخت ارزی، تغییر نرخ هزینه، latency شبکه، locale فارسی، تقویم و واحد پول می‌تواند Evidence و Recovery را تغییر دهد. ابزار جایگزین، Export، self-host/exit، زمان تمدید License و fallback را ثبت کنید. مبلغ canonical را IRR نگه دارید و اگر تومان نمایش می‌دهید label و تبدیل را صریح کنید. این‌ها ادعای حقوقی، بانکی یا مالی دربارهٔ ایران نیستند.

آزمایش تکرارپذیر: Dashboard سبز اما Decision ناقص

Fixture مصنوعی زیر ۲۴ Deploy در ۲۸ روز، Lead time پنج‌ساعته و صفر Critical defect نشان می‌دهد و نتیجه را SPEED_QUALITY_BALANCED اعلام می‌کند. Auditor بررسی می‌کند آیا این اعداد به Bet، Scope، Harm floor، Evidence، Rollout و Authority متصل‌اند.

{
  "decision_id": "",
  "bet": {"population": "", "outcome": "", "mechanism": "", "not_claimed": []},
  "change": {"artifact": "", "class": "", "scope": "", "reversibility_evidence": ""},
  "harm_floor": {"policy_id": "", "claims": []},
  "quality_envelope": [],
  "evidence_manifest": "",
  "rollout": {"cohort": "", "exposure": "", "stop": [], "rollback_evidence": ""},
  "metrics": [
    {"name": "deployments", "value": 24, "window": "28d"},
    {"name": "lead_time_hours", "value": 5},
    {"name": "critical_defects", "value": 0}
  ],
  "debt_exceptions": [{"id": "D1", "owner_role": "", "expiry": "", "repayment_evidence": ""}],
  "decision_owner_role": "",
  "risk_acceptor_role": "",
  "declared": "SPEED_QUALITY_BALANCED"
}
const fs = require('node:fs');
const x = JSON.parse(fs.readFileSync(process.argv[2], 'utf8'));
const findings = [];
const req = (ok, rule, path) => { if (!ok) findings.push({ rule, path }); };

req(x.decision_id, 'IDENTITY', 'decision_id');
req(x.bet?.population, 'BET', 'bet.population');
req(x.bet?.outcome, 'BET', 'bet.outcome');
req(x.bet?.mechanism, 'BET', 'bet.mechanism');
req((x.bet?.not_claimed || []).length, 'CLAIM_BOUNDARY', 'bet.not_claimed');
req(x.change?.artifact, 'CHANGE_IDENTITY', 'change.artifact');
req(x.change?.class && x.change?.scope, 'CHANGE_CLASS', 'change');
req(x.change?.reversibility_evidence, 'REVERSIBILITY', 'change.reversibility_evidence');
req(x.harm_floor?.policy_id, 'HARM_FLOOR', 'harm_floor.policy_id');
req((x.harm_floor?.claims || []).length, 'HARM_FLOOR', 'harm_floor.claims');
req((x.quality_envelope || []).length, 'QUALITY_ENVELOPE', 'quality_envelope');
req(x.evidence_manifest, 'EVIDENCE', 'evidence_manifest');
req(x.rollout?.cohort && x.rollout?.exposure, 'ROLLOUT', 'rollout');
req((x.rollout?.stop || []).length, 'STOP_RULE', 'rollout.stop');
req(x.rollout?.rollback_evidence, 'ROLLBACK', 'rollout.rollback_evidence');
req(x.decision_owner_role, 'AUTHORITY', 'decision_owner_role');
req(x.risk_acceptor_role, 'AUTHORITY', 'risk_acceptor_role');
for (const [i, d] of (x.debt_exceptions || []).entries())
  req(d.owner_role && d.expiry && d.repayment_evidence, 'DEBT_CONTRACT', `debt_exceptions[${i}]`);

const metricNames = new Set((x.metrics || []).map(m => m.name));
req(metricNames.has('primary_outcome'), 'OUTCOME_METRIC', 'metrics');
req(metricNames.has('harm_guardrail'), 'GUARDRAIL_METRIC', 'metrics');
req((x.metrics || []).every(m => m.window && m.population && m.source),
  'METRIC_CONTRACT', 'metrics');

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

اجرای نسخهٔ ناقص باید HOLD و ۲۲ Finding بدهد: Identity، چهار شکاف Bet/Claim، چهار شکاف Change، دو Harm floor، Quality envelope، Evidence، سه Rollout، دو Authority، Debt contract، Outcome metric، Guardrail metric، Metric contract و Decision mismatch. اعداد سبز حذف نمی‌شوند؛ فقط از ادعایی بزرگ‌تر از معنای خود منع می‌شوند.

پس از افزودن BET-IRR-۰۴۲، Build/Scope/Class، Harm policy، Quality envelope، Evidence manifest، cohort پنج‌درصدی، stop/rollback rehearsal، Metric contractهای Outcome/Guardrail و Debt/Authority معتبر، اجرای دوباره باید count=۰ و READY_FOR_SPEED_QUALITY_REVIEW بدهد. این نتیجه فقط کامل‌بودن ساختار Packet را می‌سنجد؛ Evidence truth، ارزش محصول، کفایت Threshold، ایمنی، انطباق یا «تعادل» را اثبات نمی‌کند.

نمونهٔ Decision: نمایش IRR و تومان

تیم فرض کرده ابهام واحد پول باعث اصلاح دستی پیش از تأیید می‌شود. به‌جای تغییر یک‌بارهٔ Checkout، ابتدا Prototype فارسی را با دادهٔ مصنوعی می‌سنجد؛ سپس Build b391 فقط نمایش را برای cohort پنج‌درصدی تغییر می‌دهد، درحالی‌که مبلغ canonical IRR و Charge واقعی غیرفعال است. Primary outcome «تأیید معتبر بدون اصلاح واحد» و Guardrailها مبلغ نادرست، رهاشدن، تماس پشتیبانی و latency هستند.

نتیجهٔ ۲۴ساعته فقط برای همان Segment، UI revision، Exposure و Window معتبر است. اگر Outcome بهتر و Guardrail سالم باشد، Decision بعدی «افزایش محدود Exposure» است، نه اثبات Revenue یا Market fit. اگر داده دیر برسد یا cohort assignment drift کند، نتیجه INCONCLUSIVE می‌شود. همهٔ شناسه‌ها، ارقام و سامانه‌های این مثال ساختگی‌اند؛ شبکه، Production، پول واقعی، PSP، بانک، نام، موبایل، حساب، PAN، CVV2، OTP، Cookie، Token یا Credential واقعی وجود ندارد.

Anti-patternهای رایج تعادل سرعت و کیفیت

ادعا/رفتارمشکلاصلاح
۲۴ Deploy یعنی سریع و باکیفیتOutcome/Scope/Instability غایبMetric contract + Outcome/Guardrail
صفر Critical یعنی امنDetection و taxonomy نامعلومEvidence coverage و unknown
همهٔ Criticalها همیشه اول‌اندSeverity، urgency، exposure و authority مخلوطRisk profile و triage policy
MVP می‌تواند خراب باشدScope کم با Harm مجاز اشتباه شدهHarm floor + Claim محدود
اتوماسیون سرعت و کیفیت را تضمین می‌کندOracle/maintenance/flaky نادیدهOption economics و lifecycle
CI/CD یعنی Release امنPipeline capability با Decision یکی شدهEvidence، rollout و recovery
Error budget داریم، پس Risk مجاز استReliability budget به همهٔ Harmها تعمیم یافتهSLO scope + floor
Debt را بعداً می‌پردازیممالک/trigger/expiry نداردDebt contract و capacity
درست از بار اولیادگیری و uncertainty انکار می‌شودsmall bet + correction
AI زمان تست را نصف کردBaseline/quality/review/cost نامعلومbounded pilot + countermetrics

AI و ابزارها چه نقشی دارند؟

ابزار می‌تواند Change metadata را جمع، Risk candidate را علامت، Test selection پیشنهاد، cohort/flag را اجرا، Metric را محاسبه و Debt expiry را یادآوری کند. AI می‌تواند Option یا missing-field candidate بسازد. نباید Evidence گمشده را جعل، Harm floor را Waive، Outcome را علی اعلام، فرد را مقصر، یا Risk/Release/Scale را خودمختار تصویب کند. Prompt/model/version/source/reviewer و Correction باید ثبت شوند.

سیستم سنجش متوازن

بعدMetric نمونهCountermetric
FlowChange lead time با p50/p85WIP، queue و batch size
DeliveryDeployment frequencyChange fail و rework rate
RecoveryFailed deployment recovery timeHarm برگشت‌ناپذیر
ReliabilitySLI و error-budget burndata quality و exclusion rate
ProductOutcome مخصوص BetGuardrail/Harm و nonresponse
Evidencetime-to-valid-decisionCorrection/inconclusive rate
Debtrisk-weighted agingfeature delay و debt replacement
Peopleafter-hours/rework loadsurvey nonresponse و support burden

Dashboard را به Action وصل کنید

برای هر Threshold بنویسید چه کسی، در چه SLA و با چه اختیار چه می‌کند. نمودار Burn بدون Pause policy فقط تزئین است؛ Outcome بدون Stop rule به Confirmation bias کمک می‌کند؛ Debt aging بدون ظرفیت بازپرداخت، فهرست آرزوهاست. Data freshness و Correction را روی Dashboard نمایش دهید.

ریتم تصمیم برای تیم کوچک

  1. روزانه: Guardrail، SLO burn، Rollout و Stop/Pause.
  2. هفتگی: Betهای باز، WIP/Queue، Evidence quality و Debt سررسید.
  3. در پایان Window: Outcome، Alternative، limitation و Continue/Adapt/Stop.
  4. ماهانه: Metric drift، correction، ظرفیت Feature/Reliability/Debt/Learning.
  5. فصلی: Harm floor، SLO، authority و ابزار/وابستگی/exit.

برنامهٔ اجرایی ۳۰روزه

بازهکارخروجی
روز ۱–۳یک Value stream و Decision را انتخاب کنیدScope و baseline رویدادها
روز ۴–۷Harm floor و Authority را تصویب کنیدPolicy v1 و escalation
روز ۸–۱۲Bet/Quality/Evidence templates را بسازیدFixture کامل و ناقص
روز ۱۳–۱۸یک Change برگشت‌پذیر را Pilot کنیدRollout، stop و rehearsal
روز ۱۹–۲۳DORA/Outcome/Guardrail contracts را متصل کنیدDashboard با data quality
روز ۲۴–۲۷Debt/Exception و capacity reviewrepay/adapt/expire decisions
روز ۲۸–۳۰خودِ فرایند را بازبینی کنیدADOPT/ADAPT/STOP و correction v2

چک‌لیست Decision Owner

  • Outcome Bet، Population، Mechanism، Decision و not-claimed روشن است.
  • Stage و Constraint استارتاپ ثبت شده، اما مجوز Harm نشده است.
  • Harm floor و صاحب اختیار پیش از Deadline تعیین شده‌اند.
  • Quality envelope برای Scope/Build/Window نسخه دارد.
  • Change class، Impact، Exposure، Detectability و Reversibility معلوم‌اند.
  • Evidence minimum به Claim وصل است، نه به تعداد Test.
  • Batch قابل فهم و State/Dependency آن قابل برگشت است.
  • Rollout، cohort، observation، stop و rollback rehearsal دارند.
  • Metricهای DORA تعریف محلی، Population، source و Window دارند.
  • Outcome و Guardrail از Delivery metric جدا هستند.
  • Error budget فقط در Scope همان SLI/SLO مصرف می‌شود.
  • Debt/Exception مالک، Risk، expiry، trigger و repayment evidence دارد.
  • Authority محصول، مهندسی، QA، عملیات و Risk جداست.
  • Decision receipt، limitation، next review و correction ثبت شده است.

جمع‌بندی

استارتاپ خوب «کیفیت را قربانی سرعت» نمی‌کند و برای کیفیت نامحدود نیز Opportunity را از دست نمی‌دهد. سؤال درست این است: کدام عدم‌قطعیت را با کوچک‌ترین Change قابل‌بازگشت، درون Harm floor، با Evidence کافی و Exposure محدود روشن کنیم؟ Deployment، SLO، Outcome، Debt و Recovery هر کدام معنای جدا دارند. وقتی این قراردادها روشن باشند، تیم به‌جای جنگ شعارها، دربارهٔ Continue، Adapt، Stop یا Repay تصمیمی قابل‌ممیزی می‌گیرد.

سؤالات متداول تعادل سرعت و کیفیت در استارتاپ

آیا سرعت و کیفیت واقعاً Trade-off هستند؟

در یک تصمیم کوتاه‌مدت، ظرفیت محدود می‌تواند Trade-off بسازد؛ اما Batch کوچک، Feedback سریع، Testability و Rollback اغلب هر دو را بهتر می‌کنند. رابطه را با Context و چند Metric بسنجید، نه با حکم همیشگی.

آیا MVP می‌تواند باگ داشته باشد؟

وجود Defect ممکن است، اما «MVP» مجوز Harm یا Claim غلط نیست. Scope، Exposure و Featureها را کم کنید؛ Harm floor، Evidence لازم، Recovery و اطلاع شفاف را حذف نکنید. Disposition هر Defect به Risk و Policy بستگی دارد.

بهترین نسبت زمان Feature و Technical Debt چیست؟

نسبت جهانی وجود ندارد. SLO burn، Incident load، debt aging/interest، runway، opportunity window و ظرفیت را در Portfolio ببینید. Trigger بازپرداخت و سقف WIP از درصد ثابت مهم‌تر است.

آیا Deployment frequency بالا نشانهٔ کیفیت است؟

خیر. این Metric Throughput تحویل است. آن را با Change lead time، recovery، change fail/rework، SLO، Outcome، Guardrail و Evidence quality بخوانید. تعداد Deploy به‌تنهایی ارزش یا کیفیت محصول را ثابت نمی‌کند.

چه زمانی برای سرعت، تست کمتری اجرا کنیم؟

وقتی Claim، Change class و Exposure نشان دهد Evidence دیگری سریع‌تر و کافی‌تر است و Harm floor/Policy اجازه می‌دهد؛ مثلاً Test selection ریسک‌محور همراه با Rollout محدود. Test را تصادفی حذف نکنید و Gap، Compensation، Expiry و Reopen را ثبت کنید.

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