2025년 11월 17일 월요일

파일 기반 협업의 한계: 왜 Excel WBS는 확장성이 없는가

소프트웨어 엔지니어라면 분산 시스템의 CAP 정리를 알 것입니다. Consistency(일관성), Availability(가용성), Partition tolerance(분할 내성) - 이 세 가지를 모두 만족할 수 없다는 이론이죠.

놀랍게도 Excel WBS 관리에서도 정확히 같은 문제가 발생합니다.

매일 아침 반복되는 대화:

  • "어제 보낸 파일 못 받으셨어요?"
  • "제가 수정한 버전이 최신인데요?"
  • "아, 그거 덮어쓰신 거예요?"

어느 날, 중요한 마일스톤 회의에서 PM, 개발팀장, QA팀장이 각자 다른 버전의 WBS를 보고 있다는 걸 발견했습니다. 그 순간 깨달았습니다.

Excel은 혼자 쓸 때는 완벽하지만, 팀으로 쓸 때는 재앙이다.

파일 기반 시스템의 근본적 한계

Race Condition: 누가 먼저인가?

데이터베이스를 다뤄본 개발자라면 Race Condition을 알 것입니다. 두 프로세스가 동시에 같은 데이터를 수정하려 할 때 발생하는 문제죠. Excel에서는 이게 매일 일어납니다.

실제로 있었던 일입니다:

09:00 - 김팀장이 WBS.xlsx를 열고 일정 수정 시작
09:05 - 박대리도 같은 파일을 열고 담당자 변경 시작
09:30 - 김팀장이 저장 (30분 작업)
09:35 - 박대리가 저장 (김팀장의 30분 작업이 사라짐)
09:40 - 김팀장: "어? 내가 수정한 게 왜 없지?"

데이터베이스라면 이런 코드로 해결합니다:

-- 데이터베이스의 트랜잭션 처리
BEGIN TRANSACTION;
SELECT * FROM tasks WHERE id = 1 FOR UPDATE;  -- 락 획득
UPDATE tasks SET start_date = '2024-01-15' WHERE id = 1;
COMMIT;  -- 다른 사람이 이제 수정 가능

하지만 Excel은? Last Writer Wins. 마지막에 저장한 사람이 승자입니다. 앞사람의 작업은 흔적도 없이 사라지죠.

버전 관리의 악몽

Git을 사용하는 개발자들은 얼마나 축복받았는지 모릅니다. Excel 버전 관리의 실상을 보여드리죠:

프로젝트_WBS.xlsx
프로젝트_WBS_v2.xlsx
프로젝트_WBS_v2_최종.xlsx
프로젝트_WBS_v2_최종_진짜최종.xlsx
프로젝트_WBS_v2_최종_진짜최종_수정.xlsx
프로젝트_WBS_v2_최종_진짜최종_수정_김팀장검토.xlsx
프로젝트_WBS_v2_최종_진짜최종_수정_김팀장검토_박대리수정.xlsx

이게 과장이라고요? 지금 당신의 프로젝트 폴더를 열어보세요.

Git이었다면 이렇게 깔끔했을 텐데:

git log --oneline
f3d2a1b 박대리: 담당자 변경
e4c5b6a 김팀장: 일정 조정
a1b2c3d 이과장: 신규 작업 추가

확장성의 벽: O(n²) 복잡도

팀이 커질수록 파일 공유의 복잡도는 기하급수적으로 증가합니다. 왜일까요?

def calculate_communication_overhead(team_size):
    """팀 크기에 따른 커뮤니케이션 복잡도"""

    # 모든 팀원 간 파일 공유 경로의 수
    paths = team_size * (team_size - 1) / 2

    # 각 경로마다 발생 가능한 충돌
    conflicts_per_path = 3  # 평균적으로

    total_complexity = paths * conflicts_per_path

    print(f"팀 {team_size}명:")
    print(f"  - 커뮤니케이션 경로: {paths}개")
    print(f"  - 잠재적 충돌: {total_complexity}건/일")

    return total_complexity

# 실제 계산
calculate_communication_overhead(5)   # 팀 5명: 경로 10개, 충돌 30건
calculate_communication_overhead(10)  # 팀 10명: 경로 45개, 충돌 135건
calculate_communication_overhead(20)  # 팀 20명: 경로 190개, 충돌 570건!

20명이 넘으면? 하루 종일 파일 관리만 해야 합니다.

Excel이 우리를 힘들게 하는 7가지 이유

1. 동시 편집의 불가능

월요일 아침, 스프린트 계획 회의. 10명이 모여서 WBS를 업데이트해야 합니다.

Excel 방식:

