운이 좋았다. 처음으로 오픈 소스에 참여했는데, 대상이 pandas였다.
pandas가 무엇인지 잘 모르시는 분들을 위해 말씀드리자면,
table 데이터를 다룰 때 사용하는 파이썬 라이브러리인데
많이 사용하는 파이썬 라이브러리 top 10안에 든다.
나에게는 첫 직장이고 시작이었지만
합류한 팀은 프로젝트의 한 phase를 마무리하고 있었다.
간단한 🛫온보딩 과정을 마무리하고
다음 phase를 위해 프로젝트 코드의 구조와 동작을 파악하고 있었다.
빨리 프로젝트에 도움이 되는 일을 하고 싶었지만
프로젝트의 전체 히스토리를 잘 모르는 상태인 내가
프로젝트에 도움이 될 만한 일을 하는 것은 쉽지 않았다.
그러던 중 팀에서 작성한 데이터 전처리 코드에 대해서 속도 향상 작업이 필요했다.
히스토리를 잘 몰라도 할 수 있는 작업이지만
프로젝트에 기여하는 바가 있는 작업이라
내가 도맡아서 진행했다
속도룰 높이기 위해 공식 문서를 기반으로 여러 시도들을 하고 있었는데
그 중에 하나가 numba
엔진을 활용하는 것이었다.
분명 공식 문서대로 적용하고 있는데
이상하게 Resampler.mean(engine="numba")
를 실행하면
자꾸 UnsupportedFunctionCall
에러가 났다.
나름 구글링을 했는데도 원인을 찾을 수가 없어서
pandas 공식 GitHub에 이슈를 남기게 되었다.
그리고 pandas 멤버 중 한 분이 코멘트를 남기셨는데,
groupby
랑 rolling
에서는 지원하는 기능이지만
resample
에서는 아직 지원하지 않는다는 내용이었다.
분명 공식문서에 지원한다고 써져있는걸 확인했는데
아직 구현이 안 되어있다고 했다;;
그래서 공식문서에 수정이 필요하다는 새로운 이슈를 만들었다.
그러자 다른 pandas 멤버께서 공식 문서가 잘못된 것이 맞다며
contribution을 환영(?)한다는 댓글을 남겨주셨다.
오픈 소스 contribution은 오타 수정부터 시작한다고 들었던 것 같아
첫 contribution을 마음먹었다.
고맙게도 pandas에서는 contribution guide 아주 친절하고 자세하게 알려줬고
처음 해보는 나 같은 사람도 쉽게 따라갈 수 있었다.
지금까지 Git을 쓰면서 fork를 쓸일은 잘 없었다.
학부 때, 실습으로 몇 번 사용해본 적은 있어도
실제로 활용해본적은 처음이었다.
방법은 간단하다.
그냥 공식 pandas GitHub에서 fork 버튼을 누르면
아래 그림처럼 내 repos에 pandas라는 repo가 생기고
밑에 작은 글씨로 forked from pandas-dev/pandas 라고 적혀있다!
사실 시작할 때만 해도 엄청 간단한 작업일거라 예상하고
코드에서 Resampler.mean 찾고 주석만 바꾸면 pandas 공식 contributor 되는거잖아? 🤩
라고 생각했다.
물론 처음은 예상한대로였다.
공식 문서에 적힌 순서대로 pandas.core.resample.Resampler.mean
을 찾아들어갔다.
파일이 많기는 했지만, 어렵지 않게 resample.py
파일을 찾고
class Resampler
도 쉽게 찾을 수 있었다.
그리고 cmd+F
로 def mean
를 검색했다.
그런데 mean()
method가 존재하지 않았다...
뭐야? 왜 없어? 코드가 너무 커서 검색이 잘 안되나
라는 생각에 Resampler
class를 대략 훑어보았지만,
std()
와 var()
있어도, mean()
는 존재하지 않았다
아니 없는데 어떻게 코드가 도는거냐;; doc은 어떻게 생기는거야?
그러다가 천천히 코드를 살펴보니깐 뭔가를 찾았다.
Resampler
class 선언 이후에
_add_downsample_kernel
함수가 선언되어 있고
mean
을 포함한 함수를 의미하는 듯한 여러 string들이 argument로 들어가고 있었다.
처음보는 코드 구조에 이건 뭐지?라는 생각이 들었지만,
찬찬히 _add_downsample_kernel
함수를 살펴보았다.
그리고 왜 공식 문서가 잘못되었는지 알 수 있었다.
모든 코드 내용을 이해하지는 못했지만, 대략적으로 살펴보면
1. 코드 처음에 assert문으로 원하지 않는 args가 들어온건 아닌지 확인한 후
2.
args
에 따라서 각기 다른 함수f
를 정의하도록 if문을 구성했다. (그림에서는 편의상 한 if문만 보였다)3. 이때, 함수
f
는_downsample
이라는 함수에 name을 넘겨주어서 자신을 정의한다4. 마지막으로
f
의 doc을docs_class
에서 같은 이름을 가진 method의 doc으로 설정한 후,f
를 Resampler class의 method로 set한다.
정리해보자면,
_add_downsample_kernel
은 string 타입의 name
과 기타 args들을 받아서 Resampler의 method를 생성하는 역할을 한다.
그리고 이때, 생성된 method의 doc을 docs_class
라는 다른 class의 doc으로 설정한다.
여기서 docs_class
의 default값이 GroupBy
다
즉, Resampler.mean() method는
_add_downsample_kernel
을 통해 생성된 method였고,
GroupBy.mean()
의 docs를 그대로 가져다가 쓰고 있었던 것이다!!!
글의 시작에, pandas 멤버 중 한 분이 groupby
랑 rolling
에서는 engine을 지원한다고 말한 내용을 보면 알 수 있듯이
GroupBy.mean()
의 경우 engine argument를 사용할 수 있기 때문에 문서에 이를 언급했고, 단순히 이를 copy했던 Resampler.mean()의 경우 실제로 엔진 기능을 지원하지 않지만, 문서에는 지원하는 것처럼 보였던 것이다!
단순히 method 찾아서 주석만 고치면 된다고 생각했는데, 역시 해보기 전까지는 모르는 것 같다.
문제의 원인을 알고난 후, 수정하는 건 크게 어렵지 않았다.
_add_downsample_kernel
을 통해서 Resampler.mean()
을 만들지 말고
Resampler
class 내부에 독립적인 method를 선언하고 올바른 docstring을 작성하면 됐다.
docstring은 기존 var()
, std()
method를,
함수 내부는 _add_downsample_kernel
내부를 참조했다.
물론 기존 코드에서 _add_downsample_kernel
에 "mean"을 넘겨주지 않도록 삭제도 했다.
문제 수정 후, 내 repo에 push하고 PR을 작성했다.
PR 내용은 Resampler.mean의 docstring이 GroupBy.mean의 것을 상속하고 있으니, 독립적으로 method를 선언했다는 내용이었다.
PR 제출 후, GitHub Action으로 테스트가 돌았는데 doc build 에러가 발생해서 당황했지만, 이는 기존부터 있던 이슈인 듯 했다. (merge된 가장 최근 commit에서도 같은 에러가 발생한 걸 확인했다)
혹시 몰라서 리뷰어들이 알 수 있도록 FYI로 남겨두었다.
예상대로 기존에도 있었던 문제였고, dependecy와 관련된 문제라는 답변을 얻었다.
나에게 contribution을 독려해주셨던 분께서 간단한 리뷰를 해주셨다.
docstring을 적을 때, std()
와 var()
을 참고했어서 똑같이 versionadded:: 1.5.0
라고 적었는데,
Resampler.mean()은 이전부터 numeric_only
parameter를 사용했기 때문에 지워도 된다는 내용이었다.
⚡️빠르게 수정 후, 최종적으로 approve를 받고 최종 merge까지 되었다!!!
한 가지 뿌듯했던 것은 내가 이슈를 제기함으로 인해,
pandas 팀내에서도 resample
과 groupby
의 method를 분리하자는 의견이 나오고 관련된 이슈까지 생성되었다는 점이다.
그렇게 회사 일로 시작했지만, 처음으로 오픈 소스 contributor가 되었다.
물론 새로운 feature를 추가하는 작업을 한 것은 아니었고 간단한 코드 수정 작업이긴 했지만
직접 문제를 발견해서 이슈를 제기하고 pandas 코드를 뜯어보고 문제를 해결했던 일련의 과정들을 경험한 것이 의미가 있는 것 같다.
글에 담지는 못했지만 환경설정 하면서 삽질했던 것, 문제 해결에 필요하다고 생각해서 엉뚱한 코드 읽고 있었던 시간들 모두 값진 경험이었다.
내가 수정한 코드가(비록 작은 부분이기는 하지만😅) pandas에 남아있는다고 생각하니깐 기분이 묘했다.
pandas 2.0
에 등록된 260명에 contributor들 중에 유일하게 🇰🇷한국어로 내 이름이 적힌걸 보니 뭔가 뿌듯했다!! 마치 국위선양이라도 한 느낌이었다ㅋㅋㅋㅋ
앞으로도 문제를 발견했을 때, 끝까지 파고 드는 자세와 실행력을 발전시켜 나갈 수 있도록 노력해야겠다.
*짤들의 출처는 짤을 클릭하면 확인하실 수 있습니다!