나의 페어 프로그래밍 탐험기

안녕하세요, 카카오엔터프라이즈 hans입니다. 

이번 글을 통해 제가 어떻게 페어 프로그래밍을 처음 접하게 되었고, 그 과정에서 무엇을 주목하게 되었는지, 그 후 어떤 것들을 경험하고 느꼈는지 공유드리고자 합니다. 

 


 

탐험의 시작 

 

애자일 방법론, XP(eXtreme Programming) 방법론 중에서도 페어 프로그래밍 방법론을 어떻게 접하게 되었는지 먼저 이야기하도록 하겠습니다. 

2015년 여름, 첫 직장에서 당시 전사 차원으로 애자일 방법론을 도입하고자 샌프란시스코에 있는 Pivotal Software, 그 안에 Pivotal Labs라고 하는 컨설팅 회사에 조직 내 선발된 인재들이 파견을 가게 되었습니다. 

파견 기간동안 Pivotal Labs에서 애자일 방법론을 잘 전수받은 분들이 조직을 별도 구성하여 그 방법론대로 개발을 할 수 있도록 하고, 새로 합류한 팀원에게도 전파하도록 했었는데요, 당시 그 조직에 속해 있던 분이 저의 프로젝트 리드를 담당하셨고, 자연스럽게 Pivotal의 방법론을 따라가면서 소프트웨어를 개발하게 되었습니다. 

그때 접하게 되었던 Pivotal의 개발 방법론을 간단히 공유 드릴게요.

 

처음 접한 페어 프로그래밍 : the Pivotal Way

 

먼저, 개인에게 컴퓨터를 제공하지 않습니다. 무조건 코드는 공용 컴퓨터로 작성해야 합니다. 그 다음 모든 업무는 페어 프로그래밍으로 진행하는 것을 원칙으로 합니다. 9시 출근 6시 퇴근을 꼭 지키고요, 출근 후 9시15분쯤 수십 명이 참여하는 데일리 스탠드 업 미팅을 진행합니다.  그리고 매일 여러 명이 돌아가면서 페어 프로그래밍을 진행합니다. 또한 무조건 1주 단위의 짧은 Iteration을 주고, TDD와 BDD를 강제하고 있습니다.그리고 CI/CD를 통해 재빠르게 소프트웨어를 릴리즈합니다.

저는 둘이서 하나의 코드를 짜는 페어 프로그래밍이 당시 가장 신선한 충격이었습니다. 둘이서 같은 시간에 하나의 코드를 짜는 게 효율적인가 의심도 들었지만, 혼자 열심히 코딩을 해도 막히는 순간이 있을 때 끙끙 앓다가 결국 누군가의 도움을 받을 때가 있는데 ‘애초에 둘이 같이 하면 되지’가 그들의 생각이었습니다.

누군가와 같이 일을 할 때 약간의 긴장감을 더 해 집중력이 더 오르기 때문에 효율성이 오르고, 각자 일할 때 보다 함께 할 때 커뮤니케이션이 증가하면서 더 많은 아이디어가 오고가고 이를 통해 더 많은 것을 배울 수 있고, 또 가장 빠르게 배울 수 있기 때문에 페어 프로그래밍을 통해 개인의 성장 속도가 가속화되고, 상향평준화되면서 결과적으로 개인, 조직, 업무가 더 좋은 방향으로 발전한다는 것이 이들이 말하는 페어 프로그래밍이었습니다. 

Pivotal의 개발 방법론을 통해 페어 프로그래밍에 대해 아주 깊은 인상을 갖게 되었고, 그 이후 지금까지 페어 프로그래밍을 경험하고 얻은 교훈에 대해 정리해 보았습니다.

 

 

페어 프로그래밍 탐험기 

 

첫 번째 탐험: 신뢰의 중요성 

저의 첫 번째 페어 프로그래밍 경험은 Pivotal의 개발 방법론을 접했던 ALM(Application Lifecycle Management) 프로젝트입니다. 최대한 제가 배운대로 해보려고 노력했는데요, 성향도 다르고 서로 처한 환경도 다른 사람들끼리 모이는 곳이 조직이다보니 관계가 전혀 없는, 상호 신뢰도가 낮은 사람과의 페어는 효율이 낮다는 것을 깨달았습니다. 서로의 코드에 대해 의견을 주는 과정이 공격적으로 느껴지고, 단지 두 사람이 한 컴퓨터 앞에 앉아있었을 뿐이었습니다. 페어 프로그래밍을 하고 싶다면 그 전에 함께 하는 동료들과 먼저 신뢰를 쌓아야 한다는 교훈을 얻었습니다. 