김PM: "제가 화면 공유할게요. 뭐 수정할 거 있으면 말씀해주세요."
박개발: "3번 작업 담당자를 저로..."
김PM: (타이핑)
이QA: "아, 5번 작업 날짜도..."
김PM: "잠깐, 하나씩 말씀해주세요"
(1시간 후)
최팀장: "이거 나중에 파일로 보내주세요"

Google Docs/현대적 도구 방식:

(모두 동시에 편집 중)
김PM: "각자 자기 작업 업데이트하세요"
(10분 후)
김PM: "다 됐네요. 다음 안건으로..."

시간 차이가 느껴지시나요? 이게 매주, 매일 반복됩니다.

2. 버전 충돌 지옥

실제로 있었던 끔찍한 사건:

class ExcelVersionHell:
    """Excel 버전 관리의 실제 참상"""

    def monday_morning_disaster(self):
        """월요일 아침의 재앙"""

        # 금요일 저녁
        friday_evening = {
            "김팀장": "WBS_최종.xlsx 작성 후 퇴근",
            "박대리": "집에서 WBS_최종.xlsx 다운로드"
        }

        # 주말
        weekend = {
            "박대리": "주말에 WBS_최종.xlsx 대폭 수정",
            "이과장": "토요일에 받은 WBS_최종.xlsx 살짝 수정"
        }

        # 월요일 아침
        monday_morning = {
            "09:00": "김팀장: WBS_최종.xlsx 열기",
            "09:05": "박대리: WBS_최종_주말수정.xlsx 메일 발송",
            "09:10": "이과장: WBS_최종_검토.xlsx 메일 발송",
            "09:15": "김팀장: ????? 어느 게 최신이지?",
            "09:30": "전체 회의: 3개 버전 수동 병합 시작",
            "11:00": "드디어 병합 완료... 아침이 사라졌다"
        }

        return "생산성 제로의 아침"

3. 수식 지옥과 #REF! 에러 파티

Excel의 수식은 강력하지만, 협업에서는 시한폭탄입니다:

=SUMIF(Sheet2!C:C,A2,Sheet2!D:D)
=VLOOKUP(B2,'담당자'!A:F,3,FALSE)
=IF(D2="완료",E2-F2,IF(D2="진행중",TODAY()-F2,""))

# 누군가 행을 삭제하면...
#REF! #REF! #REF! #REF! #REF!

한 번 깨진 수식을 복구하는 데 걸리는 시간: 평균 30분.
한 달에 발생하는 수식 에러: 평균 12건.
연간 낭비 시간: 72시간 (9일!)

4. 이메일 폭탄

실제 받은 이메일함의 모습:

📧 [09:00] WBS 최신 버전입니다
📧 [09:30] Re: WBS 최신 버전입니다 (수정)
📧 [10:00] Re: Re: WBS 최신 버전입니다 (추가 수정)
📧 [10:30] 긴급: WBS 수정본 (중요)
📧 [11:00] Re: 긴급: WBS 수정본 (오류 수정)
📧 [14:00] WBS 오후 버전
📧 [15:00] WBS 최종 (진짜)
📧 [16:00] WBS 최종_수정
📧 [17:00] 내일 회의용 WBS
📧 [17:30] Re: 내일 회의용 WBS (날짜 변경)

하루 평균 WBS 관련 이메일: 15개
일주일: 75개
한 달: 300개

이메일 찾는 시간만 하루 30분입니다.

5. 히스토리 추적 불가

뭔가 잘못됐을 때:

// Git이었다면
git blame tasks.js
// "아, 김개발이 3일 전에 이 부분 수정했네"
git diff HEAD~3
// "이런 이유로 바꿨구나"

// Excel에서는
"누가 이거 바꿨어요?"
"글쎄요..."
"언제 바뀐 거죠?"
"모르겠는데요..."
"왜 바꾼 거죠?"
"......"

6. 자동화? 그게 뭔가요?

매주 금요일 번다운 차트 만들기:

def friday_burndown_ritual():
    """금요일의 의식"""

    tasks = [
        "1. Excel 열기 (1분)",
        "2. 데이터 범위 선택 (2분)",
        "3. 삽입 > 차트 (1분)",
        "4. 차트 종류 선택 (1분)",
        "5. 축 레이블 수정 (3분)",
        "6. 색상 조정 (5분)",
        "7. 제목 추가 (1분)",
        "8. 범례 조정 (2분)",
        "9. PowerPoint로 복사 (2분)",
        "10. 이메일 작성 (5분)"
    ]

    total_time = 23  # 분
    weeks_per_year = 52

    yearly_waste = total_time * weeks_per_year / 60  # 시간
    print(f"연간 {yearly_waste:.0f}시간을 차트 만들기에 소비")
    print("이 시간이면 새 기능 3개는 개발했을 텐데...")

7. 모바일? 꿈도 꾸지 마세요

출장 중 급하게 WBS 확인이 필요할 때:

