기타

[Pair Programming] 페어프로그래밍 알아보기(1)

강씨아저씨 2021. 3. 21. 11:11

 오랜만에 포스팅입니다.

이번 포스팅은 조금의 페어 프로그래밍 경험과 여러 포스팅 내용을 읽고 이해하고 공감한 것들을 잊지 않기 위해 정리한 글입니다. 정리할 내용이 많기 때문에 시리즈로 작성될 예정입니다. 

 

페어 프로그래밍이란? 

 여러분은 현업에서 일하면서 페어 프로그래밍(Pair Programming)이라는 것을 한 번쯤 들어봤을 것입니다. 그렇다면 여러분은 페어 프로그래밍을 직접 경험해보신 적이 있나요? 많은 소프트웨어 개발자들이 페어 프로그래밍에 대해 들어봤지만 아직 현업에서 적용하는 곳은 많지 않습니다. 그 이유를 간단히 요약해보자면 다음과 같습니다.

 

  1. 효과가 즉시 나타나지 않습니다.
  2. 한대의 컴퓨터에 두 명의 개발자가 함께 하는 것이 말처럼 간단하지 않아서 많은 개발자들이 불편함을 느낍니다.

 위와 같은 이유가 있지만 경험상 페어 프로그래밍은 팀워크와 고품질 소프트웨어 개발에 많은 도움이 된다고 생각합니다.

 페어 프로그래밍은 한대의 컴퓨터에 두 명의 개발자가 코드를 함께 작성하는 것을 의미하고 이를 간략하게 페어링(Pairing) 이라고도 부릅니다. 여러분은 페어링을 하면서 코드를 작성할 뿐만 아니라 작업에 대한 계획을 세우고 아이디어를 명확히 하고 접근방식에 대해 논의하며 더 나은 해결책을 제시하게 됩니다. 이러한 과정 때문에 원활한 페어 프로그래밍을 위해서는 많은 의사소통과 협업이 필요합니다.

 

페어프로그래밍은 어떻게 하는 건가요?

 페어 프로그래밍은 여러 가지 방식이 있고 이를 수행하는 데 있어서 정해진 올바른 방식은 없습니다.

다만 아래에서 언급되는 방식들은 범용적으로 적용되는 방식들이니 페어 프로그래밍을 시도하실 때 참고하시기 바랍니다. 

 

역할 

페어 프로그래밍은 Driver 와 Navigator 라는 2가지 역할을 필요로 합니다.

 Driver 는 키보드를 소유하고 있는 사람으로 현재의 작은 목표를 완수하는데 집중합니다. Driver 는 Navigator 가 흥미를 잃지 않도록 항상 자신이 하고 있는 일에 대해 이야기해야 합니다.
 Navigator 는 Driver 가 코드를 작성하는 동안 관찰자의 입장으로 코드를 검토하고 지식을 전달하며 생각을 공유합니다. Navigator 는 코드의 세부사항을 Driver 에게 맡기고 Driver 보다 더 넓은 관점으로 설계, 구조에 대한 문제와 버그를 파악하는데 집중합니다. Navigator 는 Driver 의 흐름을 방해하지 않도록 목표가 끝난 뒤 아이디어나 잠재 위험요소에 대한 내용을 토론합니다.
 

 이러한 역할분담의 의미는 코드에 대해 두 가지 다른 관점을 갖게 하는 것입니다.
Driver 는 좀 더 기술적인 것과 세부사항 등을 생각하고, Navigator 는 관찰자 입장에서 설계, 구조적인 부분과 큰 그림을 생각해야 합니다. 또한 상황에 맞춰 키보드의 소유권을 교대하면서 이와 함께 역할도 교대하게 됩니다.

 

시간관리 

뽀모도로기법(Pomodoro Technique)은 페어 프로그래밍을 더 쉽게 할 수 있도록 도와주는 다양한 도구들 중 하나입니다. 이것은 일을 짧은 시간 단위로 분배하고 관리해서 시간당 효율을 높이는 시간관리 방법입니다. 이 기법은 거의 모든 페어링 방식에 적용될 수 있으며 계속해서 집중할 수 있도록 도와줍니다.

 다음은 뽀모도로기법을 페어링에서 어떻게 사용하는지에 대한 예시입니다.

 

  1. 다음 작업을 결정합니다.
  2. Driver 와 Navigator 의 역할을 선정합니다.
  3. 타이머를 합의된 적정시간으로 설정합니다.(전통적으로는 25분입니다.)
  4. 외부의 방해 없이 1. 에 정의된 작업을 수행하면서 각자의 역할을 수행합니다.
  5. 타이머가 울리면 작업을 일시 중지합니다.
  6. 짧은 휴식(5-10분) 후 Navigator 와 Driver 를 교대해서 다시 시작합니다.
     * 짧은 휴식시간 동안 물/커피를 마시거나 화장실을 이용하는 데 사용하고, 이메일 작성과 같은 다른 작업에 이 시간을 사용하지 마세요.
  7. 3,4 회 반복한 후 15~30분 정도의 더 긴 휴식시간을 갖습니다.

페어링은 고단한 작업이 될 수 있으므로 뽀모도로기법을 이용해서 주기적으로 휴식을 취하고 키보드를 넘기라는 신호를 듣는 것은 여러분에게 도움이 될 것입니다.

 

그 외 페어링 방식

뽀모도로기법만 적용한 페어링 방식 외에도 여러 가지 상황에 따라 다양한 방식들을 도입해 볼 수 있습니다.

 

