"작업 진행률이 어떻게 되나요?"
"90% 완료됐습니다!"
일주일 후...
"지금은 몇 %인가요?"
"음... 95%요."
또 일주일 후...
"아직도 안 끝났나요?"
"거의 다 됐는데... 98%쯤?"
이게 바로 90% 증후군입니다.
소프트웨어 개발에는 오래된 농담이 있습니다: "첫 90%를 완료하는 데 전체 시간의 90%가 걸리고, 나머지 10%를 완료하는 데 또 90%가 걸린다."
농담이 아니라 현실입니다.
90%가 실은 50%인 이유
개발자들이 진행률을 판단할 때 이런 착각을 합니다:
# 개발자 머릿속
visible_work = {
"화면_구현": 100, # ✅ 완료!
"기본_기능": 100, # ✅ 완료!
"API_연동": 80 # 거의 완료
}
progress = sum(visible_work.values()) / 300
print(f"진행률: {progress:.0%}") # 93%!
# 실제 전체 작업
all_work = {
"화면_구현": 100,
"기본_기능": 100,
"API_연동": 80,
"엣지_케이스": 0, # 시작도 안 함
"에러_핸들링": 0, # 생각도 안 함
"성능_최적화": 0, # 나중에...
"보안_검증": 0, # 있었나?
"테스트": 0, # 당연히 나중
"버그_수정": 0, # 버그가 있을까?
"문서화": 0 # 굳이...?
}
real_progress = 280 / 700
print(f"실제 진행률: {real_progress:.0%}") # 40%!
보이는 것만 세면 90%, 전체를 세면 40%.
진행률 착시의 심리학
1. 완료의 정의가 모호함
"완료"가 뭔가요?
- 개발자: "코드 다 짰어요" ✅
- PM: "테스트는요?"
- 개발자: "아... 그것도 포함이었어요?" 😅
2. 파레토 법칙의 함정
80/20 법칙의 역설:
- 80%의 기능을 20%의 시간에 구현
- 나머지 20%의 기능에 80%의 시간 소요
마지막 20%가 진짜입니다.
3. 복잡도의 지수적 증가
// 처음: 단순함
function addNumbers(a, b) {
return a + b; // 1분이면 완성!
}
// 나중: 현실
function addNumbers(a, b) {
// 입력 검증
if (typeof a !== 'number' || typeof b !== 'number') {
throw new Error('Invalid input');
}
// 오버플로우 체크
if (a > Number.MAX_SAFE_INTEGER - b) {
throw new Error('Overflow');
}
// 정밀도 처리
const result = parseFloat((a + b).toPrecision(15));
// 로깅
logger.info(`Addition performed: ${a} + ${b} = ${result}`);
// 캐싱
cache.set(`${a}+${b}`, result);
return result; // 2시간 걸림...
}
실제 사례: 로그인 기능
한 스타트업의 실제 진행률 보고입니다:
Day 1: "50% 완료!"
✅ 로그인 폼 UI
✅ 기본 검증
Day 3: "80% 완료!"
✅ 백엔드 API
✅ 세션 관리
Day 5: "90% 완료!"
✅ 로그인 성공 케이스
Day 10: "95% 완료..."
⏳ 비밀번호 찾기
⏳ 소셜 로그인
⏳ 2FA
Day 15: "98% 완료..."
⏳ 브라우저 호환성
⏳ 모바일 최적화
⏳ 보안 취약점 수정
Day 20: "99% 완료..."
⏳ 부하 테스트
⏳ 에러 메시지 다국어
⏳ 로그인 실패 5회 제한
⏳ CAPTCHA
Day 25: "정말 완료!"
예상 5일 → 실제 25일 (5배)
정확한 진행률 측정법
1. Binary Progress (0% or 100%)
가장 정직한 방법입니다.
def binary_progress(task):
"""완료 아니면 미완료"""
if task.is_completely_done():
return 100
else:
return 0
# 중간은 없다!
장점: 명확함
단점: 진행 상황 파악 어려움
2. Definition of Done 체크리스트
Task: 로그인 API
Progress Checklist:
- [ ] 기능 구현 (20%)
- [ ] 단위 테스트 (15%)
- [ ] 통합 테스트 (15%)
- [ ] 코드 리뷰 (10%)
- [ ] 문서화 (10%)
- [ ] 보안 검증 (10%)
- [ ] 성능 테스트 (10%)
- [ ] 배포 준비 (10%)
완료: 8개 중 3개 ✓
진행률: 37.5% (정확!)
3. Story Point 기반
const storyPoints = {
"로그인 폼": 3, // ✅ 완료
"검증 로직": 5, // ✅ 완료
"세션 관리": 8, // ✅ 완료
"에러 처리": 5, // ⏳ 진행중
"보안 강화": 8, // ❌ 시작 전
"테스트": 5 // ❌ 시작 전
};
const completed = 3 + 5 + 8; // 16
const total = 34;
const progress = (completed / total) * 100; // 47%
4. 번다운 차트 활용
남은 작업 (시간)
100 |*
80 | *
60 | * ← 예상
40 | * * * * * ← 실제 (평평해짐)
20 | * * * *
0 |____________________
1 3 5 7 9 11 13 (일)
평평해지는 구간이 90% 증후군입니다.
90% 증후군 예방법
1. 작업을 작게 쪼개기
❌ "로그인 기능" (40시간)
✅ 작은 단위로:
- 로그인 폼 UI (2시간)
- 이메일 검증 (1시간)
- 비밀번호 검증 (1시간)
- API 엔드포인트 (2시간)
- JWT 토큰 생성 (2시간)
- 세션 저장 (1시간)
...각각 완료 가능한 크기
2. 숨겨진 작업 미리 포함
def realistic_estimate(visible_work):
hidden_multiplier = {
"테스트": 0.3,
"디버깅": 0.2,
"리팩토링": 0.1,
"문서화": 0.1,
"코드리뷰": 0.1,
"통합": 0.2
}
total = visible_work * (1 + sum(hidden_multiplier.values()))
return total # 2배
3. 3점 추정법 사용
def three_point_estimate(optimistic, realistic, pessimistic):
"""PERT 추정법"""
estimate = (optimistic + 4 * realistic + pessimistic) / 6
# 예: 로그인 기능
# 낙관: 3일, 현실: 5일, 비관: 10일
# 추정: (3 + 4*5 + 10) / 6 = 5.5일
return estimate
4. 일일 체크인
## Daily Progress Check
### 어제 완료한 것 (구체적으로)
- ✅ 로그인 폼 HTML/CSS
- ✅ 클라이언트 검증 로직
### 오늘 할 것 (측정 가능하게)
- [ ] POST /login API
- [ ] JWT 토큰 생성
### 블로커
- 🚫 JWT 라이브러리 선택 필요
### 실제 남은 작업 (솔직하게)
- 약 15시간 예상
팀별 대응 전략
PM을 위한 팁
90% 보고를 들었을 때:
- "Definition of Done 체크리스트 보여주세요"
- "테스트는 작성하셨나요?"
- "엣지 케이스는 처리하셨나요?"
- "문서는 업데이트하셨나요?"
대부분 "아..."라고 답할 겁니다.
개발자를 위한 팁
진행률 보고 시:
- "기능은 90%, 전체는 60%입니다"
- "Happy Path는 완료, 예외 처리 진행 중"
- "3일 더 필요합니다" (구체적 시간)
경영진을 위한 팁
프로젝트 상태 파악:
- 진행률보다 남은 작업 수를 보세요
- 번다운 차트의 기울기를 보세요
- 데모 가능한 기능을 확인하세요
90% 증후군 체크리스트
프로젝트가 90% 증후군에 빠졌는지 확인:
- 2주 이상 90%대 진행률 유지
- "거의 다 됐어요"를 3번 이상 들음
- 남은 작업 리스트가 늘어남
- 예상 완료일이 계속 미뤄짐
- 팀원들이 지쳐 보임
3개 이상 해당? 90% 증후군입니다.
마무리: 정직한 진행률이 최선
"90% 완료"는 거짓말이 아닙니다. 착각일 뿐입니다.
해결책:
- 작업을 작게 나누기
- 숨은 작업 미리 계산
- Binary (0/100) 또는 체크리스트 사용
- 일일 점검
- 솔직한 커뮤니케이션
마지막 10%가 전체의 50%라는 걸 인정하면, 더 정확한 계획을 세울 수 있습니다.
"90% 완료"라고 하지 마세요.
"10개 중 9개 완료"라고 하세요.
숫자는 거짓말하지 않습니다.
정확한 진행률 관리와 투명한 프로젝트 추적이 필요하신가요? Plexo를 확인해보세요.
댓글 없음:
댓글 쓰기