프로젝트 추정 기술을 향상시켜라
실천 사항
일을 쪼개서 하라는 말은 많이 들었지만 얼마나 쪼개야할지 기준을 정하진 못했다.
앞으로 이틀 이상 걸리는 작업은 더 쪼개려고 한다. 기준은 이틀로 정했다.
업무별 목표를 정해서 진행하는데, 목표를 구체적으로 정해야한다.
왜냐하면 불필요한 작업을 덜어주기 때문이다. 개발자로서 욕심이 생겨서 ‘X 작업할 때 평소 신경쓰였던 Y도 같이 고쳐야 겠다.’라고 생각하는 경우가 많다.
일을 시작할 때 아래 세가지를 정해야겠다.
- 작게 쪼개기
- 구체적인 목표 정하기
- 측정 가능한 마일스톤 정의하기
책 내용
정확한 추정치를 활용하여 프로젝트 계획을 추진하라.
“이 프로젝트를 마치는 데 시간이 얼마나 걸릴까요?” 소프트웨어 프로젝트를 진행할 때 자주 듣는 질문이다. 우리가 한 추정이 설사 부정확하더라도 다른 사업적 결정에 반영된다. 추정이 형편없으면 큰 대가를 치러야 할 수도 있다.
유연성을 보장하는 정확한 추정치를 도출하는데 도움되는 전략 몇가지
- 프로젝트를 더 작은 작업으로 분해하라.
- 자신 또는 다른 누군가가 원하는 작업 시간 말고, 작업에 실제로 드는 시간을 기준으로 추정하라.
- 추정을 최상의 시나리오가 아닌 확률 분포로 생각하라.
- 실제 업무 담당자가 추정하게 하라.
- 기준점 편향에 주의하라.
- 하나의 업무를 여러 방법을 사용해 추정하라.
- 이상적인 인월(person-month)을 조심하라.
- 기존 데이터로 추정치를 검증하라.
- 범위가 커질 수 있는 작업을 타임 박스로 제한하라.
- 다른 이들이 추정에 이의를 제기하도록 허용하라.
추정을 반복해서 수정하면 프로젝트 결과물이 나아질 수 있다. 프로젝트 초반에는 추정에 불확실한 부분이 많지만, 세부사항이 구체화될수록 변화의 여지가 줄어든다.
미지의 변수를 고려하라.
일정을 크게 어긋나게 한 원인은 아예 추정하거나 계산할 수 없었던 온갖 미지의 프로젝트와 문제에 있다.
- 새로운 코드베이스를 위한 단위 테스트 장치를 개발하고 테스트용 자체 모의 라이브러리, 단언문 라이브러리 작성하기
- 일련의 스타일 가이드라인이 장기적으로 코드 품질을 개선하는 데 도움이 된다는 것, 그리고 그렇게 많은 코드를 작성하기 전에 이런 가이드라인을 개발해야 한다는 것을 깨닫기
- 우선순위가 높은 일부 고객에 대응하느라 작업 중단하기
- 사용자가 재현하기 어려운 특정한 방법을 통해 발생하는 버그 수정하기
- 고객 데이터가 많아지면서 발생하는 제품의 확장성 문제 해결하기
- 프로젝트 중간에 초창기 개발자를 다른 회사에 빼앗기기: 많은 지식을 이어받고 작업을 재분배해야 했다.
‘이 프로젝트 엔지니어링 작업을 완료하기까지 1개월이 걸릴 것이다.’라는 말은 달력상 1개월 이상이 소요된다는 말이다.
평소 개발자는 눈에 띄는 버그 수정, 면접 진행, 팀 회의 참석, 관리자와 1:1 대화 진행, 비상 당번 근무, 신입 개발자 교육, 이메일 회신 등 많은 엔지니어링 외적 업무를 반복해서 처리해야 한다. 이런 사항을 고려하면 하루 8시간을 근무한다고 해서 프로젝트에 8시간을 쓴다고 볼 수는 없다.
일회성 방해 요소도 발생한다.
- 엔지니어링 조직에서는 버그 픽싱 데이, 해커톤, 현장 업무, 업무 평가 등의 일정을 진행한다.
- 운영 팀이 업그레이드, 유지 보수, 데이터 마이그레이션을 위해 개발자 업무 중단 시간을 잡아두기도 한다.
- 영업 팀이 계약을 성사시키기 위해 몇 가지 맞춤형 작업을 긴급하게 요청할 수도 있다.
- 예상치 못한 장애나 우선순위가 높은 보안 버그를 고쳐야할 때도 있다.
- 핵심 사업 지표가 갑자기 떨어져서 조사가 필요할 때도 있다.
- 팀원이 아프거나 휴가를 갈 때도 있다.
구체적인 프로젝트 목표와 측정 가능한 마일스톤을 정의하라.
프로젝트 목표를 설정하는 간단한 작업을 하면 두 가지 구체적인 혜택이 뒤따른다.
첫째, 잘 정의해둔 목표는 작업 목록에서 꼭 해야 할 일과 하면 좋은 일을 구분하는 중요한 필터가 된다. 목표가 구체적일수록 기능을 구별하는 데 도움이 된다. 구체적인 프로젝트 목표의 예를 들면 다음과 같다.
- 홈페이지 사용자 지연 시간의 p95를 0.5초 이하로 감소시키기
- 사용자가 콘텐츠 유형에 따라 결과를 필터링할 수 있는 새로운 검색 기능 배포하기
- 서비스를 루비에서 C++로 포팅하여 성능 개선하기
- 서버에서 설정값을 요청할 수 있게 웹 애플리케이션 재설계하기
- 통신망 접속이 없을 때도 콘텐츠에 접근할 수 있게 오프라인에서도 모바일 애플리케이션 지원하기
- 고객당 매출을 증가시키기 위해 제품 결제 흐름 A/B 테스트하기
- 국가별로 핵심 지표를 세분화하는 새로운 분석 보고서 개발하기
두번째는 핵심 이해 관계자들 사이에 명확성과 공통의 이해가 형성된다는 것이다.
재작성 프로젝트는 매우 조심스럽게 접근하라.
무언가를 바닥부터 재작성하려는 욕구는 소프트웨어 개발자의 아주 일반적인 특징이다.
안타깝게도 재작성 프로젝트는 매우 위험한 편이다. 재작성 프로젝트가 특히 골머리를 썩이는 데는 몇 가지 이유가 있다.
- 재작성 프로젝트도 다른 소프트웨어 프로젝트와 똑같이 어려운 프로젝트 계획과 추정을 거쳐야한다.
- 원래 버전에 이미 익숙하기 때문에 새로운 영역을 맡을 때보다 재작성 프로젝트를 크게 과소평가하는 경향이 있다.
- 다른 개선사항도 추가하고 싶은 생각이 들기 쉽다
- ‘두 번째 시스템 효과’: 처음 만들 때는 조심스럽게 진행하고 단순하게 하려고 하지만 두 번째는 과하게 설계하는 경향이 있다.
마라톤 중간에 전력 질주하지 마라.
- 근무 시간이 늘어나면 시간당 생산성이 떨어진다.
- 생각보다 일정이 더 지연됐을 수 있다.
- 추가 근무 시간으로 인해 팀원들이 번아웃을 경험할 수 있다.
- 추가 근무는 팀 내 역학 관계를 망가뜨릴 수 있다.
- 마감 기한이 다가올수록 의사소통 간접 비용이 늘어난다.
- 기한을 향한 전력 질주 때문에 기술 부책 유발된다.
초과 근무할 필요가 있다고 생각한다면 팀원의 동의를 구해라.
- 지금까지 타임라인이 지연된 주요 원인을 모두가 이해하고 공유하라.
- 프로젝트 계획과 타임라인을 현실적으로 수정하라.
- 프로젝트가 수정한 타임라인보다 더 지연된다면 전력 질주를 포기하라.
핵심 요약
- 프로젝트 계획에 추정을 포함시켜라.
- 미지의 변수를 고려해서 일정을 여유 있게 잡아라.
- 측정할 수 있는 마일스톤을 정의하라.
- 가장 위험한 작업을 먼저 하라.
- 초과 근무의 한계를 이해하라.