안녕하세요. 인프랩 백엔드 개발자 하루입니다.

최근 커뮤니티와 강의 페이지의 검색 기능을 개선하는 작업을 진행하였는데요.

이번 포스트에서는 해당 프로젝트를 하면서 경험한 페어 프로그래밍에 대한 이야기를 공유하고자 합니다.

페어 프로그래밍

본격적인 내용을 소개하기 전에 우선 페어 프로그래밍에 대한 정의를 살펴보고자 합니다.

인터넷에서 페어 프로그래밍을 검색해 보면 아래와 같은 내용을 확인할 수 있습니다.

동료 프로그래밍 또는 쌍 프로그래밍은 애자일 소프트웨어 개발 중 하나로 하나의 컴퓨터에서 두 사람의 프로그래머가 작업하는 방법이다.
코드를 작성하는 사람이 진행자(driver)가 되고 다른 한 사람이 관찰자(observer, navigator)가 되어 코드 검토(code review)를 하며 프로그래밍을 작성한다.
두 프로그래머는 수시로 역할을 바꾼다.

두 프로그래머가 하나의 작업 공간을 공유하여 키보드 소유권과 진행자 역할인 driver와 관찰자 역할인 observer를 교대하여 개발을 진행합니다.

하지만 흔히들 제시되는 이 방법론에는 크나큰 단점들이 존재합니다.

  • 생산성 저하
  • 키보드 정복자
  • 감정 노동

콴다 팀 블로그에서 소개한 페어 프로그래밍의 단점

토이, 사이드 프로젝트의 경우에는 이 부분이 크게 와닿지 않을 수 있지만, 회사에서 같은 팀원과 함께하는 업무인 경우에는 위와 같은 단점들이 크게 다가와 오히려 강한 부작용을 일으킬 수 있습니다.

그래서 해당 단점을 극복하면서 페어 프로그래밍이라는 협업 방식을 사용해야 했습니다.

결과적으로 저희는 일반적인 정의와는 다른 페어 프로그래밍을 진행했으며 방식과 함께 프로젝트를 진행하면서 겪었던 이점을 공유하려 합니다.

페어 프로그래밍 (with Code With Me)

저희가 정의한 페어 프로그래밍 코딩 협업 방식은 아래와 같습니다.

두 개의 역할(driver, navigator)을 한 사람씩 역할을 맡아 수행하며 일정 시간마다 역할 교대를 하는 것이 아니라 동시에 한 역할을 같이 수행하는 방식입니다.
코드를 설계하고 작성하는 진행자(driver)의 역할은 한 사람이 아닌 두 프로그래머 모두 참여한다.
코드를 검토하는 사람(navigator) 또한 두 프로그래머 모두 서로의 코드를 리뷰해준다.

저희는 설계부터 시작해서 기능 개발을 하는 단계에서 두 개발자 모두 하나의 IDE를 공유하며 같이 코드를 작성하였습니다.

그리고 개발이 마무리가 된 후에는 서로의 작성한 코드들을 검토하고 피드백을 주고받았습니다.

과거에는 서로 다른 PC로 같은 화면을 공유하며 개발하기 어려운 환경이었습니다.

하지만 기술의 발전으로 인해 제약이 사라졌고 저희는 JetBrain의 IDE에서 제공하는 Code With Me를 사용해 위와 같은 동시 개발 방식을 진행하게 되었습니다.

실시간 생각 공유를 통한 문제 해결

이번 프로젝트에서는 적용한 기술은 다음과 같습니다.

  • Spring Boot

  • MongoDB Atlas Search

둘 다 처음 도입하는 스택이기 때문에 기술을 익히기 위한 러닝 커브가 존재했습니다.

예를 들면 Atlas Search의 검색 index 설정 방법에 대한 이슈를 해결해야 하는 상황이 있었습니다.

두 사람 모두 검색엔진으로 주로 사용하는 ElasticSearch를 경험한 적이 있었고 Atlas Search index도 ElasticSearch와 같은 루씬 라이브러리를 가집니다.

그래서 서로가 각자 경험했던 내용을 기반으로 의견을 나누며 코드를 수정하면서 디깅한 결과 예상보다 빠르게 해결할 수 있었습니다.

그 외에도 spring을 사용하면서 겪은 이슈들도 하나의 IDE를 가지고 각자 디깅해보며 해결 방법을 찾아 나가는 경험을 했고 서로가 문제를 어떻게 해결해 나가는지 공유가 되는 점이 좋았습니다.

그리고 이렇게 해결한 이슈에 대해서는 혼자 해결했을 때보다 더 오래 기억할 수 있었습니다.

업무의 집중도 향상

페어 프로그래밍을 하는 동안에 불필요한 외적인 일을 소비하는 시간을 줄이고 두 프로그래머 모두 목표에 집중할 수 있는 환경이 마련됩니다.

저희도 이번 프로젝트를 진행하면서 정해진 페어 시간 안에서는 개발과 휴식이 같이 이루어져 허비되는 시간 없이 집중도를 높일 수 있었습니다.

또한 자칫 지루하거나 피로를 느낄 수 있는 상황을 해결할 수 있는 수단이 되기도 했습니다.

예를 들면 인프런 커뮤니티 게시판에는 질문, 자유주제, 스터디 3가지 항목이 존재합니다.

세 가지 요소의 로직이 비슷한 부분이 있어 코드를 작성할 때 반복적인 작업을 자주 해야 하는 상황이 많았습니다.

