Founding as a Developer — Validate Before You Build
Judge the Smoke Test and Cut the MVP Scope
한국어 원문으로 표시합니다.
목표
스모크 테스트 결과를 윌슨 구간으로 판정하고(채널별·전체·낯선 채널만), 보류인 채널의 필요 표본을 계산한 뒤, 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 를 쓴다.
결정은 지인 채널을 뺀 판정으로 합니다. 다음 시험 채널은 필요한 추가 방문자가 가장 적은 보류 채널입니다.