또한 애자일 리더가 사라지면서 사람들은 결국 전에 하던 방식대로, 익숙했던 방식대로 돌아가는 것을 경험했습니다. 즉, 리더와 구성원들의 의지가 없고 시스템적으로 갖춰지지 않은 페어 프로그래밍은 지속적으로 실행 되기 어려움을 느꼈습니다.

 

두 번째 탐험: TDD/BDD의 필요성

페어를 실제로 하다 보니 오타, 변수명 등으로 인한 디버깅 시간이 80% 이상 감소되는 것을 확인하였습니다. 낭비되는 시간을 줄임으로써 향상되는 시간이 개개인으로 일할 때보다 더 많은 일을 할 수 있다는 것을 실제로 경험하면서 페어 프로그래밍은 정말 1 + 1 > 2 가 될 수 있는 아주 효과적인 방법임을 느꼈습니다. 

또 BDD(Behavior-Driven Development)를 도입하면서 Given -When – Then 시나리오 기반의 BDD 기법을 사용하여 테스트 코드를 짜다보니 구현에 막힘이 없었습니다. 그래서 페어 도중 길을 잃지 않기 위해서는 TDD/BDD 도입을 꼭 권합니다.

페어를 하게 되면 업무시간 내내 진행하기도 합니다. 평소 업무와 달리 긴장감과 높은 집중력, 그리고 계속 커뮤니케이션을 해야 하기 때문에 굉장히 피로도가 높은데요, XP 방법론에서 6시에 퇴근하는 것은 체력을 보존하기 위함이 아니라, 체력을 회복해야했기 때문이라는 것을 깨달았습니다. 그래서 페어 프로그래밍을 할 때 중간휴식은 필수임을 강조하고 싶습니다! 

 

세 번째 탐험: 실력을 향상시킬 수 있는 최고의 기회

저의 세 번째 탐험기는 채용 프로세스를 진행할 때도 페어로 과제를 수행한 후 입사하여, 경력이 20년 가까이 차이나는 시니어 개발자분과 3개월동안 개발을 100% 페어로만 진행해 본 경험입니다. 페어를 실력있는 시니어 개발자분과 하다보니 이 분이 가지고 있는 노하우를 직접 경험하고 얻을 수 있다는 점이 가장 좋았는데요, 바로 옆에서 보고 배우면서 주니어에게 있어서 페어는 실력을 상승시킬 수 있는 최고의 기회임을 느꼈습니다. 

가끔 아쉬웠던 점은 오늘 무엇을 작업할지 명확하지 않은 상황에서 페어로 작업을 하는 경우에는 굉장히 혼란스러웠습니다. 무엇을 하는지 이해가 없는 상황에서 페어를 할 때는 그냥 옆에서 받아 적는 역할이 되어버리기도 했습니다. 그래서 목표가 명확하지 않다면, 오늘 해야 하는 목표부터 함께 세우고 페어를 시작해야 서로에게 의미있는 페어가 될 수 있습니다.

 

네 번째 탐험: 새로운 인사이트를 얻을 수 있는 기회 

다음은 새로 합류한 주니어 개발자와의 페어 프로그래밍입니다. 이 때는 제가 올드한 JS 코딩 스타일을 가지고 있다는 것을 느꼈습니다. 오히려 주니어 개발자분이 요즘 Modernize한 스타일은 이런 거라고 알려주시기도 했는데요, 저는 주로 함수형 스타일을 전파하고, 그 분은 Modernize한 자바스크립트 코딩 스타일을 전파하면서 코딩 스타일이 섞이게 되었습니다. 서로의 부족한 부분을 보완해주는 방향이다 보니 서로에게 배우기도 하면서 결과물까지 잘 나오면서, 시니어 개발자에게 있어서도 페어는 실력을 상승시키기 위한 최고의 기회임을 깨달았습니다. 

