- 코드로 보이는 산출물은 하루 작업 전체가 아니라, 읽기·조사·디버깅·검증·결정 끝에 남은 순수 결과물에 가까움
- 여러 해 동안 프로그래머들에게 던진 비공식 질문에서, 6시간짜리 변경을 diff만 보고 다시 입력하는 데 가장 흔한 답은 약 30분이었음
- 이 비율은 과학적 연구가 아니라 설문과 diff 관찰에 기반하지만, 프로그래밍을 1/12은 동작, 11/12는 사고로 보는 실용적 기준이 됨
- 소프트웨어 개발은 공장식 제작보다 설계 작업에 가깝고, 최초 설계 뒤의 복제는 기계가 거의 0에 가까운 한계비용으로 수행함
- 관리와 프로세스가 타이핑 시간을 늘리는 쪽으로 최적화되면 빗나간 효과를 낳으며, 사고의 품질을 높이는 환경과 협업 방식이 더 중요함
6시간 작업을 다시 입력하는 데 걸리는 시간
- 가정은 회의와 방해가 거의 없는 좋은 날에 프로그래머가 6시간의 진지한 프로그래밍을 했다는 상황임
- 퇴근 전 diff를 출력했지만, 밤사이 버전 관리 시스템이 망가져 전날 백업으로 복구되며 하루 작업이 사라짐
- 질문의 핵심은 diff를 건네받은 프로그래머가 그 6시간의 작업을 코드베이스에 다시 입력하는 데 얼마나 걸리느냐임
- 여러 해 동안 컨벤션, 고객사, 동료, 처음 만난 프로그래머에게 이 질문을 던졌고, 가장 흔한 답은 약 30분이었음
- 6시간에는 30분이 12번 들어가므로, 이 관찰은 프로그래밍이 1/12은 동작, 11/12는 사고라는 표현으로 이어짐
비율의 성격과 한계
- 이 수치는 철저한 과학 연구에서 나온 값이 아니며, 좋은 기록을 남긴 공식 조사도 아님
- 목표는 프로그래밍 활동의 통계적·수학적 법칙을 찾는 것이 아니라, 합리적인 질문에 대한 합리적인 답을 찾는 데 있었음
- 어떤 회사도 하루 작업 전체를 실제로 삭제해 실험을 증명하거나 반박하려 하지 않았기 때문에, 근거는 추정과 일일 diff 관찰에 머묾
- 많은 changelog와 diff를 살펴본 결과, 좋은 날의 순수 변경량은 대체로 30분 ± 10분 정도로 보였음
타이핑은 병목이 아니다
- “타이핑은 병목이 아니다”라는 말은 오래전부터 스티커와 소셜 미디어에서 반복되어 왔음
- 일부 프로그래머에게는 타이핑 자체가 병목이 될 수 있지만, 빠른 코드 생산의 핵심은 보통 타이핑 속도나 도구 숙련만이 아님
- Quora의 “How do programmers code so quickly?”라는 긴 글에서 한 응답자는 근육 기억, 도구 숙련, 디버깅 능력, 타이핑 능력, 정보 검색 능력을 언급했음
- 그러나 빠른 코드 생산에서 타이핑과 도구는 보조 수단에 가깝고, 무엇을 해야 하는지 판단하는 시간이 더 큰 비중을 차지함
소프트웨어 공장과 설계 작업의 차이
- 물리적 제품 생산에서는 눈에 보이는 작업 대부분이 움직임이며, 철을 굴리고 찍고 누르고 밀링하고 배치하고 조립하는 행위가 작업처럼 보임
- 현대 공장은 CNC 기계처럼 추상 모델, 즉 데이터를 기반으로 정확한 움직임을 수행하고, 인간은 기계를 직접 수작업하는 대신 관리함
- 소프트웨어 쪽의 공장은 이미 완성되어 있으며, 사용자는 “copy”나 “download” 버튼을 눌러 bit-perfect copy를 얻음
- 최초 모델이 존재하면 이후 복제의 한계비용은 사실상 0에 가까우며, 소프트웨어는 지적 재화임
- Uncle Bob Martin은 소프트웨어 개발이 제작 작업이 아니라 설계 작업이며, 최초 설계 이후의 복제는 기계가 거의 0 비용으로 수행한다고 말해 왔음
- 프로그래머, 테스터, PO, Scrum Master, 소프트웨어 관리자는 고객과 커뮤니티가 사용할 복제본의 기반이 되는 데이터 모델을 설계함
지적 작업은 관찰하기 어렵다
- 산업시대식 사고는 소프트웨어 개발을 공장처럼 보려 하고, 개발자는 실제 프로세스에 해가 되더라도 물리적 노동처럼 보이게 하라는 압박을 받음
- 지적 활동은 관찰과 측정이 어렵고, 80% 완성된 아이디어에는 물리적 형태가 없음
- 실험, proof-of-concept 코드, 메모가 있을 수는 있지만, 물리적 작업처럼 정확한 완료율을 보여주지 못함
- 제조 중인 의자는 50% 지점에서 대략 50% 완성된 것처럼 보이고, 완성되면 완성품처럼 보임
- 의자 설계는 70% 이상 진행되기 전까지 종이에 존재하지 않을 수도 있으며, 설계가 끝나기 전에는 실제로 70% 완료인지도 알기 어려움
30분짜리 변경이 6시간의 일을 뜻하는 이유
- 30분은 하루 종일 썼다 지우고 편집하고 다시 만든 코드의 순수 결과물을 재현하는 시간이지, 투입된 노력 전체가 아님
- 프로그래머는 결함과 보안 취약점을 피하기 위해 코드를 쓰는 동안 계속 평가하고 가설을 세움
- 코드 텍스트는 실행 시 프로그램이 무엇을 해야 하는지만 담고, 왜 그 방식을 택했는지, 시스템의 다른 부분에 어떤 영향을 주는지, 어떤 오류를 넣었다가 제거했는지는 대체로 남기지 않음
- 실제 작업의 대부분은 변경 자체가 아니라 변경 방법을 결정하는 데 있으며, 기존 코드를 이해해야 하므로 지저분한 코드나 설계가 드러나지 않는 소스에서는 시간이 더 듦
- 프로그래머의 결과물은 공유 코드베이스에 통합되므로 사회적 맥락을 가지며, 다른 프로그래머·테스터·운영 담당자가 작업을 이해하도록 돕는 일도 코드에는 드러나지 않는 비용과 이익을 만듦
코드 줄 수는 진척의 척도가 아니다
- 6시간의 지적 작업은 읽기, 조사, 결정, 확인, 검증, 검토를 거쳐 코드베이스의 순수 변경 30분치로 바뀔 수 있음
- 이는 추가된 코드 줄 수를 뜻하지 않으며, 버그 수정과 기능 추가를 했는데도 주말의 코드 줄 수가 주초보다 줄어드는 경우가 있음
- 팀의 상위 관리자가 SLOC를 진척 지표처럼 보고하고 있다는 사실을 모른 채, 여러 주 동안 음수 코드 줄 수를 기록해 문제가 된 적이 있었음
- 프로그래머가 실제로 한 일은 읽기, 학습, 이해, 추측, 조사, 디버깅, 테스트, 컴파일, 실행, 가설 수립과 반증에 가까움
- 많은 작업은 결국 생각하고 결정하는 일로 남음
덜 쓰는 것이 빠른 개발일 수 있다
- Quora 응답 중 하나는 키보드 위에서 손가락이 움직이는 모습은 보이지만, 사용자와 대화하고 동료와 문제를 논의하고 조사하고 생각하는 시간은 보이지 않는다고 했음
- 다른 응답자는 고객이 “요구사항”이나 “must have”라고 부르는 불필요한 생각을 제거하도록 돕는 것이 해결책 전달을 가장 크게 가속한다고 했음
- 또 다른 응답자는 뛰어난 개발자가 키보드를 만지기 전에 요구사항을 이해하고 적절한 해법을 구상하면서 작업의 90% 이상을 수행한다고 했음
- “무엇을 쓰지 않을지 알기”, “덜 하기”, “더 작은 단계로 일하기”, “먼저 무엇을 할지 파악하기”가 반복적으로 등장하는 답변임
- 더 많이 타이핑하거나 더 많이 복사·붙여넣기 하는 사람은 사고와 이해가 부족할 수 있고, 그 결과 오류와 다른 프로그래머의 이해·수정 부담이 늘어날 수 있음
프로세스는 사고를 위해 설계되어야 한다
- 프로그래밍이 1/12의 동작과 11/12의 사고라면, 사람들에게 시간의 11/12 동안 타이핑하라고 압박해서는 안 됨
- 필요한 것은 사고의 품질을 높이는 재료, 환경, 프로세스임
- 반대로 하면 시스템을 잘못된 효과에 맞춰 최적화하게 됨
- 소프트웨어에 대해 함께 생각하고 결정을 더 쉽게 내리도록 시스템을 의도적으로 만들 때 생산성이 높아질 수 있음
- 업무 중 학습을 실험하며 사고가 최적화되는 시스템을 만드는 방법을 고민해야 함