Post

2022 오픈소스 컨트리뷰션 아카데미 Masters 후기

title

Challenges 후기

오픈소스 컨트리뷰션 아카데미가 끝나고 Masters 기간에 대한 후기를 작성하려 했지만 여러 학교 과제와 기말고사에 치여 쓰지 못하다가 뒤늦게 작성하게 됬다. 뒤늦게 작성하는 만큼 최종 발표 이후 의 활동 기간동안 활동한 내용도 모두 포함해서 작성하고자 한다.

2022 오픈소스 컨트리뷰션 아카데미는 크게 Challenges 기간과 Masters 기간으로 나누어서 운영된다.

우선 첫 한달간의 Challenges 기간동안 간단한 기여를 해보며 프로젝트에 익숙해진뒤 Masters 기간에 좀 더 본격적인 활동을 하게되는 방식이다. Challenges 기간 이후에는 중간 발표회를 가졌고 이후 바로 Masters 활동이 시작되었다.

리드 멘티

리드 멘티 선정

Challenges 이후 Masters 에는 선정된 멘티들만 이어서 활동을 하게 되고 그중 몇명이 리드 멘티로 뽑혀 Masters 활동에서 조금 더 주도적인 역할을 하게 된다.

Challenges 기간동안 이런저런 기여를 한것을 좋게 봐주신 덕분에 리드 멘티로 선정될 수 있었고 리드 멘티로서의 역할과 함께 Yorkie 프로젝트에 기여를 할 수 있도록 노력하고자 했다.

또한 Masters 기간이 시작되면서 Challenges 기간동안 부족했거나 바라는 점이 있는지에 대해 구글 폼을 사용해 설문조사를 진행하셨고 여기서 오프라인 활동이 좀 더 있었으면 좋겠다는 의견이 많이 나왔다.

이에 대해 토요일 위클리 시간에 회의를 하였고 리드 멘티의 주도로 오프라인 모각코를 진행하기로 했다. 모각코 진행은 나포함 총 2명의 리드멘티가 격주로 주도해 매주 진행하기로 하였고 Masters 기간에는 Openup이 운영 안했던 주를 제외하고 매주 주말에 오프라인 모각코를 진행했다.

오프라인 모각코

offline_meeting

Masters 기간동안 위의 사진과 같이 매주 오프라인 모각코를 진행하였다. 모각코를 하면서 Yorkie 프로젝트에 기여할 부분을 찾아보고 함께 의논하였고 막히는 부분이 있을때는 같이 해결하고자 하였다.

이를 통해 멘토분께 직접 질문드릴 수 있어서 좀 더 빠르게 해결할 수 있었고 또 많은것을 배울 수 있었다고 생각한다. 아무래도 slack을 통해 질문을 할때는 질문을 올릴때 질문이 적절한지 망설여 지는 부분이 없잖아 있었는데 오프라인에서 만나서 활동을 하니까 좀 더 편하게 질문을 할 수 있었다.

또한 프로젝트 개발 뿐만 아니라 여러 개발과 관련된 이야기들을 하기도 하고 점심이나 저녁시간에는 함께 식사도 하면서 네트워킹을 하는 시간 또한 가질 수 있었다. 이를 통해서도 여러 분야와 위치에 있는 개발자로부터 다양한 이야기를 들을 수 있었고 많은 것을 배울 수 있었다.

이처럼 오프라인에서 함께 개발도 하고 이야기를 하는 것이 매우 재미있었다고 생각하고 혼자서 외롭게 개발하는 것 보다 좀 더 프로젝트에 많은 기여를 할 수 있었다고 생각한다.

기여 활동

yorkie_contribution

Masters 기간에는 Challenges 기간부터 작업하던 #370 PR을 이어서 작업하였고 멘토 분들의 도움을 받기도 하면서 성공적으로 마무리할 수 있었다.

또한 change들을 삭제하기위해 여러 로직이 추가되었기 때문에 다른 개발자들이 알기 쉽도록 문서를 추가하는 작업도 진행하였다.

