スモークテストを判定し MVP の範囲を切る
한국어 원문으로 표시합니다.
목표
스모크 테스트 결과를 윌슨 구간으로 판정하고(채널별·전체·낯선 채널만), 보류인 채널의 필요 표본을 계산한 뒤, RICE 로 MVP 범위를 예산 안에서 자르고 "만들까·더 시험할까·무엇을" 을 정한다.
왜 중요한가
가설은 틀릴 수 있게 숫자로 써야 시험할 수 있고, 시험 결과는 누가 참여했는지까지 따져야 읽을 수 있다. 지인 채널의 높은 전환율과 만들기 쉬운 기능의 높은 점수는 둘 다 가장 흔한 착시다.
재료
/opt/fixtures/founder/mvp/smoke.csv—channel,visitors,signups,preorders(newsletter_friends 는 지인·구독자, 나머지는 낯선 방문자)/opt/fixtures/founder/mvp/hypothesis.json—statement, metric, threshold, budget_person_months/opt/fixtures/founder/mvp/features.csv—feature,reach,impact,confidence_pct,effort_pm
정의
- 선주문율 = preorders ÷ visitors, 가입률 = signups ÷ visitors.
- 윌슨 95% 구간: 앞 모듈(fv-problem)과 같은 식, z =
NormalDist().inv_cdf(0.975). - 판정: 하한 ≥ threshold →
"pass", 상한 < threshold →"fail", 나머지"insufficient". n_needed(p, threshold): n = 1, 2, … 200000 순서로k = round(p·n)의 구간이 threshold 를 벗어나는(하한 ≥ 또는 상한 <) 첫 n, 없으면 None.- RICE = reach × impact × (confidence_pct ÷ 100) ÷ effort_pm.
- 범위: RICE 내림차순(같으면 feature 이름순)으로 보면서, 누적 effort_pm 이 예산 이하가 되면 넣고, 넘치면 건너뛰고 다음 것을 본다.
- 비율·구간은 소수 넷째 자리, RICE 는 둘째 자리.
단계
/root/founder/mvp/rates.json에 채널마다signup_rate·preorder_rate를 쓴다./root/founder/mvp/mvp.py에wilson(k, n)→[low, high]와verdict(k, n, threshold)를 만든다./root/founder/mvp/verdict.json에 채널마다low·high·verdict를 쓴다./root/founder/mvp/pooled.json에all(네 채널 합)과cold(newsletter_friends 를 뺀 세 채널 합) 각각preorders, visitors, low, high, verdict를 쓴다.mvp.py에n_needed(p, threshold)를 더하고,/root/founder/mvp/sample.json에 판정이 insufficient 인 채널마다n_needed(그 채널의 선주문율 기준)와extra_visitors(n_needed − visitors)를 쓴다./root/founder/mvp/rice.json에 기능마다 RICE 점수를 쓴다./root/founder/mvp/scope.json에included(넣은 순서대로),effort(합계 인월),excluded(건너뛴 순서대로)를 쓴다./root/founder/mvp/plan.json에go_build(cold 판정이 pass 인가),cold_verdict,next_test_channel(insufficient 인 채널 가운데 extra_visitors 가 가장 적은 채널),scope_if_go(7단계 included) 를 쓴다.
참고
- 흔한 실수: 따뜻한 청중을 섞은 판정으로 결정하기, 비율(점추정)과 기준을 바로 비교하기, confidence 를 80 그대로 곱하기, 예산을 넘는 기능에서 멈춰 버리기(건너뛰고 다음을 봐야 한다).
채널별 가입률과 선주문율
/root/founder/mvp/rates.json 에 채널마다 signup_rate·preorder_rate 를 쓴다.
분모는 모두 방문자 수입니다. 가입률이 높아도 선주문율이 낮을 수 있습니다 — 가설의 지표는 선주문율입니다.
구간으로 판정하는 함수
/root/founder/mvp/mvp.py 에 wilson(k, n) 과 verdict(k, n, threshold) 를 만든다.
wilson 은 앞 모듈의 식 그대로입니다. verdict 는 하한 ≥ 기준이면 pass, 상한 < 기준이면 fail, 나머지 insufficient.
채널별 판정
/root/founder/mvp/verdict.json 에 채널마다 low·high·verdict 를 쓴다.
기준은 hypothesis.json 의 threshold 입니다. 점추정과 기준을 바로 비교하지 않습니다.
지인 채널을 빼고 다시 판정한다
/root/founder/mvp/pooled.json 에 all 과 cold 각각 preorders·visitors·low·high·verdict 를 쓴다.
cold 는 newsletter_friends 를 뺀 세 채널의 선주문과 방문자를 더한 것입니다. 비율을 평균하지 말고 수를 더하세요.
보류라면 몇 명이 더 필요한가
mvp.py 에 n_needed(p, threshold) 를 더하고 /root/founder/mvp/sample.json 에 insufficient 채널마다 n_needed·extra_visitors 를 쓴다.
n 을 1부터 늘려 k = round(p·n) 으로 구간을 다시 계산하고, 기준을 벗어나는 첫 n 에서 멈춥니다. 상한은 200000.
RICE 점수
/root/founder/mvp/rice.json 에 기능마다 RICE 점수를 쓴다.
confidence_pct 는 퍼센트라 100 으로 나눠 곱합니다. effort 는 인월입니다.
예산 안의 범위
/root/founder/mvp/scope.json 에 included·effort·excluded 를 쓴다.
점수 내림차순으로 보되, 넘치는 기능은 건너뛰고 다음 기능을 계속 봅니다. 같은 점수는 이름순.
만들까, 더 시험할까, 무엇을
/root/founder/mvp/plan.json 에 go_build·cold_verdict·next_test_channel·scope_if_go 를 쓴다.
결정은 지인 채널을 뺀 판정으로 합니다. 다음 시험 채널은 필요한 추가 방문자가 가장 적은 보류 채널입니다.