Pair Programming

신입 개발자 분을 모시게 되면서 다양한 개발 문화에 대해서, 협업에 대해서 알아봐야할 것 같다는 생각이 들어서 스터디를 하게 되었다.

개요

페어 프로그래밍 진행 방법은 기본적으로 한 명이 타이핑을 하고 다른 한 명은 실시간 리뷰를 하는 것이다. 그리고 역할을 주기적으로 변경하며 진행하면 된다.
장비는 모니터, 키보드, 마우스 하나만으로 진행 할 수 도 있고, 모니터, 키보드, 마우스를 두 개씩 연결하고 각자 사용 할 수 도 있다.

방법들

드라이버 & 네비게이터

가장 일반적이고 전통적인 방법으로 한 명은 드라이버로 소스코드를 타이핑 하고, 다른 한 명은 네비게이터로서 작성되는 소스코드를 실시간으로 리뷰를 하고 큰 그림을 염두에 두고 가이드를 해 나가는 방법이다. 네비게이터(navigator)가 전략을 제시하고 드라이버(driver)가 실제 코드를 작성하며, 이 열할을 각자 번갈아가며 수행한다.

핑퐁(Ping-Pong)

TDD로 개발을 하는 경우, 한 명은 실패하는 테스트 케이스를 작성하고, 다른 한 명은 테스트를 성공시키기 위한 구현코드를 작성하는 방법이다. 한 명이 계속 키보드를 잡고 코딩을 하는 것을 방지 할 수 있다.

키보드 & 마우스

한 명은 마우스만 사용하고, 다른 한 명은 키보드만 사용하는 방법이다. 잘 사용하지 않는 방법이긴 하지만, 새로운 툴이나 단축키 등을 배울 때 사용하면 유용할 수 있다.

몹(Mob) 프로그래밍

일명 떼 코딩이라고 불리는 방법으로, 돌아가면서 한 명씩 드라이버가 되고 나머지는 네비게이터가 되어 개발을 진행한다. 가장 큰 장점은 커뮤니케이션 비용을 줄일 수 있다는 것이다. 프로젝트 초반에 코딩 스타일을 맞춰야 하거나, 주기적으로 코드리뷰를 하는 경우에도 사용하면 좋다. 하지만 단점은 네비게이터가 여러 명이다 보니 의견 통합이 어려울 수 있고, 간혹 자리를 비우거나 딴짓을 하는 사람이 생기기도 한다.

페어 프로그래밍의 장점

지식 공유

같이 페어 프로그래밍을 진행 했던 사람들에게 물어보면 가장 많이 장점으로 언급되는 부분이다. 웹 개발을 하더라도 누구는 JavaScript를 잘하고 누구는 CSS를 잘 할 수 있는데, 이런 경우 같이 페어를 하면 서로 몰랐던 부분을 많이 배울 수 있게 된다. 그리고 팀에 새로운 멤버가 들어온 경우, 팀의 개발환경이나 개발 스타일 등에 대해서 문서로 전달 하는 것이 아니라 페어 프로그래밍을 통해 같이 개발하면서 공유해 줄 수 있다. 또한 기술적인 스킬 뿐만 아니라 페어가 가지고 있는 좋은 습관들도 배울 수 있는 좋은 기회가 된다.

심리적 안정감

개발을 할 때, 간혹 어려운 문제가 있더라도 ‘페어가 있으니 해결할 수 있겠지?’ ‘페어가 해결해 주겠지?’ 등의 심리적으로 기댈 수 있다. 실제로 페어가 해결 하기를 기다리는 것이 아니라 같이 고민을 하게되는 것이다.새로운 언어나 프레임워크 등을 사용해야하는 경우에도 혼자서는 중간에 포기하는 경우가 있는데, 페어와 함께 하다 보면 끝까지 도전을 해보게 되기도 한다.

높은 업무 집중도