그리고 작업을 하던 과정에서 발견한 버그를 수정하는 작업을 하기도 하였고 리펙토링을 위한 작업 또한 진행하였다.

이러한 상세한 기여 사항을 아래에 적어보았다.

Add --backend-snapshot-with-purging-changes flag #370 마무리 작업

이슈 링크: https://github.com/yorkie-team/yorkie/issues/288
PR 링크: https://github.com/yorkie-team/yorkie/pull/370

Challenges 기간 작업

우선 Challenges 기간에 시작하고 아직 마무리되지 못햇던 작업에 대한 마무리를 위해 노력했다. 이 작업은 change들을 삭제하기 위해 DB와 관련된 여러 로직을 추가하는 만큼 좀 더 깊은 검증을 위해 멘토님께서 토론을 제의해 주셨었다.

Masters 기간이 시작되자 바로 구현에 대한 토론을 해야겠다 생각했고 총 두번에 걸쳐 진행하게 되었다.

first_discussion

우선 첫번째 토론은 매주 토요일에 진행하는 위클리에서 진행하였는데 위 이미지가 토론 내용을 정리한 글로 작업 중이던 내용에 대해 만은 이야기를 할 수 있었다.

특히, 당시 직면한 문제에 대해 Yorkie에서 change들을 다루는 방식과 이 방식 사이에 어떻게 change들을 purging하는 기능을 주가할 수 있는지에 대해 이야기했다. 그 과정에서 현재 내가 이해한 Yorkie의 로직과 이 로직사이에 기능을 어떻게 추가하였는지 설명드렸고 이에 대한 의견을 들을 수 있었다.

이때 Yorkie 프로젝트의 일부인 Toonie를 사용해 그림을 그리면서 토론을 진행하였다.

first_discussion_toonie.png

한 시간 가까이 진행된 토론을 통해 멘토님께서도 현재의 작업 방향에 대해 동의해 주셨고 세부적으로 작업을 어떻게 마무리하면 좋을지에 대한 방향성을 정할 수 있었다. 특히 change들이 삭제되었을때 history api의 구현과 동기화를 보장하며 change를 삭제할 수 있는 범위에 대한 것을 확정할 수 있었다.

토론을 통해 history api의 경우 조금 번거로운 로직이 추가되더라도 단순히 마지막 snapshot 이후의 change들만 출력하는것이 아닌 최대한 남아있는 change들을 모두 보여줄 수 있도록 하고, snapshot이 생성될때 change들의 삭제는 마지막 SyncedSeqs 이전의 change들을 삭제하는 방식으로 하기로 하였다.(자세한 로직은 아래에 서술한 documentation 작업을 통해 남겨두었다)

그리고 --backend-snapshot-with-purging-changes 플래그가 retention 기능 추가의 출발점으로 retention 기능의 중요성과 이 작업의 필요성에 대해서도 들을 수 있었다.

사실 지금까지 작업을 하면서 Yorkie의 로직을 너무 많이 건드려서 문제가 생기는 것은 아닐까 걱정하기도 하였고 과연 이 기능의 추가가 의미있는 기여가 될 수 있을지에 대해서도 고민이 있었다. 하지만 토론을 통해 멘토님에게 retention 기능의 중요성에 대해 들을 수 있었고 그 기능 구현의 출발점으로 중요한 의미가 있다는 것을 알 수 있었다.

이러한 조언 덕분에 진행하던 작업에 좀 더 열의가 생길 수 있었고 열심히 작업에 집중할 수 있었다고 생각한다.

추가적으로 테스트 코드를 좀 더 세분화하고 전체적인 코드를 간결하게 다듬는게 좋다는 의견 또로 주셨고 이에 대한 작업도 함께 시작했다.

second_discussion_suggestion

그렇게 작업을 진행하던 도중 추가적인 토론을 제의해 주셨고 현재의 개발 현황과 PR을 어떻게 마무리하면 좋을지에 대한 의견을 나눌 수 있었다.

