레이블이 현대적PM인 게시물을 표시합니다. 모든 게시물 표시
레이블이 현대적PM인 게시물을 표시합니다. 모든 게시물 표시

2025년 11월 17일 월요일

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

동시성 제어의 부재: CAP 정리로 본 Excel의 한계

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

Excel 기반 WBS 관리에서도 비슷한 문제가 발생합니다:

Consistency(일관성): 모든 팀원이 같은 버전을 보고 있는가?
Availability(가용성): 언제든 접근하고 수정할 수 있는가?
Partition tolerance(분할 내성): 네트워크가 끊어져도 작업을 계속할 수 있는가?

Excel은 이 중 어느 것도 제대로 보장하지 못합니다.

읽는 시간: 6분
대상 독자: 소프트웨어 엔지니어, 기술 리드, 아키텍트


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

Race Condition과 Lost Update 문제

데이터베이스 시스템에서 잘 알려진 Race Condition 문제가 Excel WBS에서도 동일하게 발생합니다:

-- 트랜잭션 A (김팀장)
BEGIN TRANSACTION;
UPDATE tasks SET start_date = '2024-01-15' WHERE task_id = 'T001';
-- 30분 후 COMMIT

-- 트랜잭션 B (박대리) - 거의 동시에 시작
BEGIN TRANSACTION;  
UPDATE tasks SET assignee = '이개발' WHERE task_id = 'T001';
-- 35분 후 COMMIT (김팀장 변경사항 덮어씀)

Excel에서는 이런 동시성 제어 메커니즘이 전혀 없습니다. Last Writer Wins 정책만 적용되어 먼저 작업한 사람의 노력이 사라집니다.

버전 관리 시스템의 부재

Git을 사용하는 개발자라면 이해할 것입니다:

# Git에서는 이렇게 충돌을 해결하죠
git merge feature-branch
# Conflict 발생 시 수동 해결
git add resolved-file.js
git commit -m "Merge conflict resolved"

# Excel에서는?
# 충돌 감지 불가 → 데이터 손실 → 수동 복구 → 시간 낭비

확장성 문제: O(n²) 복잡도

팀 크기가 커질수록 파일 공유의 복잡도는 기하급수적으로 증가합니다:

def communication_overhead(team_size):
    # 팀원 간 파일 공유 경로의 수
    return team_size * (team_size - 1) / 2

# 5명 팀: 10개 경로
# 10명 팀: 45개 경로  
# 20명 팀: 190개 경로

Excel WBS는 O(n²) 복잡도로 확장되어 일정 규모를 넘으면 관리 불가능해집니다.


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

1. 분산 버전 관리 문제

Git의 분산 버전 관리 개념을 파일 기반 WBS에 적용해보면:

# Git 브랜치 모델
main (production WBS)
├── feature/김팀장-일정수정
├── feature/박대리-담당자변경  
└── feature/이과장-예산조정

# Excel "브랜치" 모델  
WBS_원본.xlsx
├── WBS_김팀장수정.xlsx
├── WBS_박대리수정.xlsx
└── WBS_이과장수정.xlsx

Git에서는 git merge로 변경사항을 통합하지만, Excel에서는 수동 병합만 가능합니다.

더 심각한 문제는 Merge Conflict 감지 불가입니다. 같은 셀을 두 명이 수정해도 경고가 없어 데이터 손실이 발생합니다.

2. 동시성 제어 메커니즘 부재

데이터베이스의 ACID 속성 관점에서 Excel을 분석해보면:

Atomicity(원자성): ❌ 부분 저장 시 일관성 깨짐
Consistency(일관성): ❌ 동시 수정 시 데이터 무결성 보장 안 됨
Isolation(격리성): ❌ 트랜잭션 격리 없음
Durability(지속성): ⚠️ 로컬 파일 손실 위험

# 동시 편집 시나리오 (Pseudo-code)
class ExcelConcurrencyIssue:
    def concurrent_edit_scenario(self):
        # Thread A: 김팀장
        file_a = open("WBS.xlsx", "r+")
        data_a = file_a.read()
        data_a.modify("start_date", "2024-01-15")  # 30분 소요
        file_a.write(data_a)  # T+30min
        
        # Thread B: 박대리 (거의 동시 시작)
        file_b = open("WBS.xlsx", "r+")  # 같은 파일
        data_b = file_b.read()  # 김팀장 수정 전 버전 읽음
        data_b.modify("assignee", "이개발")  # 25분 소요  
        file_b.write(data_b)  # T+35min (김팀장 변경사항 덮어씀)
        
        # 결과: 김팀장의 30분 작업 손실

