모두가 행복한 개발 문화 정착기
안녕하세요. 크몽 안드로이드 개발자 Vigli(비글리)입니다. 크몽에 입사한 지 1년 3개월 정도 지났는데요. 짧은 시간일지 모르나, 크몽 내, 외부적으로는 대격변을 했던 시간이었습니다. 그중 현재 진행 중이고 앞으로도 계속 업그레이드를 할 크몽의 모바일 데브옵스에 대해 소개해 드릴까 합니다. 은근슬쩍 저희 문화를 자랑하는 글이기도 해요ㅎㅎ
데브옵스는 개발(Development)과 운영(Operation)의 합성어입니다. 다양한 해석이 있지만, 제가 생각하는 데브옵스는 사용자도, 개발자도, 관리자도, 모두가 서비스를 편하게 사용할 수 있도록 도와주는 도구라고 생각합니다. 그러기 위해 개발자가 개발에 몰두할 수 있도록 해야 하며, 사용자는 편하게 앱을 쓸 수 있어야 하고, 개발자든 사용자든 모두가 쉽게 서비스에 대해 커뮤니케이션할 수 있는 환경을 만들어야 한다고 봅니다. 이 3가지를 어떻게 구성하느냐에 따라 좋은 개발 문화와 좋지 않은 개발 문화가 나눠진다고 봐요.
제가 입사했을 때 크몽의 모바일 데브옵스는 이랬어요
그래서 뛰어난 실력과 훈훈한 외모를 지닌 크몽의 모바일 개발자들이 좋은 프로세스를 만들기 위해 많은 고민과 시도를 했고, 결국! 크몽만의 데브옵스를 만들었습니다. (글 작성 당시와 현재 글을 보고 있는 것과 다를 수 있습니다. 크몽은 항상 좋은 문화를 위해 언제든지 변화할 준비가 되어 있어요!)
총 5개의 단계인 계획 - 개발 - 테스트 - 배포 - 운영이 사이클을 돌고 있습니다. 각 단계에는 문화와 도구를 활용하여 앞서 말한 3개의 환경(개발 몰두, 사용자를 위한 앱, 원활한 커뮤니케이션)을 제공하기 위한 노력을 하고 있습니다.
2주 단위 스프린트
크몽은 2주 단위 스프린트를 갖습니다. 그에 따라 개발 스코프를 계획하고 진행합니다. 스프린트 동안 목표한 일감을 끝내기 위해 모두 열심히 일하고 있어요!
스프린트 In/Out 회의
스프린트가 끝나는 마지막 워킹데이에 이번 스프린트에 진행한 일감과 다음 스프린트에 진행할 일감을 정리합니다. 그리고 서로 이번 스프린트에 좋았던 점, 아쉬웠던 점을 공유하는 시간을 가져요. 예로, 좋았던 점에는 컨디션 난조에도 불구하고 계획했던 일감을 모두 처리했다는 얘기가 있었고, 아쉬운 점에는 모기 때문에 잠을 못 자 컨디션 관리가 힘든 스프린트였다는 얘기가 있었어요.
Dev Day (데브데이)
매달 1회 진행하는 개발팀 행사입니다. 챕터별 연초 계획했던 목표의 진행사항을 공유하고 트라이브 별 월간 진행사항을 공유합니다. 한 번씩 맥주와 음료수를 마시며 진행하기도 해요. 그만큼 무겁고 딱딱하지 않고 우리만의 파티 같은 분위기 에요!
일일 스크럼 회의
매일 아침, 모두의 컨디션과 어제 한일, 오늘 할 일을 가볍게 공유하는 자리입니다. 각자 1~2분 정도 짧게 얘기하지만, 동료의 컨디션을 알 수 있고, 다 같이 얼굴 보며 인사하는 시간입니다.
페어 프로그래밍
언제든 동료의 요청 시, 페어 프로그래밍을 합니다. 함께 코드를 보고 얘기하며 코딩하면 생각하는 시야가 커지고 실력도 덩달아 높아집니다. 시간과 인력을 투자세요. 작은 단위 라도 한 번씩 해보세요. 가성비 갑입니다!
오프라인 코드 리뷰
오프라인 코드 리뷰는 자리나 회의실, 라운지 등 어떤 장소든 상관없이 진행합니다. iOS 개발자분들은 시간을 정해서 규칙적으로 진행하고, Android 개발자분들의 경우 리뷰가 필요한 코드가 있거나, 동료가 리뷰를 요청하면 진행합니다.
온라인 코드 리뷰
온라인 코드 리뷰는 Pull Request로 진행하고, 안드로이드 개발자들이 하고 있습니다. feature branch에서 각자 기능 개발이 끝나면 정해진 동료에게 Pull Request Review를 요청합니다. 댓글을 통해 서로가 열띤 토론을 펼칩니다. 온라인 코드 리뷰는 시작한 지 1달 정도 되었고 기존 Git 전략도 이 문화를 위해 변형했습니다. (데브옵스에 대한 글이므로 크몽의 Git 전략에 관한 얘기는 생략할게요~) 1달밖에 안되었지만 모두 많은 도움을 얻고 있는 문화가 되고 있습니다.
코드 머지 규칙
기능 개발 시 develop branch에서 feature branch를 생성하여 개발합니다. 그렇게 feature branch의 개발이 끝나면 develop branch에 바로 머지할 수 없고 앞서 말한 온라인 코드 리뷰 도구인 Pull Request가 통과해야 develop branch에 머지할 수 있습니다. 다른 개발자 한 명에게 꼭 리뷰를 받아야 하고, 그 외 리뷰자 요청은 선택사항입니다. 리뷰가 끝났다면 로켓 이모티콘을 달아 머지하라고 알립니다.
공동 개발 문서화
서버에서 받는 데이터 모델을 통일하고, 개발 사양을 맞추기 위해 준비 중인 부분이에요. 이렇게 함으로써 예상치 못한 동작이나 시나리오의 실수를 줄이고, 사용자에게 Android, iOS 어디서든 동일한 경험을 주기 위한 작업이기도 해요.
내부 QA
내부 QA는 필수로 테스트해야 할 QA 리스트를 진행합니다.(결제, 로그인, 회원가입, 푸시 등) 이 리스트를 통과하지 못하면 수정될 때까지 이후 일정은 모두 정지입니다. 핵심 기능을 테스트 함으로써 크리티컬 한 버그가 배포되지 않게 방지합니다.
Unit 테스트
크몽 앱은 MVP 패턴을 사용하고 있습니다. Presenter와 Model의 기능은 Unit 테스트를 추가하여 테스트합니다. 아직 시작 단계이며, 일부 TDD(Test Driven Development)로 개발하고 있습니다. TDD를 하기 위해 대격변의 시기에 앱의 구조를 설계하고 그에 따라 리팩토링도 진행했었습니다.
UI 테스트
내부 QA 목록 중 일부분은 UI 테스트를 추가하고 있습니다. 내부 QA는 직접 하는 테스트인데 게으른 개발자로서 반복된 과정은 참 힘들고 지겨워요. 그래서 자동화를 구축 중에 있습니다.
시나리오 테스트
모든 부분을 테스트할 수 없고, 개발과 머지 시 다른 기능에 영향을 줄 수 있습니다. 이렇게 되면 예상치 못하고, 앱은 죽지 않으나 비정상 동작하고, 사용자는 불편함을 느끼겠죠. 이런 부분을 파악하기 위해 테스트하면 좋지만, 항상 테스트가 어려운 부분이죠. 그래서 앞서 말한 플로우는 시나리오 테스트를 추가하고 있습니다.
운영 테스트
크몽의 릴리즈는 베타부터 시작합니다. 운영 서버에서도 신기능이 정상 동작하는지 한 번 더 확인하게 됩니다.
Sanity 테스트
대규모의 기능 개발 또는 변경 시에만 진행하는 테스트입니다. 모든 인원이 집중적으로 테스트하며 버그를 찾아냅니다. 이번에 맞춤견적을 릴리즈 할 때 진행했던 테스트입니다.
릴리즈 관리 자동화
릴리즈에 대한 정보와 작업했던 commit 정보는 Github와 Jira를 연결하여 자동 등록되게 해 놨습니다. commit 메시지에 Jira 일감을 적어두면 자동으로 Jira 일감에 commit 정보가 등록됩니다. 배포 일감에 해당 작업 일감을 모두 연결함으로써 어떤 작업이 릴리즈 되었는지 관리할 수 있습니다.
단계적 테스트
Android의 경우, Playstore의 단계적 출시 기능을 사용합니다. 20%, 50%, 100% 단계적 출시로 이전에 놓친 오류를 마지막으로 확인하는 단계이기도 합니다.
빌드/배포 자동화
CI/CD를 위해 작업 중이며, 빌드/테스트/배포를 수행합니다. 시작 단계로 이것저것 테스트 중이며, 실제 사용을 준비 중입니다.
빌드/배포 알리미
빌드, 배포가 끝나면 Slack에 봇인 끄몽이가 결과를 알려줍니다. 시작 단계로 이것저것 테스트 중이며, 실제 사용을 준비 중입니다.
테스트 알리미
테스트 결과를 Slack에 봇인 끄몽이가 알려줍니다. 작 단계로 이것저것 테스트 중이며, 실제 사용을 준비 중입니다.
내 맘대로 코드랩
매주 약 1시간 자유롭게 코드랩을 진행합니다. 주제는 없습니다. 당일 리더가 어떤 주제든 상관없이 자기가 하고 싶었던 주제로 간단한 코드랩을 함께 진행합니다. 대체로 경험이 없거나 적은 기술을 하다 보니 서로 도와주며 진행하게 됩니다. 코드랩 이후 간단하게 크몽 앱에 도움이 될까?라는 이야기도 합니다.
기술 세미나
소개하고 싶은 기술이 있다면 컨플루언스를 통해 공유하거나 사내 세미나를 진행합니다. 자유롭게 크몽 앱에 도입할지 이야기하고, 장/단점에 대해 이야기도 합니다.
스토어 리뷰 알리미
매일 1회 알리미가 새로운 스토어 리뷰를 Slack에 알려줍니다. 좋은 리뷰는 항상 감사하며 보지만, 좋지 않은 리뷰는 어떻게 개선할지에 대한 이야기를 하고 해결하려고 합니다.
Crash 리포트 알리미
실시간으로 새로운 Crash가 발생한 경우, 알리미가 Slack에 알려줍니다. 알리미 덕에 오류를 긴급하게 처리하고 배포했던 경험이 있습니다.
크몽의 모바일 데브옵스에 대해 간략하게나마 소개해봤습니다. 아직 시작단계도 많고 미쳐 진행 못 한 부분도 있지만, 하나씩 착실하게 진행하고 있어요. 정답이 없는 문제이고 시간이 지나면, 지금 소개해 드린 것과 전혀 달라질 수도 있어요! 그리고 모바일이라고 통칭했지만, Android/iOS 자율적으로 문화를 갖고 있어서 조금 다를 수 있어요. 하지만 결국 중요한 건, 사용자도, 개발자도, 관리자도, 모두가 서비스를 편하게 사용할 수 있도록 도와주는 도구를 잘 구성하는 것이라고 생각해요. 좋은 데브옵스를 만들기 위해 항상 변화하고 시도할 준비가 되어 있습니다. 궁금한 부분이나 의견은 언제든지 댓글 남겨주세요. 긴 글 읽어주셔서 감사합니다.
우리 팀은 크몽과 딱 어울리는 당신을 기다리고 있어요. 우리 함께 크몽을 만들어요!
채용공고 *개발직군 상시 채용중!