코드 이전의 합의 — 개발 문화가 협업의 구조를 결정하는 방식
1 views
# 코드 이전의 합의 — 개발 문화가 협업의 구조를 결정하는 방식

> "지지자불여호지자(知之者不如好之者), 호지자불여낙지자(好之者不如樂之者)."
> — 『논어』 옹야편
아는 자는 좋아하는 자만 못하고, 좋아하는 자는 즐기는 자만 못하다. 협업을 다룬 글의 첫머리에 공자를 인용한 데는 이유가 있다. 개발 문화의 층위가 이 세 단계와 닮아 있기 때문이다. 규칙을 아는 조직, 규칙을 따르길 좋아하는 조직, 그리고 규칙 위에서 일하는 것을 자연스럽게 여기는 조직. 이 세 조직의 코드 베이스는 서로 다른 지층을 갖는다.

## 문화는 분위기가 아니라 의사결정의 형식이다
개발 문화라는 말은 자주 오용된다. 사내 카페테리아, 자율 출퇴근, 수평적 호칭, 해커톤. 이런 것들은 문화의 표층일 뿐이다. 표층은 모방하기 쉽고, 모방되어도 효과가 없다.

문화의 본체는 **의사결정의 형식**이다. 누가, 무엇을 근거로, 어떤 절차를 통해, 어떤 흔적을 남기며 결정하는가. 이것이 코드의 형태를 빚는다. 풀 리퀘스트 한 건이 머지되기까지 몇 명의 시선을 통과하는지, 그 시선들이 무엇을 보는지, 거부의 언어가 어떻게 발화되는지. 이런 미시적 의례의 누적이 시스템의 거시 구조로 침전된다.
아마존이 2002년 무렵부터 사내에 강제한 'API 우선 원칙'은 좋은 예다. 베이조스의 메모로 알려진 이 지침은 모든 팀이 서비스 인터페이스를 통해서만 데이터를 주고받도록 했다. 표면적으로는 기술 결정이었지만, 본질은 의사결정의 형식에 대한 규약이었다. 팀과 팀 사이의 대화를 사람의 호의가 아니라 계약된 인터페이스에 위임하라는 것이다. 십수 년 뒤 그 조직이 AWS를 외부에 판매할 수 있었던 것은 우연이 아니다. 내부 협업의 형식이 곧 외부 상품의 형식이 되었기 때문이다.

