복잡도 이론과 프로젝트 관리

왜 복잡한 프로젝트는 자주 실패하는가

by 전규현 Raymond
015-8-complexity-theory-pm.png


"간단한 웹사이트인데 왜 6개월이나 걸려요?"

클라이언트의 당황스러운 질문입니다.

겉으로 보기엔 간단합니다. 로그인, 게시판, 결제. 끝.

그런데 실제로는? 소셜 로그인 5종, 다국어 지원, 실시간 알림, 외부 API 10개 연동, GDPR 준수, 접근성 기준 충족...

처음엔 간단해 보였던 프로젝트인데, 막상 진행하니 복잡도가 기하급수적으로 증가합니다. "이것도 해야 하고, 저것도 해야 하고" 하며 계획이 늘어납니다.

프로젝트 성공률 통계가 충격적입니다. 간단한 웹사이트는 성공률 85%, 중간 규모 시스템은 45%, 복잡한 엔터프라이즈는 15%입니다.

왜 복잡도가 높아질수록 실패율이 기하급수적으로 증가할까요?

복잡도 이론(Complexity Theory)이 답을 제공합니다. 복잡도는 단순히 "어렵다"가 아닙니다. 시스템의 상태 공간이 폭발적으로 증가하여 예측과 제어가 불가능해지는 현상입니다.

복잡도의 4가지 차원

첫 번째는 구조적 복잡도입니다. 컴포넌트 수와 그들 간의 연결을 측정합니다. 10개 모듈이 서로 완전히 연결되면 연결 수는 45개, 가능한 상호작용은 35조 가지가 됩니다. 한 모듈 수정이 어디에 영향을 줄지 예측 불가능합니다.

두 번째는 인지적 복잡도입니다. 인간이 한 번에 이해할 수 있는 정보량은 제한적입니다. Miller의 법칙에 따르면 7±2개가 한계입니다. 조건문이 7개 이상 겹쳐 있으면 그 의미를 한 번에 파악하기 어렵습니다. 변수명을 명확히 하고 조건을 분리하면 이해하기 쉬워집니다.

세 번째는 동적 복잡도입니다. 시간에 따른 변화와 피드백 루프를 의미합니다. 1개월차에는 작은 해킹 하나였는데, 3개월차에는 해킹 위에 해킹 5개, 6개월차에는 더 이상 수정 불가능한 스파게티 코드가 됩니다. 복잡도가 시간에 따라 지수적으로 증가합니다.

네 번째는 조직적 복잡도입니다. 콘웨이의 법칙에 따르면 "시스템 구조는 조직 구조를 따라간다"고 합니다. Frontend팀, Backend팀, DB팀, DevOps팀으로 분리되어 있으면, 결과적으로 4개의 분리된 시스템과 12개의 통신 채널, 16개의 회의, 64개의 문서가 생깁니다. 팀이 늘어날수록 통신 오버헤드가 n²으로 증가합니다.

복잡도 측정 방법

순환 복잡도는 코드의 분기 수를 측정합니다. 함수 내에 if문이 5개 있으면 순환 복잡도는 6입니다. 1-10은 단순하고 이해하기 쉬우며, 11-20은 복잡하고 주의가 필요하며, 21 이상은 매우 복잡하여 리팩토링이 필수입니다.

결합도와 응집도도 중요합니다. 결합도는 모듈 간 의존성을 의미합니다. 낮은 결합도는 좋고, 높은 결합도는 나쁩니다. 응집도는 모듈 내 요소들의 관련성을 의미합니다. 높은 응집도는 좋고, 낮은 응집도는 나쁩니다.

네트워크 밀도도 측정할 수 있습니다. 10개 모듈에 20개 연결이 있으면 밀도는 44%입니다. 밀도가 50%를 넘으면 과도하게 연결된 시스템입니다.

복잡도 관리 전략

첫 번째는 분할 정복입니다. 큰 시스템을 작은 독립적 모듈로 분해합니다. 모놀리식 시스템의 복잡도가 1000이라면, 마이크로서비스 5개로 나누면 각각 복잡도 50, 총 복잡도 250으로 75% 감소합니다.

두 번째는 추상화 계층 도입입니다. 복잡한 세부사항을 숨깁니다. API 호출 시 모든 헤더와 옵션을 직접 설정하는 대신, 간단한 함수 호출로 처리할 수 있게 합니다.

세 번째는 표준화와 패턴입니다. 반복되는 문제에 검증된 해결책을 적용합니다. 디자인 패턴, 아키텍처 패턴, 코딩 컨벤션을 일관되게 사용합니다.

네 번째는 복잡도 예산 설정입니다. 프로젝트 시작 시 복잡도 한계를 정합니다. 순환 복잡도 15, 결합도 0.3, 파일 최대 300줄, 함수 최대 50줄, 파라미터 최대 4개 등으로 제한을 두면, 한계를 넘으면 리팩토링을 강제합니다.

복잡도와 프로젝트 실패의 관계

복잡도 지수가 1이면 실패 확률 63%, 2이면 86%, 3이면 95%입니다. 복잡도가 선형적으로 증가하면, 실패 확률은 지수적으로 증가합니다.

복잡도 폭발 시나리오는 이렇습니다. 초기 1개월에는 "간단한 기능 추가"로 시작했는데, 3개월 후에는 "예상보다 연결이 많네", 6개월 후에는 "어디를 건드려도 다른 곳이 깨짐", 9개월 후에는 "처음부터 다시 만들자"가 됩니다.

핵심 정리

"복잡한 시스템은 실패하도록 설계되어 있다" - 찰스 페로

모든 프로젝트는 복잡해집니다. 피할 수 없습니다. 하지만 관리할 수는 있습니다.

복잡도를 측정하고, 한계를 설정하고, 지속적으로 단순화하세요. 완벽하게 단순한 시스템은 없지만, 관리 가능한 수준의 복잡도는 유지할 수 있습니다.

기억하세요. 복잡도와의 싸움은 한 번에 끝나는 것이 아닙니다. 매일, 매 코드 리뷰, 매 설계 결정에서 복잡도를 의식하고 관리해야 합니다. 다음 프로젝트부터 복잡도를 측정하는 것부터 시작해보세요. 작은 노력이 큰 차이를 만듭니다.

복잡한 프로젝트를 체계적으로 관리하고 싶으신가요? Plexo를 확인해보세요.

작가의 이전글노력 추정 정확도 높이기