9시 출근해서 6시 퇴근 할 때까지 어느 정도로 집중해서 일을 할 수 있을까? 카카오 톡이나 라인 같은 메신저로 친구들과 대화도 나누고, 사내 메신저를 통해 동기들과 대화도 하고, 이메일도 주고 받게 되고, 티타임을 가지는 등 업무 외적으로 사용하는 시간이 많이 있을 것이다.덕분에 중간중간 일의 흐름이 많이 끊기게 된다. 하지만 페어와 함께 개발을 하다 보면 불필요하게 사용하던 개인적인 시간을 최소화 하고, 개발에 집중을 하게 된다.

실시간 코드 리뷰

작은 타이핑 실수부터, 큰 설계 결함 등 페어 프로그래밍을 하다 보면 실시간으로 해당 로직에 대해서 코드리뷰를 할 수 있다. 내 소스코드에 대한 피드백을 가장 빠르게 받게되는 것이다.이를 통해 설계가 좋아지고, 결함도 줄어 들고, 일정한 수준의 코드 품질을 유지할 수 있었다는 의견이 많이 있다. 그리고 페어와 함께 개발을 하다 보면 코드 리뷰뿐만 아니라 같이 설계에 대한 고민을 끊임 없이 나눌 수 있는 사람이 있다는 것이 큰 장점 인것 같다.

집단적 코드소유 (Collective Ownership)

페어 프로그래밍을 하게 되면 자연스럽게 일의 담당자를 지정할 수 없게된다. 즉, 업무마다 담당자를 정하고 그 업무만 개발 하는 것이 아니라, 팀으로서 전체 제품에 대해서 함께 고민하고 개발을 해나가는 것이다. 모든 개발자들이 어떤 기능이든지 추가나 버그 수정, 리팩토링 등을 진행할 수 있다. 특정 업무에 대한 병목이 발생하는 것을 막을 수 있고, 코드 전체에 대해서 개발자들이 함께 아이디어를 내고 공유할 수도 있다.

피어 리뷰(Peer Review)

우리 팀은 항상 같이 일한 팀원 들에게 피어 리뷰를 하고 있다. 하지만 사실 같은 팀에 속해서 일을 하더라도 업무적으로 엮이지 않는다면 그 사람에 대해서 제대로 알기 어렵고 대외적인 이미지만 가지고 평가를 하게 된다. 하지만 페어 프로그래밍을 진행하면서 모든 팀원들과 같이 일을 하고 많은 대화를 나누게 됨으로써 동료들의 장단점을 더 잘 알게 되고, 그 사람의 성장을 위한 진실된 피드백을 줄 수 있었다. 자연스럽게 팀워크도 더 좋아지게 됐던 것 같다.

단점

생산성저하

관리자 입장에서는 한 명이 할 일을 두 명이 하고 있으니, 생산성이 반으로 줄어든다고 생각하기 쉽다. 오래되긴 했지만 몇 몇 논문에서 15% 시간이 더 걸리고, 15% 결함이 줄었다는 연구 결과도 있다. 앞서 장점으로 말했던 가치를 위해서 떨어지는 생산성은 미래를 위한 투자로 생각하는 것이 좋은 것 같다.

키보드 정복자

실제 페어 프로그래밍을 하다보면, 시니어와 주니어 개발자가 같이 하는 경우가 많은데, 드라이버와 네비게이터의 역할 바꿔가면서 진행해야 하지만 시니어 개발자 혼자 개발을 하게 되는 경우가 종종 있다. 생산성이 떨어지는 문제를 못 참는 문제도 있고, 주니어 개발자가 작성하고 있는 코드를 가만히 보고만 있을 수 없는 것이다. 처음에는 말로 이렇게 해 저렇게 해 지시를 하다가 결국 키보드를 점령해 버린다. 이런 일이 반복되면서 주니어 개발자는 의기소침하게 되고 키보드 타이핑 하는 것을 두려워하게 된다. 페어 프로그래밍을 했다고는 하지만 대화 없이 한 사람의 주도하에 개발이 끝나게 되는 것이다. ⇒ 내가생각하는 가장 최악의 케이스다

감정 노동

항상 좋은 사람과 일을 하면 좋겠지만, 우리는 언제나 마음이 맞지 않은 팀원과 함께 하게 될 것이다. 혹은 마음은 잘 맞더라도 개발하는 스타일이 매우 다른 사람이 있을 수도 있다. 사람 마다 가지고 있는 성격이나 스타일이 쉽게 바뀌거나 개선 할수 있는 부분이 아니기 때문에 해결하기 어려운 문제라고 생각된다. 그 날 하루는 어쩔 수 심한 감정 노동에 시달리게 될 것이다.

