2025년 11월 27일 목요일

모두가 놓치는 숨겨진 작업들: 빙산의 70%를 찾아서

 "개발 다 끝났는데 왜 아직도 출시를 못하죠?"

PM이 답답해하며 묻습니다. 개발자는 한숨을 쉬며 대답합니다.

"아, 이제 테스트하고, 문서 쓰고, 배포 준비하고, 모니터링 설정하고..."

이게 바로 숨겨진 작업의 함정입니다.

프로젝트를 빙산에 비유하면, 보이는 부분은 30%에 불과합니다. 나머지 70%는 수면 아래 숨어있죠.

빙산의 일각

실제 프로젝트의 작업 분포를 보면 충격적입니다:

보이는 작업 (30%)
├── 기능 구현
├── UI 개발
└── API 개발

숨겨진 작업 (70%) 😱
├── 코드 리뷰
├── 테스트 작성
├── 버그 수정
├── 문서화
├── 배포 준비
├── 모니터링 설정
├── 성능 최적화
├── 보안 점검
├── 데이터 마이그레이션
└── 팀 미팅

왜 계속 놓칠까?

1. 개발자의 낙관적 사고

개발자들은 본능적으로 코딩 시간만 생각합니다.

"로그인 API? 반나절이면 충분해!"

하지만 실제로는:

# 개발자 머릿속
estimate = {
    "코딩": 4  # 시간
}

# 현실
reality = {
    "코딩": 4,
    "디버깅": 2,
    "테스트 작성": 2,
    "코드 리뷰": 1,
    "문서화": 1,
    "배포": 1,
    "버그 수정": 2
}

print(f"예상: {sum(estimate.values())}시간")
print(f"실제: {sum(reality.values())}시간")
# 예상: 4시간
# 실제: 13시간 (3배 이상!)

2. PM의 경험 부족

PM은 개발 과정의 세부사항을 모를 수 있습니다. "로그인 기능"이라고 하면 단순히 ID/PW 체크만 생각하지, 세션 관리, 보안, 로깅, 에러 처리까지는 떠올리지 못하죠.

자주 놓치는 숨겨진 작업 Top 10

100개 이상의 프로젝트를 분석한 결과입니다:

1. 코드 리뷰 (코딩 시간의 20-30%)

PR 작성하고, 리뷰 기다리고, 피드백 반영하고... 이 모든 게 시간입니다.

2. 테스트 작성 (코딩 시간의 30-50%)

"나중에 테스트 추가하면 되지"라고 생각했다가, 그 '나중'이 언제인지 정하지 않아 프로젝트가 지연됩니다.

3. 버그 수정 (전체 개발의 15-20%)

버그가 안 생길 거라고요? 그런 코드는 이 세상에 없습니다.

4. 회의 시간

주간 회의 오버헤드
├── 스프린트 계획: 2시간
├── 데일리 스탠드업: 15분 × 5 = 1.25시간
├── 스프린트 리뷰: 1시간
├── 회고: 1시간
└── 임시 미팅: 2시간
총: 주당 7.25시간!

주 40시간 중 18%가 회의입니다.

5. 문서화

  • API 문서: "나중에 Swagger 붙이면..."
  • README: "코드 보면 알잖아..."
  • 운영 매뉴얼: "내가 직접 배포하면..."

이 "나중에"와 "~하면"이 프로젝트를 망칩니다.

6. 환경 설정

로컬은 잘 돌아가는데 서버에서 안 돌아요! Docker 설정, CI/CD 파이프라인, 환경 변수... 이것만 하루 종일 걸립니다.

7. 데이터 관련 작업

  • 테스트 데이터 생성: "실제 같은 더미 데이터가 필요해요"
  • 마이그레이션: "기존 데이터를 새 스키마로..."
  • 백업 설정: "혹시 모르니까..."

8. 보안 작업

OWASP Top 10 체크, 취약점 스캔, SSL 인증서... 출시 직전에 발견하면 대참사입니다.

9. 성능 최적화

"왜 이렇게 느려?" 프로파일링하고, 병목 찾고, 캐싱 추가하고, DB 인덱스 튜닝... 끝이 없습니다.

10. 예외 처리

Happy Path만 생각했는데, 사용자는 상상도 못한 방법으로 시스템을 사용합니다.

실제 사례: 결제 시스템 구축

한 스타트업의 실제 이야기입니다.

초기 계획 (보이는 작업만)

결제 시스템 (40시간)
├── 결제 API 개발 (16시간)
├── 결제 UI 개발 (16시간)
└── PG사 연동 (8시간)

"일주일이면 끝나겠네요!"

실제 작업 (숨겨진 작업 포함)

결제 시스템 (96시간)
├── 보이는 작업 (40시간)
│   ├── 결제 API 개발 (16시간)
│   ├── 결제 UI 개발 (16시간)
│   └── PG사 연동 (8시간)
└── 숨겨진 작업 (56시간) 😱
    ├── 보안 검토 (8시간)
    ├── PCI DSS 준수 (8시간)
    ├── 테스트 시나리오 작성 (4시간)
    ├── 통합 테스트 (8시간)
    ├── 에러 케이스 처리 (6시간)
    ├── 로깅 및 모니터링 (4시간)
    ├── 문서화 (4시간)
    ├── 코드 리뷰 (6시간)
    ├── 환불 프로세스 (4시간)
    └── 관리자 도구 (4시간)

2.4배 차이가 났습니다!

결제 시스템이라는 특성상 보안과 안정성에 많은 시간이 들어갔는데, 이걸 처음에는 아무도 생각하지 못했습니다.

숨겨진 작업 찾는 방법