이는 Lost Update Problem의 전형적인 사례입니다.

3. 실시간 데이터 동기화 불가

분산 시스템에서 Eventually Consistent 모델도 지원하지 않는 Excel:

// 이상적인 분산 WBS 시스템
class DistributedWBS {
    async updateTask(taskId, changes) {
        // 1. Optimistic Locking
        const version = await this.getTaskVersion(taskId);
        
        // 2. Conflict Detection  
        if (await this.hasConflict(taskId, version)) {
            return this.resolveConflict(taskId, changes);
        }
        
        // 3. Atomic Update
        await this.atomicUpdate(taskId, changes, version + 1);
        
        // 4. Event Broadcasting
        this.broadcastChange(taskId, changes);
    }
}

// Excel의 현실
class ExcelWBS {
    updateTask(taskId, changes) {
        // 1. 파일 열기 (다른 사람이 열고 있는지 모름)
        // 2. 수정 (충돌 감지 안 됨)
        // 3. 저장 (이전 변경사항 덮어쓰기)
        // 4. 이메일로 공유 (수동)
    }
}

결과: 데이터 일관성을 보장할 수 없는 시스템

4. 자동화 제로

=IF(D2="완료",E2,IF(D2="진행중",E2*0.5,0))
=SUMIF(C:C,G2,E:E)
=VLOOKUP(A2,Sheet2!A:F,3,FALSE)

# 매번 수동으로 수식 복사, 붙여넣기, 수정...
# 한 셀 잘못 건드리면 #REF! 에러 파티 🎉

5. 협업 = 이메일 폭탄

월요일 이메일함

  • 📧 "WBS 최신 버전입니다" - 09:00
  • 📧 "RE: WBS 수정했습니다" - 10:30
  • 📧 "RE: RE: WBS 제가 다시 수정" - 11:00
  • 📧 "RE: RE: RE: 어느 버전이 최신?" - 14:00
  • 📧 "긴급: WBS 충돌났습니다" - 16:00
  • 📧 "최종: 이게 진짜 최종" - 18:00

6. 통계는 수작업

번다운 차트 만들기:

  1. 데이터 범위 선택 (5분)
  2. 차트 삽입 (2분)
  3. 서식 조정 (10분)
  4. 매일 반복... 😫

7. 모바일? 그게 뭔가요?



🚀 현대적 협업 시스템의 아키텍처

CRDT (Conflict-free Replicated Data Types) 기반 해결

Google Docs, Figma 등이 사용하는 CRDT 알고리즘을 WBS 관리에 적용하면:

// CRDT 기반 실시간 WBS 동기화
class CRDTBasedWBS {
    constructor() {
        this.state = new YMap();  // Yjs CRDT implementation
        this.setupRealtimeSync();
    }
    
    updateTask(taskId, field, value) {
        // 1. 로컬에서 즉시 적용
        this.state.get(taskId).set(field, value);
        
        // 2. 자동으로 다른 클라이언트에 전파
        // 3. 충돌 시 자동 해결 (CRDT 알고리즘)
        // 4. 일관성 보장
    }
    
    setupRealtimeSync() {
        this.state.observe(event => {
            // 변경사항을 실시간으로 UI에 반영
            this.updateUI(event.target, event.changes);
        });
    }
}

WebSocket 기반 실시간 아키텍처



분산 시스템 설계 원칙 적용


실시간 협업의 마법: "마치 한 사무실에 있는 것 같아요"

현대적 프로젝트 관리 도구의 핵심은 실시간 협업입니다. Google Docs를 사용해보신 적 있으신가요? 여러 사람이 동시에 문서를 편집해도 충돌하지 않고, 실시간으로 변경사항이 나타나는 그 경험 말이에요.

Plexo는 바로 그런 경험을 프로젝트 관리에서 제공합니다.

🎬 실제 협업 시나리오

