이러저러한 사정 때문에 며칠 야근을 하게 되었다. 아침 8시부터 코딩을 시작해서 밤 12시까지 멈추지 않았다. 더 이상 몸이 견딜 수 없을 때 잠을 잤고, 다시 아침에 일어나서 새벽부터 코딩을 시작했다. 미국 동부에 폭설이 내려서 아침저녁으로 눈을 치워야 했던 것은 덤이다. 이런 식으로 끝까지 ‘달린’ 것은 5년 만의 일인 것 같다. 그리고 결론을 내렸다. 야근은 미친 짓이다.
프로그래머가 정신을 집중해서 양질의 코드를 만들어낼 수 있는 시간의 최대치는 하루에 2~3시간이라는 것이 정설이다. 내 경험에 비추어 봐도 그렇다. 나는 아침 9시에 사무실에 도착하고 오후 6시에 퇴근을 한다.
점심시간을 빼면 하루에 8시간을 컴퓨터 앞에 앉아 있는 셈이다. 하지만 컴퓨터 앞에만 앉아 있을 수는 없다. 미팅도 해야 하고, 클라이언트도 만나야 하고, 친구들과 잡답도 해야 하고, 커피를 마시느라 들락거리기도 해야 하고, 개인적인 용무도 봐야 한다.
이런저런 시간을 다 빼고 나면 손끝에서 코드를 뽑아낼 수 있는 물리적인 시간의 최대치는 5시간을 넘지 않는다. 그 5시간만 제대로 집중해서 코드를 만들어내면 그날 내가 할 수 있는 일은 모두 한 셈이다. 그나마 여기에서 5시간은 실제로 코딩을 하는 시간이 아니라 차분하게 컴퓨터 앞에 앉아 있을 수 있는 시간을 의미한다.
그럼 6시에 퇴근하는 대신 밤 11시까지 책상에 앉아 있으면 (즉, 야근을 하면) 코드를 뽑아낼 수 있는 시간이 5시간에서 10시간으로 늘어나는 것이 아닐까. 생산성이 두 배로 늘어나는 것이 아닐까. 바로 이것이 프로그래밍의 본질을 이해하지 못하는 책상물림들의 셈법이다.
기계적으로 키보드를 두드리는 ‘타자’와 코드를 짜는 프로그래밍을 같은 일로 착각하는 것이다. 그러한 착각이 참이면 이런 식의 셈법도 성립한다. 하지만 프로그래밍은 ‘양’의 노동이 아니라 ‘질’의 노동이다. 손가락이 아니라 머리로 하는 일이다.
프로그래밍을 할 때 프로그래머의 두뇌는 CPU 레지스터와 메모리의 확장된 버전이 된다. 수많은 변수의 상태와 상호작용이 두뇌에 기억되고, 각종 클래스와 패키지 이름, 구현해야 하는 알고리즘 개요, 다른 하위시스템과의 상호작용, 방금 수정한 버그 내용, 사용자 요구사항 내용 등이 모두 기억된다.
1차원적인 기억의 문제가 아니다. 기억한 내용들이 서로 다차원적인 방식으로 상호작용하는 것을 실시간으로 파악하고 판단해야 한다. 엉망으로 꼬이고 엉킨 실타래의 끝을 놓치지 않고 추적하는 것이다. 열 개의 볼링핀을 저글링하는 서커스 단원처럼 한순간도 잡생각을 할 수 없는 고도의 집중력을 요구하는 일이다.
이런 수준의 집중력을 하루에 2~3 시간 이상 발휘할 수 있는 사람은 없다. 괴물 같은 사람이라도 5시간이 한계다. 사람에 따라서 하루 평균 2~3시간 발휘할 수 있는 집중력을 특정한 날에 몰아서 발휘하는 사람도 있다. 대신 그런 사람은 더 긴 휴식시간을 필요로 한다.
핵심은 지속가능한(sustainable) 양질의 집중력을 하루 평균 얼마나 발휘할 수 있느냐 하는 것이다. 매일 10시간씩 컴퓨터 앞에 앉아 있는다고 해서 10시간 내내 양질의 코드를 생산할 수 있는 것이 아니라는 이야기다.
사람이 사용할 수 있는 정신적인 에너지는 정해져 있다. 그날 쓸 분량을 다 쓰고 나면 당연히 회복할 시간이 필요하다. 책을 읽거나, 영화를 보거나, 연인과 데이트를 하거나, 친구와 잡담을 나누어야 한다. 충분한 수면을 취해야 하는 것은 물론이다.
에너지가 바닥난 사람을 컴퓨터 앞에 앉혀두면 그가 할 수 있는 일은 “잠자코 앉아있기”말고 아무 것도 없다. 키보드 위에서 영혼이 담기지 않은 손가락 놀림만 분주하다.
그래서 '코드를 짜기 위한 야근'이라는 표현은 '따뜻한 얼음'이나 '둥근 삼각형'처럼 형용모순이다. 말 자체가 성립하지 않는다. 에너지가 고갈된 상태에서는 정상적인 코드를 만들어내는 것이 불가능하다. 코드가 아니라 버그만 생산한다.
일하는 시늉만 무성하고 실제로 일은 아무 것도 이루어지지 않는다.
야근을 하면서 실제로 프로그래밍을 할 수 있는 경우는 낮에 집중력을 발휘할 만한 일을 아무것도 하지 않았을 경우로 국한된다.
이런 이유 때문에 익스트림 프로그래밍 진영에서는 오래 전부터 프로그래머가 일주일에 40시간 이상의 노동을 수행하지 말아야 한다고 주장해왔다. 프로그래머의 인권이나 노동권에 대해서 말하는 것이 아니다. 소프트웨어 프로젝트의 진정한 ‘성공’을 원한다면 프로그래머를 양계장의 닭처럼 쥐어짜는 것이 결코 도움이 되지 않는다는 사실을 깨달아야 한다고 말하고 있는 것이다.
생산성 하락도 문제지만, 정상적인 시간과 비용에 포함되지 않는 암시장이 형성되는 것도 큰 문제다. 프로젝트 관리자나 물주들이 프로그래머들의 ‘야근’을 당연한 것으로 여기면서 의존하기 때문에 프로젝트의 단가가 비정상적인 방식으로 산정된다.
이러한 암시장 효과로 인해서 프로젝트 일정이 주먹구구식으로 정해지고 프로젝트에 참여한 프로그래머들의 개인적인 삶이 담보로 저당 잡힌다. 이러한 악순환 속에서 소프트웨어의 ‘품질’을 찾는 것은 알래스카에 가서 야자나무를 찾는 것과 마찬가지다.
결론을 내려 보자. 그대가 프로그래머라면 하루에 2시간 이상 코드를 생산할 수 없다고 해서 조금도 자책하지 않기 바란다. 2시간 이상 코드를 만들어낼 수 있는 사람은 세상에 없다. 그대의 상사가 야근을 하라고 하면 어쩔 수 없이 야근을 하되 '시체처럼 앉아있기' 이상을 하려고 노력하지 마라. 그렇게 하지 않아도 된다.
열심히 야근을 하는 것처럼 보이는 세상의 다른 모든 프로그래머도 그대와 다르지 않다. 원래 다 그런 것이다.
관련기사
- 액터 모델 프로그래밍 주목하라2014.02.18
- 폴리글랏 시대, 개발자를 위한 통섭의 메시지2014.02.18
- 카드정보 유출, 더 알아야할 불편한 진실2014.02.18
- 카드 정보 유출 사태 키운 SW의 배신2014.02.18
그대가 프로그래머에게 일을 맡기는 사람이라면 (프로젝트 관리자든 아니면 프로젝트에 돈을 대는 물주든) 하루에 2시간 이상 코드를 생산할 수 있다고 말하는 사람을 진심으로 두려워하기 바란다. 시키지도 않았는데 기꺼이 야근을 하겠다고 말하는 사람을 호환마마보다 더 무서워하기 바란다.
그 사람은 프로그래머가 아니기 때문이다. 그는 좀비다. 언제 그대를 물어뜯을지 모르는 영혼 없는 존재다.
*본 칼럼 내용은 본지 편집방향과 다를 수 있습니다.