27장: 프로그램의 크기가 구현에 미치는 영향
27장: 프로그램의 크기가 구현에 미치는 영향
- 소프트웨어 규모 확대는 작은 프로젝트의 모든 요소를 같은 비율로 늘리는 일이 아님.
- 코드가 10배인 프로젝트는 전체 노력이 약 30배, 구현은 25배, 아키텍처와 시스템 테스트는 40배가 들 수 있으며 오류도 15배 이상 생길 수 있음.
- 작은 프로젝트의 비형식적인 방식을 그대로 키우면 통제하기 어렵고, 큰 프로젝트의 엄격한 방식을 작은 프로젝트에 그대로 쓰면 절차의 무게에 눌림.
27.1 의사소통과 규모
- 팀원이
n명이고 모두 서로 소통한다면 잠재적인 의사소통 경로는 n(n-1)/2개임.
- 2명은 1개, 5명은 10개, 10명은 45개이며 50명은 1,200개가 넘음.
- 팀이 커질수록 의사소통 시간과 오해 가능성이 급격히 늘어나므로 경로를 합리적으로 제한하고 정돈할 조직 기법이 필요함.
- 대표적인 방법은 정보를 문서로 공식화하는 것임. 모든 사람이 매번 서로 설명하는 대신 공통 텍스트·그림·전자 문서를 읽고 갱신함.
27.2 프로젝트 규모의 범위
- 프로젝트 규모의 범위가 넓어 하나의 크기를 전형적이라고 할 수 없음.
- 큰 프로젝트의 수는 적지만 프로젝트마다 많은 인력이 참여하므로 전체 프로그래머의 상당수가 큰 팀에서 일함.
| 팀 규모 |
전체 프로젝트 중 비율 |
전체 프로그래머 중 비율 |
| 1~3명 |
25% |
5% |
| 4~10명 |
30% |
10% |
| 11~25명 |
20% |
15% |
| 26~50명 |
15% |
20% |
| 50명 이상 |
10% |
50% |
27.3 프로젝트 규모가 오류에 미치는 영향
- 프로젝트가 커지면 오류의 수뿐 아니라 발생 원인의 구성도 달라짐.
- 작은 프로젝트에서는 구현 오류가 전체의 약 75%를 차지하고 개별 프로그래머의 역량이 품질에 큰 영향을 줌.
- 큰 프로젝트에서는 요구사항과 아키텍처 작업이 늘어 구현 오류의 비율이 약 50%까지 낮아질 수 있음. 다만 일부 대형 프로젝트에서는 구현 오류가 여전히 75%에 이름.
- 규모가 2배가 되면 오류 수도 단순히 2배가 되는 것이 아니라 코드 1,000줄당 결함 밀도까지 증가함.
| 프로젝트 크기 |
일반적인 오류 밀도 |
| 2K LOC 미만 |
KLOC당 0~25개 |
| 2K~16K LOC |
KLOC당 0~40개 |
| 16K~64K LOC |
KLOC당 0.5~50개 |
| 64K~512K LOC |
KLOC당 2~70개 |
| 512K LOC 이상 |
KLOC당 4~100개 |
- 대형 프로젝트가 소형 프로젝트와 같은 오류율을 달성하려면 요구사항, 아키텍처, 구현 전반에서 더 강한 결함 예방과 제거 활동이 필요함.
- 산업 자료에서 초대형 프로젝트의 KLOC당 오류 수는 소형 프로젝트보다 최대 4배까지 많았음.
27.4 프로젝트 규모가 생산성에 미치는 영향
- 2K LOC 이하에서는 개인의 역량이 생산성에 가장 큰 영향을 주지만 규모가 커질수록 팀 규모와 조직 방식의 영향이 커짐.
- 한 실험에서는 2명 팀이 3명 팀보다 생산성이 39% 높았으며, 작은 인원 차이도 생산성에 영향을 줄 수 있음을 보여 줌.
| 프로젝트 크기 |
직원 1명·연간 LOC 범위 |
COCOMO II 명목값 |
| 1K |
2,500~25,000 |
4,000 |
| 10K |
2,000~25,000 |
3,200 |
| 100K |
1,000~20,000 |
2,600 |
| 1,000K |
700~10,000 |
2,000 |
| 10,000K |
300~5,000 |
1,600 |
- 실제 생산성은 소프트웨어 종류, 인력 수준, 언어, 방법론, 복잡도, 도구, LOC 집계 방식 등에도 크게 좌우됨.
- 세부 수치보다 규모가 커질수록 생산성이 낮아지는 경향이 중요함. 소형 프로젝트는 대형 프로젝트보다 2~3배, 가장 작은 프로젝트는 가장 큰 프로젝트보다 5~10배 높은 생산성을 보일 수 있음.
27.5 프로젝트 규모가 개발 활동에 미치는 영향
활동 비율과 규모
- 1명 프로젝트에서는 개인이 성공과 실패를 좌우하지만, 25명 프로젝트에서는 조직이 더 큰 영향을 미침.
- 작은 프로젝트에서는 구현이 전체 개발 시간의 최대 65%를 차지하고, 중간 규모에서는 약 50%로 줄어듦.
- 큰 프로젝트에서는 아키텍처, 통합, 시스템 테스트가 더 빠르게 늘어 구현이 전체 노력에서 차지하는 비율이 작아짐.
- 구현 작업은 규모에 거의 선형으로 증가하지만 다음 활동은 규모보다 빠르게 증가함.
- 의사소통, 계획, 관리
- 요구사항 개발, 시스템 기능 설계, 인터페이스 설계·명세, 아키텍처
- 통합, 결함 제거, 시스템 테스트, 문서 작성
- 코드가 10배로 커지면 구현 노력은 약 25배, 계획은 25~50배, 통합은 30배, 아키텍처와 시스템 테스트는 40배까지 늘 수 있음.
- 약 10K LOC 프로젝트는 전체 노력의 5% 정도를 요구사항과 아키텍처에 쓸 때 비용이 낮았지만, 100K LOC에서는 15~20%가 적절했음.
- 규모와 관계없이 규율 있는 코딩, 동료의 설계·코드 검사, 좋은 도구, 고급 언어는 유용하며 큰 프로젝트일수록 더 중요함.
프로그램, 제품, 시스템, 시스템 제품
- 프로그램: 개발자 자신이나 소수 사용자가 비형식적으로 사용하는 단일 프로그램임.
- 제품: 다른 환경의 사용자도 쓸 수 있도록 충분히 테스트하고 문서화하며 타인이 유지보수할 수 있게 만든 프로그램으로, 단순 프로그램보다 약 3배의 비용이 듦.
- 시스템: 여러 프로그램이 함께 동작하도록 인터페이스를 만들고 통합한 것으로, 단순 프로그램보다 약 3배의 비용이 듦.
- 시스템 제품: 제품 수준의 완성도와 시스템의 다중 구성 요소를 모두 갖추며 단순 프로그램보다 약 9배의 비용이 듦.
- 단순 프로그램 경험만으로 시스템 제품을 추정하면 비용과 일정을 거의 10배까지 과소평가할 수 있음.
- 2K LOC 구현 경험만으로 2K 프로그램 전체를 추정하면 비구현 활동을 빠뜨려 실제 시간이 약 50% 더 들 수 있고, 같은 경험으로 32K 프로그램을 추정하면 실제 시간이 100% 더 들 수 있음.
방법론과 규모
- 작은 프로젝트의 방법론은 비형식적이고 직관적인 반면, 큰 프로젝트의 방법론은 엄격하고 의식적으로 계획됨.
- 명시적으로 고르지 않았더라도 모든 작업 방식은 방법론임. 큰 프로젝트에서는 무의식적인 선택만으로 복잡성을 감당할 수 없음.
- 형식적인 절차를 잘못 적용하면 산출물 작성 비용이 이득을 삼키지만, 큰 팀의 의사소통을 조정하려면 더 많은 계획과 문서가 필요함.
- 1K LOC 프로젝트는 노력의 약 7%를 문서 작업에 쓰지만 100K LOC 프로젝트는 약 26%를 쓸 수 있음.
- 문서는 그 자체가 목적이 아니라 계획을 충분히 생각하고 팀 전체에 전달한 결과여야 함. 내용 없는 범용 문서를 형식적으로 만들고 있다면 방법론을 잘못 적용한 것임.
- 큰 방법론을 작은 프로젝트에 맞게 덜어 내기보다 작은 방법을 필요한 만큼 확장하는 편이 나음.
- 가벼움과 무거움 중 하나를 고르는 것이 아니라 프로젝트의 규모와 종류에 맞는 적정 무게(right-weight)의 방법론을 선택함.
참고 자료
- 배리 뵘·리처드 터너, Balancing Agility and Discipline (Addison-Wesley, 2004): 프로젝트 규모에 따른 애자일 방식과 계획 중심 방식의 균형을 다룸.
- 앨리스터 코번, Agile Software Development (Addison-Wesley, 2002): 규모와 중요도에 맞는 방법론 선택과 Crystal 방법론을 설명함.
- 배리 뵘, Software Engineering Economics (Prentice Hall, 1981), Software Cost Estimation with Cocomo II (2000): 규모가 비용·생산성·품질과 개발 활동에 미치는 영향을 다룸.
- 케이퍼스 존스, Estimating Software Costs (McGraw-Hill, 1998), Programming Productivity (1986): 소프트웨어 생산성과 프로그램 규모의 영향을 자료로 분석함.
- 프레더릭 브룩스, The Mythical Man-Month, Anniversary Edition (Addison-Wesley, 1995): 대규모 팀과 프로젝트 관리 문제를 다룸.
- 피터 디그레이스·레슬리 스탈, Wicked Problems, Righteous Solutions (Yourdon Press, 1990): 규모와 형식성에 맞춰 개발 프로세스를 조정하는 방법을 다룸.
- 케이퍼스 존스, Program Quality and Programmer Productivity (IBM Technical Report, 1977): 대형 프로젝트와 소형 프로젝트의 활동·품질 차이를 분석함.
요점 정리
- 프로젝트가 커질수록 의사소통을 의식적으로 지원해야 한다. 방법론의 가치는 의사소통 문제를 얼마나 잘 줄이는지로 판단해야 한다.
- 다른 조건이 같다면 큰 프로젝트는 작은 프로젝트보다 생산성이 낮다.
- 다른 조건이 같다면 큰 프로젝트는 코드 1,000줄당 오류가 더 많다.
- 작은 프로젝트에서 당연하게 처리하던 활동도 큰 프로젝트에서는 세심하게 계획해야 하며, 규모가 커질수록 구현의 비중은 낮아진다.
- 무거운 방법론을 축소하기보다 가벼운 방법론을 확장하는 편이 낫다. 가장 효과적인 방식은 프로젝트에 맞는 적정 무게의 방법론이다.