오전 10시: 서울의 김PM이 새 작업을 추가합니다.
오전 10시 3초: 부산의 박개발자 화면에 즉시 새 작업이 나타납니다.
오전 10시 5초: 박개발자가 자신을 담당자로 지정합니다.
오전 10시 8초: 김PM 화면에 박개발자의 아바타가 해당 작업에 표시됩니다.

실시간 간트 차트 협업

충돌도 없고, 기다릴 필요도 없고, 메일로 주고받을 필요도 없습니다. 마치 같은 화이트보드를 보고 있는 것처럼 자연스럽죠.

📊 실제 변화의 숫자들

C사에서 Plexo 도입 후 측정한 결과입니다:

  • 버전 충돌: 주 12건 → 0건
  • 파일 찾는 시간: 일 37분 → 0분
  • 상황 파악 시간: 일 45분 → 3분
  • 팀 만족도: 5.2 → 8.7 (10점 만점)

🎯 도구 선택 가이드

당신에게 맞는 도구 찾기





도구별 상세 비교

기준ExcelGoogle SheetsJiraAsanaMS ProjectPlexo
실시간 협업⚠️
WBS 구조⚠️⚠️
자동 계산⚠️⚠️
번다운 차트수동수동
모바일⚠️
학습 곡선낮음낮음높음중간매우 높음낮음
가격$5/월무료$7.75/월$10.99/월$55/월$29/월
추천 대상1인소규모개발팀마케팅대기업WBS 중심

🔄 마이그레이션 전략

Phase 1: 파일럿 프로젝트 (2주)

Week 1: 준비

  • 월: 도구 선정 및 계정 생성
  • 화: 팀 교육 (1시간 세션)
  • 수: Excel WBS 임포트
  • 목: 기본 설정 완료
  • 금: 팀 피드백 수집

Week 2: 실전

  • 월-목: 실제 프로젝트 운영
  • 금: 평가 및 결정

Phase 2: 단계별 전환 (1개월)




Phase 3: 체인지 관리