문화는 분위기의 문제가 아니다. **무엇을 기록으로 남기고 무엇을 구두 합의로 흘려보낼 것인가**의 문제다.
## 협업의 네 가지 지층: 코드, 리뷰, 회의, 회고
협업이라 부르는 활동은 균질하지 않다. 적어도 네 개의 지층으로 나뉜다.
### 첫 번째 지층: 코드 자체
코드는 협업의 최종 산물이자 가장 정직한 기록이다. 변수 이름 하나, 함수 시그니처 하나에도 작성자의 사유 습관이 묻어난다. 그리고 그것을 그대로 둔 리뷰어의 묵인도 함께 묻어난다.
좋은 코드 베이스는 일관된 어휘를 갖는다. 같은 개념이 같은 이름으로 불리고, 다른 개념은 다른 이름으로 분리된다. 이 일관성은 천재의 산물이 아니다. 누군가가 매번 "이 이름은 우리가 다른 곳에서 쓰는 그 이름과 충돌한다"고 말해온 시간의 누적이다. 어휘를 지키는 일은 사유의 경계를 지키는 일이기도 하다.
### 두 번째 지층: 코드 리뷰
리뷰는 협업에서 가장 정치적인 의례다. 한 사람의 작업물을 다른 사람이 공개적으로 평가하는 행위는 어떤 조직 문화에서도 긴장을 만든다. 그 긴장을 다루는 방식이 곧 조직의 성숙도다.
구글이 사내 엔지니어링 가이드에서 강조해 온 원칙 중 하나는 "리뷰어는 완벽한 코드를 요구하지 않는다. 코드 베이스의 건강을 지속적으로 개선하는 코드를 요구한다"는 것이다. 이 한 문장에는 세 가지 함의가 들어 있다. 완벽은 비용이 무한대이므로 협업의 적이라는 것, 개선의 방향은 한 번의 머지가 아니라 누적된 벡터로 측정된다는 것, 그리고 리뷰는 거부의 도구가 아니라 방향 조정의 도구라는 것이다.
리뷰가 인격 평가로 미끄러지는 조직에서는 PR이 작아지지 않고 점점 늦어진다. 사람들은 시선을 피하기 위해 머지를 미루거나, 비공식 채널에서 미리 합의를 마친 뒤에야 PR을 올린다. 공식 절차가 형해화되고 실질 결정은 다시 구두 합의로 회귀한다.
### 세 번째 지층: 회의
회의는 동기적 협업의 가장 비싼 형식이다. N명의 시간을 동시에 점유하기 때문이다. 회의가 많은 조직이 일을 많이 한다고 느끼는 것은 착각이다. 결정이 회의에서만 일어나는 조직은, 바꿔 말하면 회의 바깥에서 결정을 내릴 권한이 분배되지 않은 조직이다.
깃랩이 공개한 핸드북은 이 문제에 대한 흥미로운 답을 보여준다. 그들은 'handbook-first'를 표방하며 회의에서 논의될 내용을 사전에 문서로 정리하고, 회의는 그 문서에 대한 결정과 이견 표명의 자리로만 사용한다. 문서가 1차 매체이고 회의는 2차 매체다. 비동기 협업이 가능한 조직이란, 이런 식으로 매체의 우선순위를 뒤집은 조직이다.
### 네 번째 지층: 회고
회고는 협업의 메타 레이어다. 협업 자체를 협업의 대상으로 삼는 행위이기 때문이다. 회고가 형식적으로 굳어진 조직에서는 매번 같은 항목이 반복된다. "다음에는 일정을 더 여유 있게 잡자", "다음에는 사양을 더 명확히 하자". 같은 문장의 반복은 회고가 학습으로 이어지지 않는다는 증거다.
회고의 본질은 **무엇을 시스템화할 것인가**를 결정하는 자리다. 사람의 의지로 해결할 일을 절차로 옮기고, 절차로 굳어진 일을 자동화로 옮긴다. 회고에서 나온 결론이 다음 스프린트의 체크리스트가 되지 않으면, 그것은 회고가 아니라 한탄이다.
## 신뢰의 비용을 누가 지불하는가
협업의 모든 형식은 결국 하나의 질문으로 환원된다. **신뢰의 비용을 누가 지불하는가**.
신뢰는 공짜가 아니다. 누군가의 코드를 의심 없이 머지하려면, 누군가가 그 코드의 품질을 보증하는 비용을 미리 지불해야 한다. 그 비용은 테스트일 수도, 정적 분석일 수도, 페어 프로그래밍일 수도, 작성자 본인의 평판일 수도 있다.
비용을 미리 지불하지 않는 조직은 사후에 더 큰 비용을 지불한다. 장애 대응, 핫픽스, 책임 소재 다툼, 그리고 신뢰의 영구적 손상이 그것이다. 사전 비용은 분배할 수 있지만, 사후 비용은 집중된다. 새벽 세 시에 호출되는 온콜 엔지니어 한 사람에게 모두 떨어진다.
좋은 개발 문화는 신뢰 비용을 시스템으로 분산시킨 문화다. CI 파이프라인은 자동화된 불신의 장치다. 사람이 매번 의심하지 않아도 되도록 기계가 대신 의심한다. 코드 오너십, 머지 규칙, 배포 게이트 — 이 모든 것은 신뢰의 비용을 미리, 그리고 골고루 지불하기 위한 장치다.
장자는 "오상아(吾喪我)"라 했다. 나를 잃어버린 나. 협업의 성숙도 이와 비슷하다. 잘 짜인 시스템 안에서 개인은 자신의 영웅적 분투를 잃어버린다. 잃어버려도 일이 진행된다. 그것이 시스템의 미덕이다.
## 문서, 그리고 잊혀질 권리
협업의 마지막 층위는 기록이다. 무엇을 남기고 무엇을 흘려보낼 것인가의 문제다.
조선의 사관(史官) 제도는 흥미로운 참조점을 제공한다. 사초(史草)는 군주조차 볼 수 없었고, 실록은 당대가 아닌 후대를 위해 작성되었다. 기록의 독립성을 제도로 보장한 것이다. 현대의 개발 조직에서 이에 해당하는 것은 결정의 맥락이다. **왜 그렇게 결정했는가**가 **무엇을 결정했는가**보다 오래 살아남아야 한다.
ADR(Architecture Decision Record)이라 불리는 문서 형식이 십여 년 전부터 확산된 것은 이 통찰의 제도화다. 어떤 기술을 선택했는지보다, 어떤 대안을 검토했고 어떤 트레이드오프 위에서 그것을 골랐는지를 남긴다. 일 년 뒤 그 결정을 뒤집을 후임자가 같은 논의를 처음부터 다시 하지 않도록 하기 위해서다.
다만 모든 것을 기록하려는 충동은 또 다른 함정이다. 슬랙의 모든 대화, 모든 회의록, 모든 티켓 — 정보가 무한히 누적되면 검색 가능성은 역설적으로 떨어진다. 잊혀질 권리는 시스템에도 필요하다. 오래된 결정은 아카이브되어야 하고, 사문화된 규칙은 폐기되어야 한다. 살아 있는 문서만이 권위를 가진다.
## 합의의 형식이 조직의 형식이다
콘웨이는 1968년 한 논문에서 이렇게 적었다. "시스템을 설계하는 조직은, 그 조직의 의사소통 구조를 그대로 닮은 시스템을 만들도록 제약된다." 반세기 넘게 인용되어 온 이 명제는 여전히 유효하다. 그리고 그 역도 유효하다. **어떤 시스템을 만들고자 하는가는 어떤 조직이 되고자 하는가의 문제와 분리되지 않는다**.
마이크로서비스로 가고 싶다면 팀이 먼저 분리 가능한 단위여야 한다. 모노리포의 일관성을 유지하고 싶다면 팀들 사이에 공유 어휘가 살아 있어야 한다. 기술 결정처럼 보이는 모든 선택은, 한 꺼풀 벗기면 조직 결정이다.
그러므로 개발 문화를 묻는 일은 결국 이렇게 된다. 우리는 무엇을 함께 결정하고, 무엇을 위임하며, 무엇을 기록하고, 무엇을 잊을 것인가. 이 네 질문에 대한 답의 총합이 그 조직의 코드 베이스다.
협업은 친밀함이 아니다. 협업은 합의의 형식을 다듬어 가는 오랜 노동이다. 카페테리아의 커피는 그 노동을 견디게 해 줄 뿐, 노동을 대신해 주지 않는다.
> "위무위(爲無爲), 사무사(事無事)."
> — 『도덕경』 63장
함이 없음으로 하고, 일 없음으로 일한다. 좋은 협업의 끝은 누구도 영웅으로 보이지 않는 평온이다. 시스템이 그 자리를 대신했기 때문이다. 그 평온을 만들기 위해, 누군가는 지금도 PR 코멘트의 한 줄을 고쳐 쓰고 있다.