좋은 개발자가 알아야하는 9가지 포인트들 - 5. 태스크 완료 시간 추정
1. 기본기 확실히 하기 2. 학습 능력 키우기 3. 의사 소통 잘하기 4. 문제 정의 잘하기 5. 태스크 완료 시간 추정 잘하기 6. 운영을 고려한 코드 작성하기 7. 서비스 사고 대처 능력 키우기 8. 결과를 내는데 집중하기 9. 영향력 갖기 (코딩 멍키) 많은 개발자들이 싫어하거나 잘 하지 못하는 것이 본인이 맡은 업무의 완료 시간을 추정하는 것이다. 반대 입장에서 생각해보면 이 추정이 잘 되어야 전체적인 계획이 가능해진다. 부정적으로 그걸 신이 알지 내가 알 수 있냐는 사람부터 너무 긍정적으로 빨리 끝낼 수 있다고 이야기하는 사람까지 다양한 사람들이 있다. 너무 길게 잡는 것도 문제지만 의욕만 앞서 너무 빠르게 잡아 전체적으로 일정을 지연시키는 것도 문제다. 추정을 매번 정확히 한다는 것은 불가능하겠지만 잘 추정하는 사람들의 공통점은 추정을 잘 하려 노력하는 사람들이고 결국 일을 잘 하는 사람들이다. 추정을 잘 하려면 어떤 부분에 잘 생각해봐야할까? 1. 내가 모르는 영역("unknown")이 무엇인지 생각해본다. 이 부분이 전체 업무 달성에서 얼마나 중요한지 가늠해보고 필요하면 관련 경험이 있는 사람들에게 물어본다. 많은 경우 내가 인지하고 있는 모르는 영역(known "unknown")은 큰 문제가 안 생기는데 인지하지 못하고 있는 모르는 영역(unknown "unknown")이 문제가 된다. 2. 내가 혹시라도 하고 있는 가정("assumption")이 무엇이 있는지 생각해본다. 잘못된 가정은 보통 다른 팀과 협업을 하는 경우 일의 분담과 관계되어서 발생한다. 협업을 하는 팀들과 어떤 형태의 산출물을 주고 받게 되는지 혹시라도 잘못하고 있는 가정이 있는지 확인할 필요가 있다. 내가 맡은 업무나 프로젝트가 중요할수록 업무를 마치 처음 보는 것처럼 잘못된 가정이나 내가 인지하지 못하고 있는 모르는 영역(unknown "unknown")이 있는지 처음부터 다시 복기해보는 것이 필요하다. 이걸 잘하면 결국 업무를 완료할 가능성이 높아지기에 일을 잘 하는 사람이 된다는 거다. 다음으로 신이 아닌 이상 매번 추정을 맞게 할 수는 없다. 늦어지는 것이 분명해진다면 마지막 순간까지 기다리지 말고 빨리 관련자들에게 업데이트하는 것이 필수다. 또 일정을 하나만 주지 말고 업무의 문맥을 파악했다면 일을 나눠서 일부를 먼저 완료하는 것도 방법이고 일정이 정말 중요한 경우 덜 중요하지만 오래 걸리는 기능을 일단 빼고 가는 것도 방법이다. 즉 융통성있게 의사소통을 통해 다양한 옵션을 생각해보라는 거다. 또 하나는 모든 결정이 중요하지 않다는 것을 인지하고 덜 중요한 결정들은 데드라인을 정해두고 그 시간 안에 최선의 결정을 하는 거다. 예를 들어 API 프레임워크를 무엇을 사용할지 정하는 거라면 완벽한 결정을 하려 시간을 끄는 것보다는 시간을 미리 정하고 그 안에 최선의 결정을 하는 식으로 가는 거다. 마지막으로 여러분이 만일 팀원들에게 일을 나눠주고 전체적인 일정을 만들어내야 하는 리더라면 다음을 고민해봐야 한다. * 내가 혹시 본의 아니게 팀원들에게 압력을 주며 알아서 빠른 일정을 이야기하도록 하지는 않는지? 만일 일정을 맞추는 것이 가장 중요하다면 그것부터 이야기하고 어떻게 맞출지 논의를 하는 편이 낫다 (어느 기능을 빼도 될지 등등). * 일정에 대한 내 의견을 이야기하는지? 이건 이틀이면 되는 거 아냐? 그 경우 팀원의 관점에서는 그 일정보다 더 시간이 걸리면 안 될 것 같은 압박을 받게 된다. * 업무 완료 시간을 단축하기 위해서 인원을 더 투입하면 된다고 생각하지는 않는지? 같이 일해본 경험이 없는 사람들이 투입되거나 새로 배워야하는 일에 투입된다면 팀원이 늘어난다고 단기적으로는 일이 더 빨리 진척되지 않는다. 가장 큰 이유는 사람이 늘면 보통 의사소통 비용이 늘어나기 때문이다. 이에 대해서는 Frederick Brooks가 쓴 "The Mythical Man-Month" 책을 보면 설명이 잘 나온다. 다시 한번 업무 완료 시간 추정은 내 매니저나 PM을 위해서 하는 것이 아니라 나를 위해서 내 업무를 잘 하기 위해서 필요하며 이는 연습과 실수를 통해서 더 잘할 수 있는 기술이란 점이다.