second_discussion

위의 이미지가 두번째 토론 내용을 정리한 것으로 이제 진짜 어떻게 마무리해서 Merge 할지에 대한 내용을 정리할 수 있었다. 특히 Retention 기능은 서버단위, 유저단위, 문서단위 등으로 센분화 할 수 있는데 현재의 PR 단계에서 어디까지 구현하고 추가적인 기능은 다음 미래 계획으로 넘기는 것에 대한 논의를 할 수 있었다.

따라서 현재 단계에서는 Retention 기능의 출반점인 만큼 세분화된 모든 기능을 한번에 구현하기 보단 우선 서버 단위로 snapshot이 생성될때 change들을 삭제할 수 있는 기능까지만 추가하기로 하였다.

또한 몽키패치를 사용해 테스트 코드를 작성하는 것에 대한 이야기를 하였고 비결정적인 테스트를 결정적으로 만드는게 중요한 만큼 필요성에 대한 이야기를 들을 수 있었다.

마지막으로 이 PR이 Merge 된다면 retention 기능의 첫 시작인 만큼 현재 구현을 다른 개발자들이 알 수 있도록 문서화 해놓으면 좋을것 같다는 제안 또한 해주셨다.

그렇게 토론 이후 열심히 작업하여 기능을 완성하였고 테스트 코드 또한 몽키패치를 사용하여 세부 로직을 검증할 수 있도록하여 의미있는 테스트를 할 수 있도록 하였다. 그리고 안정적으로 작동하는 것을 확인한뒤 메인 레포지토리에 Merge될 수 있었다!

이 작업을 통해 Yorkie 프로젝트의 DB 작동 로직 등과 같은 여러 구현을 파악해 볼 수 있었다. 그리고 엄청 큰 기능은 아니지만 어느정도 의미있는 기능의 추가라는 작업을 하면서 개발 과정에서의 토론과 코드 작성, 안정성 검증, 개발 방향과 목표에 대한 설정, 테스트 코드 작성 들과 같은 일련의 개발 프로세스를 경험해 볼 수 있었다.

또한 그 과정에서 협업자이신 멘토님의 의견을 들으면서 많은 것을 배울 수 있었고 앞으로 개발을 하는데 있어 시야를 넓힐 수 있었다고 생각한다.

Fix history command authentication error #397

history_error

이슈 링크: https://github.com/yorkie-team/yorkie/issues/396
PR 링크: https://github.com/yorkie-team/yorkie/pull/397

이 이슈는 위의 작업을 하는 과정에서 발견한 버그이다. change들을 삭제했을때의 history 명령을 테스트하는 과정에서 발견할 수 있었는데 어느날 authentication 관련 기능이 추가된 뒤로 history 명령이 작동을 안하는 문제였다.

이 문제를 이슈로 작성하였는데 코드를 조금 살표보았더니 history 명령에 authentication 코드가 누락되어 있는것을 발견할 수 있었고 바로 수정하여 PR로 올리게 되었다. 비교적 간단한 버그 수정이였던 만큼 금방 Merge 되었다.

Add design document about retention feature #413

retention_doc

PR 링크: https://github.com/yorkie-team/yorkie/pull/413

이 PR은 위에서 언급한 --backend-snapshot-with-purging-changes 플래그 추가 작업이 어떻게 구현되었는지를 설명하는 문서를 작성한 것이다.

이전에 멘토님께서 DB와 관련된 많은 로직이 추가된 만큼 다른 개발자가 해당 로직을 봤을때 이해할 수 있도록 구현 방식에 대한 내용을 문서로 남기는 것을 제안해 주셨고 시간이 좀 지났지만 생각나 작성하게되었다.

플래그의 정확한 기능과 구현 방식, 앞으로의 retention 기능에 대한 내용까지 포함하여 작성하였고 이전에 토론과정에서 Toonie를 사용해 도식화 하였던것을 다듬어서 이미지로 첨부하였다.