나: "WBS 파일 좀 보내주세요"
동료: "메일 확인하세요"
나: (폰으로 xlsx 파일 다운로드)
폰: "이 파일을 열 수 있는 앱이 없습니다"
나: (Excel 앱 다운로드)
폰: (화면에 개미만한 글씨의 스프레드시트)
나: "안 보여..."
나: "노트북 켤 때까지 기다려야겠다"

현대적 도구로의 전환: 실시간 협업의 마법

Google Docs가 보여준 미래

Google Docs를 처음 사용했을 때를 기억하시나요? 여러 사람의 커서가 동시에 움직이는 것을 보고 "와, 이게 되네?"라고 감탄했던 그 순간.

그 기술의 핵심은 **CRDT(Conflict-free Replicated Data Types)**입니다:

// CRDT 기반 실시간 동기화의 원리
class RealtimeWBS {
  constructor() {
    this.state = new YMap(); // Yjs CRDT 구현체
    this.awareness = new Awareness(); // 사용자 상태 추적
  }

  updateTask(taskId, changes) {
    // 1. 로컬에서 즉시 반영 (0ms)
    this.state.get(taskId).set(changes);

    // 2. 다른 사용자에게 자동 전파
    // 3. 충돌 시 자동 병합 (알고리즘이 처리)
    // 4. 모든 클라이언트가 같은 상태 보장
  }

  onRemoteChange(event) {
    // 다른 사용자의 변경사항 실시간 수신
    const cursor = event.user.cursor;
    const changes = event.changes;

    // UI에 즉시 반영
    this.updateUI(changes);
    this.showUserCursor(event.user);
  }
}

이제 WBS 관리도 이렇게 할 수 있습니다.

실제 협업 시나리오

월요일 아침 스프린트 계획, 이제는 이렇습니다:

09:00 - 팀 전원 웹브라우저로 WBS 접속
09:01 - 각자 자기 작업 동시 업데이트 시작
       - 김PM: 새 마일스톤 추가 중
       - 박개발: 작업 시간 수정 중
       - 이QA: 테스트 일정 조정 중
       - 최디자인: 디자인 작업 추가 중
09:05 - 모든 수정 완료
09:06 - 자동 생성된 간트 차트 확인
09:07 - "좋네요, 진행하시죠"

5분. Excel로는 1시간 걸리던 일이 5분입니다.

숫자로 보는 변화

실제 기업 A사의 도입 전후 비교:

def roi_calculation():
    """투자 대비 수익률 계산"""

    # Before: Excel 시대
    excel_era = {
        "버전_충돌_해결": 10,  # 시간/주
        "파일_찾기": 5,        # 시간/주
        "수동_업데이트": 8,    # 시간/주
        "이메일_관리": 3,      # 시간/주
        "차트_생성": 2,        # 시간/주
        "총_낭비": 28          # 시간/주
    }

    # After: 현대적 도구
    modern_era = {
        "버전_충돌_해결": 0,   # 자동 병합
        "파일_찾기": 0,        # 클라우드
        "수동_업데이트": 0,    # 자동화
        "이메일_관리": 0.5,    # 대부분 불필요
        "차트_생성": 0,        # 실시간 생성
        "총_낭비": 0.5         # 시간/주
    }

    # 절감 효과
    weekly_saving = excel_era["총_낭비"] - modern_era["총_낭비"]
    monthly_saving = weekly_saving * 4
    yearly_saving = weekly_saving * 52

    # 금액 환산 (시급 $50 가정)
    yearly_money = yearly_saving * 50

    print(f"주간 절감: {weekly_saving}시간")
    print(f"월간 절감: {monthly_saving}시간")
    print(f"연간 절감: {yearly_saving}시간")
    print(f"연간 절감액: ${yearly_money:,}")

    return yearly_saving

# 결과: 연간 1,430시간, $71,500 절감

오늘이 바로 전환할 때

"우리는 항상 이렇게 해왔는데..."라는 말, 들어보셨죠?

이 말이 나오는 순간, 당신의 팀은 이미 뒤처지고 있습니다.

Excel은 훌륭한 도구입니다. 하지만 혼자 쓸 때만요. 팀으로 일한다면, 팀을 위한 도구가 필요합니다.

망치로 나사를 박을 수도 있습니다. 하지만 드라이버가 있는데 왜 그러시나요?

첫 걸음은 작게

거창할 필요 없습니다. 다음 프로젝트 하나만 현대적 도구로 시작해보세요.

2주 후, 팀이 이렇게 말할 겁니다:
"다시는 Excel로 돌아가고 싶지 않아요."

변화는 어렵지만, 변하지 않는 것은 더 위험합니다.


실시간 협업 WBS를 경험하고 싶으신가요? Plexo에서 14일 무료로 시작하세요.