2025년 11월 28일 금요일

90% 완료의 함정: 마지막 10%가 90%인 이유

"작업 진행률이 어떻게 되나요?"

"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% 보고를 들었을 때:

  1. "Definition of Done 체크리스트 보여주세요"
  2. "테스트는 작성하셨나요?"
  3. "엣지 케이스는 처리하셨나요?"
  4. "문서는 업데이트하셨나요?"

대부분 "아..."라고 답할 겁니다.

개발자를 위한 팁

진행률 보고 시:

  • "기능은 90%, 전체는 60%입니다"
  • "Happy Path는 완료, 예외 처리 진행 중"
  • "3일 더 필요합니다" (구체적 시간)

경영진을 위한 팁

프로젝트 상태 파악:

  • 진행률보다 남은 작업 수를 보세요
  • 번다운 차트의 기울기를 보세요
  • 데모 가능한 기능을 확인하세요

90% 증후군 체크리스트

프로젝트가 90% 증후군에 빠졌는지 확인:

  •  2주 이상 90%대 진행률 유지
  •  "거의 다 됐어요"를 3번 이상 들음
  •  남은 작업 리스트가 늘어남
  •  예상 완료일이 계속 미뤄짐
  •  팀원들이 지쳐 보임

3개 이상 해당? 90% 증후군입니다.

마무리: 정직한 진행률이 최선

"90% 완료"는 거짓말이 아닙니다. 착각일 뿐입니다.

해결책:

  1. 작업을 작게 나누기
  2. 숨은 작업 미리 계산
  3. Binary (0/100) 또는 체크리스트 사용
  4. 일일 점검
  5. 솔직한 커뮤니케이션

마지막 10%가 전체의 50%라는 걸 인정하면, 더 정확한 계획을 세울 수 있습니다.

"90% 완료"라고 하지 마세요.
"10개 중 9개 완료"라고 하세요.

숫자는 거짓말하지 않습니다.


정확한 진행률 관리와 투명한 프로젝트 추적이 필요하신가요? Plexo를 확인해보세요.

댓글 없음:

댓글 쓰기