문서화를 통한 개발자간의 정보 공유가 오픈소스 개발에서는 매우 중요하다는 것을 느낄 수 있었고 영문으로 내가 구현했던 로직을 정리해서 작성해보는 것을 경험 할 수 있었다.

또한 이 --backend-snapshot-with-purging-changes 플래그 추가 작업이 이번 오픈소스 컨트리뷰션 아카데미 기간동안 가장 중점적으로 작업했던 것인데 이를 다른 개발자들도 알 수 있도록 문서로 남김으로서 오픈소스 컨트리뷰션 아카데미를 잘 마무리 할 수 있었다고 생각한다.

PR 링크: https://github.com/yorkie-team/yorkie/pull/414

이 작업은 --backend-snapshot-with-purging-changes 플래그를 추가하면서 추가된 테스트 코드들을 원래 이곳저곳에 끼워넣기 식으로 추가했던 것을 retention_test.go에 몰아서 정리하는 간단한 PR이다.

오픈소스 컨트리뷰션 아카데미에 Yorkie 프로젝트에 참가하게 되면서 부터 Yorkie의 업데이트 사항을 실시간으로 받아볼 수 있도록 github에서 watch 기능을 켜두었는데 최근 업데이트에서 일부 테스트 코드가 retention_test.go라는 새로운 파일로 이동된 것을 보고 추가적으로 관련된 테스트 코드를 모두 이동하였다.

이를 통해 테스트 코드를 이전보다 보기좋게 다듬을 수 있었고 테스트 코드가 이곳저곳에 있던만큼 중복되어 사용되었던 몽키패치를 하나로 통합할 수 있었다.

Remove use of bou.ke/monkey library #427

이슈 링크: https://github.com/yorkie-team/yorkie/issues/416
PR 링크: https://github.com/yorkie-team/yorkie/pull/427

이 작업은 기존에 Yorkie의 테스트 코드에서 사용되었던 몽키패치 라이브러리가 라이센스를 위반하는 문제가 있다는 제보가 있었고 이를 해결하기 위해 다른 라이브러리로 대체하는 것이었다.

Yorkie 프로젝트 테스트 코드에서는 테스트를 위해 원래 별도의 스레드에서 병렬적으로 동작하던 작업을 bou.ke/monkey 라이브러리를 사용해 하나의 스레드에서 동작하도록 변경해왔다.

나 또한 위의 --backend-snapshot-with-purging-changes 플래그 추가 작업을 하면서 테스트 코드를 작성하는 과정에서 멘토님으로부터 bou.ke/monkey 라이브러리 사용을 제안받았고 테스트 코드를 작성하기도 하였다.

하지만 어떤 외국인 개발자 분으로부터 bou.ke/monkey 라이브러리를 라이센스가 위반되기 때문에 사용하면 안된다는 제보가 이슈로 등록되었고 확인을 해보니 bou.ke/monkey 라이브러리의 라이센스가 아예 다른 프로젝트에서 사용하면 안된다고 명시되어 있었던 것이다..!!

따라서 이를 대체할 다른 방법이나 라이브러리를 고민해보게 되었고 이에 대해서 Slack 채널을 통해 토론을 하기도 하였다.(현재는 디스코드로 소통 방식이 변경되었다)

monkey_discussion

나도 여러 대체 방법을 찾아보기위해 노력했고 Dependency Injection을 사용하도록 코드 구조를 변경하거나 사용자는 적지만 비슷한 다른 라이브러리를 발견할 수 있었다. 이에 대해 슬랙채널을 통해 건의해 보았고 일단 크게 수정이 필요하지 않은 유사한 몽키패치 라이브러리인 go-mpatch를 사용하도록 수정하여 PR로 올려두었고 현재 Merge 되었다.