Ping Pong Pairing

이 방식은 Driver 가 테스트 초안을 작성하고 Navigator 에게 이를 구현하도록 요청하고 키보드 소유권을 넘겨 Driver 와 Navigator 를 교대하는 방식입니다. 새로운 Driver 가 된 기존의 Navigator 는 테스트를 성공하도록 구현후, 다시 현재의 Navigator 가 구현할 테스트 초안을 작성합니다. 이 흐름은 TDD 방식으로 명확하게 정의된 작업이 있을 때 완벽히 동작합니다.

Ping Pong 페어링의 진행방식은 다음과 같습니다.

 

  1. ping : 개발자1 은 실패하는 테스트 코드를 작성합니다.
  2. pong : 개발자2 는 테스트 코드를 성공하도록 구현합니다.
  3. ping : 개발자2 는 다음 pong 을 위해 실패하는 테스트 코드를 작성합니다.
  4. pong : 개발자1 은 이전 ping 에서 작성된 실패하는 테스트 코드를 성공하도록 구현합니다.
  5. ping : 개발자1 은 다음 pong 을 위해 실패하는 테스트 코드를 작성합니다.
  6. ping & pong 을 반복합니다.

매번 pong 시점에는 실패하는 테스트 코드 작성 전에 함께 코드 리팩터링을 합니다. 

이 과정은 TDD 의 Red-Green-Refactor 를 따르는 것입니다.

 

Strong-Style Pairing

이 방식의 기본 아이디어는 "머릿속에서 컴퓨터로 아이디어를 전달하려면 반드시 다른 사람의 손을 거쳐야 한다는 것"입니다.
지식 전달에 특히 유용한 방식으로 "Driver 는 Navigator 가 지시하지 않은 어떤 작업도 수행하지 않는" 방식이기 때문에 Navigator 는 작업에 대해 훨씬 많은 경험을 갖고 있고 Driver 는 언어나 도구에 대한 초심자일 때 유용합니다.

이 방식의 중요한 점은 Driver 는 Navigator 를 전적으로 신뢰하고 불완전한 이해 상태를 편안하게 생각해야 한다는 것입니다. 그리고 구현중 발생한 이유에 대한 질문은 목표 구현 후 논의되어야 합니다.

이 방식은 마이크로 매니징에 가깝지만 수동적으로 보는 것을 통한 학습이 아닌 능동적인 수행을 통한 학습으로 초기 지식 전달을 위한 온보딩 도구가 될 수 있습니다. 하지만 지나치게 이용해서는 안되며 나중에는 역할을 전환할 수 있어야 하고 마이크로 매니징을 벗어나는 게 목표라는 것을 명심해야 합니다.

 

피해야 하는 함정들

페어링을 하다 보면 아래와 같은 몇 가지 함정에 빠지고 싶은 유혹을 느낄 때가 있습니다.

다음은 페어링 진행 시 주의해야 하는 사항들입니다.

 

산만함

페어링을 할 때는 메일을 확인하거나 전화를 사용하지 마세요. 이러한 행동은 여러분의 파트너가 무례하게 느낄 수도 있고, 하고 있는 일로부터 여러분을 산만하게 할 수도 있습니다. 만약 여러분이 정말로 무언가를 확인할 필요가 있다면 여러분이 무엇을 하고 있는지, 그리고 왜 그런지 투명하게 하세요. 충분한 휴식시간을 취하고 매일 개별 시간을 예약함으로써 모든 사람이 메일을 읽을 충분한 시간을 갖도록 하세요.

 

마이크로 매니징 모드 

마이크로매니징(Micromanaging)에 주의하세요. 파트너가 생각할 여지를 남겨두지 않고, 지시를 계속한다면 그것은 파트너에게 좌절감을 주는 경험입니다. 페어링 도중 아래와 같은 이야기가 오고 간다면 마이크로 매니징을 하고 있진 않은지 생각해보세요.

 

  • "이제 System.print 를 입력하세요..."
  • "이제 우리는 새 클래스를 만들어야 합니다..."
  • "이제 command + shift + O 를 누르세요.."

조바심

페어링을 진행하는 동안 5초 규칙을 적용하세요. Navigator 가 Driver 의 잘못된 행동이나 코드를 보고 얘기하려고 할 때는 말하기 전에 적어도 5초 동안 기다리세요. Driver 가 이미 알고 있을 수도 있고, 만약 알고 있다면 여러분은 불필요하게 Driver 의 흐름을 방해할 것입니다.
Navigator 로써 오류나 다가오는 장애물을 즉시 지적하지 마세요. 즉시 개입하면 Driver 의 사고 과정에 지장을 줄 수 있기 때문에 Driver 가 수정할 때까지 기다리거나 나중에 기억할 메모에 작성하세요. 

 

키보드 정복자 

키보드를 독점하는 상황을 주의하세요. 파트너에게 타이핑 작업도 못하게 하면서 항상 키보드를 독점하고 있습니까?
이것은 파트너의 페어링에 정말 성가신 경험이 될 수 있고 적극적인 참여를 방해함으로써 집중하는데 어려움을 겪을 수 있습니다.
앞에서 설명한 기법과 방식들을 이용해서 키보드를 자주 전환하도록 시도해 보세요.

 

오늘은 여기까지~! 

 

누군가에게 도움이 되었길 바라면서 오늘의 포스팅 끝~

 

참고 링크 : martinfowler.com/articles/on-pair-programming.html

참고 링크2 : medium.com/@weblab_tech/pair-programming-guide-a76ca43ff389