const changeManagement = {
  저항극복: {
    '변화 거부': '점진적 도입, 충분한 교육',
    '학습 부담': '챔피언 유저 지정, 멘토링',
    '기존 방식 고수': '병행 운영 후 점진적 전환',

  인센티브: {
    early_adopter: '얼리어답터 배지',
    first_project: '첫 프로젝트 완료 보상',
    knowledge_sharing: '지식 공유 포인트',

  성공지표: {
    adoption_rate: '> 80%',
    user_satisfaction: '> 4.0/5.0',
    efficiency_gain: '> 30%',
};

💰 ROI 계산기

숨은 비용 vs 실제 이익

def calculate_roi(team_size=10, hourly_rate=50):
    # Excel의 숨은 비용 (월간)
    excel_costs = {
        "버전 관리 혼란": team_size * 2 * hourly_rate,  # 주당 2시간 낭비
        "수동 업데이트": team_size * 3 * hourly_rate,    # 주당 3시간
        "회의 시간": team_size * 1 * hourly_rate,        # 주당 1시간 추가
        "재작업": team_size * 2 * hourly_rate,           # 오류로 인한 재작업
    }

    monthly_waste = sum(excel_costs.values()) * 4  # 4주

    # 도구 비용
    tool_cost = team_size * 29  # Plexo 기준

    # 월간 절감액
    monthly_savings = monthly_waste - tool_cost

    return {
        "숨은 비용": f"${monthly_waste:,}/월",
        "도구 비용": f"${tool_cost}/월",
        "순 절감액": f"${monthly_savings:,}/월",
        "연간 이익": f"${monthly_savings * 12:,}/년",
        "ROI": f"{(monthly_savings / tool_cost * 100):.0f}%"
    }

# 10명 팀 기준
result = calculate_roi(10, 50)
print(f"연간 절감: {result['연간 이익']}")  # $187,680/년

생산성 개선 효과





🎬 전환 성공 사례

실제 성공 사례: "Excel 지옥에서 탈출한 B사의 기적"

B사는 5명 규모의 마케팅 에이전시입니다. 3개 프로젝트를 동시에 진행하면서 Excel로 일정을 관리했는데, 매주 2번씩 "버전 충돌 사태"가 발생했습니다.

전환의 결심

프로젝트 매니저 최씨는 더 이상 참을 수 없었다고 말합니다:

"클라이언트 미팅에서 진행률을 물어봤는데, 최신 파일이 뭔지 몰라서 5분 동안 파일을 뒤지고 있었어요. 그 순간 정말 창피했습니다."

극적인 변화

Plexo 도입 후 겨우 1주일 만에 팀 분위기가 완전히 바뀌었습니다:

Day 1: 계정 생성과 Excel 파일 자동 임포트 (10분 소요)
Day 2: 첫 실시간 협업 경험 - "우와! 이게 되네요!"
Day 3: 팀 전체 교육 (30분) - "생각보다 쉽네요"
Day 7: 팀 회식에서 "다시는 Excel로 돌아가지 말자" 다짐

1개월 후의 놀라운 결과

  • ✅ 버전 충돌: 주 2회 → 0회
  • ✅ 회의 시간: 주 10시간 → 5시간 (50% 감소)
  • ✅ 프로젝트 정시 완료율: 40% → 85%
  • ✅ 팀 만족도: 5.2 → 9.2 (10점 만점)

"이제 클라이언트가 갑자기 현황을 물어봐도 자신 있게 답할 수 있어요. 모든 게 실시간으로 업데이트되거든요." - 최PM

에이전시 C사: 다중 도구 통합




⚡ Quick Start Guide

30분 안에 시작하기

🚀 즉시 실행 체크리스트

Step 1: 도구 선택 (5분)

  • □ 팀 규모 확인
  • □ 예산 검토
  • □ 무료 체험 신청

Step 2: 셋업 (10분)

  • □ 계정 생성
  • □ 팀원 초대
  • □ 기본 프로젝트 생성

Step 3: 데이터 이관 (10분)

  • □ Excel 파일 준비
  • □ Import 실행
  • □ 구조 검증

Step 4: 첫 협업 (5분)

  • □ 실시간 편집 테스트
  • □ 코멘트 기능 사용
  • □ 자동 저장 확인

🎉 축하합니다! Excel 지옥에서 탈출하셨습니다!

도구별 시작 링크


🎯 결론: 더 이상 미루지 마세요

Excel WBS를 고집하는 비용

# 1년 후 누적 손실
team_size = 10
hourly_rate = 50
yearly_loss = team_size * hourly_rate * 8 * 52  # 주당 8시간 낭비

print(f"연간 손실: ${yearly_loss:,}")  # $208,000
print("이 돈으로 할 수 있는 것:")
print("- 개발자 1명 추가 고용")
print("- 팀 전체 최신 장비 업그레이드")
print("- 연 2회 팀 워크샵")

오늘이 바로 그날





💬 마지막 한마디

"우리는 항상 이렇게 해왔어"는 가장 위험한 문장입니다.

Excel은 훌륭한 도구입니다.
하지만 팀 협업을 위해 만들어진 도구는 아닙니다.

망치로 나사를 박을 수는 있지만,
드라이버를 쓰는 게 더 현명하지 않을까요?

당신의 팀은 더 나은 도구를 사용할 자격이 있습니다.


🔄 마이그레이션 전략: 파일에서 시스템으로

점진적 전환 아키텍처

Excel에서 현대적 WBS 시스템으로의 전환은 Strangler Fig Pattern을 적용할 수 있습니다:

interface MigrationStrategy {
    phase1: "Excel 파일 Import/Export 지원";
    phase2: "하이브리드 운영 (Excel + Web)";  
    phase3: "완전 Web 기반으로 전환";
    rollback: "언제든 Excel로 되돌리기 가능";
}

class ExcelMigration {
    // Phase 1: 기존 Excel 파일을 구조화된 데이터로 변환
    async importExcelWBS(file: File): Promise<WBSStructure> {
        const workbook = XLSX.read(await file.arrayBuffer());
        const worksheet = workbook.Sheets[workbook.SheetNames[0]];
        
        return this.parseWBSStructure(worksheet);
    }
    
    // Phase 2: 언제든 Excel로 내보내기 가능
    async exportToExcel(wbs: WBSStructure): Promise<Blob> {
        const workbook = XLSX.utils.book_new();
        const worksheet = this.createWorksheet(wbs);
        
        XLSX.utils.book_append_sheet(workbook, worksheet, "WBS");
        return XLSX.writeFile(workbook, "project_wbs.xlsx");
    }
}

기술 스택 비교

측면Excel현대적 WBS 시스템
동시성File LockingCRDT + OT
버전 관리파일명 기반Git-like versioning
실시간성없음WebSocket + SSE
확장성O(n²)O(log n)
백업수동자동 + 클라우드
API없음RESTful + GraphQL

아키텍처 결정 기록 (ADR)

# ADR-001: WBS 관리 시스템 아키텍처

## 상태: 승인됨

## 컨텍스트
- 기존 Excel 기반 WBS는 동시 편집, 버전 관리, 실시간 동기화 한계
- 팀 규모 확장 시 O(n²) 복잡도로 관리 불가능
- 분산 팀 협업 요구사항 증가

## 결정
- CRDT 기반 실시간 동기화
- WebSocket을 통한 양방향 통신
- Event Sourcing으로 변경 이력 추적
- RESTful API로 확장성 보장

## 결과
- 동시 편집 충돌 문제 해결
- 실시간 협업 가능
- 확장 가능한 아키텍처

🛠️ 기술적 구현 고려사항

1. 데이터 모델링

WBS의 계층 구조를 효율적으로 저장하기 위한 모델:

-- Adjacency List Model (단순하지만 쿼리 복잡)
CREATE TABLE tasks (
    id UUID PRIMARY KEY,
    parent_id UUID REFERENCES tasks(id),
    name VARCHAR(255),
    start_date DATE,
    due_date DATE,
    assignee_id UUID
);

-- Nested Set Model (쿼리 효율적이지만 업데이트 복잡)
CREATE TABLE tasks (
    id UUID PRIMARY KEY,
    lft INTEGER,
    rgt INTEGER,
    level INTEGER,
    name VARCHAR(255)
);

2. 실시간 동기화 구현

// Operational Transform 기반 충돌 해결
class OperationalTransform {
    transform(op1, op2) {
        // 동시에 발생한 두 연산을 변환하여
        // 모든 클라이언트에서 같은 결과 보장
        if (op1.type === 'insert' && op2.type === 'insert') {
            return this.transformInsertInsert(op1, op2);
        }
        // ... 다른 연산 조합들
    }
}

🎯 도구 선택 가이드: 기술적 요구사항 기반

평가 매트릭스

class ToolEvaluation:
    def evaluate_wbs_tools(self):
        criteria = {
            'real_time_sync': 0.3,      # 실시간 동기화
            'scalability': 0.25,        # 확장성  
            'api_support': 0.2,         # API 지원
            'data_export': 0.15,        # 데이터 이식성
            'customization': 0.1        # 커스터마이징
        }
        
        tools = {
            'google_sheets': {'real_time_sync': 8, 'scalability': 6, 'api_support': 9},
            'notion': {'real_time_sync': 7, 'scalability': 7, 'api_support': 8},
            'jira': {'real_time_sync': 5, 'scalability': 9, 'api_support': 9},
            'modern_wbs_tools': {'real_time_sync': 9, 'scalability': 8, 'api_support': 9}
        }
        
        return self.calculate_scores(tools, criteria)

🔧 Plexo: 엔지니어가 설계한 WBS 시스템

기술적 특징

아키텍처:

  • Frontend: Vue 3 + TypeScript (타입 안전성)
  • Backend: NestJS + PostgreSQL (확장 가능한 API)
  • 실시간 동기화: Yjs CRDT (Google Docs와 동일한 기술)
  • 배포: Docker + Kubernetes (클라우드 네이티브)

핵심 기능:

  • RESTful API 완전 지원
  • WebSocket 실시간 동기화
  • Git-like 변경 이력 추적
  • Excel Import/Export (마이그레이션 지원)

개발자 친화적:

  • OpenAPI 스펙 제공
  • SDK 및 CLI 도구
  • Webhook 지원
  • 커스터마이징 가능한 UI

14일 무료 체험


소프트웨어 엔지니어링 관점에서 프로젝트 관리 도구를 평가해보는 것도 의미가 있습니다.

#SoftwareEngineering #DistributedSystems #CRDT #ProjectManagement