이 작업을 하면서 어떤 개발을 할때 다른 프로젝틑 의존성으로 사용한다면 그 라이센스도 주의해서 사용해야 한다는 것의 중요성을 상기시킬 수 있었다. 또한 대체할 방법을 찾아보는 과정에서 Dependency Injection 이라는 기법이 있다는 것을 배울 수 있었고 여러 컨트리뷰터분들과 함께 토론하는 과정에서 오픈소스 프로젝트의 의사결정 과정에 참여해 볼 수 있었다.

오픈소스 컨트리뷰션 아카데미 기간동안 가장 기억에 남는 작업중 하나였다고 생각해 컨트리뷰션 기간이 끝나고 주최측에서 사연을 응모받을때 Yorkie 팀의 대표 사연으로 응모하기도 하였다. 아마 공식 사이트에 후기 게시판에도 조만간 올라가지 않을까 싶다..!

Replace deprecated ioutil library #428

PR 링크: https://github.com/yorkie-team/yorkie/pull/428

이 작업은 Yorkie 프로젝트에서 사용중인 라이브러리 중에 deprecated된 라이브러리를 다른 라이브러리로 대체하는 간단한 리펙토링 작업이었다. 오픈소스 컨트리뷰션 아카데미 최종 발표 이후에도 아직 활동 지원기간은 남아있어 최종 발표 이후에도 오프라인 모각코 활동은 지속하였는데 모각코 활동을 하면서 Yorkie 코드를 살펴보던 도중 발견하게 되었다.

이전에 같은 라이브러리를 제거한 PR이 있었지만 이때 누락된 것으로 보이는 코드가 몇줄 있었고 많은 내용은 아닌 만큼 금방 작업해 바로 PR을 열 수 있었다. 현재는 Merge되었다.

ioutil

최종 보고서 및 발표회

final_evaluation

Masters 기간이 끝나갈때쯤 최종 활동 보고서를 작성해 제출해야된다는 안내가 있었다. 중간 보고서와 마찬가지로 공유된 노션 링크를 통해 작성해 제출하는 방식이었고 보고서 제출 시점까지 작업한 내용을 모두 정리해 작성하였다.

보고서를 작성하며 기여한 내용을 한번 모두 정리해 볼 수 있었고 열심히 기여를 하다보니 벌써 끝났다는 사실에 아쉬움이 있기도 하였다.

최종 보고서 제출 이후에는 최종 발표회가 있었는데 다른 리드 멘티분과 의논한 결과 다른 리드 멘티분께서 발표회날 일정이 있어 중간 발표와 반대로 최종 발표는 내가 발표하기로 하였다!

중간 발표때와 같이 발표자료는 함께 구글 독스를 사용해 준비하였다. 10월 초에 학교 강의 중 중간고사를 보는 강의도 있어 발표자료는 그전에 미리 준비하였다.

그래도 미리 준비했지만 중간 고사 기간과 일부 겹친 만큼 발표 준비에 모든걸 집중하기엔 시간이 부족해 조금은 아쉽기도 하였다. 그래도 최선을 다해 준비하고자 노력했다.

발표회는 10월 8일에 주최인 OpenUp에서 진행하였고 발표 후 질답 시간을 갖는 방식으로 진행되었다.

위의 영상이 OpenUp에서 업로드한 발표영상이다!

모든 오픈소프 컨트리뷰션 아카데미 팀의 멘토 분들이 현장에 참석하시고 유튜브 생중계까지 진행한 만큼 상당히 긴장되었다고 생각한다. 그래도 최대한 침착하게 발표하고자 노력했고 좋은 경험이었다고 생각한다.

다만 마지막 질답에서 Yorkie 프로젝트가 상당히 오래 개발되어 왔다는 점을 조금더 어필했으면 어땠을까 하는 아쉬움도 살짝은 있었다..ㅎ(원래 이런 발표 이후에는 항상 아쉬운점만 생각하는것 같다ㅎㅎ)

presentation_cheer