피곤함

페어와 함께 하루 종일 집중해서 개발을 하고, 끊임없이 대화를 한다는 것은 매우 많은 에너지를 소모하게 만든다. 중간 중간 쉬는 시간을 갖지 않으면 체력적으로 힘들어서 포기하게 될 것이다.

페어프로그래밍을 잘하기 위한 방법

많은 대화와 소통 언제나 설계에 대해서 같이 고민하고 대화를 해야 한다.
시각적으로 표현하며 대화하는 것도 좋은 방법이다. 화이트 보드를 이용해서 시각적으로 표현해가면서 하는 것도 좋은 방법이다. 꼭 페어끼리가 아니더라도 그 순간 필요하다면 다른 팀원들을 불러서 의견을 듣는 것도 좋을 것이다.
코딩을 하는 순간에도 계속 머리 속에 있는 생각을 공유해야한다. 머릿속의 생각을 가감없이 공유한다. '이런 생각을 갖고 있는데, 이렇게 구현 해보겠습니다'
생각을 멈추면 안된다 '페어가 알아서 하겠지' 하고 안일하게 생각하면 안하느니만 못하다. 하나라도 더 서로에게 공유하기 위해 노력이 필요하다.

주니어와 함께 일할 때의 팁

Don’t type.
직접 개발을 하지 말고, 주니어에게 무엇을 입력해야 하는지 알려주세요. 토론하고 질문하세요.
Let them make mistakes.
직접 문제를 해결해 주면 일련의 규칙만 배우게 됩니다. 그냥 시도하게 하고 어떻게 되는지 지켜보세요. 문제가 발생하면 왜 안 되는지 이해할 수 있도록 도와주세요.
Take Breaks
주니어와 시니어의 경험의 차이로 인해 많은 추가 설명을 해야 될 것입니다. 정말 많이 피곤할 것입니다. 휴식을 취하세요.
Be prepared to say “I don’t know”
“나도 모른다. 그래도 좋은 질문이다. 같이 알아보자.”모르는 것에 대해 학습하는 방법을 알려줄 수 있는 좋은 기회입니다.
Find what they can teach you.
멋진 연주자 이거나 암벽 등반가 일수도 있습니다. 그들이 가르쳐 줄 수 있는 것을 찾고, 배우고 싶다고 하세요. 둘 사이의 관계가 뒤집어 지는 순간 사회적 평등을 느낄 것입니다.
위 아티클의 마지막에 다음과 같이 강조하고 있다.
“Just Remember: Don’t Type”
시니어든 주니어든, 누구랑 같이 페어 프로그래밍을 하게 되든, 잊지 않았으면 한다. 타이핑을 하는 것 보다 대화를 하는 것이 더 중요하다. 대화를 통해 서로의 생각을 공유하자. 이것이 페어 프로그래밍을 잘 하는 가장 중요한 방법일 것이다.

실제적인 고민

장소를 어떻게 할 것인가? - 대화가 많이 필요한 작업이기 떄문에 가능하면 다른 사람들과 단절된 곳에서 하는 것이 팀적으로도, 페어프로그래밍을 진행하는 사람들 입장에서도 심리적으로 좋을 것 같다.
개발할 때 디바이스 구성 및 자리 위치는 어떻게 할 것인가 (컴퓨터 1대, 그렇다면 키보드 마우스는? 스크린을 연결해서 네비게이터가 큰 화면에서 확인할 수 있도록?)
하나의 프로젝트에 하나의 잡에 대해서 페어프로그래밍을 한다면, 한쪽이 이 프로젝트의 배경과 프레임워크에 대한 지식이 매우 낮다면, 과연 페어프로그래밍은 효율적인가?
패드를 들고가서 시각화 도구로 서로 설명하면서 사용하면 좋을 듯.
마무리하면서 페어프로그래밍 회고를 통해서 점점 발전시켜나가면 좋을 듯.

참고