만약 각자 맡아서 작업을 했을 때는 지루했을 수 있었지만 같은 공간에서 함께 작업을 하니 즐겁게 진행할 수 있었습니다.

community

팀워크를 통한 생산성 향상

처음에 이 방식을 도입했을 때는 두 사람 모두 driver가 되기엔 어려움이 있었습니다.

한 사람이 코드를 작성하고 있으면 다른 한 사람은 자연스럽게 그 코드를 눈으로 관찰만 하면서 흐름을 따라가는 행위밖에 하지 못했는데요.

페어 프로그래밍 계속하게 되면 자연스럽게 서로의 개발 방식과 스타일을 알게 되며 서로 말을 하지 않더라도 상대방의 다음 코드 작성 위치를 알 수 있었습니다.

예를 들어 상대방이 기능의 구현부를 작성하고 있다면 그 기능에 대한 테스트를 위한 셋업에 필요하다는 사실을 인지해 테스트 코드를 작성하게 되었고 결국 기능 구현과 동시에 테스트가 작성되어 빠르게 작업을 이어갈 수 있었습니다.

코드의 품질 역시 함께 개발하면서 서로의 코딩 스타일을 맞춰나가 싱크업을 유지하기 때문에 일관성 있는 코드의 형태로 개발이 될 수 있었습니다.

지속적인 코드 리뷰 효과

코드를 작성한 후 서로 간의 코드를 리뷰하는 시간을 작업물을 원격 저장소에 올리지 않고도 서로가 observer가 되어 크고 작은 오류를 잡아낼 수 있습니다.

덕분에 기존의 코드 리뷰 방식보다 더 즉각적인 방식으로 빠르게 피드백을 주고받을 수 있었습니다.

또한 상대방이 작성한 코드가 설계부터 시작해서 같이 생각 공유를 했기 때문에 쉽게 그 코드에 대한 의도 파악을 할 수 있었습니다.

Code With Me 장단점

이번에는 Code With Me를 사용하면서 좋았던 점을 공유하고자 합니다.

먼저 Code With Me는 하나의 각자의 PC에 고유한 IDE를 실행하고 Client가 Host 환경에 접속하는 방식이기에 각자 원하는 플러그인을 사용할 수 있습니다.

따라서 vim을 사용하는 사람과 그렇지 않은 사람과 페어를 진행하더라도 각자의 방식대로 개발을 진행할 수 있습니다.

오른쪽 위 사람 아이콘을 선택하면 여러 메뉴가 나오는데 현재 상대방이 작업하는 위치로 이동하거나 상대방을 내가 있는 곳으로 이동시킬 수 있습니다.

이를 통해 상대방이 어떤 작업을 하는지 물어보지 않아도 파악할 수 있고 내가 작성한 코드에 대한 의견을 묻고 싶을 때 상대방에게 쉽게 그 코드를 보여줄 수 있어서 좋았습니다.

또한 화면 공유 기능도 제공하기에 IDE 외에 다른 화면을 보여주고 싶을 때 유용하게 사용할 수 있었습니다.

code-with-me-menu

또 하나의 장점으로 포트 포워딩 기능을 제공합니다.

로컬에서 개발 결과를 확인하기 위해 특정 포트로 서버를 띄운 경우 원래는 Host의 PC에서만 접속할 수 있습니다.

하지만 Code With Me에서 제공하는 포트 포워딩을 사용하면 Host의 서버를 Client에서 localhost주소로 접속할 수 있게 해줍니다.

port-forwarding

하지만 아직 다음과 같은 불안정한 문제가 남아있습니다.

  • Client는 가끔 한글 작성이 제대로 되지 않는 경우가 있습니다. (특히 vim 플러그인을 사용하면 더 심하게 발생합니다)

  • 최근에는 그 횟수가 적어졌지만, crash가 발생합니다.

  • Client에게 모든 권한을 주더라도 모든 기능을 사용할 수는 없습니다. (ex. 파일복사/이동)

  • 두 사람이 같은 파일을 수정하는 경우 간헐적으로 코드가 형태가 이상하게 바뀌거나 rollback되는 현상이 있습니다.

하지만 위 문제들은 JetBrain측에서 지속적인 업데이트를 통해 추후에는 해결될 이슈라고 생각합니다.

혹시 더 좋은 도구를 알고 계신다면 공유해주시면 감사드리겠습니다. 🙏

마무리

혼자 가면 빨리 갈 수 있지만, 함께 가면 멀리 갈 수 있다는 말이 있습니다.

스타트업에서 혼자 빨리 가기보다는 함께 멀리 가기 위해 저희 팀원들은 다양한 소통의 창구를 시도하여 팀간의 커뮤니티를 활성화하고 있습니다.

물론 좋은 코드를 작성하기 위해 일반적으로 요구되는 개발자의 하드 스킬적인 면모도 중요합니다.

하지만 팀원들과 신뢰와 이해 기반 관계를 만들기 위해 더 좋은 커뮤니케이션과 협업을 해나가는 것도 개발자의 필요 스킬이라고 생각합니다.

단순한 텍스트 전달보다는 지속적인 말과 행위를 통해 업무 향상과 함께 성장하기에 페어 프로그래밍은 좋은 재료라고 생각합니다.

모든 팀과 상황에서 적용할 수 있는 방법은 아니라고 생각하지만, 페어 프로그래밍을 도입하고자 하는 분에게 작게나마 도움이 되었으면 좋겠습니다.

마지막으로 부족한 글을 읽어주셔서 감사합니다.