또한 Yorkie 팀원 분들께서 많은 응원을 해주셨다!! 온라인 뿐만 오프라인 현장에서도 많은 분들이 응원해주셨고 덕분에 무사히 발표를 마칠 수 있었다! (모두들 감사합니다!!)

후기

활동 기간 종료

ossca_badge

최종 발표 이후에도 11월까지 오프라인 모각코 장소 대여를 해주는 등 지원기간이 있었고 이에 따라 11월까지 오프라인 모각코를 진행하며 컨트리뷰션 활동을 이어갈 수 있었다. 따라서 거의 반년에 달하는 기간동안 활동을 하였고 어느덧 마무리하게 되었다.

활동기간 종료 후 12월 6일에 후기 인터뷰를 촬영할 생각이 없냐는 제의가 있었고 12월 9일에 OpenUp에서 인터뷰 영상을 촬영하기도 하였다! 아래가 인터뷰 영상이다.

컨트리뷰션 후기

yorkie_presentation

이번 2022 오픈소스 컨트리뷰션 아카데미를 활동하면서 정말 많은 것을 경험할 수 있었고 또 배울 수 있었다고 생각한다.

이 활동이전에도 평소 여러 오픈소스 소프트웨어를 사용하면서 여러 사람이 함께 참여하여 개발하는 오픈소스 방식에 매력을 느끼고 호감을 갖고 있었다. 더 나아가 기술은 공유 할 수록 더 발전할 수 있다는 자유 소프트웨어 정신이 좋기도 하였고 많은 좋은 소프트웨어를 개발해주신 오픈소스 커뮤니티들에 대한 감사함도 있었기에 언젠가 오픈소스 개발에 기여해보고 싶다고 생각하고 있었다.

하지만 선뜻 오픈소스 개발에 뛰어들기에는 망설여졌는데, 아직 학생이라 실력이 부족한 건 아닐까 생각하기도 하였고 오픈소스 커뮤니티가 어떤 식으로 운영되는지에 대해서도 잘 몰랐기 때문에 막연한 두려움 같은 것도 있었다고 생각한다. 그러나 이번 오픈소스 컨트리뷰션 활동을 계기로 드디어 처음으로 오픈소스 프로젝트에 실제로 기여를 해보는 경험을 할 수 있었다.

이 과정에서 오픈소스 커뮤니티는 어떻게 구성되고 기여의 과정은 어떻게 되는지 알 수 있었다. 그리고 기여를 위해 여러 코드를 분석하고 새발하면 멘토님들께 코멘트를 받기도 하며 정말 많은것을 배울 수 있었다. 특히, 새로운 기능을 추가할때는 이와 연관된 다른 기능들에 영향을 줄 수 있기 때문에 로직 구조를 상세히 검증하는 것이 중요하다는 것을 느끼게 되었다.

그리고 이러한 검증을 위한 자동화되면서 결정적인 방식의 테스트코드의 중요성을 알 수 있었고, 직접 테스트 코드를 작성하며 어떤 부분을 어떻게 테스트해야 할 지 많은 생각을 해볼 수 있었다. 또한, 여러 사람이 같이 작업하는 오픈소스인 만큼 코드 스타일을 주의해서 작성해야 한다는 것도 경험할 수 있었다.

그리고 이러한 직접적인 기여 뿐만 아니라 오프라인 모각코 활동 들을 통해 다른 개발자 분들과 교류하는 기회도 가질 수 있었다. 이를 통해 여러 개발자 분들께 여러 이야기와 조언들을 들을 수 있었고 다양한 경험을 나누는 과정 자체도 재미있었다.

이를 계기로 앞으로도 계속 오픈소스 활동을 이어나가고 싶다고 생각하게 되었고 또 이를 위해 많은 공부를 해야겠다는 생각도 들었다.

정말 너무 많은 것을 경험하고 배울 수 있었고 또 재밌었던 만큼 다른 분들에게도 꼭 한번 신청해 열심히 활동해보라고 추천하고 싶다.

ossca

This post is licensed under CC BY 4.0 by the author.