- 프로젝트 추정이나 위임은 “이걸 만들기” 같은 큰 요청을 명확한 작업 목록으로 바꾸는 데서 시작하며, 각 항목은 원하는 변화와 완료 상태를 드러내야 함
- 분해 과정은 아이디어·스케치·초기 목록에서 필요한 단계를 적고, 각 항목이 충분히 정의될 때까지 재귀적으로 세분화하는 방식임
- 야외 활동용 streak tracker 예시는 데이터 모델, 캘린더 보기, 활동 기록, streak 계산, streak freeze로 점차 나뉘며 불확실한 지점도 함께 드러남
- “충분히 정의된 작업”은 원하는 변화, 완료 모습, 완료까지의 모든 단계, 즉시 시작에 필요한 정보를 모두 예라고 답할 수 있는 상태임
- 작업 분해는 경험 기반의 패턴 매칭이 필요한 기술이므로, 초보 팀에는 계획을 시도하고 피드백받는 안전한 연습 기회가 필요함
큰 프로젝트를 작업 목록으로 바꾸기
- 프로젝트 추정에 관한 기존 논의는 이미 명확한 작업 목록이 있다고 가정했지만, 실제 현장에서는 그 이전 단계인 작업 분해가 먼저 필요할 수 있음
- 작업 분해는 큰 프로젝트를 구성 작업으로 나누는 과정이며, 추정이나 위임을 하려면 “이 그림을 만든다” 같은 단일 작업보다 더 세밀한 단위가 필요함
- 혼자 진행하는 개인 프로젝트라면 스케치만으로도 충분할 수 있지만, 다른 사람에게 맡기거나 기간을 추정하려면 세부성을 더 높여야 함
예시: 개인용 streak tracker
- 야외 활동을 한 날을 추적하는 개인용 streak tracker가 예시로 사용됨
- Streaks 앱과 비슷한 형태를 원함
- 달리기, 자전거, 스키 같은 야외 활동 옵션을 넣고 싶어 함
- Duolingo의 streak freeze 기능도 포함하려 함
-
1차: 스케치에서 시작
- 시각적 목업은 만들 기능을 이해하기 쉽게 보여주는 좋은 출발점임
- 혼자 만드는 프로젝트라면 이 정도 스케치만으로 바로 코드를 작성할 수도 있음
- 추정이나 위임이 목적이라면 “이 그림을 만든다”보다 더 잘게 나뉜 작업 목록이 필요함
-
2차: 큰 기능 단위로 나누기
- 첫 번째 분해에서는 프로젝트를 대략적인 구성 요소로 나눔
- 데이터 모델링
- 현재 주의 날짜를 보여주는 캘린더 보기
- 아이콘을 클릭해 활동을 기록하고 해당 날짜를 streak 추적상 완료로 표시하는 인터랙티브 캘린더
- 현재 streak 길이 계산과 표시
- streak freeze 구현
- 예시를 단순화하기 위해 배포, 데이터베이스 설정 같은 운영 작업은 제외함
- 실제 프로젝트, 특히 여러 사람이 참여하는 프로젝트라면 배포, 프론트엔드, 백엔드 작업을 별도 항목으로 나누는 편이 더 적절함
- 이 단계만으로도 어느 정도 추정은 가능하지만, freeze 누적·추적 방식이나 과거 기록, 활동 유형 추가·삭제 같은 불확실성이 남아 있음
-
3차: 완료 기준이 보이도록 더 나누기
- 데이터 모델은 활동 유형, 기록된 활동, freeze, streak로 나뉨
- 활동 유형은 run/bike/ski/climb 같은 하드코딩 목록이면 충분함
- 기록된 활동은 날짜와 유형을 가짐
- freeze는 획득 날짜와 사용 날짜를 가짐
- streak는 시작일, 종료일, 활동 유형별 집계 정보를 가짐
- 정적 캘린더 보기는 주간 보기, 홈 화면, 월간 보기, 탐색, 날짜 이동 입력으로 나뉨
- 날짜 이동은 복잡한 fuzzy date 입력 없이 HTML5 date 위젯을 사용할 수 있음
- 동적 주간 캘린더는 월간 보기에 동적 입력을 넣지 않고, 특정 날짜의 활동 유형 클릭으로 완료 기록을 남김
- streak 계산과 표시는 활동 기록을 훑어 streak를 계산하고, 현재 streak를 UI에 표시하며, UI에서 활동을 기록하면 streak를 다시 계산함
- streak freeze는 누적, 중복 누적 방지, UI에서 사용과 잔여 수 표시까지 포함함
- freeze 획득 기준 X일은 일단 하드코딩해도 됨
- freeze는 다음 streak로 이월될 수 있음
- 과거 활동을 수정해 streak를 재계산할 때 freeze를 다시 얻는 중복 누적을 막아야 함
반복해서 적용하는 분해 절차
- 작업 분해는 한 번에 끝나는 설계가 아니라 반복 과정임
- 작업 목록이나 하나의 큰 프로젝트에서 시작함
- 그 작업을 끝내기 위해 필요한 단계를 생각해 적음
- 각 단계가 충분히 정의됐는지 확인함
- 충분하지 않으면 해당 항목을 다시 분해함
- 각 반복은 완전하거나 정확할 필요가 없고, 이전 목록보다 조금이라도 더 확장되면 충분함
- 모든 작업이 충분히 정의될 때까지 같은 과정을 반복함
“작업”과 “충분히 정의됨”의 기준
- 소프트웨어 개발과 프로젝트 추정에서 작업은 충분히 정의되고, 완전하며, 변화를 전달하는 일의 단위임
- “work on stuff”는 요구사항 윤곽이 없기 때문에 작업이 아님
- “나무를 벤다”는 전기톱만 가져왔다면 완전한 작업이 아님
- 업무 맥락에서 작업은 수행 후 무언가가 달라져야 의미가 있음
- 작업이 충분히 정의됐는지는 작업자가 다음 질문에 모두 “예”라고 답할 수 있는지로 판단함
- 원하는 변화가 무엇인지 이해하는가
- “완료”가 어떤 모습인지 이해하는가
- 완료까지 필요한 모든 단계를 정의할 수 있는가
- 차단 요소나 의존성이 없다고 할 때, 지금 바로 시작하는 데 필요한 정보를 모두 가지고 있는가
- 조직 맥락에 따라 프로젝트 매니저, 주요 이해관계자, 감사자 같은 관찰자도 이 질문들에 “예”라고 답할 수 있어야 할 수 있음
- 버그 수정처럼 더 이상 세분화하기 어려운 미지수가 있는 작업도 있음
- 이런 경우에는 timeboxing 같은 기법을 사용할 수 있음
경험으로 쌓이는 분해 감각
- 작업 분해는 연습이 필요한 기술이며, 처음부터 쉽게 느껴지지 않는 것이 정상임
- 예시에서 데이터 모델링을 먼저 둔 이유는 명확한 알고리듬이 아니라 경험에 따른 직관임
- 비슷한 도구를 만들 때 데이터 모델을 먼저 잡으면 일이 더 잘 풀렸던 경험이 있음
- Django는 모델 데이터 우선 흐름에 더 잘 맞는 affordance를 제공함
- 여러 프로젝트를 보거나 수행한 경험이 부족하면 시작점을 정하기 어려울 수 있음
- 팀이 이 능력을 기르려면 안전한 환경에서 프로젝트 계획을 만들고, 분해해 보고, 피드백을 받아야 함
- 초기 계획이 많이 틀리더라도 처벌하지 않으면, 그 실수가 다음번 패턴 매칭에 쓰일 경험 데이터가 됨
예시 프로젝트의 추정 결과
- 보너스 추정에서는 작업을 세분화한 뒤 복잡도, 불확실성, 예상 일수, 최악의 경우 일수를 붙임
- 전체 예상치는 15.5일, 최악의 경우는 23.5일로 계산됨
- 주요 항목 중 streak 계산과 freeze 누적은 medium 복잡도와 moderate 불확실성으로 각각 예상 3일, 최악 4.5일임
- freeze 중복 누적 방지는 small 복잡도지만 extreme 불확실성으로 예상 1일, 최악 5일로 잡힘
- 실제로는 약 열두 번의 저녁과 긴 비행 한 번에 완성했지만, 디자인을 크게 생략했고 freeze 알고리듬에는 나중에 마주칠 버그가 있을 가능성이 있음