1. 체크리스트 활용

새로운 기능을 추가할 때마다 이 체크리스트를 확인하세요:

## 개발 작업 체크리스트

### 핵심 개발

- [ ] 기능 구현
- [ ] UI 개발
- [ ] API 개발

### 품질 보증

- [ ] 유닛 테스트
- [ ] 통합 테스트
- [ ] E2E 테스트
- [ ] 코드 리뷰

### 문서화

- [ ] API 문서
- [ ] 사용자 가이드
- [ ] 코드 주석
- [ ] README 업데이트

### 배포 준비

- [ ] 환경 설정
- [ ] CI/CD 파이프라인
- [ ] 모니터링 설정
- [ ] 롤백 계획

### 보안

- [ ] 입력 검증
- [ ] 인증/인가
- [ ] 보안 스캔
- [ ] OWASP 체크

### 성능

- [ ] 성능 테스트
- [ ] 최적화
- [ ] 캐싱 전략

2. 과거 프로젝트 분석

이전 프로젝트의 실제 시간을 분석해보세요. 패턴이 보일 겁니다.

예를 들어, 우리 팀의 지난 3개 프로젝트:

  • 프로젝트 A: 계획 100시간 → 실제 145시간 (45% 초과)
  • 프로젝트 B: 계획 200시간 → 실제 310시간 (55% 초과)
  • 프로젝트 C: 계획 50시간 → 실제 72시간 (44% 초과)

평균 48% 초과. 다음부터는 예상 시간에 1.5를 곱합니다.

3. 팀원들에게 물어보기

각 역할별로 구체적으로 물어보세요:

  • 개발자: "코드 짜는 것 외에 뭘 더 하시나요?"
  • QA: "테스트 준비하는데 뭐가 필요한가요?"
  • DevOps: "배포할 때 체크하는 게 뭐가 있나요?"

놀랍도록 많은 작업이 나올 겁니다.

숨겨진 작업 추정 공식

제 경험을 바탕으로 만든 공식입니다:

def estimate_total_time(visible_tasks):
    """
    전체 시간 = 보이는 작업 + 숨겨진 작업
    """

    hidden_multipliers = {
        "코드_리뷰": 0.2,      # 20%
        "테스트": 0.3,         # 30%
        "버그_수정": 0.15,     # 15%
        "문서화": 0.1,         # 10%
        "회의": 0.1,           # 10%
        "배포_준비": 0.05,     # 5%
        "기타": 0.1            # 10%
    }

    hidden_tasks = visible_tasks * sum(hidden_multipliers.values())
    total = visible_tasks + hidden_tasks

    return {
        "visible": visible_tasks,
        "hidden": hidden_tasks,  # 100% 추가
        "total": total,          # 2배
        "safe": total * 1.2      # 20% 버퍼 추가
    }

# 예시
result = estimate_total_time(40)
print(f"보이는 작업: {result['visible']}시간")
print(f"숨겨진 작업: {result['hidden']}시간")
print(f"총 예상: {result['total']}시간")
print(f"안전 버퍼 포함: {result['safe']}시간")

# 출력:
# 보이는 작업: 40시간
# 숨겨진 작업: 40시간
# 총 예상: 80시간
# 안전 버퍼 포함: 96시간

경험칙: 보이는 작업의 2-2.5배를 잡으세요.

실전 적용 예시

Step 1: 기능 정의

"사용자 프로필 수정 기능"

Step 2: 보이는 작업 나열

  • API 개발: 8시간
  • UI 개발: 8시간

Step 3: 숨겨진 작업 추가

체크리스트를 돌면서 하나씩 추가합니다:

사용자 프로필 수정 (총 38시간)
├── 보이는 작업 (16시간)
│   ├── API 개발 (8시간)
│   └── UI 개발 (8시간)
└── 숨겨진 작업 (22시간)
    ├── DB 스키마 수정 (2시간)
    ├── 이미지 업로드 처리 (3시간)
    ├── 입력 검증 (2시간)
    ├── 테스트 작성 (4시간)
    ├── 코드 리뷰 (3시간)
    ├── 버그 수정 (3시간)
    ├── 문서 업데이트 (1시간)
    ├── 캐시 무효화 (2시간)
    └── 배포 및 모니터링 (2시간)

처음 예상(16시간)보다 2.4배 늘어났지만, 이게 현실적인 일정입니다.

숨겨진 작업을 줄이는 방법

완전히 없앨 수는 없지만 줄일 수는 있습니다:

  1. 자동화: CI/CD, 자동 테스트, 문서 자동 생성
  2. 템플릿: 코드 템플릿, 문서 템플릿
  3. 체크리스트: 반복되는 작업 표준화
  4. 페어 프로그래밍: 코드 리뷰 시간 단축
  5. TDD: 테스트와 개발 동시 진행

마무리: 정직한 계획이 성공의 시작

"개발 끝났는데 왜 출시 못하냐"는 질문을 받고 싶지 않다면, 처음부터 모든 작업을 계획에 포함시키세요.

숨겨진 작업을 무시하면:

  • 프로젝트는 반드시 지연됩니다
  • 팀원들은 야근에 시달립니다
  • 품질은 떨어집니다
  • 신뢰를 잃습니다

보이는 작업의 2배를 잡으세요. 처음엔 과하다고 느껴지겠지만, 결국 맞아떨어질 겁니다.

프로젝트의 70%는 수면 아래 있다는 걸 잊지 마세요.


프로젝트의 숨겨진 작업까지 체계적으로 관리하고 싶으신가요? Plexo를 확인해보세요.

댓글 없음:

댓글 쓰기