Three Queues Management
소프트웨어를 개발하다 보면 복잡한 상황을 자주 마주한다. 계획대로 일하지 못하게 만드는 문제들이 쏟아지는 것. 이 때문에 계획대로 일을 하고 있다가도 정신을 차리고 보면 계획하지 않았던 다른 일을 하는 경우가 종종 있다.
그러다 보면 원래 계획한 일은 차일피일 미뤄진다. 금요일 오후 미팅에서 이번 주에 무슨 일을 했는지 돌아보면 정확히 무슨 일을 했는지 기억이 나질 않고 계획했던 일은 절반도 해결하지 못한 상태가 된다. 복잡한 상황이 일을 어느 하나 제대로 못 하게 만든 것.
사실 우리는 한 번에 하나의 일밖에 처리하지 못한다. 일을 동시에 처리하지 못한다. 따라서 복잡한 상황에서 일을 한 번에 하나씩 처리할 수 있는 환경을 만들어야 한다. 오늘은 복잡한 상황에서 단순하게 일하는 나만의 방법을 소개한다.
오늘 소개할 방법을 Three Queues Management라고 이름 붙였다.
큐(Queue)는 자료 구조에서 사용하는 용어다. 일종의 투 두 리스트(To Do List). 다만 새로운 일이 생기면 가장 아랫줄에 적고 가장 위에 적은 일부터 처리해야 하는 선입선출(First In First Out)의 특징이 있다. 큐는 자료 구조에서 사용하는 용어인 만큼 '적는다'는 표현 대신 '쌓는다'고 표현한다.
이제 복잡한 상황을 단순하게 만들기 위해 어떤 큐를 어떻게 활용하는지 확인해보자.
첫 번째 큐는 백로그 큐다. 계획하지 않은 일을 쌓는 곳이다. 계획한 일을 하던 중에 누군가 새로운 일을 해야 한다고 요청하면 그 일은 백로그 큐에 쌓는다.
백로그 큐는 분류에 따라 여러 개를 둘 수 있다. 혹은 하나의 백로그 큐에서 태그 등으로 분류할 수도 있다. 혹은 둘 다 할 수도 있다. 하지만 많은 분류 두는 건 이후 메인 큐를 만들 때 어렵게 만든다. 5개 내로 분류해두는 걸 권한다.
분류의 기준은 저마다 다를 수밖에 없다. 예를 들자면 도메인의 종류일 수도 있다. 개인이 여러 플랫폼을 맡고 있다면 그게 기준일 수도 있다.
계획하지 않은 일이 생기면 백로그 큐에 쌓아두고 신경 쓰지 말자. 계획한 일에 집중할 수 있게.
두 번째는 메인 큐다. 팀마다 업무 주기가 있을 것이다. 1주 단위로 진행할 수도, 2주 단위일 수도 있다. 한 업무 주기 내에 해결하기로 계획한 일을 쌓는 곳이 메인 큐다.
새로운 주기가 시작되기 전에 아직 계획하지 않은 일을 쌓아둔 백로그 큐에서 하나씩 일을 꺼내서 어떤 일을 메인 큐에 넣을지 판단한다. 해결해야 한다면 메인 큐로 옮기고 그렇지 않다면 다시 백로그 큐에 넣는다.
메인 큐에 넣는 기준 역시 저마다 다르다. 중요한 건 팀에서 합의된 기준이 있어야 한다는 점이다. 우리 팀에선 OKR을 사용하고 있다. OKR을 기준으로 백로그 큐에서 꺼낸 일을 이번에 해결할지, 한다면 무엇을 먼저 할지 판단하고 메인 큐를 완성한다.
메인 큐가 완성되면 일을 하나씩 꺼내서 해결하자. 계획대로.
세 번째는 사이드 큐다. 메인 큐에 쌓인 일만 처리해야 한다면 시급한 문제를 해결하지 못할 수도 있다. 시급한 문제를 다루기 위해 다음 스프린트가 시작될 때까지 기다리거나 메인 큐가 빌 때까지 기다려야 하기 때문이다. 이런 시급한 문제를 해결하기 위한 큐가 사이드 큐다.
사이드 큐에는 계획한 일보다 먼저 해야 할 시급한 일을 쌓는다. 이 역시 기준이 필요하다. 예를 들면 핫픽스나 코드 리뷰는 사이드 큐에 쌓는다고 정할 수 있다.
시급한 일을 처리하느라 일의 흐름이 끊기는 게 좋진 않다. 개인적으론 사이드 큐를 비우는 시간을 정해두는 걸 권한다. 예를 들면 리뷰 아워를 만드는 방법이 있다. 매일 아홉 시부터 한 시간은 코드 리뷰만 한다고 정해서 그 외의 시간에는 메인 큐를 비우는 일에 집중할 수 있다.
백로그 큐에 쌓여야 할 일이 사이드 큐에 쌓이지 않도록 주의하자. 계획한 일 보다 우선되어야 할 분명한 기준이 필요하다. 사이드 큐에 일이 너무 많아져서 계획한 일이 밀릴 정도가 되면 문제다. 이때는 사이드 큐에 쌓일 일을 왜 미리 감지하지 못했는지 회고해야 한다.
세 가지 큐를 사용해 일하면 복잡한 문제를 단순하게 처리할 수 있다. 굉장히 단순해 보이지만 실제로 수행하긴 쉽지 않다. 첫째로는 기준을 정하기 어렵기 때문이고 둘째로는 감정에 흔들려서 기준을 무시하기 때문이다.
기준에 따라 행동하는 게 정말 중요하다. 계획하지 않은 일이 들어왔을 때 지금은 못 한다고 단호하게 "No"라고 말할 수 있어야 한다. 보통 이렇게 말하기가 참 어렵다. 미안하기 때문.
미안해하지 않아도 괜찮다. 모두 하나의 목표를 향해 가고 있다면 기준대로 행동하는 게 결국엔 이득이 된다. 경험상 감정을 제어하고 계획한 일에 집중할 때 전반적인 생산성이 높아져 목표를 빠르게 달성할 수 있었다.
기준을 세워두고 급하지 않은 일은 백로그 큐에 담아두고 메인 큐에 쌓인 일을 순서대로 처리해보자. 복잡한 상황이 단순해지는 걸 경험할 수 있을 것이다.
여기까지 읽으면서 JavaScript 이벤트 루프와 유사하다고 생각했을지도 모르겠다. 그렇다. 개인적으로 일을 잘하려면 이벤트 루프가 동작하듯 일을 처리해야 한다고 믿는다. 중간에 이벤트 루프를 언급하면 자칫 글이 장황해질 우려가 있어 포기했다.