본문 바로가기

iOS

[Swift] Apple의 Swift 언어에 Contribute하기 (Feat. chatGPT)

얼마 전 medium에서 스위프트 언어에 기여한 경험 이라는 글을 봤습니다. 개발 실력이나 경력과 관계 없이 적극적인 자세로 contribute하는 자세가 멋있어 보여서, '나도 한번 해 볼까?'라는 충동과 함께 typo 정도라면 수정해서 올릴 수 있을거라는 생각이 들었습니다. 그리고 당장 apple의 repo들을 뒤지기 시작했습니다. 결과는 성공! contribute의 과정을 적어나가 보겠습니다.

 

Apple의 Swift 언어에 Contribute한 과정

 

1. Apple의 Repo를 돌아보며 typo를 찾기가 쉬울지 판단해보기

우선 typo 찾기가 어렵다면 당장 급한 일은 아니니 개발 공부를 하며 천천히 찾아볼 생각이었습니다.

apple의 repo 중 변화가 활발해보이는 것을 고른 다음, github1s를 이용해서 '전체 찾기'기능으로 code base 및 docs 전체에 '발생할 가능성이 있는 typo'를 마구 입력해보았습니다.

결과적으로, typo는 생각보다 찾기 쉬웠습니다. 이는 swift repo 말고도 CoreLib과 같은 여러 repo에서도 같은 양상이었습니다. 기왕이면 swift 언어에 기여하고 싶었기에 swift repo를 선택했습니다.

 

2. 기존에 있는 Issue, PR 및 typo 관련 PR을 보며 무엇을 해야하고 알아야 하는지 파악하기

여러 repo와 Issue, PR을 살펴본 결과, 보통 Contriubtion.md의 형태로 기여에 대한 가이드를 주고 있었습니다. 글을 한 번 훑고, 실제 PR과 Issue들을 돌아보며 알게 된 사실들을 정리했습니다.

 

- swift-ci bot으로 test / smoke test / build 등을 진행할 수 있다.

- typo 관련 PR은 smoke test만으로 끝낼 수 있고, collaborator들이 빠르게 approve를 해준다.

- commit을 squash해서 merge할 것을 권장한다.

- PR은 심플하게 적을 수 있다. 내용만 확실히 드러난다면.

 

전체적인 방법을 파악하니 contribute를 할 수 있는 가능성이 보였기 때문에, 미루지 않고 swift repo를 fork했습니다.

 

3. fork -> commit -> push -> PR

기존에 프로젝트에서 하던 것과 같은 방식으로 PR을 올렸고, commit message도 merged인 typo 관련 PR을 참고하여 작성했습니다.

 

아래와 같이, 평소에 프로젝트에서 하던 것보다도 아주 심플하게 PR을 작성했습니다. 제 경우에는 globally하게 typo를 수정했기 때문에 관련된 collabolator들이 10명이나..! reviewer에 등록되었습니다.

 

4. 코드리뷰 -> 수정사항 반영 -> rebase and squash -> force push

 

아래와 같은 리뷰와 함께 수정사항이 요청되었습니다. 전체적인 typo를 수정하는 것과 같은 작업을 Gardening label로 분류해주네요! Fix를 Gardening으로 수정하며 몇 가지 수정사항을 함께 반영했습니다. 

commit이 늘어났기 때문에 rebase and squash로 커밋을 하나로 합친 다음, force push하여 PR에 있는 commit을 교체했습니다.

 

5. reviewer의 추가적인 approve -> CI bot을 이용한 smoke test

일단 reviewer가 많기 때문에 추가적인 approve를 기다렸고, 동시에 CI bot을 이용해 smoke test를 진행했습니다. 

ci.swift.org에서 진행중인 test를 monitoring할 수 있습니다.

 

6. test 완료 후 Merge

test가 끝나면 Merge가 되고, contribution도 끝...!

 

typo를 찾고 수정하는 과정에서 집중했던 부분

typo를 찾고 수정하는 과정에서 집중했던 부분은 아래와 같습니다.

 

1. typo를 변경했을 때 side effect가 있지는 않을까?

단순 주석을 수정하는 경우에는 별 문제가 없겠지만, 함수의 parameter, public variable 등을 건드리는 경우에는 문제가 되겠죠..!

 

2. 이 변경이 단순히 typo 수정으로 완결될 수 있을까?

typo 수정이 아니라 더 큰 변화가 요구된다면 이후로 미뤄둘 생각이었습니다.

 

예시1) enum의 case에 존재하는 typo

아래와 같이 enum의 case 명이 Seperator로 잘못 작성되어 있었습니다.

 

살펴보니 해당 case 명을 직접적으로 호출하지 않고 rawvalue를 통한 init을 하고 있었으며, local하게 사용되고 있어 수정할 수 있겠다고 판단했습니다.

 

예시2) 주석으로 달려 있는 무엇인지 모를 script

아래와 같이 finally -> finaly로 잘못 작성되어 있는 것이 의심되는 script가 있었습니다. 단순히 수정을 하자니 CHECK-LABEL이 테스팅과 관련된 주석 같아서 우선 서칭을 해봤습니다.

 

단순히 구글에 검색했을 때 결과가 잘 나오지 않아서. 실마리를 잡기 위해 chatGPT를 사용했습니다.

 

손쉽게 SIL의 test function으로 사용된다는 것을 알 수 있었습니다. 조금 더 깊게 물어보았습니다. typo를 수정해도 될 지, 외부 의존성에는 문제가 없을지 판단할 수 있도록 질문했습니다.

 

(suffix가 맞습니다)

일련의 대화를 통해 mangling을 통해 생성된 'y'라는 것을 알게 되었습니다. 그래도 chatGPT에는 오류가 많기 때문에, 직접 SIL에 대해 서칭하여 링크와 링크의 글을 통해 SIL의 verifier를 통해 test를 수행할 수 있다는 것을 알게 되었습니다. 근래 chatGPT를 사용하며 느낀 점은, chatGPT는 전혀 모르는 영역에 대한 실마리를 얻거나 cross checking하기에 좋은 서비스라는 것입니다.

 

결론적으로 해당 finally -> finaly로 추측되었던 부분은 typo가 아니라는 것을 알 수 있었습니다.

Apple의 Swift 언어에 Contribute하며 알게 된 점

전체적으로 대규모 프레임워크나 라이브러리가 어떻게 관리되고 evolution 하는지에 대해 감을 잡을 수 있었습니다. 이 정도 규모의 open source에 contribute하는 경험이 처음이었기에 배울 점이 많았습니다.

 

새로이 알게 된 지식들도 있습니다. ci.swift.org와 smoke test나, SIL의 활용 등 평소에는 관심도 갖지 않았던 분야에 대해 아주 살짝 맛보기를 할 수 있었네요..!

 

이번 경험 덕분에 앞으로 오픈 소스 contribution을 조금씩 늘려나갈 수 있을 것 같습니다. 다음에는 오래된 로직의 Modernize를 해볼 생각이에요!