프로젝트 설계
본문네 명이 하던 프로그램 프로젝트가 마감을 앞두고 늦어지자, 친구 네 명을 더 불러 여덟 명이 되었다. 손이 두 배가 되었으니 빨리 끝날 것 같았다. 그런데 새로 온 친구들에게 코드를 설명하고, 누가 무엇을 맡을지 정하고, 서로 만든 부분을 맞추느라 오히려 일이 더 늦어졌다. 사람을 늘렸는데 왜 늦어질까? 나누어 만든 코드가 처음부터 잘 맞물리게 하려면 코드를 쓰기 전에 무엇을 정해 두어야 할까?
4.2.1소통 경로의 수
여러 사람이 함께 만드는 프로그램에서는 각자 만든 부분이 서로 맞물려야 한다. 그러려면 서로의 코드가 어떤 값을 주고받는지 알아야 하고, 바뀐 것이 있으면 알려야 한다. 팀원이 두 명이면 맞출 관계가 하나지만, 네 명이면 여섯, 여덟 명이면 스물여덟이다. 일하는 손은 사람 수에 비례해 늘지만, 맞춰야 할 관계는 사람 수의 제곱에 가깝게 늘어난다. 그리고 새로 들어온 사람은 일을 배우는 동안 기존 팀원의 시간을 빼앗는다.
팀원이 \(n\)명이면 둘씩 맺는 소통 경로는 \(\dbinom{n}{2} = \dfrac{n(n-1)}{2}\)개이다. 이 부담을 줄이려면 각 부분이 주고받는 입력과 출력, 함수의 이름과 매개변수, 자료 구조를 미리 정해 두어, 서로의 속을 몰라도 약속만 지키면 맞물리게 한다. 이 약속을 인터페이스라 한다.
그림 1에서 팀원 수를 바꾸어 보자. 4명이면 경로 6개, 8명이면 28개, 12명이면 66개이다. 사람을 두 배로 늘리면 소통할 경로는 네 배 넘게 늘어난다. 그래서 늦어진 프로젝트에 사람을 더 넣으면, 늘어난 소통과 교육의 부담이 늘어난 손을 잡아먹어 오히려 더 늦어지기도 한다. 인터페이스를 미리 정해 두면 각자는 자기 부분과 약속만 신경 쓰면 되므로, 실제로 맞춰야 할 경로가 크게 준다.1
4.2.2코드를 쓰기 전의 설계
좋은 프로젝트는 코드를 쓰기 전에 이미 절반이 끝나 있다. 먼저 프로그램 전체의 입력과 출력을 정하고, 그 사이의 일을 몇 개의 모듈로 나눈다. 모듈마다 무엇을 받아 무엇을 돌려주는지 함수의 꼴로 적고, 모듈 사이에 주고받을 자료 구조를 정한다. 그다음 알고리즘을 고르고 복잡도를 어림한다. 마지막으로 누가 어느 모듈을 맡을지, 언제까지 무엇을 끝낼지 일정을 세운다. 모듈마다 작은 시험을 미리 정해 두면, 나중에 합칠 때 어디가 맞지 않는지 금방 찾을 수 있다.
4.2.3예제 풀이
4명 팀에 4명이 더 들어왔다. 소통 경로는 몇 개에서 몇 개로 늘어나는가? 프로그램을 모듈 4개로 나누어 두 명씩 맡기고, 모듈끼리는 정해 둔 인터페이스로만 주고받는다면, 실제로 맞춰야 할 경로는 몇 개로 줄어드는가? 모듈들은 한 줄로 이어져 이웃한 모듈끼리만 자료를 주고받는다.
소통 경로는 \(4 \times 3 \div 2 = 6\)개에서 \(8 \times 7 \div 2 = 28\)개로 늘어난다.
모듈 안에서는 두 명이 하나의 경로로 맞추므로 4개이고, 모듈 사이는 이웃끼리 3개의 인터페이스만 맞추면 된다. 따라서 맞춰야 할 경로는 \(4 + 3 = 7\)개로, 28개의 4분의 1에 불과하다. 즉 팀이 커질수록 일을 잘 나누고 그 경계를 약속으로 고정하는 설계가 중요해진다. 그래서 프로젝트 계획서에는 기능 목록뿐 아니라 모듈 사이의 인터페이스를 함수의 꼴로 적어 둔다.
아래 탐구 카드에서 프로젝트의 입력과 출력, 모듈과 인터페이스, 역할과 일정을 담은 설계서를 써 보자.
- '늦어진 소프트웨어 프로젝트에 사람을 더 넣으면 더 늦어진다'는 말은 1975년 브룩스가 「맨먼스 미신」에서 쓴 것으로, 브룩스의 법칙이라 불린다. 그는 IBM의 거대한 운영 체제 개발을 이끌며 이를 겪었다.
팀원이 \(n\)명이면 소통 경로가 \(n(n-1)/2\)개로 사람 수의 제곱에 가깝게 늘어, 사람을 더 넣으면 소통과 교육의 부담이 늘어난 손을 잡아먹을 수 있다. 그래서 코드를 쓰기 전에 입력과 출력, 모듈과 인터페이스, 자료 구조와 알고리즘, 역할과 일정을 정해 나누어 만든 코드가 약속만으로 맞물리게 한다. 처음 질문의 프로젝트는 인터페이스 없이 사람만 늘려 맞춰야 할 관계가 6개에서 28개로 늘어 더 늦어졌다.