또한 Fluentd를 도입하면서 문서를 보는 것부터 페어로 진행하여 도입을 완료했던 경험이 있습니다. Pivotal에서 배운 방법인데요, 프로그래밍 뿐만 아니라 같이 문서를 보는 것만으로도 혼자 볼 때보다 서로 이야기를 나누면서 더 빠르고 깊게 구조를 이해하고, 다양한 옵션들을 알 수 있었으며, 더 빠르게 도입할 수 있었습니다. 

 

다섯 번째 탐험: 지식의 교환

현재는 코로나 때문에 재택근무를 해야하기 때문에 원격으로 페어를 진행하고 있습니다.
페어를 하면서 동료 A,B가 BDD로 개발한 코드를 동료 B,C가 함께 변경하다가 B가 휴가를 가서 동료 C,D가 페어로 변경을 한 적이 있었는데요, 새로운 동료D가 투입되었지만 B와 페어를 지속했던 경험과 테스트코드 덕분에 페어 파트너가 변경되어도 아무런 문제가 없었음을 발견하였습니다. 이를 통해 Pivotal의 개발 방법론이 동작하는 규칙이라는 것을 재확인할 수 있었으며, 현재 코로나로 인한 원격근무나, 메타버스와 같이 공간을 초월해서 일하는 환경에 페어는 꼭 정착되어야 하는 문화가 틀림없다는 확신이 들었습니다. 

다만 같은 동료와 페어하는 시간이 길어지다 보니, 개발 스타일이 고정된다는 점이 있었는데요, 왜 Pivotal의 개발 방법론에서 (열 여럿이서 매일 돌아가면서 페어를 하라는 규칙이 있는지 이해가 되었고, 지속적으로 페어 파트너를 교체할 수 있어야 지식의 교환이 더 활발하게 이뤄질 수 있다는 교훈을 얻었습니다.  

 

페어 프로그래밍 방법

 

제가 실행하고 있는 페어 프로그래밍 방법을 공유합니다. 

드라이버와 내비게이터 

컴퓨터 한 대에 키보드와 마우스를 연결하여 함께 코드를 작성하거나 가장 많이 사용하는 방법으로, 한 컴퓨터로 한 사람은 직접 작성하는 드라이버, 다른 사람은 조언과 방향을 지시해주는 내비게이터가 되어 진행합니다. 

 

MacOS Screen Share

MacOS Screen Share를 활용하는 방법입니다. 이미지의 126번 라인을 보시면 “\0” 부분이 확대되어 보이는데요, 오른쪽 상단 제어에 망원경을 클릭하면 따로 건드리지 않아도 원하는 부분을 지목할 수 있습니다. 원격으로 페어 프로그래밍을 할 때 어느 부분을 보라고 말을 하지 않아도, 상대방의 화면에서 바로 확인할 수 있어 굉장히 편리하게 사용할 수 있습니다. 

 

VSC Live Share

비슷한 기능으로 VSC Live Share가 있습니다. 작업한 코드 보기가 쉽고, 로그인을 할 때마다 무엇을 하고 있는지 바로 확인할 수가 있지만 페어 파트너가 같은 화면을 보고 있다는 것이 바로 확인이 되지 않아 매번 서로 확인해야 하고, 어느 부분을 동기화해달라고 이야기를 해야 하는 불편함이 있습니다.

 

카카오워크 화상회의

카카오 엔터프라이즈에서는 카카오워크 화상회의를 통해 원격근무를 하고 있습니다. 그래서 요즘은 화상회의를 통해 페어 프로그래밍을 진행하고 있습니다. 

 

앞으로의 탐험 계획

 

페어 프로그래밍에 관심을 가지고 지금까지 다양하게 시도해보면서 결국 애자일 팀은 스포츠 팀과 같다는 생각이 많이 들었습니다. 애자일도 스포츠도 팀으로 구성되어 있으며, 팀원들이 명확하게 인식하는 목표가 있고, 서로의 신뢰를 바탕으로 공통의 목표를 위해 최선을 다한다는 점인데요. 

목표와 신뢰를 바탕으로 평소부터 페어를 하고, BDD를 하고, eXtreme Programing을 한다면 어떠한 상황이 생기더라도 그 상황을 잘 해결할 수 있는 면역력이 생기기 때문에 페어를 통해 깊은 신뢰감을 바탕으로 동료들과의 관계를 넓히고, 어떤 상황에서도 잘 대응할 수 있는 팀으로 잘 만들어 나가는 것이 저의 목표입니다. 

감사합니다. 

Latest Posts